Ferramenta de provisionamento do OpenWeave Factory

Ver o código-fonte no GitHub

A Ferramenta de provisionamento de fábrica do OpenWeave oferece uma forma conveniente de provisionar informações de configuração persistentes por dispositivo em dispositivos ativados pelo Weave. A Ferramenta de provisionamento de fábrica precisa ser usada como parte de um processo de linha de fabricação que carimba dispositivos individuais com informações exclusivas de identidade e credencial antes do envio aos clientes. Também pode ser usado por desenvolvedores para personalizar o hardware de pré-produção usado durante o processo de desenvolvimento.

Teoria da operação

O objetivo da Ferramenta de provisionamento de fábrica do OpenWeave é injetar informações de configuração selecionadas no armazenamento de configuração persistente do dispositivo, onde ele pode ser selecionado e usado pelo ambiente de execução pelo firmware do dispositivo. A configuração permanente do dispositivo geralmente é armazenada no flash interno do dispositivo, embora os detalhes de como os dados sejam armazenados e em que formato variam de acordo com a plataforma. A própria ferramenta de provisionamento é independente do formato de armazenamento final e depende do código no firmware do dispositivo para gravar os dados da maneira correta. A interface do usuário da ferramenta também é, em grande parte, independente do tipo de hardware que está sendo configurado, o que significa que processos de fabricação semelhantes podem ser empregados em linhas de produtos baseadas em diferentes plataformas de hardware.

A ferramenta de provisionamento de fábrica foi projetada para ser executada em uma máquina host conectada a um dispositivo de destino por uma forma de interface de depuração ou controle. Por exemplo, uma porta JTAG ou SWD. A ferramenta funciona injetando informações de provisionamento na RAM do dispositivo de forma específica. O dispositivo é Instruído a reiniciar, quando o código integrado ao firmware do dispositivo localiza os dados codificados, valida a integridade e grava os valores contidos em um armazenamento permanente em um formato adequado para a plataforma.

O código no dispositivo que detecta e processa os dados de provisionamento injetados está integrado à camada de dispositivos OpenWeave e pode ser ativado em qualquer plataforma compatível. Depois de ativado, o código será executado automaticamente toda vez que o dispositivo for inicializado, em um ponto inicial do processo de inicialização. O código funciona verificando uma região de RAM específica da plataforma. Em plataformas com montagens modestas de memória (por exemplo, <1M), a verificação abrange toda a RAM disponível.

Quando colocados na RAM, os dados de provisionamento são codificados com um prefixo de fácil identificação, o que permite que sejam encontrados rapidamente durante o processo de verificação. Um valor de verificação de integridade baseado em um hash criptográfico é usado para confirmar a validade dos dados antes do processamento.

Por padrão, a ferramenta de provisionamento seleciona o local da RAM em que os dados de provisionamento serão injetados com base na plataforma do dispositivo de destino. Essa escolha pode ser substituída por um argumento para a ferramenta. Em geral, não é necessário que o firmware do dispositivo reserve um local de RAM especificamente para receber dados de provisionamento. Normalmente, o provisionamento de dados é gravado em um local da RAM alocado para outras finalidades, mas geralmente não é usado no início do processo de inicialização do dispositivo. As opções comuns são o topo da pilha inicial do sistema ou a extremidade de uma arena de alocação heap.

A Ferramenta de provisionamento de fábrica usa um conjunto de ferramentas externas de desenvolvimento para interagir com o dispositivo de destino. As ferramentas usadas dependem do tipo de dispositivo de destino. No momento, duas interfaces de dispositivo são compatíveis:

  • uma sondagem de depuração J-Link SEGGER conectada a uma porta JTAG ou SWD do dispositivo
  • uma porta serial USB conectada a um Espressif ESP32

A interface J-Link depende da ferramenta SEGGER J-Link Commander (JLinkExe), que precisa ser instalada separadamente na máquina host.

A interface do ESP32 depende do comando Espressif esptool.py, que é disponibilizado como parte do SDK do ESP-IDF do Espressif.

Tipos de informações que podem ser provisionadas

A Ferramenta de provisionamento de fábrica da OpenWeave é capaz de provisionar os seguintes tipos de informações:

  • Número de série do dispositivo
  • ID do dispositivo Weave atribuído pelo fabricante
  • Certificado Weave e chave privada atribuídos pelo fabricante
  • Código de pareamento do Weave
  • Número de revisão do produto
  • Data de fabricação

Em geral, um dispositivo precisa que todas as informações acima funcionem corretamente, mas não é necessário provisionar todas ao mesmo tempo. Assim, o provisionamento de diferentes tipos de informação pode acontecer em pontos distintos do processo de fabricação. Além disso, é possível substituir os valores provisionados anteriormente por novos valores em uma etapa de provisionamento subsequente.

Fontes das informações de provisionamento

As informações de provisionamento de dispositivos podem ser fornecidas à ferramenta de provisionamento para a configuração original das seguintes maneiras:

  • Argumentos de linha de comando
  • Como usar um arquivo CSV de provisionamento
  • Buscando valores de um servidor de provisionamento do Nest

Linha de comando

Na forma mais simples, as informações de provisionamento de dispositivos são especificadas diretamente na linha de comando para a Ferramenta de provisionamento de fábrica do OpenWeave. Exemplo:

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

Os valores de dados binários, como o certificado Weave e a chave privada, podem ser especificados como strings base64 ou como os nomes dos arquivos que contêm os dados desejados em formato bruto (binário).

Veja abaixo uma lista completa de argumentos de linha de comando disponíveis.

Provisionando arquivo CSV

Para acomodar o provisionamento em massa de dispositivos, a ferramenta de provisionamento de fábrica também pode ler os dados de um arquivo de dados de provisionamento formatado em CSV. Espera-se que as colunas desse arquivo correspondam a tipos de dados de provisionamento específicos, ou seja, Serial_Num, Certificate, Private_Key etc. As linhas no arquivo fornecem valores individuais para dispositivos específicos, indexados pelo ID do dispositivo Weave (Device_Id). O ID do dispositivo específico a ser provisionado precisa ser especificado na linha de comando. Exemplo:

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

As seguintes colunas CSV são compatíveis:

Nome Formatação Descrição
Device_Id 16 dígitos hexadecimais ID do dispositivo do Weave. Precisa estar presente.
Serial_Num string Número de série do dispositivo.
Certificate string em base64 Certificado do dispositivo Weave atribuído pelo fabricante.
Private_Key string em base64 Chave privada do Weave atribuída pelo fabricante.
Pairing_Code string Tecer código de pareamento.
Product_Rev número inteiro Número de revisão do produto.
Mfg_Date DD/MM/AAAA Data de fabricação do dispositivo.

As colunas podem aparecer no arquivo CSV em qualquer ordem. Todas as colunas são opcionais, exceto Device_Id. Todos os valores não presentes no arquivo CSV não são provisionados no dispositivo.

O usuário pode especificar valores de provisionamento individuais na linha de comando, além do arquivo CSV. Nesse caso, o valor da linha de comando tem prioridade sobre as do arquivo.

O formato de arquivo CSV aceito pela ferramenta de provisionamento de fábrica é compatível com a saída do comando gen-provisioning-data da ferramenta weave.

Servidor de provisionamento do Nest

A Ferramenta de provisionamento de fábrica permite buscar informações de provisionamento selecionadas de um servidor de provisionamento Nest usando um protocolo baseado em HTTPS. O protocolo do servidor de provisionamento pode ser usado para buscar o certificado de dispositivo do Weave atribuído pelo fabricante, a chave privada correspondente e o código de pareamento do Weave do servidor de provisionamento.

Para especificar o local da rede do servidor de provisionamento, informe um URL base na linha de comando da ferramenta de provisionamento. As informações de provisionamento que você quer selecionar são especificadas com o ID do dispositivo Weave na linha de comando. Exemplo:

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

O usuário pode especificar valores de provisionamento individuais na linha de comando, além do URL do servidor de provisionamento. Nesse caso, os valores fornecidos na linha de comando têm precedência sobre os valores retornados pelo servidor.

Ativar / desativar o suporte ao provisionamento de fábrica

O suporte para o provisionamento de fábrica do OpenWeave no firmware do dispositivo é controlado pela opção de configuração do tempo de compilação WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING. Essa opção é ativada por padrão. O recurso pode ser desativado substituindo a opção no arquivo WeaveProjectConfig.h do aplicativo. Exemplo:

#define WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING 0

Em geral, é seguro ativar o provisionamento para a configuração original no firmware do dispositivo de produção, desde que a interface de depuração do dispositivo esteja desativada corretamente nos dispositivos de produção. Isso pode ser alcançado por meio de hardware (por exemplo, soprando fusíveis no SoC) ou em software (por exemplo, por meio de um carregador de inicialização seguro que bloqueia o acesso de depuração como parte do processo de inicialização).

Executar a ferramenta de provisionamento de fábrica

A Ferramenta de provisionamento de fábrica do OpenWeave é compatível com as seguintes opções de linha de comando:

Opção Descrição
--target <string> Tipo de dispositivo de destino As opções são: nrf52840 e esp32.
--load-addr <hex-digits> Endereço na memória do dispositivo em que os dados de provisionamento serão gravados.
--detalhado, -v Ajustar o nível de verbosidade de saída Usar vários argumentos para aumentar a verbosidade
--serial-num <string> Defina o número de série do dispositivo.
--device-id <hex-digits> Defina o ID do dispositivo atribuído pelo fabricante.
--device-cert <base-64> | <nome-do-arquivo> Defina o certificado do dispositivo Weave atribuído pelo fabricante.
--device-key <base-64> | <file-name> Defina a chave privada do dispositivo Weave atribuída pelo fabricante.
--código de pareamento <string> Defina o código de pareamento do dispositivo.
--product-rev <integer> Defina a revisão do produto para o dispositivo.
--mfg-date <AAAA/MM/DD> | hoje | agora Defina a data de fabricação do dispositivo.
--jlink-cmd <path-name> Caminho para o comando JLink. O padrão é 'JLinkExe'.
--jlink-if SWD | JTAG Tipo de interface J-Link. O padrão é SWD.
--jlink-speed <integer> | adaptável | automático Velocidade da interface J-Link.
--jlink-sn <string> Número de série da sondagem J-Link.
--esptool-cmd <path-name> Caminho para o comando esptool. O padrão é 'esptool.py'.
--porta <path-name> Nome do dispositivo da porta COM para ESP32. O padrão é /tty/USB0.
--speed <integer> Taxa Baud da porta COM. O padrão é 115200.
--prov-csv-file <file-name> Ler os dados de provisionamento de dispositivo de um arquivo CSV de provisionamento.
--prov-server <url> Ler os dados de provisionamento de dispositivo de um servidor de provisionamento.
--disable-server-validation Ao usar HTTPS, desative a validação do certificado apresentado pelo servidor de provisionamento.

Examples

O comando a seguir define o código do dispositivo, o número de série, a revisão do produto e o código de pareamento como valores específicos. A data de fabricação está definida como a data atual. E o certificado do dispositivo e a chave privada estão definidos para testar os valores fornecidos em um arquivo CSV fornecido com o repositório de origem 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