🛠 TrustZone, secure boot et OTP : sécuriser son firmware
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
- 1 × Raspberry Pi Pico 2 (atención: la escritura de claves en la OTP es IRREVERSIBLE — probar solo en una tarjeta de demostración)
- Pico SDK ≥ 2.0.0, picotool, OpenSSL
- Terminal serie para verificar las salidas
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
- Escribir la clave en la OTP sin copia de seguridad: el antifuse es irreversible, una clave perdida = tarjeta definitivamente cerrada a sus propios binarios.
- Olvidar que el arranque seguro desactiva los núcleos Hazard3: elegir entre seguridad y RISC-V.
- Pensar que la seguridad es absoluta: el desafío DEF CON 32 mostró ataques físicos (FIB, láser) — dimensionar contra su modelo de amenaza real.
- La protección anti-replay mediante número de versión (-v) debe gestionarse: firmar una versión 0 y luego revocar otra puede dejarlo bloqueado.
- Compilar sin el boot2/boot signature aware correcto: utilizar un SDK reciente y
picotool verifyantes de flashear.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython