{getToc} $title={Índice}
Informações
Nível de dificuldade: Médio/AvançadoRequisitos: Conhecimento em Linux Embarcado, Yocto, Devtool, Secure Boot integrado com o Yocto pt.1 (Bootloader).
Ressalvas
Esse tutorial é uma continuação do tutorial:Secure Boot integrado com o Yocto pt.1 (Bootloader)
Verificar os conteúdos da imagem com:
Para a implementação dessa etapa, é necessário ter habilitado o AHAB Secure Boot e realizado os procedimentos necessários para validação do Bootloader.
É altamente recomendado que a primeira parte do tutorial seja consultada.
Introdução
Este tutorial contempla o segundo passo do Chain of Trust de um sistema Linux Embarcado, que corresponde à assinatura do Kernel.Arquivos necessários
Para assinar o kernel são necessários três arquivos:
- Imagem do kernel
- Blob da device tree usada (.dtb)
- Rootfs usado para gravação (.wic)
Esses arquivos se encontram na pasta de deploy do Yocto:
<yocto-worskpace>/build-wayland/tmp/deploy/images/<machine>
No caso desse exemplo os arquivos são:
Image-5.4-...-.bin
Imx8qxp-mek-5.4-...-.bin
Arquivo wic compactado (.wic.bz2 ou .wic.tar)
Copiar esses arquivos pra pasta workspace do CST e descompactar a imagem .wic.bz2/tar para .wic.
Montagem do container
Agora precisamos montar o OS container, que é o binário da imagem a ser assinado.Para isso, necessitamos de uma pasta que contém diversos arquivos importantes.
Copiar a pasta "git" do diretório:
Copiar a pasta "git" do diretório:
<yocto-worskpace>/build_wayland/tmp/work/imx8qxpc0mek-poky-linux/imx-boot/1.0-r0
Para a pasta workspace do CST.
Renomear a pasta para mkimage_container.
Assim como no tutorial do Secure Boot do Bootloader, precisamos montar um Makefile para a construção do container, o seu conteúdo deve ser:
MKIMG = mkimage_container/mkimage_imx8
flash_kernel: $(MKIMG) Image imx8qxp-mek.dtb
./$(MKIMG) -soc QX -rev B0 -c -ap Image a35 0x80280000 --data imx8qxp-mek.dtb
0x83000000 -out flash_os.bin
Executar o comando:
Para a pasta workspace do CST.
Renomear a pasta para mkimage_container.
Assim como no tutorial do Secure Boot do Bootloader, precisamos montar um Makefile para a construção do container, o seu conteúdo deve ser:
MKIMG = mkimage_container/mkimage_imx8
flash_kernel: $(MKIMG) Image imx8qxp-mek.dtb
./$(MKIMG) -soc QX -rev B0 -c -ap Image a35 0x80280000 --data imx8qxp-mek.dtb
0x83000000 -out flash_os.bin
Executar o comando:
$make flash_kernel
Caso dê tudo certo, o output mostrará os offsets do container.
Caso dê tudo certo, o output mostrará os offsets do container.
Assim como no tutorial do Bootloader, salvar esses offsets para a assinatura do container.
Script de assinatura do container
Local do script:<yocto-workspace>/build_wayland/workspace/sources/u-boot-imx/doc/imx/ahab/csf_examples/csf_linux_img.txt
Copiar esse script para a workspace CST.
Atualizar o script com o offset do container e corrigir eventuais mudanças de nome da tabela SRK ou caminhos.
Assinar o binário com o comando:
Copiar esse script para a workspace CST.
Atualizar o script com o offset do container e corrigir eventuais mudanças de nome da tabela SRK ou caminhos.
Assinar o binário com o comando:
$./release/linux64/bin/cst -i csf_linux_img.txt -o os_cntr_signed.bin
O nome do output tem que ser exatamente esse, ou então você terá que modificar a variável de ambiente do u-boot relativa.
O nome do output tem que ser exatamente esse, ou então você terá que modificar a variável de ambiente do u-boot relativa.
Copiar o container assinado para o .wic
Para utilizar a ferramenta wic, você precisa estar dentro do seu workspace yocto, com o ambiente setado ($source setup_environment build_wayland ou $. export).Verificar os conteúdos da imagem com:
$wic ls <caminho para o arquivo wic>/<arquivo.wic>
Provavelmente serão mostrados dois containers, estamos interessados no diretório boot.
Com $wic ls <caminho para o arquivo wic>/<arquivo.wic>:1 conseguimos ver o conteúdo do diretório boot (caso ele seja o primeiro container, senão, utilize o número relativo ao diretório boot).
Copiar o binário de container assinado para dentro do boot com o comando:
$wic cp <caminho para o binário>/os_cntr_signed.bin <caminho para o arquivo wic>/<arquivo.wic>:1
Gravação
Agora é só gravar a placa, não é necessário compactar o arquivo.wic novamente, inclusive isso pode causar erros.Caso dê tudo certo, o bootloader irá inicializar normalmente e após isso será iniciado o kernel, confirmando o sucesso do procedimento.
Também é possível utilizar o comando dentro do bootloader:
=> auth_cntr <endereço-do-kernel>
Que deverá retornar sucesso na autenticação do container.
Finalização
Com o final desse tutorial, temos que o AHAB verifica o Bootloader e o Bootloader verifica o Kernel.
Cada etapa precisa ser assinada pela chave privada específica do CST, que você gerou e só você deve ter acesso.
Qualquer imagem que não esteja assinada ou que esteja assinada com uma hash errada, não irá funcionar.
Muito bom! Tutorial simples e objetivo com conteúdo relevante!! Parabéns pelo site, sucesso.
ResponderExcluirMuito bom e de extrema relevância para desenvolvedores e profissionais de micro programação.
ResponderExcluirParabéns pelo site e pela iniciativa, sucesso.