从linux访问自定义硬件加速器:用于openVPN/openSSL

从linux访问自定义硬件加速器:用于openVPN/openSSL,openssl,embedded-linux,openvpn,hardware-acceleration,zynq,Openssl,Embedded Linux,Openvpn,Hardware Acceleration,Zynq,我试图让openVPN使用我为其加密操作设计的定制硬件加速器(为了简单起见,我只是想让openVPN使用我在FPGA上设计的定制AES加速器)。我将在运行linux的Xilinx ZYNQ平台上使用openVPN,并且我将拥有对FPGA逻辑的内存映射访问 我已经编写并验证了用于多种加密操作(RSA、SHA256、AES)的加速器,但仅通过裸机编程接口使用了它们 我正在寻找一种让openVPN使用这些加速器的方法,但我一无所获,需要一些指导 我知道openVPN使用openSSL库,可以通过使用它

我试图让openVPN使用我为其加密操作设计的定制硬件加速器(为了简单起见,我只是想让openVPN使用我在FPGA上设计的定制AES加速器)。我将在运行linux的Xilinx ZYNQ平台上使用openVPN,并且我将拥有对FPGA逻辑的内存映射访问

我已经编写并验证了用于多种加密操作(RSA、SHA256、AES)的加速器,但仅通过裸机编程接口使用了它们

我正在寻找一种让openVPN使用这些加速器的方法,但我一无所获,需要一些指导

我知道openVPN使用openSSL库,可以通过使用它们的“引擎”将其配置为使用/dev/Crypto(cryptodev)API,但我仍然不知道要在我的加速器块和openSSL之间建立连接,到底需要做些什么。几乎没有关于CryptoDev的文档,我甚至很难理解它是如何与openSSL一起工作的

我知道我需要编写某种内核模块/设备驱动程序(或者可能只是将我的加速器的内存地址映射到内核空间?),但这只允许linux“查看”我的加速器

请帮助我了解为了让openSSL(以及openVPN)能够使用我的硬件加速器,我需要做些什么。这可能是一个很高的水平,但我只需要大致知道需要采取哪些步骤,这样我才能起步

编辑:如果你对Xilinx ZYNQ一无所知,不要让它吓到你,只要假设我自己制作了硬件加速器,它神奇地映射到了物理内存中。现在我只需要将它集成到openSSL/cryptodev中。


谢谢

您需要做的第一件事是为加速器配备一个内核空间驱动程序。接下来,您需要通过在加速器(struct crypto_alg)中提供支持的AES密码列表来注册支持的密码(使用linux/crypto.h中的crypto_register_algs函数)

您可以在此处找到更多信息:

接下来,使用cryptoDev模块允许用户空间访问通过cryptoAPI注册的自定义加密驱动程序(加速器)

重新编译OpenSSL以使用CryptoDev和-DHAVE_CryptoDev。使用“-engine cryptodev”选项使用cryptodev引擎