Banc de mesure des capacites cryptographiques et reseau securisees d'un ESP32, ecrit directement sur ESP-IDF (pas de couche Arduino).
Il repond a une question precise : qu'est-ce qu'un ESP32 sait reellement soutenir en chiffrement, en TLS, en 802.1X et en SNMPv3, et a quel prix ?
Materiel du banc de reference :
| Puce | ESP32-D0WDQ6 revision v1.0, deux coeurs a 240 MHz |
| Flash | 4 Mo, pas de PSRAM |
| Liaison | CP210x sur COM16 |
| ESP-IDF | v5.5.5 |
| Domaine | Contenu |
|---|---|
| Chiffrement | MD5, SHA-1, SHA-2 (224 a 512), SHA-3, HMAC, CMAC ; AES en CBC, CTR, CFB, OFB, GCM, CCM et XTS sur 128/192/256 bits ; ChaCha20-Poly1305 ; 3DES ; le tout sur trois tailles de message |
| Derivation de cles | PBKDF2-HMAC-SHA1/SHA256/SHA512, dont les parametres exacts de la cle maitresse WPA2-PSK ; HKDF-SHA256/384/512 |
| X.509 | Analyse de certificats RSA et ECDSA, validation de chemin a 1 et 2 niveaux, avec et sans verification du nom |
| Asymetrique | RSA 2048/3072/4096 en signature PKCS#1 v1.5 et PSS, verification, generation de cles ; ECDSA P-256/P-384/P-521 |
| Echange de cles | ECDH sur P-256, P-384, P-521, X25519, Brainpool, secp256k1 ; DH 2048 bits en corps fini |
| WiFi securise | Association WPA2-PSK, WPA3-SAE, balayage actif et passif, protection des trames de gestion |
| 802.1X | EAP-TLS, EAP-TTLS avec MSCHAPv2 et PAP, PEAP ; validation du certificat RADIUS contre l'autorite du banc |
| TLS | TLS 1.2 et 1.3 ; suites ECDHE-RSA, ECDHE-ECDSA, DHE-RSA, RSA statique, AES-GCM, AES-CBC, ChaCha20 ; authentification mutuelle avec identite RSA puis ECDSA ; reprise de session par ticket ; debit applicatif |
| Syslog sur TLS | RFC 5424 et RFC 5425 (comptage d'octets), transport mutuellement authentifie, cout unitaire et debit soutenu |
| HTTPS | Autorite de certification propre, authentification mutuelle, connexion neuve contre connexion maintenue |
| SNMPv3 | USM complet : six protocoles d'authentification (MD5, SHA-1, SHA-224/256/384/512), quatre de confidentialite (DES, AES-128/192/256), derivation et localisation de cles, message complet code et decode, plus un agent interrogeable depuis le PC |
L'ESP32 de premiere generation accelere en materiel AES, SHA et l'arithmetique multiprecision de RSA. Il n'accelere pas les courbes elliptiques, contrairement aux ESP32-S3, C3 et H2.
Consequence contre-intuitive : sur cette puce, une signature ECDSA P-256 n'est pas forcement plus rapide qu'une signature RSA-2048, et une poignee de main ECDHE coute cher parce que la multiplication scalaire reste entierement logicielle. Le banc rend ce compromis chiffrable, courbe par courbe et suite par suite.
C'est ce qui doit guider le choix d'une suite TLS et d'un type de certificat client sur ce materiel — pas les intuitions issues des serveurs.
ESP32-D0WDQ6 a 239,99 MHz, ESP-IDF v5.5.5, mbedTLS 3.6.6, accelerateurs AES, SHA et MPI actifs. Medianes.
| Operation | Mediane |
|---|---|
| RSA-2048 verification | 0,88 ms |
| RSA-3072 verification | 1,51 ms |
| RSA-4096 verification | 2,28 ms |
| RSA-2048 signature | 145 ms |
| RSA-4096 signature | 548 ms |
| ECDSA P-256 signature | 132 ms |
| ECDSA P-256 verification | 258 ms |
| ECDSA P-521 verification | 748 ms |
Verifier une signature RSA-2048 est ici 290 fois plus rapide que verifier une signature ECDSA P-256. L'exponentiation publique RSA tombe sur le multiplieur materiel ; la verification ECDSA, elle, demande deux multiplications scalaires entierement logicielles.
Consequence directe : sur cette puce, un certificat serveur RSA se valide bien plus vite qu'un certificat ECDSA, a rebours de ce qu'on observe sur un serveur. Cote signature en revanche, ECDSA P-256 et RSA-2048 se valent.
| Operation | Mediane |
|---|---|
| X25519, secret partage | 93 ms |
| ECDH P-256, secret partage | 122 ms |
| DH-2048 en corps fini, secret partage | 156 ms |
| ECDH P-384, secret partage | 198 ms |
| ECDH secp256k1, secret partage | 201 ms |
| ECDH P-521, secret partage | 346 ms |
| ECDH Brainpool P-256, secret partage | 2 166 ms |
Deux enseignements inattendus. D'abord, le Diffie-Hellman classique sur 2048 bits reste competitif face a ECDH P-256 : il beneficie du multiplieur materiel que les courbes n'utilisent pas. Ensuite, Brainpool P-256 est 18 fois plus lent que NIST P-256 a taille de cle identique : mbedTLS applique aux courbes NIST une reduction modulaire specialisee dont Brainpool ne beneficie pas.
| Algorithme | Debit |
|---|---|
| SHA-384 | 26,1 Mio/s |
| SHA-512 | 25,9 Mio/s |
| SHA-1 | 16,3 Mio/s |
| SHA-256 | 16,0 Mio/s |
| MD5 | 12,9 Mio/s |
| SHA-224 | 3,4 Mio/s |
| SHA3-256 | 0,40 Mio/s |
SHA-384 et SHA-512 depassent SHA-256 : l'accelerateur traite des blocs de 128 octets au lieu de 64. En revanche SHA-224 s'effondre a un cinquieme de SHA-256 — le materiel ne le prend pas en charge, il retombe en logiciel. Un detail de configuration lourd de consequences pour SNMPv3, dont un profil normalise repose precisement sur SHA-224.
| Algorithme | Debit |
|---|---|
| AES-128-CBC | 10,8 Mio/s |
| AES-128-CTR | 6,2 Mio/s |
| ChaCha20-Poly1305 | 3,8 Mio/s |
| AES-128-GCM | 2,3 Mio/s |
| AES-128-CCM | 0,9 Mio/s |
| 3DES-CBC | 0,6 Mio/s |
ChaCha20-Poly1305 depasse AES-GCM de 63 %, malgre l'accelerateur AES : dans GCM, c'est la multiplication dans le corps de Galois qui domine, et elle s'execute en logiciel. La taille de cle AES (128, 192 ou 256) n'a, elle, aucun effet mesurable — le materiel absorbe les tours supplementaires.
C'est la contre-epreuve directe du resultat precedent, sans TLS ni reseau.
| Operation | Mediane |
|---|---|
| Analyse d'un certificat ECDSA P-256 | 1,94 ms |
| Analyse d'un certificat RSA-2048 | 2,40 ms |
| Validation d'une chaine a 1 niveau, RSA | 2,52 ms |
| Validation d'une chaine a 2 niveaux, RSA | 3,58 ms |
| Validation a 2 niveaux + verification du nom | 3,61 ms |
| Validation d'une chaine a 1 niveau, ECDSA | 320 ms |
Valider une chaine ECDSA coute 127 fois plus cher qu'une chaine RSA sur cette puce. Un niveau de chaine RSA supplementaire ne coute qu'une milliseconde, et la verification du nom d'hote est gratuite (0,03 ms) : rien ne justifie de la desactiver.
| Operation | Mediane |
|---|---|
| PBKDF2-HMAC-SHA1, 4096 iterations (PMK WPA2-PSK) | 657 ms |
| PBKDF2-SHA256, 1 000 iterations | 109 ms |
| PBKDF2-SHA256, 10 000 iterations | 1 089 ms |
| PBKDF2-SHA512, 10 000 iterations | 1 000 ms |
| HKDF-SHA256 ou SHA-512 | 0,30 ms |
Toute connexion a un reseau WPA2-PSK coute 657 ms de calcul pur, avant meme la poignee de main a quatre voies : c'est la derivation de la cle maitresse a partir de la phrase secrete, imposee par IEEE 802.11i. Sur les 2 a 3 secondes d'une association WPA2, une part notable vient de la.
Un equipement qui se reconnecte souvent au meme reseau a tout interet a
conserver la cle derivee plutot qu'a la recalculer — c'est exactement ce que
fait CONFIG_ESP_WIFI_STA_DISCONNECTED_PM et ce que permet la reconnexion
rapide 802.11r.
A l'oppose, HKDF ne coute rien (0,3 ms) : la hierarchie de cles de TLS 1.3 n'est pas un poste de cout.
Noter encore une fois l'inversion : PBKDF2-SHA512 est plus rapide que PBKDF2-SHA256 a nombre d'iterations egal, l'accelerateur traitant des blocs de 128 octets au lieu de 64.
| Operation | Debit ou duree |
|---|---|
| AES-128-OFB, 16 Kio | 7 103 Kio/s |
| AES-128-CFB128, 16 Kio | 6 685 Kio/s |
| AES-128-GCM, 16 Kio | 2 318 Kio/s |
| AES-128-XTS, 4 Kio | 1 805 Kio/s |
| AES-256-XTS, 4 Kio | 1 592 Kio/s |
| AES-128-CMAC, 1 Kio | 0,587 ms |
| HMAC-SHA-256, 1 Kio | 0,168 ms |
| AES-128-CCM, 16 Kio | 908 Kio/s |
| AES-256-CCM, 16 Kio | 800 Kio/s |
Trois enseignements. La taille de cle AES reste sans effet : 128, 192 et 256 bits donnent le meme debit en GCM, le materiel absorbant les tours supplementaires — l'ecart n'apparait qu'en CCM et XTS, ou une partie du travail est logicielle.
XTS plafonne a 1,8 Mio/s, six fois moins qu'AES-CBC : le mode demande deux operations AES par bloc plus une multiplication dans un corps de Galois. C'est l'ordre de grandeur du surcout a attendre du chiffrement de flash de l'ESP32 sur les lectures non mises en cache.
HMAC bat CMAC d'un facteur 3,5 (0,168 ms contre 0,587 sur 1 Kio), bien que CMAC s'appuie sur l'accelerateur AES : le mode CMAC enchaine les blocs sans pouvoir les traiter d'un seul appel, et repaie le cout fixe du peripherique a chaque bloc. Pour un besoin d'integrite pure, HMAC-SHA-256 est le bon choix sur cette puce.
| Operation | Mediane |
|---|---|
| Derivation de cle, SHA-256 | 615 ms |
| Derivation de cle, SHA-1 | 607 ms |
| Derivation de cle, SHA-512 | 417 ms |
| Derivation de cle, MD5 | 169 ms |
| Localisation de cle | 0,02 a 0,18 ms |
| Etiquette HMAC-192-SHA-256 | 0,34 ms |
| Chiffrement AES-128-CFB | 0,03 ms |
| Chiffrement DES-CBC | 0,09 ms |
| Message complet SHA-256/AES-128, codage | 0,40 ms |
| Message complet SHA-256/AES-128, decodage | 0,39 ms |
La derivation de cle est plus de mille cinq cents fois plus couteuse que le traitement d'un message. Un agent qui derive ses cles a chaque demarrage paie une demi-seconde par protocole ; un agent qui les conserve ne paie plus rien. C'est la seule optimisation qui compte reellement dans USM.
Une fois les cles en place, l'ESP32 traite environ 2 500 messages SNMPv3 par seconde en SHA-256 avec AES-128, chiffrement et authentification compris.
Premier constat surprenant : MD5 derive 3,6 fois plus vite que SHA-256, alors que SHA-256 beneficie de l'accelerateur materiel et pas MD5.
L'explication tient au decoupage. Le RFC 3414 fait condenser le megaoctet par blocs de 64 octets, soit 16 384 appels successifs. L'accelerateur materiel a un cout fixe par appel — verrouillage du peripherique, transfert des registres — qui domine completement a cette granularite. Le banc mesure donc la meme derivation soumise par blocs de 4 Kio, qui produit exactement la meme cle :
| Protocole | Blocs de 64 o | Blocs de 4 Kio | Gain |
|---|---|---|---|
| HMAC-SHA-96 (SHA-1) | 610 ms | 147 ms | 4,2x |
| HMAC-192-SHA-256 | 617 ms | 147 ms | 4,2x |
| HMAC-256-SHA-384 | 417 ms | 124 ms | 3,4x |
| HMAC-384-SHA-512 | 417 ms | 124 ms | 3,4x |
| HMAC-MD5-96 | 170 ms | 162 ms | 1,05x |
| HMAC-128-SHA-224 | 392 ms | 384 ms | 1,02x |
La lecture est nette : seuls les algorithmes reellement pris en charge par le materiel gagnent au regroupement. MD5 et SHA-224 ne bougent pas — ce qui confirme par la mesure que l'accelerateur SHA de l'ESP32 ne traite pas SHA-224, alors qu'il traite SHA-1, SHA-256, SHA-384 et SHA-512.
Consequence pratique : une implementation SNMPv3 embarquee qui suit litteralement le decoupage du code de reference laisse un facteur quatre sur la table, pour une modification de quelques lignes et sans le moindre ecart a la norme.
Mesures sur WiFi 2,4 GHz, serveur de test sur le meme reseau local.
| Profil | Mediane |
|---|---|
| Reprise par ticket, TLS 1.2 | 32 ms |
| RSA statique AES128 (sans confidentialite persistante) | 159 ms |
| Reprise par ticket, TLS 1.3 | 270 ms |
| Sans verification de chaine | 315 ms |
| TLS 1.3, chaine RSA | 346 ms |
| ECDHE-RSA AES128-GCM | 370 ms |
| DHE-RSA AES128-GCM | 393 ms |
| mTLS, identite RSA | 733 ms |
| TLS 1.3, chaine ECDSA | 783 ms |
| ECDHE-ECDSA AES128-GCM | 806 ms |
| mTLS, identite ECDSA | 972 ms |
Trois lectures :
Le choix du certificat serveur pese lourd. Une chaine ECDSA coute 806 ms la ou une chaine RSA en coute 370 : plus du double, en TLS 1.2 comme en 1.3. C'est la traduction directe des 258 ms de verification ECDSA mesures plus haut. Sur cette puce, une PKI RSA est le bon choix.
La reprise TLS 1.2 est le meilleur levier disponible : 32 ms contre 370, soit un facteur onze. Mais la reprise TLS 1.3 ne rapporte que 270 ms, huit fois moins efficace. La raison est structurelle : TLS 1.3 combine par defaut le secret pre-partage avec un echange ECDHE frais, pour garantir la confidentialite persistante — et l'ESP32 repaie donc integralement la multiplication scalaire que la reprise 1.2 evitait. Un equipement qui rouvre souvent ses sessions gagne ici a rester en TLS 1.2.
La verification de chaine ne coute que 55 ms (370 contre 315 sans verification) : la desactiver ne se justifie jamais.
| Mesure | Mediane | Debit |
|---|---|---|
| Aller-retour TLS, 64 o | 4,4 ms | — |
| Aller-retour TLS, 16 Kio | 27,5 ms | 1,14 Mio/s |
| Message syslog de 128 o | 1,0 ms | 448 msg/s en rafale |
| HTTPS 1 Kio, connexion neuve | 435 ms | — |
| HTTPS 1 Kio, connexion neuve avec mTLS | 775 ms | — |
| HTTPS 1 Kio, connexion maintenue | 250 ms | — |
| HTTPS 64 Kio, connexion neuve avec mTLS | 896 ms | 71 Kio/s |
| HTTPS 64 Kio, connexion maintenue | 82 ms | 777 Kio/s |
Le contraste sur les 64 Kio resume tout le banc : maintenir la connexion divise le temps par onze et le debit est multiplie par dix. Une fois la session ouverte, l'ESP32 soutient sans peine plus de 1 Mio/s en TLS et pres de 450 journaux par seconde. C'est l'etablissement qui coute, pas le transport.
Ces chiffres sont reproductibles avec crypto, snmp, puis la campagne reseau :
.\tools\run_network_bench.ps1 -Port COM16- ESP-IDF v5.5.x installe (
~/esp/esp-idfsur ce poste) - Python 3.9 ou plus recent
- OpenSSL (celui de Git for Windows convient)
A faire avant la premiere compilation : les certificats sont embarques dans le binaire, leur absence fait echouer l'edition de liens.
.\pki\gen_pki.ps1 # detecte l'IP du PC
.\pki\gen_pki.ps1 -ServerIp 192.168.1.50 # ou explicitementLe script produit une chaine RSA a deux niveaux, une chaine ECDSA, les certificats serveur, client, RADIUS, et les cles nues de mesure. L'adresse IP donnee est inscrite dans le SAN du certificat serveur : si l'IP du PC change, il faut relancer le script puis recompiler.
Les cles privees des autorites restent dans pki/out et ne sont jamais
embarquees.
. .\tools\idf_env.ps1
idf.py menuconfig # menu "BenchTLSESP32 - configuration du banc"Au minimum : le SSID et le mot de passe WPA2, et l'adresse du PC.
idf.py build
idf.py -p COM16 flash monitorpython .\tools\bench_servers.pyUn seul processus fournit les quatre services : echo TLS sur chaine RSA (8443) et sur chaine ECDSA (8445), HTTPS (8444), collecteur syslog (6514).
Pensez a autoriser ces ports dans le pare-feu Windows, sans quoi les mesures reseau echoueront toutes sans message explicite cote ESP32 :
# PowerShell administrateur
New-NetFirewallRule -DisplayName "BenchTLSESP32 - serveurs de test" `
-Direction Inbound -Action Allow -Protocol TCP `
-LocalPort 8443,8444,8445,6514 -RemoteAddress 192.168.1.0/24 -Profile AnyLa campagne reseau complete tient ensuite en une commande, qui demarre les serveurs, pilote la carte et les arrete :
.\tools\run_network_bench.ps1 -Port COM16Le serveur RADIUS tourne dans Docker et se valide sans WiFi :
cd tools\freeradius
docker compose up -d
.\test_eap.ps1 # EAP-TLS, TTLS/MSCHAPv2, TTLS/PAP, PEAP/MSCHAPv2test_eap.ps1 rejoue une conversation 802.1X complete contre le serveur avec
eapol_test, en basculant default_eap_type entre chaque famille de methode
puis en restaurant la configuration. Les quatre scenarios doivent passer avant
de brancher un point d'acces : cela separe proprement un probleme de
configuration RADIUS d'un probleme de lien radio.
Il reste ensuite a fournir un point d'acces annoncant du WPA-Enterprise et
pointant vers le poste. Voir tools/freeradius/README.md.
Le firmware demarre sur une console. Ce choix est deliberé : relancer une mesure sans redemarrer evite de repayer l'association WiFi et la synchronisation d'horloge.
bench> help liste des commandes
bench> crypto toutes les mesures locales, sans reseau
bench> crypto hash seulement les fonctions de hachage
bench> crypto asym keygen signatures + generation de cles (tres long)
bench> wifi connect association WPA2 puis mise a l'heure
bench> wifi connect peap association 802.1X en PEAP
bench> wifi scan balayage actif et passif
bench> wifi assoc temps d'association de tous les modes configures
bench> tls poignees de main, mTLS, reprise, debit
bench> syslog syslog sur TLS mutuel
bench> https requetes HTTPS
bench> snmp USM complet
bench> snmp agent demarre l'agent SNMPv3 embarque
bench> all suite complete
bench> report tableau de synthese
bench> report crypto.rsa un seul groupe
bench> export json resultats exploitables hors ligne
bench> reset vide le registre
Apres wifi connect puis snmp agent, depuis le PC :
snmpget -v3 -l authPriv -u benchuser \
-a SHA-256 -A benchAuthPassword \
-x AES -X benchPrivPassword \
<ip-esp32> 1.3.6.1.2.1.1.1.0
snmpwalk -v3 -l authPriv -u benchuser \
-a SHA-256 -A benchAuthPassword \
-x AES -X benchPrivPassword \
<ip-esp32> 1.3.6.1.2.1.1C'est la verification d'interoperabilite de l'implementation USM : si net-snmp accepte les reponses, la derivation de cles, l'authentification et le chiffrement sont conformes.
Chaque ligne rapporte la mediane, la moyenne, le p95, le debit et le nombre d'iterations.
La mediane et le p95 sont donnes ensemble a dessein :
- la mediane donne le cout intrinseque de l'algorithme ;
- le p95 donne le cout observe quand la pile WiFi et l'ordonnanceur preemptent le calcul.
L'ecart entre les deux est l'information utile pour dimensionner un equipement reel. Les debits sont derives de la mediane, non de la moyenne : une seule interruption WiFi suffirait a fausser cette derniere.
Un cas qui n'a pas pu s'executer apparait quand meme, avec son motif. Une ligne absente se lirait a tort comme un succes.
Les chiffres AES, SHA et RSA n'ont de sens qu'accompagnes de l'etat des accelerateurs, rappele dans l'en-tete de chaque rapport. Pour mesurer le gain reel :
.\tools\bench_hw_vs_sw.ps1Le script construit et flashe successivement les deux configurations. La comparaison des deux exports donne le facteur d'acceleration par algorithme.
BenchTLSESP32/
├── main/ orchestrateur, console, configuration Kconfig
├── components/
│ ├── bench_core/ chronometrage, statistiques, restitution
│ ├── bench_certs/ PKI embarquee dans le binaire
│ ├── bench_crypto/ hachage, chiffrement, asymetrique, echange de cles
│ ├── bench_wifi/ association, 802.1X, horloge
│ ├── bench_tls/ poignees de main, mTLS, reprise, debit
│ ├── bench_syslog/ client RFC 5424 / RFC 5425
│ ├── bench_https/ client HTTPS
│ └── bench_snmpv3/ USM, messages ASN.1, agent
├── pki/ generation de la PKI
└── tools/ serveurs de test, RADIUS, hostapd, scripts
Le socle de mesure repose sur trois choix :
-
Chaque iteration est chronometree individuellement. Diviser une duree totale par un nombre d'iterations masquerait la dispersion, qui est justement ce qui distingue un microcontroleur d'un serveur.
-
L'horloge de reference est le compteur de cycles CPU, calibre au demarrage plutot que suppose. Il reboucle toutes les ~17,9 s a 240 MHz : le socle bascule alors automatiquement sur
esp_timeret le signale. -
Les mesures s'executent sur une tache epinglee au coeur 1. Le compteur de cycles est propre a chaque coeur ; une migration est detectee et l'echantillon concerne est ramene sur
esp_timer.
Elles sont a connaitre avant de citer un chiffre.
Methode EAP negociee. En TTLS et PEAP, c'est le serveur RADIUS qui impose
la methode de phase 1 ; le suppliant d'ESP-IDF ne peut pas l'exiger. Les lignes
EAP-TTLS/* et PEAP portent sur ce que le firmware a demande, pas
necessairement sur ce qui a ete negocie. Pour les distinguer reellement, il
faut modifier default_eap_type cote serveur entre deux passes : voir
tools/freeradius/README.md. EAP-TLS fait exception et reste fiable sans
precaution.
Verification du nom d'hote en HTTPS. Le banc s'adresse au serveur par
adresse IP. mbedTLS ne confronte pas une adresse aux extensions SAN de type
iPAddress, et esp_http_client n'offre pas de moyen d'imposer un nom attendu
different de la cible : la verification du nom est donc levee pour ces mesures.
La validation de chaine contre l'autorite du banc reste pleinement active —
c'est elle qui porte le sujet « CA personnalisee ». Le module TLS, lui, verifie
bien le nom, en le passant explicitement a esp-tls.
Controle temporel en 802.1X. Au premier demarrage l'ESP32 est en 1970 et rejetterait le certificat du serveur RADIUS avant d'avoir pu joindre un serveur NTP. Le controle de periode de validite est donc desactive pour la seule phase 802.1X ; la validation de chaine reste active.
Decoupage du temps d'association. ESP-IDF n'expose pas d'evenement entre l'authentification et l'association : le premier segment mesure ne peut pas etre decompose plus finement sans instrumenter la pile. La comparaison entre modes reste valide, seul le contenu de ce segment changeant.
Generation de cles RSA. Sa duree depend du nombre de candidats premiers rejetes et varie d'un facteur superieur a cinq d'un tirage a l'autre. Sur peu d'echantillons, l'ecart entre le minimum et le maximum est plus parlant que la mediane.
Le mode « sans verification » de TLS n'existe que pour chiffrer le cout de la validation de chaine. Il ne doit jamais servir de reference de performance.
Le reseau fait partie de la mesure. Les chiffres TLS, syslog et HTTPS
incluent la latence du lien WiFi et la charge du PC. Le RSSI est rapporte par
wifi status : deux campagnes menees a des puissances recues differentes ne
sont pas comparables.
Ce depot contient une PKI de test dont les cles privees sont generees en clair et dont les mots de passe sont publies. Rien ici ne doit etre reutilise ailleurs qu'entre un ESP32 et un PC sur un reseau de test isole.
.gitignore exclut pki/out et les fichiers PEM embarques : les cles generees
ne doivent pas etre versionnees.