Strumento di provisioning fabbrica OpenWeave

Visualizza sorgente su GitHub

Lo strumento di provisioning fabbrica di OpenWeave fornisce un pratico metodo per eseguire il provisioning di informazioni di configurazione persistenti per dispositivi sui dispositivi abilitati per Weave. Lo strumento di provisioning in fabbrica è destinato a essere utilizzato come parte di un processo di produzione che contrassegna i singoli dispositivi con informazioni univoche di identità e credenziali prima della spedizione ai clienti. Può inoltre essere utilizzato dagli sviluppatori per personalizzare l'hardware di pre-produzione utilizzato durante il processo di sviluppo.

Teoria operativa

L'obiettivo dello strumento di provisioning fabbrica di OpenWeave è inserire determinate informazioni di configurazione nell'archivio di configurazione permanente di un dispositivo, dove può essere recuperato e utilizzato in fase di esecuzione dal firmware del dispositivo. La configurazione permanente del dispositivo è in genere archiviata all'interno del flash interno del dispositivo, anche se i dettagli esatti di come vengono archiviati i dati e in quale formato variano a seconda della piattaforma. Lo strumento di provisioning dei dati di fabbrica è indipendente dal formato di archiviazione finale e si basa sul codice nel firmware del dispositivo per scrivere i dati nel modo corretto. Inoltre, l'interfaccia utente dello strumento è in gran parte indipendente dal tipo di hardware configurato, il che significa che è possibile utilizzare processi di produzione simili su tutte le linee di prodotto basate su diverse piattaforme hardware.

Lo strumento di provisioning dei dati di fabbrica è progettato per essere eseguito su un computer host connesso a un dispositivo di destinazione tramite una qualsiasi forma di interfaccia di debug o di controllo, ad esempio una porta JTAG o SWD. Lo strumento inserendo informazioni di provisioning nella RAM del dispositivo in un formato codificato. Il dispositivo riceve quindi le istruzioni di riavviare, dopodiché il codice integrato nel firmware del dispositivo individua i dati codificati, ne convalida l'integrità e scrive i valori contenuti nello spazio di archiviazione permanente nel formato appropriato per la piattaforma.

Il codice sul dispositivo che rileva ed elabora i dati di provisioning inseriti è integrato nel livello dispositivo di OpenWeave e può essere attivato su qualsiasi piattaforma supportata. Dopo l'attivazione, il codice viene eseguito automaticamente a ogni avvio del dispositivo, in un momento anteriore del processo di inizializzazione del dispositivo. Il codice esegue la scansione di un'area geografica di RAM specifica della piattaforma. Sulle piattaforme con memoria modesta (ad esempio, <1M), la scansione comprende tutta la RAM disponibile.

Quando sono inseriti nella RAM, i dati di provisioning sono codificati con un prefisso facilmente identificabile, che consente di trovarli rapidamente durante il processo di scansione. Un valore del controllo di integrità basato su un hash crittografico viene utilizzato per confermare la validità dei dati prima dell'elaborazione.

Per impostazione predefinita, lo strumento di provisioning seleziona la località di RAM in cui inserire i dati di provisioning in base alla piattaforma del dispositivo di destinazione. Questa scelta può essere ignorata tramite un argomento nello strumento. In generale, non è necessario che il firmware del dispositivo prenoti una posizione di RAM specifica per la ricezione dei dati di provisioning. In genere, i dati di provisioning vengono scritti in una posizione della RAM che viene allocata per altri scopi, ma in genere non è utilizzata all'inizio del processo di avvio del dispositivo. Le scelte più comuni sono la parte superiore dello stack di sistema iniziale o l'estremità lontana di un'area di heap.

Lo strumento di provisioning dei dati di fabbrica si basa su un insieme di strumenti di sviluppo esterni per interfacciarsi con il dispositivo di destinazione. Gli strumenti impiegati dipendono dal tipo di dispositivo di destinazione. Attualmente sono supportate due interfacce per dispositivi:

  • Un probe di debug J-Link SEGGER collegato a una porta JTAG o SWD di un dispositivo
  • una porta seriale USB collegata a un caffè Espressif ESP32

L'interfaccia J-Link si basa sullo strumento SEGGER J-Link Commander (JLinkExe), che deve essere installato separatamente sul computer host.

L'interfaccia ESP32 si basa sul comando esptool.py Espressif, fornito come parte dell'SDK ESP-IDF di Espressif.

Tipi di informazioni di cui è possibile eseguire il provisioning

Lo strumento di provisioning fabbrica di OpenWeave è in grado di eseguire il provisioning dei seguenti tipi di informazioni:

  • Numero di serie del dispositivo
  • ID dispositivo Weave assegnato dal produttore
  • Certificato Weave e chiave privata assegnati dal produttore
  • Codice di accoppiamento Weave
  • Numero di revisione del prodotto
  • Data di produzione

Anche se in genere un dispositivo necessita di tutte le informazioni riportate sopra per funzionare correttamente, non è necessario fornire tutte le informazioni contemporaneamente. Pertanto, il provisioning di diversi tipi di informazioni può avvenire in momenti diversi del processo di produzione. Inoltre, puoi sostituire i valori di cui è stato eseguito il provisioning in precedenza con nuovi valori in un passaggio successivo.

Origini delle informazioni di provisioning

Le informazioni sul provisioning dei dispositivi possono essere fornite allo strumento di provisioning delle impostazioni di fabbrica nei seguenti modi:

  • Argomenti della riga di comando
  • Utilizzo di un file CSV di provisioning
  • recuperando valori da un server di provisioning Nest

Riga di comando

Nel formato più semplice, le informazioni di provisioning del dispositivo vengono specificate direttamente nella riga di comando nello strumento di provisioning fabbrica di OpenWeave. Ad esempio:

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --pairing-code NESTUS --mfg-date 2019/04/01

I valori dei dati binari, come il certificato Weave e la chiave privata, possono essere specificati come stringhe di base 64 o come nomi dei file contenenti i dati desiderati in formato non elaborato (binario).

Di seguito è riportato un elenco completo degli argomenti della riga di comando disponibili.

Provisioning del file CSV in corso...

Per agevolare il provisioning collettivo dei dispositivi, lo strumento di provisioning dei dati di fabbrica può anche leggere i dati di provisioning da un file di dati di provisioning in formato CSV. È previsto che le colonne di questo file corrispondano a tipi di dati di provisioning specifici, ovvero Serial_Num, Certificate, Private_Key e così via. Le righe del file forniscono singoli valori per dispositivi specifici, indicizzati da ID dispositivo Weave (Device_Id). L'ID del dispositivo specifico di cui eseguire il provisioning deve essere specificato nella riga di comando. Ad esempio:

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --prov-csv-file ./dev-provisioning-data.csv

Sono supportate le seguenti colonne CSV:

Nome Formato Description
Device_Id 16 cifre esadecimali ID dispositivo intrecciato. Deve essere presente.
Serial_Num string Numero di serie del dispositivo.
Certificate stringa di base-64 Certificato del dispositivo Weave assegnato dal produttore.
Private_Key stringa di base-64 Chiave privata Weave assegnata dal produttore.
Pairing_Code string Integra il codice di accoppiamento.
Product_Rev integer Numero di revisione del prodotto.
Mfg_Date AAAA/MM/GG Data di produzione del dispositivo

Le colonne possono essere visualizzate nel file CSV in qualsiasi ordine. Tutte le colonne sono facoltative, ad eccezione di Device_Id. Il provisioning dei valori non presenti nel file CSV semplicemente non viene eseguito sul dispositivo.

L'utente può specificare singoli valori di provisioning sulla riga di comando oltre al file CSV. In questo caso, il valore della riga di comando ha la precedenza su quelli presenti nel file.

Il supporto del formato file CSV fornito dallo strumento di provisioning dati di fabbrica è compatibile con l'output del comando gen-provisioning-data dello strumento weave.

Server di provisioning Nest

Lo strumento di provisioning delle impostazioni di fabbrica supporta il recupero di determinate informazioni di provisioning da un server di provisioning Nest utilizzando un protocollo basato su HTTPS. Il protocollo del server di provisioning può essere utilizzato per recuperare il certificato del dispositivo Weave assegnato dal produttore, la chiave privata corrispondente e il codice di accoppiamento Weave dal server di provisioning.

La posizione di rete del server di provisioning viene specificata fornendo un URL di base nella riga di comando dello strumento di provisioning. Le informazioni di provisioning desiderate vengono selezionate specificando l'ID dispositivo Weave nella riga di comando. Ad esempio:

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --prov-server https://192.168.172.2:8000/

L'utente può specificare singoli valori di provisioning sulla riga di comando oltre all'URL del server di provisioning. In questo caso, i valori specificati nella riga di comando hanno la precedenza sui valori restituiti dal server.

Attivazione / disattivazione del supporto per il provisioning dei dati di fabbrica

Il supporto per il provisioning dei dati di fabbrica di OpenWeave nel firmware del dispositivo è controllato dall'opzione di configurazione di WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING. Questa opzione è attivata per impostazione predefinita. La funzionalità può essere disattivata ignorando l'opzione nel file WeaveProjectConfig.h dell'applicazione. Ad esempio:

#define WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING 0

In generale, è possibile attivare il provisioning dei dati di fabbrica nel firmware dei dispositivi di produzione a condizione che l'interfaccia di debug del dispositivo sia disattivata correttamente sui dispositivi di produzione. A tale scopo, puoi usare l'hardware (ad esempio, bruciando fusibili nel SoC) o nel software (ad esempio, tramite un bootloader sicuro che blocca l'accesso al debug come parte del processo di avvio).

Esecuzione dello strumento di provisioning delle impostazioni di fabbrica

Lo strumento di provisioning fabbrica di OpenWeave supporta le seguenti opzioni della riga di comando:

Opzione Description
--target <string> Tipo di dispositivo di destinazione. Le opzioni disponibili sono: nrf52840, esp32
--load-addr <decimali> Indirizzo nella memoria del dispositivo in cui verranno scritti i dati di provisioning.
--verbose, -v Regola il livello di dettaglio dell'output. Utilizza più argomenti per aumentare il livello di dettaglio.
--serial-num <string> Imposta il numero di serie del dispositivo.
--device-id <hex-digits> Imposta l'ID dispositivo assegnato dal produttore.
--device-cert <base-64> | <nome-file> Imposta il certificato del dispositivo Weave assegnato dal produttore.
--device-key <base-64> | <nome-file> Imposta la chiave privata del dispositivo Weave assegnata dal produttore.
--pairing-code <string> Imposta il codice di accoppiamento del dispositivo.
--product-rev <integer> Imposta la revisione del prodotto per il dispositivo.
--mfg-date <AAAA/MM/GG> | oggi | ora Imposta la data di produzione del dispositivo.
--jlink-cmd <nome-percorso> Percorso del comando JLink. Il valore predefinito è 'JLinkExe'.
--jlink-if SWD | JTAG Tipo di interfaccia J-Link. Il valore predefinito è SWD.
--jlink-speed <integer> | adattiva | auto Velocità dell'interfaccia J-Link.
--jlink-sn <string> Numero di serie del probe di J-Link.
--esptool-cmd <nome-percorso> Percorso del comando esptool. Il valore predefinito è 'esptool.py'.
--port <path-name> Nome del dispositivo della porta COM per ESP32. Il valore predefinito è /tty/USB0.
--speed <integer> Velocità in baud per la porta COM. Il valore predefinito è 115200.
--prov-csv-file <nome-file> Leggere i dati di provisioning dei dispositivi da un file CSV di provisioning.
--prov-server <url> Lettura dei dati di provisioning del dispositivo da un server di provisioning.
--disable-server-validation Quando utilizzi HTTPS, disattiva la convalida del certificato presentato dal server di provisioning.

Esempi

Il seguente comando imposta ID dispositivo, numero di serie, revisione prodotto e codice di accoppiamento su valori specifici. La data di produzione è impostata sulla data corrente. Inoltre, il certificato del dispositivo e la chiave privata sono impostati per il test dei valori specificati in un file CSV fornito con il repository di codice sorgente openweave-core.

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000042 \
    --serial-num JAYS_DEVICE_42 --product-rev 1 --pairing-code NESTUS --mfg-date today \
    --prov-csv-file ~/projects/openweave-core/certs/development/device/test-dev-provisioning-data.csv