DOCA 与 OpenSSL
本指南提供关于使用 DOCA SHA 进行 OpenSSL 实现的说明。
doca_sha_offload_engine
是一个 OpenSSL 动态引擎,具有卸载 SHA 计算的能力。它可以卸载 OpenSSL 的单次 SHA-1、SHA-256 和 SHA-512。它通过利用 OpenSSL async_jobs
库来支持同步模式和异步模式。有关 async_jobs
库的更多信息,请参阅 官方 OpenSSL 文档。
此引擎基于 doca_sha
库和 OpenSSL 动态引擎接口 API。有关 OpenSSL 动态引擎的更多信息,请参阅 官方 OpenSSL 文档。
此引擎可以通过 OpenSSL 高级算法调用接口 EVP_Digest
被 OpenSSL 应用程序调用。有关 EVP_Digest
的更多信息,请参阅 官方 OpenSSL 文档。
基于硬件的
doca_sha
引擎,可以通过调用doca_sha_get_hardware_supported()
进行验证已安装 OpenSSL 版本 ≥ 1.1.1
下图显示了 doca_sha_offload_engine
的软件层次结构及其在整个 DOCA 仓库中的位置。
从 OpenSSL 的角度来看,此引擎是通过利用 doca_sha
库对 OpenSSL 动态引擎接口 API 的实例化。

仅支持单次 OpenSSL SHA
最大消息长度 ≤ 2GB,与
doca_sha
库相同
验证引擎是否可以加载
$ openssl engine dynamic -pre NO_VCHECK:1 -pre SO_PATH:${DOCA_DIR}/infrastructure/doca_sha_offload_engine/libdoca_sha_offload_engine.so -pre LOAD -vvv -t -c
(dynamic) Dynamic engine loading support
[Success]: SO_PATH:${DOCA_DIR}/infrastructure/doca_sha_offload_engine/libdoca_sha_offload_engine.so
[Success]: LOAD
Loaded: (doca_sha_offload_engine) Openssl SHA offloading engine based on doca_sha
[SHA1, SHA256, SHA512]
[ available ]
set_pci_addr: set
the pci address of the doca_sha_engine
(input flags): STRING
对于 SHA-1
$
echo
"hello world"
| openssl dgst -sha1 -engine {DOCA_DIR}/infrastructure/doca_sha_offload_engine/libdoca_sha_offload_engine.so -engine_impl对于 SHA-256
$
echo
"hello world"
| openssl dgst -sha256 -engine {DOCA_DIR}/infrastructure/doca_sha_offload_engine/libdoca_sha_offload_engine.so -engine_impl对于 SHA-512
$
echo
"hello world"
| openssl dgst -sha512 -engine {DOCA_DIR}/infrastructure/doca_sha_offload_engine/libdoca_sha_offload_engine.so -engine_impl
openssl-speed
是 OpenSSL 吞吐量基准测试工具。有关更多信息,请查阅 官方 OpenSSL 文档。doca_sha_offload_engine
吞吐量也可以使用 openssl-speed
进行测量。
SHA-1,每个作业 10000 字节,使用引擎
$ openssl speed -evp sha1 -bytes 10000 -elapsed --engine {DOCA_DIR}/infrastructure/doca_sha_offload_engine/libdoca_sha_offload_engine.so
SHA-256,每个作业 10000 字节,使用引擎,
async_jobs=256
$ openssl speed -evp sha256 -bytes 10000 -elapsed --engine {DOCA_DIR}/infrastructure/doca_sha_offload_engine/libdoca_sha_offload_engine.so -async_jobs 256
SHA-512,每个作业 10000 字节,使用引擎,
async_jobs=256
,threads=8
$ openssl speed -evp sha512 -bytes 10000 -elapsed --engine {DOCA_DIR}/infrastructure/doca_sha_offload_engine/libdoca_sha_offload_engine.so -async_jobs 256 -multi 8
有关动态引擎用法的更多信息,请参见 官方 OpenSSL 文档。
加载
doca_sha_offload_engine
(可选,设置引擎 PCIe 地址)ENGINE *e; const char *doca_engine_path =
"${DOCA_DIR}/infrastructure/doca_sha_offload_engine/libdoca_sha_offload_engine.so"
; const char *default_doca_pci_addr ="03:00.0"
; ENGINE_load_dynamic(); e = ENGINE_by_id(doca_engine_path); ENGINE_ctrl_cmd_string(e,"set_pci_addr"
, doca_engine_pci_addr, 0); ENGINE_init(e); ENGINE_set_default_digests(e);通过调用 OpenSSL 高级函数 EVP_XXX 执行 SHA 计算
const EVP_MD *evp_md = EVP_sha1(); EVP_MD_CTX *mdctx = EVP_MD_CTX_create(); EVP_DigestInit_ex(mdctx, evp_md, e); EVP_DigestUpdate(mdctx, msg, msg_len); EVP_DigestFinal_ex(mdctx, digest, digest_len); EVP_MD_CTX_destroy(mdctx);
卸载引擎
ENGINE_unregister_digests(e); ENGINE_finish(e); ENGINE_free(e);