我正在构建一个动态引擎来支持我在 FPGA 逻辑中实现的自定义 AES 硬件模块**,但是在阅读了所有可用的文档并翻阅了源代码之后,我仍然对以下两件事感到非常困惑......
- 我应该如何以及在哪里定义引擎代码中的
EVP_[En/De]cryptInit_ex(..)
、EVP_[En/De]cryptUpdate(..)
和函数?EVP_[En/De]cryptFinal_ex(..)
在此之前,我成功地为我的 sha256 加速器构建了一个引擎,现在我正在尝试为 AES 遵循相同的步骤。对于 sha256,该EVP_MD
结构允许我声明指向我的 init、update 和 final 函数的指针。这一切都完美无缺。
现在,当我构建 AES 引擎时,我看到该EVP_CIPHER
结构没有这些指针(init、update、final),而是有一个指向 init_key 和 do_cipher 函数的指针。但是,EVP 加密接口仍然定义了这些功能。
AFAIK(如果这是错误的,请纠正我)init_key
当我调用函数时,EVP 接口调用了我的EVP_[En/De]cryptInit_ex
函数,并且调用了该do_cipher
函数EVP_[En/De]cryptUpdate
。但是我应该如何处理这些EVP_[En/De]cryptFinal
功能?我不应该在我的引擎中实现它们吗?或者我在这里遗漏了什么......
- 当涉及到动态引擎时,EVP 接口是否处理填充?还是由我在引擎本身内实现填充结构?如果是后者,那么我认为前面问题的答案将帮助我弄清楚在哪里实现它。
如果您想查看源代码,您可以参考这里的源代码,但我认为这个问题没有必要。
回顾一下,两个问题:
- 当从驱动程序调用、 和函数时
EVP_[En/De]cryptInit_ex(..)
,如何明确定义引擎中发生的哪些操作?EVP_[En/De]cryptUpdate(..)
EVP_[En/De]cryptFinal_ex(..)
- 我的引擎是否需要在加密时处理输入数据的填充,并在解密时剥离填充?或者 EVP API 是否为我处理填充,我只需要担心任意输入数据的核心 AES 算法?(作为参考,我只想使用标准的 PKCS 填充)
提前致谢!
** 我使用的是 Xilinx Zynq SoC,所以我可以在可编程逻辑中创建自定义硬件,然后通过内存映射从处理器上运行的软件与它进行交互,就像任何外围设备一样......细节无关紧要