O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Ferramenta de provisionamento de fábrica OpenWeave

Ver fonte no GitHub

A OpenWeave Factory Provisioning Tool oferece um meio conveniente de provisionar informações de configuração persistentes por dispositivo em dispositivos habilitados para Weave. A ferramenta de provisionamento de fábrica deve ser usada como parte de um processo de linha de fabricação que marca dispositivos individuais com identidade exclusiva e informações de credencial antes do envio aos clientes. Ele também pode ser usado por desenvolvedores para personalizar o hardware de pré-produção usado durante o processo de desenvolvimento.

Teoria de Operação

O objetivo da OpenWeave Factory Provisioning Tool é injetar informações de configuração selecionadas no armazenamento de configuração persistente de um dispositivo, onde podem ser obtidas e usadas em tempo de execução pelo firmware do dispositivo. A configuração persistente do dispositivo é normalmente armazenada no flash interno do dispositivo, embora os detalhes de como exatamente os dados são armazenados e em que formato variem de plataforma para plataforma. A ferramenta de provisionamento de fábrica em si é 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 é amplamente 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 Factory Provisioning Tool foi projetada para funcionar em uma máquina host conectada a um dispositivo de destino por meio de alguma forma de depuração ou interface de controle - por exemplo, uma porta JTAG ou SWD. A ferramenta funciona injetando informações de provisionamento na RAM do dispositivo de uma forma especialmente codificada. O dispositivo é então instruído a reiniciar, momento em que o código integrado ao firmware do dispositivo localiza os dados codificados, valida sua integridade e grava os valores contidos no armazenamento persistente em um formato apropriado para a plataforma.

O código no dispositivo que detecta e processa os dados de provisionamento injetados é integrado ao OpenWeave Device Layer e pode ser habilitado em qualquer plataforma compatível. Uma vez ativado, o código é executado automaticamente sempre que o dispositivo é inicializado, em um ponto no início do processo de inicialização do dispositivo. O código opera verificando uma região de RAM específica da plataforma. Em plataformas com montagens modestas de memória (por exemplo, <1M), a varredura abrange toda a RAM disponível.

Quando colocados na RAM, os dados de provisionamento são codificados com um prefixo facilmente identificável, o que permite que sejam encontrados rapidamente durante o processo de varredura. Um valor de verificação de integridade com base 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 de RAM no qual injetar os dados de provisionamento com base na plataforma do dispositivo de destino. Essa escolha pode ser substituída por meio de 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, os dados de provisionamento são gravados em um local de RAM alocado para outros fins, mas geralmente não são usados ​​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 heap.

A ferramenta de provisionamento de fábrica depende de um conjunto de ferramentas de desenvolvimento externas para fazer a interface com o dispositivo de destino. As ferramentas específicas empregadas dependem do tipo de dispositivo alvo. Duas interfaces de dispositivo são atualmente suportadas:

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

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

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

Tipos de informações que podem ser provisionadas

A OpenWeave Factory Provisioning Tool é 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 atribuído pelo fabricante e chave privada
  • Código de emparelhamento de trama
  • Número de revisão do produto
  • Data de fabricação

Embora geralmente um dispositivo precise de todas as informações acima para funcionar corretamente, não é necessário fornecer todas as informações ao mesmo tempo. Assim, o provisionamento de diferentes tipos de informações pode acontecer em pontos distintos do processo de manufatura. Além disso, é possível substituir os valores provisionados anteriormente por novos valores em uma etapa de provisionamento subsequente.

Fontes de informação de provisionamento

As informações de provisionamento de dispositivos podem ser fornecidas à Ferramenta de Provisionamento de Fábrica das seguintes maneiras:

  • Argumentos de linha de comando
  • Usando um arquivo CSV de provisionamento
  • Buscando valores de um servidor de provisionamento Nest

Linha de comando

Na forma mais simples, as informações de provisionamento do dispositivo são especificadas diretamente na linha de comando para a OpenWeave Factory Provisioning Tool. Por 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 de base 64 ou como nomes de arquivos contendo os dados desejados em formato bruto (binário).

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

Arquivo CSV de provisionamento

Para acomodar o provisionamento em massa de dispositivos, a Factory Provisioning Tool também pode ler dados de provisionamento de um arquivo de dados de provisionamento formatado em CSV. As colunas deste ficheiro são esperados correspondem a tipos específicos de dados de aprovisionamento - isto é, Serial_Num , Certificate , Private_Key , etc. Linhas no ficheiro dar valores individuais para os dispositivos específicos, indexados por ID de tecer dispositivo ( Device_Id ). A id do dispositivo específico a ser provisionado deve ser especificada na linha de comando. Por exemplo:

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

As seguintes colunas CSV são suportadas:

Nome Formato Descrição
Device_Id 16 dígitos hexadecimais ID do dispositivo Weave. Deve estar presente.
Serial_Num fragmento Número de série do dispositivo.
Certificate string de base 64 Certificado de dispositivo Weave atribuído pelo fabricante.
Private_Key string de base 64 Chave privada Weave atribuída pelo fabricante.
Pairing_Code fragmento Código de emparelhamento de trama.
Product_Rev inteiro Número de revisão do produto.
Mfg_Date AAAA / MM / DD Data de fabricação do dispositivo.

As colunas podem aparecer no arquivo CSV em qualquer ordem. Todas as colunas são opcionais, com exceção de Device_Id . Quaisquer valores que não estão presentes no arquivo CSV simplesmente 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, caso em que o valor da linha de comando tem precedência sobre os do arquivo.

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

Servidor de provisionamento Nest

A Factory Provisioning Tool suporta a busca de 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 do dispositivo Weave atribuído pelo fabricante, a chave privada correspondente e o código de emparelhamento do Weave do servidor de provisionamento.

O local de rede do servidor de provisionamento é especificado fornecendo um URL base na linha de comando da ferramenta de provisionamento. As informações de provisionamento desejadas são selecionadas especificando o ID do dispositivo Weave na linha de comando. Por 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 da URL do servidor de provisionamento. Nesse caso, os valores fornecidos na linha de comando têm precedência sobre os valores retornados pelo servidor.

Ativando / desativando o suporte de provisionamento de fábrica

Suporte para OpenWeave fábrica de provisionamento no firmware do dispositivo é controlada pelo WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING opção de configuração em tempo de compilação. Essa opção é ativada por padrão. O recurso pode ser desativado, substituindo a opção no aplicativo WeaveProjectConfig.h arquivo. Por exemplo:

#define WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING 0

Em geral, é seguro para permitir fábrica provisionamento equipamento para a produção firmware desde que a interface do dispositivo de depuração é desativado adequadamente em dispositivos de produção. Isso pode ser obtido por meio de hardware (por exemplo, queimando fusíveis no SoC) ou por 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).

Executando a Ferramenta de Provisionamento de Fábrica

A OpenWeave Factory Provisioning Tool oferece suporte às seguintes opções de linha de comando:

Opção Descrição
--target <string> Tipo de dispositivo de destino. As opções são: nrf52840, esp32
--load-addr <hex-dígitos> Endereço na memória do dispositivo no qual os dados de provisionamento serão gravados.
--verbose, -v Ajuste o nível de verbosidade da saída. Use vários argumentos para aumentar o detalhamento.
--serial-num <string> Defina o número de série do dispositivo.
--device-id <hex-dígitos> Defina o ID do dispositivo atribuído pelo fabricante.
--device-cert <base-64> | <file-name> Defina o certificado do dispositivo Weave atribuído pelo fabricante.
--device-chave <base-64> | <file-name> Defina a chave privada do dispositivo Weave atribuída pelo fabricante.
--pairing-code <string> Defina o código de emparelhamento do dispositivo.
--product-rev <inteiro> 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-se SWD | JTAG Tipo de interface J-Link. O padrão é SWD.
--jlink velocidade <inteiro> | adaptativa | auto Velocidade da interface J-Link.
--jlink-sn <string> Número de série da sonda J-Link.
--esptool-cmd <path-name> Caminho para o comando esptool. O padrão é 'esptool.py'.
--port <path-name> Nome do dispositivo da porta COM para ESP32. O padrão é / tty / USB0.
--speed <inteiro> Taxa de transmissão para porta COM. O padrão é 115200.
--prov-csv-file <file-name> Leia os dados de provisionamento do dispositivo de um arquivo CSV de provisionamento.
--prov-servidor <url> Leia os dados de provisionamento do dispositivo de um servidor de provisionamento.
--disable-server-validation Ao usar HTTPS, desative a validação do certificado apresentado pelo servidor de provisionamento.

Exemplos

O comando a seguir define a id do dispositivo, número de série, revisão do produto e código de emparelhamento para valores específicos. A data de fabricação é definida para a data atual. E o certificado do dispositivo ea chave privada são definidas para valores de teste fornecidas em um arquivo CSV fornecido com o openweave-core repositório de origem.

./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