DOCA 文档 v2.10.0

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-architecture-version-1-modificationdate-1734474334237-api-v2.png

  • 仅支持单次 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=256threads=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 文档

  1. 加载 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);

  2. 通过调用 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);

  3. 卸载引擎

    复制
    已复制!
                

    ENGINE_unregister_digests(e); ENGINE_finish(e); ENGINE_free(e);

© Copyright 2025, NVIDIA。 最后更新于 2025 年 2 月 12 日。