jzland docs
Riferimento tecnico

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

ChiaveA cosa serveDove sta
firma del secure boot (RSA 3072 o ECDSA)il bootloader avvia solo immagini firmate con questafuori dalla repo, in un posto sicuro con copia di riserva
chiave OTA (Ed25519)la scheda accetta solo aggiornamenti firmati con questafuori dalla repo; la pubblica in firmware/main/ota_chiave.h
chiave della flash encryptionla genera il chip al primo avvio e non esce mainell'eFuse, illeggibile
espsecure.py generate_signing_key --version 2 --scheme rsa3072 ~/jz-chiavi/secure-boot.pem
bun apps/brain/scripts/ota.ts chiave ~/jz-chiavi/ota.pem

Perdere 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=n

Build: 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

  1. Compila la versione nuova con la stessa ota_chiave.h.
  2. Firma l'immagine: bun apps/brain/scripts/ota.ts firma ~/jz-chiavi/ota.pem firmware/build/jz_desk.bin 0.3.0 <url>.
  3. 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.h con 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.

On this page