Cryptographie d'allumette : Comment faire tenir ECDSA dans un microcontrôleur bon marché
Lorsqu'il s'agit de protéger des données dans l'IoT ou du matériel bon marché, les développeurs se heurtent souvent à un mur. Essayez de déployer un OpenSSL complet sur un AVR 8 bits ou un faible ARM Cortex-M0. Plus probablement qu'autre chose, votre firmware ne rentrera tout simplement pas dans la mémoire, et même s'il y rentre, il ne restera aucune ressource pour la logique principale de l'application. C'est là que le projet micro-ecc devient utile—il fait une seule chose, mais il le fait sacrément bien.
Quel est l'intérêt de ce projet
micro-ecc est une implémentation compacte des algorithmes ECDH (échange de clés) et ECDSA (signature numérique) en C. L'auteur du projet, Ken MacKay, avait clairement pour objectif de créer une bibliothèque qui fonctionnerait partout où il y a au moins un processeur.
Le principal tour de force ici est l'abandon complet de l'allocation dynamique de mémoire. Pas de malloc ni de tas, juste la pile et le stockage statique. Pour les systèmes embarqués, c'est critique : vous savez exactement combien de mémoire la cryptographie consommera au moment de la compilation, et vous ne craignez pas la fragmentation ni les fuites à l'exécution.
Ce que la bibliothèque peut faire
La bibliothèque prend en charge cinq courbes standard, dont la populaire secp256r1 (aussi connue sous le nom de P-256) et la secp256k1 « Bitcoin ».
Les principales fonctionnalités ressemblent à ceci :
- Fonctionne sur les architectures 8, 32 et 64 bits.
- Protégé contre les attaques par canal auxiliaire connues.
- Écrit en C pur, mais il y a des extraits en assembleur pour AVR et ARM afin de maximiser la vitesse.
- Distribué sous la licence libérale BSD 2 clauses.
Au fait, si vous travaillez avec Arduino, le projet est disponible directement dans le Gestionnaire de bibliothèques. Pas besoin de télécharger quoi que ce soit manuellement—trouvez simplement micro-ecc et ajoutez-le à votre croquis.
Petit code pour de grandes tâches
L'auteur affirme que le code est optimisé pour la taille. Dans le monde des microcontrôleurs, c'est souvent plus important que la vitesse brute. Si vous avez juste besoin de vérifier une signature de mise à jour de firmware une fois par mois, peu importe que cela prenne 100 ms ou 500 ms. Ce qui compte, c'est que le code de vérification ne mange pas 80 % de votre mémoire flash.
Cependant, il y a des optimisations optionnelles dans le code. Par exemple, grâce à uECC_OPTIMIZATION_LEVEL, vous pouvez ajuster les performances. Mais attention : avec des niveaux d'optimisation élevés pour les plateformes ARM, GCC peut nécessiter des drapeaux spécifiques comme -fomit-frame-pointer, sinon tout pourrait se casser.
À quoi cela ressemble dans le code
La bibliothèque a une interface minimaliste. Pour commencer, vous copiez juste quelques fichiers dans votre projet et incluez le fichier d'en-tête.
#include "uECC.h"
// Создаем ключи
uint8_t public_key[64];
uint8_t private_key[32];
const struct uECC_Curve_t * curve = uECC_secp256r1();
uECC_make_key(public_key, private_key, curve);
Les points de courbe sont représentés sous forme non compressée sans le préfixe 0x04 par défaut. Si vous avez besoin d'économiser chaque octet lors de la transmission par radio, la bibliothèque fournit les fonctions uECC_compress() et uECC_decompress().
À qui cela s'adresse
Je vois plusieurs scénarios où micro-ecc est tout simplement indispensable. Premièrement, l'authentification des appareils. Par exemple, quand votre capteur doit prouver au serveur qu'il est bien ce qu'il est, pas une contrefaçon. ECDSA est parfait pour générer une telle signature.
Deuxièmement, le Secure Boot. Si vous écrivez un bootloader personnalisé pour STM32 ou un AVR, micro-ecc vous aidera à vérifier la signature d'une nouvelle image de firmware avant de l'écrire dans la flash.
Troisièmement, si vous créez de l'électronique portable ou des capteurs alimentés par batterie. Moins de cycles CPU passés sur les calculs, plus longtemps l'appareil dure. Les extraits en assembleur pour ARM et AVR seront très utiles ici.
Quelques notes pour la route
Malgré son côté awesome, le projet a ses bizarreries. Le README est assez laconique, donc pour les détails sur chaque fonction, vous devrez fouiller dans le uECC.h. La documentation réside directement dans les commentaires du code.
Si vous prévoyez de compiler le projet sur Windows, n'oubliez pas de lier la bibliothèque système advapi32.lib—elle est nécessaire pour travailler avec l'entropie. Et pour AVR, assure-z-vous d'activer l'optimisation du compilateur (-O1 et supérieur), sinon la bibliothèque peut ne pas fonctionner correctement en raison des spécificités de la gestion de la pile.
Dans l'ensemble, c'est un excellent exemple de ce à quoi devrait ressembler une bibliothèque spécialisée : un focus étroit, des dépendances minimales et un comportement prévisible. Si votre matériel est trop faible pour TLS mais que vous avez besoin de sécurité—micro-ecc mérite définitivement une place dans votre src/lib.