This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C129XNCZAD:AES 库中的错误导致意外访问存储器

Guru**** 2424570 points
Other Parts Discussed in Thread: AES-128

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/692955/rtos-tm4c129xnczad-bug-in-aes-library-causing-unintended-access-the-memory

器件型号:TM4C129XNCZAD
主题中讨论的其他器件:AES-128

工具/软件:TI-RTOS

您好!

我使用的是 TI-RTOS tirtos_tivac_2_16_01_14

AES 库中有一个错误、导致我们的应用程序出现意外行为、经过几个小时的故障排除后、发现了该错误。

错误位于 AESDataWrite API 中、由 AESDataProcess 调用。 这样、我有一个长度为23字节的数据包、我想使用 AES-128对其进行加密、甚至应用程序传递的数据长度为23、但 AESDataWrite 将写入长度为32字节的存储器、该长度是16的倍数 与应用传递的值无关。

我编写此主题有两个原因:

1 -向 TI 展示该错误、以便他们可以修复它。

2-帮助其他人修复他们的应用程序,因为我知道,此类问题将导致数小时和数小时的调查,具体取决于意外访问错误的内存位置可能导致的随机行为。

谢谢、

Mohammed Fawzy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mohammed、

    感谢您花时间在我们的论坛上发帖。 我想通知您、所描述的行为不是固件错误。 让我解释一下发生了什么以及原因。

    首先、API 说明非常清楚它的工作方式:

    //! 将纯文本/密文写入数据寄存器并进行分块。
    //!
    //! \param ui32Base 是 AES 模块的基址。
    //! \param pui32Src 是指向一个字节数组的指针。
    //!
    //! 此函数将纯文本或密文块写入
    //! AES 模块。 如果输入未就绪、该函数会等待、直到它为
    //! 写入前准备就绪。 块为16字节或4字。
    //!
    //! \无返回。 

    请注意、特别需要指出的是、它会将一个块写入 AES 模块、并且该块为'16字节'。 因此、所有写入操作必须是16的倍数、这样就可以清楚地记录下来。

    此外、这一要求不是固件驱动的要求、而是直接来自 AES 加密过程。 从数据表中:

    "AES 是 Rijndael 密码(AES 算法)和128位多项式乘法(此处称为 GHASH、根据 AES-GCM 规范)的高效实现。 Rijndael 是一个块密码、其中每个数据块为128位"

    因此、要使用 AES 密码、它必须获得128位数据、即16字节、这是要求16的倍数的来源、这就是为什么 TivaWare API 会按原样写入的原因。

    这是否向您解释了为什么以这种方式配置 TivaWare 代码、以便现在可以明显看出它不是库中的错误? 在正确理解的情况下、您可以在系统中正确解决它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Jacob 的回复。

    很好,我想了解更多,那么函数将如何等待数据准备就绪?
    "如果输入未就绪、该函数会等待直至其就绪、然后再执行写操作。 块为16字节或4个字。"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mohammed、

    这涉及检查 AES 外设是否准备好接收接下来的16个字节的数据。 在 AES 外设的控制寄存器内有一个标志、该标志指示外设何时可以接受新数据。 API 轮询该标志、直到外设指示它已准备好接收数据、然后 API 将传递给它的数据加载到 AES 外设数据寄存器中。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ralph、

    我了解更多、如果我要开发相同的驱动程序、我将在技术上执行相同的操作。
    但我认为函数描述不清楚传入长度限制是16个字节的倍数、尤其是描述中提到的最大长度为2^32。 因此、我希望能够修改说明、以便任何人都不会误解输入参数限制。

    此致、
    Mohammed Fawzy