STM32F437 硬件加密功能与 WolfSSL 集成

STM32F437 Hardware Crypto functions integration with WolfSSL

我有一个项目在连接上使用 DTLS。现在我已经成功地 运行 WolfSSL 在控制器上仅使用软件实现,但设置初始连接所需的时间令人厌恶,我现在正在寻求利用硬件加密在 MCU 中加速性能。从 WolfSSL 提供的 STM32F2 实现中,我只看到一些加密算法被重定向到硬件加密。在我的 DTLS 实现中,我使用了 WolfCrypt 提供的许多不同算法。由于我对 SSL 库的非常低级别的细节非常缺乏经验,因此我需要一些帮助来将 WolfSSL 中存在的几乎所有加密算法从软件实现重新定位到 STM32 加密硬件。

根据ST的Cube HAL框架,HW Encrytion支持的算法有

STM32F437x/439x
– AES: CFB, OFB, XTS, CCM, GCM, CMAC, KeyWrap
Key size: 128, 192, 256 bit Crypto accelerator
– ECC: Key generation, Scalar multiplication, ECDSA Random number
generator (RNG) – RSA encryption/decryption functions with PKCS#1v1.5

所以我需要帮助更改 WolfSSL 中的这些算法,以便它们使用 STM32 HW Acc。如果有人可以提供此示例,将不胜感激。

我也在 WolfSSL 论坛上问过这个问题。如果我在那里发现任何有趣的东西,我会在这里更新以供其他人使用 谢谢!

您使用的是哪个版本的 wolfSSL? wolfSSL 最近添加了对 CubeMX HAL 的支持。如果您没有 wolfSSLv3.10.0,请从此处的下载页面下载:https://wolfssl.com/wolfSSL/download/downloadForm.php or get it from the wolfSSL github repository: https://github.com/wolfSSL/wolfssl.git

在 /wolfssl/wolfcrypt/settings.h

的 STM32F2 部分中有 WOLFSSL_STM32_CUBEMX 的新定义
#ifdef WOLFSSL_STM32F2
    #define SIZEOF_LONG_LONG 8
    #define NO_DEV_RANDOM
    #define NO_WOLFSSL_DIR
    #undef  NO_RABBIT
    #define NO_RABBIT
    #undef  NO_64BIT
    #define NO_64BIT
    #define STM32F2_RNG
    #define STM32F2_CRYPTO
    #if !defined(__GNUC__) && !defined(__ICCARM__)
        #define KEIL_INTRINSICS
    #endif
    #define NO_OLD_RNGNAME
    #ifdef WOLFSSL_STM32_CUBEMX   // <--- New section for HAL support in version 3.10.0
        #include "stm32f2xx_hal.h"
        #ifndef STM32_HAL_TIMEOUT
            #define STM32_HAL_TIMEOUT   0xFF
        #endif
    #else
        #include "stm32f2xx.h"
        #include "stm32f2xx_cryp.h"
        #include "stm32f2xx_hash.h"
    #endif /* WOLFSSL_STM32_CUBEMX */
#endif

此定义增加了对将 AES、DES3 和 RANDOM 操作卸载到硬件的支持。如果您希望移植其他算法,请使用 /wolfcrypt/src/aes.c 中被 WOLFSSL_STM32_CUBEMX 定义包围的部分作为参考。这是在函数 wc_AesEncrypt 中添加 HAL API 的简短示例。源代码来自 https://github.com/wolfSSL/wolfssl/blob/master/wolfcrypt/src/aes.c#L208:

static int wc_AesEncrypt(Aes* aes, const byte* inBlock, byte* outBlock)
{
    int ret = 0;
#ifdef WOLFSSL_STM32_CUBEMX
    CRYP_HandleTypeDef hcryp;

    /* load key into correct registers */
    switch(aes->rounds) {
        case 10: /* 128-bit key */
            hcryp.Init.KeySize = CRYP_KEYSIZE_128B;
            break;
        case 12: /* 192-bit key */
            hcryp.Init.KeySize = CRYP_KEYSIZE_192B;
            break;
        case 14: /* 256-bit key */
            hcryp.Init.KeySize = CRYP_KEYSIZE_256B;
            break;
        default:
            break;
    }

    XMEMSET(&hcryp, 0, sizeof(CRYP_HandleTypeDef));
    hcryp.Instance = CRYP;
    hcryp.Init.DataType = CRYP_DATATYPE_8B;
    hcryp.Init.pKey = (uint8_t*)aes->key;

    HAL_CRYP_Init(&hcryp);

    if (HAL_CRYP_AESECB_Encrypt(&hcryp, (uint8_t*)inBlock, AES_BLOCK_SIZE,
                                            outBlock, STM32_HAL_TIMEOUT) != HAL_OK) {
        ret = WC_TIMEOUT_E;
    }

    HAL_CRYP_DeInit(&hcryp);
#else
... other non-cubemx support implementations below