Portage de la bibliothèque CorePKCS11 - FreeRTOS

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Portage de la bibliothèque CorePKCS11

La bibliothèque CorePKCS11 contient une implémentation fictive logicielle de l'interface PKCS #11 (API) qui utilise la fonctionnalité cryptographique fournie par Mbed TLS. Le stockage des clés privées dans la mémoire flash à usage général peut être pratique dans les scénarios d'évaluation et de prototype rapide. Dans les scénarios de production, afin de réduire les menaces de vol de données et de duplication de périphérique, nous vous recommandons d'utiliser du matériel cryptographique dédié. Le matériel cryptographique inclut les composants ayant des fonctionnalités qui empêchent que les clés de chiffrement secrètes soient exportées.

Pour utiliser le matériel cryptographique dédié avec FreeRTOS, portez l'API PKCS #11 API pour le matériel utilisé. Généralement, les fournisseurs de cryptoprocesseurs sécurisés, tels que Trusted Platform Module (TPM), Hardware Security Module (HSM), Secure Element ou tout autre type d'enclave matérielle sécurisée, distribuent une implémentation PKCS #11 avec le matériel. Vous pouvez ajouter la bibliothèque à CMake et à votre projet IDE, la compiler et exécuter la suite de tests PKCS #11.

Cette section décrit comment utiliser la bibliothèque FreeRTOS CorePKCS11 comme base de votre propre port de l'API PKCS #11. Seul un sous-ensemble de la norme PKCS #11 est implémenté, en mettant l'accent sur les opérations impliquant des clés asymétriques, la génération de nombres aléatoires et le hachage. Les appels de l'API PKCS #11 sont effectués par l'interface d'aide TLS afin d'effectuer l'authentification du client TLS pendantSOCKETS_Connect. Les appels de l'API PKCS #11 sont également effectués par notre flux de travail de mise en service du développeur pour importer un certificat client TLS et une clé privée pour l'authentification à l'AWS IoTCourtier MQTT. Ces deux cas d'utilisation, la mise en service et l'authentification du client TLS, nécessitent la seule implémentation d'un sous-ensemble réduit de la norme de l'interface PKCS #11.

Pour plus d'informations sur la bibliothèque FreeRTOS CorePKCS11, consultezBibliothèque FreeRTOS CorePKCS11dans leGuide de l'utilisateur de FreeRTOS.

Prerequisites

Pour procéder au portage de la bibliothèque CorePKCS11, vous avez besoin des éléments suivants :

Porting

Pour le portage de la bibliothèque CorePKCS11

  1. Portez les fonctions API PKCS #11 implémentées par CorePKCS11.

    L'API PKCS #11 dépend de l’implémentation de primitives cryptographiques, telles que le hachage SHA256 et la signature ECDSA(Elliptic Curve Digital Signature Algorithm).

    L'implémentation FreeRTOS de PKCS #11 utilise les primitives cryptographiques implémentées dans la bibliothèque mbedTLS. FreeRTOS inclut un port pour les mbedTLS. Si votre matériel cible décharge le chiffrement sur un module séparé, ou si vous souhaitez utiliser une implémentation logicielle des primitives cryptographiques autre que mbedTLS, vous devez modifier l'implémentation PKCS #11 existante.

  2. Portez la PAL (Platform Abstraction Layer) CorePKCS11 pour le stockage spécifique au périphérique du certificat et de la clé.

    Si vous décidez d'utiliser l'implémentation FreeRTOS de PKCS #11, vous aurez besoin d'un peu de personnalisation pour lire et écrire des objets cryptographiques sur une mémoire non volatile (NVM), par exemple, la mémoire flash embarquée.

    Les objets cryptographiques doivent être stockés dans une section de la NVM qui n'est pas initialisée et qui n'est pas effacée lors de la reprogrammation du périphérique. Les utilisateurs de la bibliothèque CorePKCS11 doivent être en mesure d'approvisionner les périphériques en informations d'identification, puis de reprogrammer le périphérique avec une nouvelle application pouvant accéder à ces informations d'identification via l'interface CorePKCS11.

    Les ports PAL CorePKCS11 doivent fournir un emplacement pour stocker :

    • Le certificat de périphérique client.

    • La clé privée de périphérique client.

    • La clé publique de périphérique client.

    • Une autorité de certification racine fiable

    • Une clé publique de vérification de code (ou un certificat qui contient la clé de vérification de code) pour le chargeur de démarrage sécurisé et les mises à jour Over-the-Air (OTA).

    • Un certificat de mise en service « juste-à-temps »

    freertos/vendors/vendor/boards/board/ports/pkcs11/core_pkcs11_pal.c contient des définitions vides pour les fonctions PAL. Vous devez fournir des portages au minimum pour les fonctions répertoriées dans ce tableau :

    Fonction Description
    PKCS11_PAL_Initialize Initialise la couche PAL. Appelé par la bibliothèque CorePKCS11 au début de sa séquence d'initialisation.
    PKCS11_PAL_SaveObject Écrit les données sur un espace de stockage non volatile.
    PKCS11_PAL_FindObject Utilise un CKA_LABEL PKCS #11 pour rechercher un objet PKCS #11 correspondant espace de stockage non volatile et renvoie le handle d'objet, le cas échéant.
    PKCS11_PAL_GetObjectValue Récupère la valeur d'un objet, en prenant l’exemple du handle.
    PKCS11_PAL_GetObjectValueCleanup Effectue un nettoyage pour l'appel de PKCS11_PAL_GetObjectValue. Peut être utilisée pour libérer de la mémoire dédiée à un appel PKCS11_PAL_GetObjectValue.
  3. Ajoutez la prise en charge d'une source d'entropie aléatoire cryptographique à votre port :

    • Si vos ports mbedTLS utilisent la bibliothèque pour la prise en charge de TLS et cryptographique sous-jacente, et que votre appareil dispose d'un véritable générateur de nombres aléatoires (TRNG) :

      1. Mise en œuvre dumbedtls_hardware_poll ()Pour lancer le générateur déterministe de bits aléatoires (DRBG) utilisé par mbedTLS pour produire un flux de bits aléatoire par cryptographie. La fonction mbedtls_hardware_poll() est située dans freertos/vendors/vendor/boards/board/ports/pkcs11/core_pkcs11_pal.c.

    • Si vos ports mbedTLS utilisent la bibliothèque pour la prise en charge TLS et cryptographique sous-jacente, mais que votre appareil n'a pas de TRNG :

      1. Effectuez une copie de freertos/libraries/3rdparty/mbedtls/include/mbedtls/config.h, et dans cette copie, supprimez les commentaires de MBEDTLS_ENTROPY_NV_SEED et commentez MBEDTLS_ENTROPY_HARDWARE_ALT.

        Enregistrez la version modifiée de config.h remplacé par freertos/vendors/vendor/boards/board/aws_tests/config_files/config.h. Ne remplacez pas le fichier d'origine.

      2. Implémentez les fonctions mbedtls_nv_seed_poll(), nv_seed_read_func() et nv_seed_write_func().

        Pour plus d'informations sur l'implémentation de ces fonctions, consultez les commentaires dans les fichiers d’en-tête mbedTLS mbedtls/inclure/mbedtls/entropy_poll.h et mbedtls/inclure/mbedtls/config.h.

    Important

    Un fichier de départ avec une source entropique approuvée par le NIST doit être fourni au périphérique à la fabrication.

    Note

    Si le programme de qualification FreeRTOS vous intéresse, veuillez lire nos exigences pourRNG.

    Pour plus d'informations sur les DRBG approuvés par le NIST et les sources entropiques, consultez les publications suivantes du NIST :

Testing

Si vous utilisez un IDE pour générer des projets de test, vous devez configurer le portage de votre bibliothèque dans le projet IDE.

Configuration du projet de test IDE

Si vous utilisez un IDE pour le portage et le test, vous devez ajouter des fichiers source au projet de test IDE avant de pouvoir tester votre code porté.

Important

Dans les étapes suivantes, assurez-vous d’ajouter les fichiers source à votre projet IDE depuis leur emplacement sur disque. Ne créez pas de copies de vos fichiers source.

Pour configurer la bibliothèque CorePKCS11 dans le projet IDE

  1. Ajoutez le fichier source freertos/vendors/vendor/boards/board/ports/pkcs11/core_pkcs11_pal.c au projet IDE aws_tests.

  2. Ajoutez tous les fichiers dans le répertoire freertos/libraries/abstractions/pkcs11 et ses sous-répertoires au projet d'IDE aws_tests.

  3. Ajoutez tous les fichiers dans le répertoire freertos/libraries/freertos_plus/standard/pkcs11 et ses sous-répertoires au projet d'IDE aws_tests. Ces fichiers implémentent des encapsuleurs pour les ensembles de fonctions PKCS # 11 couramment regroupés.

  4. Ajoutez le fichier source freertos/libraries/freertos_plus/standard/crypto/src/iot_crypto.c au projet IDE aws_tests. Ce fichier implémente la couche d’abstraction CRYPTO pour mbedTLS.

  5. Ajoutez tous les fichiers d'en-tête de la source et à partir de freertos/libraries/3rdparty/mbedtls et ses sous-répertoires au projet d'IDE aws_tests.

  6. Additionfreertos/libraries/3rdparty/mbedtls/includeandfreertos/libraries/abstractions/pkcs11au chemin à inclure du compilateur.

Configuration du fichier CMakeLists.txt

Si vous utilisez CMake pour générer votre projet de test, vous devez définir une cible de couche portable pour la bibliothèque dans votre fichier de liste CMake.

Pour définir la cible de couche portable d'une bibliothèque dans CMakeLists.txt, suivez les instructions de Couches portables FreeRTOS.

Le fichier de liste de modèles CMakeLists.txt sous freertos/vendors/vendor/boards/board/CMakeLists.txt inclut des exemples de définition cible de couche portable. Vous pouvez supprimer la mise en commentaire de la définition de la bibliothèque que vous portez et modifier celle-ci pour qu'elle corresponde à votre plateforme.

Consultez l'exemple suivant de définition de cible de couche portable pour la bibliothèque CorePKCS11 qui utilise l'implémentation logicielle basée sur mbedTLS de PKCS #11 et fournit un fichier PAL CorePKCS11 spécifique au port.

# PKCS11 afr_mcu_port(pkcs11_implementation DEPENDS AFR::pkcs11_mbedtls) target_sources( AFR::pkcs11_implementation::mcu_port INTERFACE "${afr_ports_dir}/pkcs11/core_pkcs11_pal.c" )

Configuration de votre environnement de test local

Après avoir configuré la bibliothèque dans votre projet IDE, vous devez configurer des fichiers à tester.

Pour la configuration des fichiers source et d'en-tête pour les tests PKCS #11

  1. Si vous avez porté la bibliothèque Secure Sockets, ouvrez freertos/libraries/freertos_plus/standard/utils/src/iot_system_init.c et, dans la fonction SYSTEM_Init(), annulez le commentaire des appels à SOCKETS_Init().

  2. Ouvrez freertos/vendors/vendor/boards/board/aws_tests/config_files/aws_test_runner_config.h et définissez la macro testrunnerFULL_PKCS11_ENABLED sur 1 pour activer le test PKCS #11.

Exécution des tests

Pour l’exécution des tests PKCS #11

  1. Générez le projet de test, puis flashez-le sur votre appareil pour l'exécuter.

  2. Vérifiez les résultats de test dans la console UART.

    ...

    Les tests sont terminés lorsque chacun des tests est réussi.

Validation

Pour qualifier officiellement un périphérique pour FreeRTOS, vous devez valider le code source porté du périphérique avecAWS IoTDevice Tester. Suivez les instructions de la sectionUtiliserAWS IoTDevice Tester pour FreeRTOSDans le Manuel de l'utilisateur de FreeRTOS pour configurer Device Tester pour la validation de port. Pour tester le port d'une bibliothèque spécifique, le groupe de test correct doit être activé dans le fichier device.json du dossier configs de Device Tester.

Une fois que vous avez terminé le portage de la bibliothèque CorePKCS11 sur votre appareil, vous pouvez commencer le portage de la bibliothèque TLS. Pour obtenir des instructions, veuillez consulter Portage de la bibliothèque TLS.