|
| 1 | +# User-defined Crypto Ciphersuite Used by Azure IoT Sample |
| 2 | + |
| 3 | +## Introduction |
| 4 | + |
| 5 | +[Azure RTOS NetX Crypto](https://learn.microsoft.com/azure/rtos/netx/netx-crypto/chapter1) is the default crypto ciphersuite used by [Azure RTOS NetX Secure](https://learn.microsoft.com/azure/rtos/netx-duo/netx-secure-tls/chapter1) TLS stack in [Azure IoT Sample](https://github.com/azure-rtos/samples). If clients want to use different crypto algorithm implementation, such as hardware security engine, TF-M PSA, or PKCS#11 based crypto methods, this user guide will show how to implement user-defined crypto ciphersuite and integrate it with Azure IoT Sample. |
| 6 | + |
| 7 | +## General Process |
| 8 | + |
| 9 | +There are four steps to implement and utilize a user-defined crypto ciphersuite. |
| 10 | + |
| 11 | +1. Declare a [NX_CRYPTO_METHOD](https://github.com/azure-rtos/netxduo/blob/master/crypto_libraries/inc/nx_crypto.h#L320) struct for your crypto algorithm, which contains initialization, cleanup and crypto operations function pointers for the crypto method in use. |
| 12 | + |
| 13 | +2. Define initialization, cleanup and crypto operation functions for this crypto method. |
| 14 | + |
| 15 | +3. Define a struct to save meta data such as scrtch buffer, algotithm id, etc, which will be passed into above functions as as input parameter. |
| 16 | + |
| 17 | +4. Add this newly defined `NX_CRYPTO_METHOD` into tls crypto array `_nx_azure_iot_tls_supported_crypto[]`, which will be automatically initialized during tls session creation and then utilized by NetX Secure TLS stack. |
| 18 | + |
| 19 | +## Example |
| 20 | + |
| 21 | +[The STMicroelectronics B-U585I-IOT02A sample project](https://github.com/azure-rtos/samples/releases/download/v6.1_rel/Azure_RTOS_6.1_B-U585I-IOT02A_IAR_Samples_Beta_2021_10_01.zip) implements [TF-M PSA](https://www.trustedfirmware.org/projects/tf-m/) based ECDSA crypto ciphersuite for TLS device authentication. We will use it an an example to demonstrate the above process. |
| 22 | + |
| 23 | +All the changed files are under the path *B-U585I-IOT02A\Projects\B-U585I-IOT02A\Applications\TFM\TFM_Appli\NonSecure\Projects\B-U585I-IOT02A\Applications\TFM\TFM_Appli\NonSecure*. |
| 24 | + |
| 25 | +1. In *psa_crypto_ciphersuites/nx_crypto_psa_crypto_ciphersuites.c*, declare NX_CRYPTO_METHOD struct `crypto_method_ecdsa_psa_crypto` for PSA based ECDSA crypto method. |
| 26 | + |
| 27 | +```c |
| 28 | +NX_CRYPTO_METHOD crypto_method_ecdsa_psa_crypto = |
| 29 | +{ |
| 30 | + NX_CRYPTO_DIGITAL_SIGNATURE_ECDSA, /* ECDSA crypto algorithm name */ |
| 31 | + 0, /* Key size in bits */ |
| 32 | + 0, /* IV size in bits */ |
| 33 | + 0, /* ICV size in bits, not used */ |
| 34 | + 0, /* Block size in bytes */ |
| 35 | + sizeof(NX_CRYPTO_ECDSA_PSA_CRYPTO), /* Metadata size in bytes */ |
| 36 | + _nx_crypto_method_ecdsa_psa_crypto_init, /* ECDSA initialization routine */ |
| 37 | + _nx_crypto_method_ecdsa_psa_crypto_cleanup, /* ECDSA cleanup routine */ |
| 38 | + _nx_crypto_method_ecdsa_psa_crypto_operation, /* ECDSA operation */ |
| 39 | +}; |
| 40 | +``` |
| 41 | + |
| 42 | +2. In *psa_crypto_ciphersuites/nx_crypto_ecdsa_psa_crypto.c*, define initialization, cleanup and crypto operations for this crypto method. |
| 43 | +- `_nx_crypto_method_ecdsa_psa_crypto_init()` for parameter check and metadata initialization; |
| 44 | +- `_nx_crypto_method_ecdsa_psa_crypto_cleanup()` for metadata clean up; |
| 45 | +- `_nx_crypto_method_ecdsa_psa_crypto_operation()` to perform ECDSA operations, including ECDSA signature, verify, EC curve setting, with [PSA crypto APIs](https://armmbed.github.io/mbed-crypto/html/index.html). |
| 46 | + |
| 47 | +3. In *psa_crypto_ciphersuites/nx_crypto_ecdsa_psa_crypto.h*, define a struct `NX_CRYPTO_ECDSA_PSA_CRYPTO` to save metadata used by crypto functions, such as scrtch buffer, psa key handle, etc. |
| 48 | + |
| 49 | +4. In *Src/nx_azure_iot_ciphersuites.c*, add this newly defined NX_CRYPTO_METHOD `crypto_method_ecdsa_psa_crypto` into `_nx_azure_iot_tls_supported_crypto[]`. |
| 50 | + |
| 51 | +```c |
| 52 | +const NX_CRYPTO_METHOD *_nx_azure_iot_tls_supported_crypto[] = |
| 53 | +{ |
| 54 | + &crypto_method_hmac, |
| 55 | + &crypto_method_hmac_sha256, |
| 56 | + &crypto_method_tls_prf_sha256, |
| 57 | + &crypto_method_sha256, |
| 58 | + &crypto_method_aes_cbc_128, |
| 59 | + &crypto_method_rsa, |
| 60 | +#ifdef NX_SECURE_ENABLE_ECC_CIPHERSUITE |
| 61 | +#ifdef ENABLE_PSA_CRYPTO_CIPHERSUITES |
| 62 | + &crypto_method_ecdsa_psa_crypto, /* PSA based ECDSA crypto method */ |
| 63 | +#else |
| 64 | + &crypto_method_ecdsa, |
| 65 | +#endif |
| 66 | + &crypto_method_ecdhe, |
| 67 | + &crypto_method_ec_secp384, |
| 68 | + &crypto_method_ec_secp256, |
| 69 | +#endif /* NX_SECURE_ENABLE_ECC_CIPHERSUITE */ |
| 70 | +}; |
| 71 | +``` |
| 72 | + |
| 73 | +With these changes, the user-defined PSA based ECDSA crypto method will be used by NX secure TLS stack in Azure IoT Sample. |
0 commit comments