Jetson Nano – Secure Boot Sequence

Jetson Nano

この記事ではJetson NanoのSecure Boot Sequenceについて解説します。Secure Bootを有効にする方法はこちらの記事を参照してください。またBoot Sequenceを解説した記事も合わせてご覧ください。

Secure Boot Components

Boot Sequenceの記事では使われなかった以下のコンポーネントが登場します。

  • SE
    • Security Engine
    • 内部の暗号エンジンとその鍵が保存されるコンポーネント
  • Fuse

PKH(Public Key Hash)、SBK(Secure Boot Key)、DK(Device Key)が予めFuseに書き込まれています。SBKとDKは https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-3261/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/bootloader_secure_boot.html#wwpID0E0BI0HA を参照してください。

Jetson NanoでSBK、DKを使うことはサポートされていないのでここでのSBK、DKの説明は参考程度に留めてください。

Secure Boot

Start from ROM

電源が投入されるとBPMPがROMをフェッチしプログラムの実行を開始します。

Secure Bootの観点ではROMは書き換えができないので常に安全です。逆の言い方をするとROMにバグがあると更新ができないためROMの開発は慎重に設計・実装されなければなりません。

Load BCT, store PK to SE, and validate BCT

ROMはOn board flashからBCTをSysRAMにロードします。

ROMはBCTに含まれるPK(Public Key)のハッシュ値とFuseのPKHを比較します。

ROMはPKのハッシュ値とPKHが一致していたら、PKをSEに保存します。

以下のSBK、DK、SSKの説明は参考程度にと留めてください。Jetson NanoでSBK、DK、SSKはサポートされていません。

ROMはFuseのSBKをSEに保存、SBKとDKとUIDからSSKを導出し、SSKをSEに保存します。なおSSKの導出方法は不明です。

ROMはBCTのsignをSEのPKで検証します。

Load and validate TegraBoot

ROMはOn board flashからTegraBootをSysRAMにロードします。

ROMはTegraBootのsignをSEのPKで検証します。

Jump to TegraBoot

ROMはSysRAM上のTegraBootに遷移します。

Load and validate TOS and CBoot

TegraBootはOn board flashからTOSとCBootをSDRAMにロードします。

TegraBootはTOSのsignをSEのPKで検証し、CBootのsignをSEのPKで検証します。

Jump to TOS

TegraBootはCPUを開始し、開始されたCPUはSDRAM上のTOSをフェッチしプログラムの実行を開始します。

Jump to CBoot

TOSはTrust Zoneから抜けSysRAM上のCBootに遷移します。

Load and validate u-boot

CBootはOn board flashからu-bootをSDRAMにロードし、u-bootのsignをCBootがもつPKで検証します。

CBootによるu-bootの検証が適切に行われているか調査が必要です。

Jump to u-boot

CBootはSDRAM上のu-bootに遷移します。

Nvidiaが提供するSecure Bootはここで終了です。u-bootによるinitrdとkernelの検証はユーザによる実装が必要です。

Load initrd & kernel

u-bootはSD cardからinitrdとkernelをSDRAMにロードします。

Jump to kernel

u-bootはSDRAM上のkernelに遷移します。

mount rootfs

Linux kernelはrootfsをマウントしrootfsのプログラムを開始します。

以上です。

参考記事