🛠 TrustZone, secure boot et OTP : sécuriser son firmware
Objectifs
Le RP2350 est l'un des MCU les plus ouverts côté sécurité : TrustZone Cortex-M, boot signé vérifié par la ROM, 8 Ko d'OTP antifuse pour les clés, accélérateur SHA-256 matériel, TRNG, et un challenge de piratage public à 10 000 $ (résultats janvier 2025). Ce tutoriel explique la chaîne de confiance, fait générer des clés et signer un firmware avec picotool, et manipule TRNG/SHA-256 côté application. Attention : le secure boot désactive les cœurs RISC-V Hazard3.
Matériel
- 1 × Raspberry Pi Pico 2 (attention : l'écriture des clés d'OTP est IRRÉVERSIBLE — ne tester que sur une carte de démo)
- Pico SDK ≥ 2.0.0, picotool, OpenSSL
- Terminal série pour vérifier les sorties
Code complet
/* trng_sha.c — entropie materielle et empreinte SHA-256 acceleree (RP2350) */
#include "pico/stdlib.h"
#include "hardware/sha256.h"
#include "hardware/trng.h"
#include <stdio.h>
int main(void) {
stdio_init_all;
uint8_t seed[32], digest[32];
for (uint i = 0; i < 32; i++) /* vrai alea matériel */
seed[i] = (uint8_t) trng_read_bool_random | (rand & 1);
sha256_init;
sha256_update_data(seed, sizeof seed);
sha256_final(digest);
printf("SHA-256 du seed : ");
for (uint i = 0; i < 32; i++) printf("%02x", digest[i]);
printf("\n");
}
Chaîne de signature (commandes) :
# 1. Cle de signature (une fois, a proteger hors ligne)
openssl ecparam -name prime256v1 -genpriv -out signing.key
cat signing.key | picotool otp load_key - --key-type ecdsa_p256 --version 0 --revoke-key 0 --disable-key 0 --permanently-lock-key 0 --address 0x0
# 2. Hash public -> OTP (IRREVERSIBLE !)
picotool info -t public_key2 -e signing.key | picotool otp hash -
# 3. Signer puis convertir l'UF2
picotool sign -k signing.key -a 0 -v 0 firmware.uf2
Vérification attendue
Chaque exécution affiche une empreinte différente (le TRNG travaille). Après verrouillage OTP, seule une image correctement signée démarre ; un UF2 non signé est rejeté par la ROM. Vérifiez aussi que le mode RISC-V devient indisponible une fois le secure boot actif.
Erreurs fréquentes
- Écrire la clé dans l'OTP sans backup : l'antifuse est irréversible, une clé perdue = carte définitivement fermée à vos propres binaires.
- Oublier que le secure boot désactive les cœurs Hazard3 : choisir entre sécurité et RISC-V.
- Penser que la sécurité est absolue : le challenge DEF CON 32 a montré des attaques physiques (FIB, laser) — dimensionnez contre votre modèle de menace réel.
- L'anti-replay par numéro de version (-v) doit être géré : signer une version 0 puis en révoquer une autre peut vous enfermer.
- Compiler sans le bon boot2/boot signature aware : utiliser un SDK récent et
picotool verifyavant de flasher.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython