STM32F437 Аппаратная интеграция криптографических функций с WolfSSL

У меня есть проект, который использует DTLS через соединения. На данный момент мне удалось запустить WolfSSL на контроллерах, используя только программную реализацию, но время, необходимое для настройки начального соединения, является отвратительным, и сейчас я хочу использовать HW crypto в MCU для ускорения работы. Из реализации STM32F2, предоставленной WolfSSL, я видел только несколько алгоритмов шифрования, перенаправляемых на аппаратное шифрование. В моей реализации DTLS я использую довольно много различных алгоритмов, предоставленных WolfCrypt. Поскольку я не очень разбираюсь в деталях библиотеки SSL очень низкого уровня, мне нужна помощь, чтобы перенастроить практически все алгоритмы шифрования, имеющиеся в WolfSSL, от программной реализации до STM32 Crypto Hardware.

Согласно платформе 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. В случае, если я найду что-нибудь интересное, я буду обновлять здесь для других. Спасибо!

1 ответ

Решение

С какой версией wolfSSL вы работаете? wolfSSL недавно добавил поддержку CubeMX HAL. Если у вас нет wolfSSLv3.10.0, загрузите его со страницы загрузки здесь: https://wolfssl.com/wolfSSL/download/downloadForm.php или получите его из репозитория wolfSSL github: https://github.com/wolfSSL/wolfssl.git

В разделе STW32F2 файла /wolfssl/wolfcrypt/settings.h есть новое определение для 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 в качестве ссылки. Вот краткий пример добавления HAL API в функцию wc_AesEncrypt. Исходный код был взят из 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
Другие вопросы по тегам