🛠 TrustZone, secure boot et OTP : sécuriser son firmware

Raspberry Pi Pico 2 · avance · Schéma : IMG-pico-2-avance-3-pico2-trustzone-signature-otp.svg — chaîne de confiance RP2350 : clés dans l'OTP 8 Ko, ROM vérifiant la signature SHA-256 du firmware, monde sécurisé TrustZone, blocs TRNG et accélérateur matériel

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

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

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels