🛠 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

Objetivos

El RP2350 es uno de los MCU más abiertos en cuanto a seguridad: TrustZone Cortex-M, arranque firmado verificado por la ROM, 8 KB de OTP antifuse para las claves, acelerador de hardware SHA-256, TRNG y un desafío público de hacking de 10 000 $ (resultados en enero de 2025). Este tutorial explica la cadena de confianza, genera claves y firma un firmware con picotool, y manipula TRNG/SHA-256 a nivel de aplicación. Atención: el arranque seguro desactiva los núcleos RISC-V Hazard3.

Material

Código completo

/* 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 materiel */
        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");
}

Cadena de firma (comandos):

# 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

Verificación esperada

Cada ejecución muestra una huella digital diferente (el TRNG está trabajando). Después de bloquear la OTP, solo arranca una imagen correctamente firmada; un UF2 no firmado es rechazado por la ROM. Verifique también que el modo RISC-V se vuelve indisponible una vez que el arranque seguro está activo.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales