Firmware di produzione
Secure boot, flash e NVS cifrati, chiavi e aggiornamenti firmati: cosa serve prima di consegnare una scheda.
In sviluppo la scheda gira senza protezioni hardware: si flasha e si riflasha liberamente. Una scheda da consegnare a qualcuno invece deve:
- avviare solo firmware firmato da noi (secure boot v2);
- tenere cifrata la flash (flash encryption) e l'archivio NVS (NVS encryption), dove stanno le chiavi degli abbinamenti, il PIN, le credenziali Wi-Fi;
- accettare aggiornamenti via rete solo firmati (chiave OTA, già nel codice:
main/ota.c).
Attenzione: secure boot e flash encryption bruciano gli eFuse del chip. È irreversibile: una scheda configurata male non si recupera. Si prova prima su una scheda di scarto.
Le chiavi
| Chiave | A cosa serve | Dove sta |
|---|---|---|
| firma del secure boot (RSA 3072 o ECDSA) | il bootloader avvia solo immagini firmate con questa | fuori dalla repo, in un posto sicuro con copia di riserva |
| chiave OTA (Ed25519) | la scheda accetta solo aggiornamenti firmati con questa | fuori dalla repo; la pubblica in firmware/main/ota_chiave.h |
| chiave della flash encryption | la genera il chip al primo avvio e non esce mai | nell'eFuse, illeggibile |
espsecure.py generate_signing_key --version 2 --scheme rsa3072 ~/jz-chiavi/secure-boot.pembun apps/brain/scripts/ota.ts chiave ~/jz-chiavi/ota.pemPerdere la chiave del secure boot o quella OTA vuol dire non poter più aggiornare le schede consegnate.
Configurazione di release
Un file firmware/sdkconfig.release (da aggiungere quando si fa la prima scheda vera) con, oltre a
sdkconfig.defaults:
CONFIG_SECURE_BOOT=y
CONFIG_SECURE_BOOT_V2_ENABLED=y
CONFIG_SECURE_BOOT_SIGNING_KEY="/percorso/fuori/dalla/repo/secure-boot.pem"
CONFIG_SECURE_FLASH_ENC_ENABLED=y
CONFIG_SECURE_FLASH_ENCRYPTION_MODE_RELEASE=y
CONFIG_NVS_ENCRYPTION=y
CONFIG_NVS_SEC_KEY_PROTECT_USING_HMAC=y
CONFIG_SECURE_DISABLE_ROM_DL_MODE=nBuild: idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release" build. Con la chiave NVS
protetta dall'HMAC (eFuse) l'archivio non si legge nemmeno estraendo la flash.
Aggiornamenti via rete
- Compila la versione nuova con la stessa
ota_chiave.h. - Firma l'immagine:
bun apps/brain/scripts/ota.ts firma ~/jz-chiavi/ota.pem firmware/build/jz_desk.bin 0.3.0 <url>. - Manda il manifesto alla scheda: dal cervello
POST /api/schede/<id>/aggiorna, o dal portale tramite il relay.
La scheda verifica impronta e firma prima di avviare la versione nuova, e se quella si pianta nei primi 30 secondi torna da sola alla precedente.
Prima di consegnare una scheda
- firmware di release firmato, secure boot e flash encryption accesi;
-
ota_chiave.hcon la chiave vera (mai quella di prova); - blocco attivazione: la scheda si lega all'account al primo accesso dal portale;
- provato il ritorno alla versione precedente con un'immagine che si pianta apposta.