|
| 1 | +# One Time Programmable (OTP) フラッシュ領域を鍵ストアとして使用 |
| 2 | + |
| 3 | +一部のマイクロコントローラーは、一度だけ書き込みが可能で消去できないフラッシュメモリの特別な領域を提供しています。 |
| 4 | + |
| 5 | +この機能は、ファームウェア更新イメージを認証するために必要な公開鍵を保存する場合に特に便利です。 |
| 6 | +公開鍵は自由に配布できる暗号鍵であり、ファームウェア更新イメージの署名を検証するために使用されます。 |
| 7 | +公開鍵をOTP領域に保存することで、それらが不変であり改ざんできないことを保証できます。 |
| 8 | + |
| 9 | +## OTPを鍵ストアとしてアクセスするためのwolfBootのコンパイル |
| 10 | + |
| 11 | +OTP領域を鍵ストアとして使用するには、`FLASH_OTP_KEYSTORE`オプションを有効にしてwolfBootをコンパイルする必要があります。 |
| 12 | +このオプションはデフォルトでは無効であり、鍵ストアはwolfBootバイナリ自体に組み込まれています。 |
| 13 | + |
| 14 | +wolfBootがOTP領域を鍵ストアとして使用する場合、実行時にOTP領域から公開鍵を読み取ります。 |
| 15 | +公開鍵は、格納されている鍵の数、各鍵のサイズ、その他の情報を含む最初の16バイトヘッダーの後にOTP領域に格納されます。 |
| 16 | + |
| 17 | +wolfBootが起動時や更新時にファームウェアイメージの認証を開始するためには、次のセクションで説明するように、公開鍵を別のステップでOTP領域にプロビジョニングする必要があります。 |
| 18 | + |
| 19 | +ターゲットデバイスに応じて、OTP領域コンテンツのバイナリイメージを準備するか、`otp-keystore-primer`ファームウェアを使用してターゲットに直接鍵をプロビジョニングできます。 |
| 20 | + |
| 21 | +## OTP領域コンテンツのイメージの作成 |
| 22 | + |
| 23 | +OTP領域のコンテンツのバイナリイメージを作成できます。 |
| 24 | +結果のファイル(`otp.bin`)は、ターゲットOTP領域への書き込みを可能にする任意の外部ツールを使用して手動でプロビジョニングできます。 |
| 25 | + |
| 26 | +現在の鍵ストアコンテンツを使用してotp-keystore-genツールをコンパイルするには、次のようにします。 |
| 27 | + |
| 28 | +```sh |
| 29 | +make otpgen |
| 30 | +``` |
| 31 | + |
| 32 | +そして、イメージファイル`otp.bin`を作成するには、次のようにします。 |
| 33 | + |
| 34 | +```sh |
| 35 | +./tools/keytools/otp/otp-keystore-gen |
| 36 | +``` |
| 37 | + |
| 38 | +## OTP領域への公開鍵の直接プロビジョニング(プライマー) |
| 39 | + |
| 40 | +`.config`ファイルで`FLASH_OTP_KEYSTORE`オプションを有効にした後、「`make`」を実行してwolfBootをコンパイルすると、`tools/keytools/otp`の下に`otp-keystore-primer`という追加アプリケーションが生成されます。 |
| 41 | +このアプリケーションはOTP領域に公開鍵をプロビジョニングするために使用されます。 |
| 42 | +このアプリケーションをマイクロコントローラーにフラッシュすることで、鍵ストア(以前に`keygen`によって生成された)に含まれる公開鍵がOTP領域に書き込まれます。 |
| 43 | + |
| 44 | +`otp-keystore-primer`アプリケーションは埋め込まれた公開鍵で生成されます。 |
| 45 | +鍵は`keygen`コマンドによって生成された`keystore.c`ファイルから取得されます。 |
| 46 | +`otp-keystore-primer`アプリケーションは`keystore.c`ファイルから公開鍵を読み取り、OTP領域に書き込みます。 |
| 47 | + |
| 48 | +`keygen`アプリケーションで新しい`keystore.c`を生成した後、`make otp`を実行することで、`otp-keystore-primer`アプリケーションを再度生成できます。 |
| 49 | + |
| 50 | +> [!警告] |
| 51 | +> `otp-keystore-primer`アプリケーションは一回限りのアプリケーションです。アプリケーションがターゲットで実行されると、公開鍵がOTP領域に書き込まれ、それらを消去することは不可能になります。したがって、公開鍵をOTP領域にプロビジョニングする前に、公開鍵が正しいことを確認し、関連する秘密鍵が安全に保存されていることを確認することが重要です。誤って秘密鍵を紛失すると、OTP領域に保存されている公開鍵は使用できなくなります。 |
| 52 | +
|
| 53 | +> [!注意] |
| 54 | +> **`otp-keystore-primer`アプリケーションを使用する際は十分注意してください。ご自身の責任で使用してください。** |
| 55 | +
|
| 56 | +## 例 |
| 57 | + |
| 58 | +### STM32H5 OTP KeyStore |
| 59 | + |
| 60 | +NULCLEO-STM32H563ZI(TrustZone(PKCS11経由)、DualBank、PQ LMSによる署名)の場合 |
| 61 | + |
| 62 | +1) 設定と鍵ツールをセットアップする |
| 63 | + |
| 64 | +```sh |
| 65 | +cp config/examples/stm32h5-tz-dualbank-otp-lms.config .config |
| 66 | +make include/target.h |
| 67 | +make keytools |
| 68 | +``` |
| 69 | + |
| 70 | +2) OTPに書き込む鍵を生成する |
| 71 | + |
| 72 | + - `./examples/keytools/keygen --lms -g 1.key -g 2.key -g 3.key -g 4.key -g 5.key` |
| 73 | + |
| 74 | +3) 生成された鍵と`src/keystore.c`をバックアップする |
| 75 | + |
| 76 | + - wolfBootツリー外の安全な場所に保存する |
| 77 | + |
| 78 | +4) 使用する署名鍵を設定する |
| 79 | + |
| 80 | + - 生成された鍵の1つを`wolfboot_signing_private_key.der`にコピーする |
| 81 | + - `cp 1.key wolfboot_signing_private_key.der` |
| 82 | + |
| 83 | +5) OTP鍵ストアをセットアップする |
| 84 | + |
| 85 | + OTP鍵ストアプライマーをフラッシュする |
| 86 | + |
| 87 | + - `make otp`を実行する |
| 88 | + - `./tools/keytools/otp/otp-keystore-primer.bin`を`0x08000000`にフラッシュする |
| 89 | + - ツールを切断してリセットボタンを押す |
| 90 | + - プライマーが実行され、keystore.cをOTPにフラッシュし、それらのブロックに書き込み保護を有効にする |
| 91 | + |
| 92 | + または |
| 93 | + |
| 94 | + 外部ツールを使用してOTP(otp.bin)を生成してフラッシュする |
| 95 | + |
| 96 | + - `make otpgen`を実行する |
| 97 | + - `./tools/keytools/otp/otp-keystore-gen`を実行してotp.binファイルを生成する |
| 98 | + - STM32CubeProgrammerなどの外部ツールを使用してotp.binを`0x08FFF000`にプログラムする |
| 99 | + |
| 100 | +6) OTP鍵ストアを検証する |
| 101 | + |
| 102 | + - アドレス`0x08FFF000`のメモリを読み取る(ASCII「`WOLFBOOT`」で始まるはずです) |
| 103 | + - 通常はSTM32CubeProgrammerを使用する |
| 104 | + |
| 105 | +7) オプションバイトを設定する |
| 106 | + |
| 107 | + - ユーザー構成2 -> TrustZone有効(TZEN=0xB4) |
| 108 | + - Bank1 - フラッシュウォーターマークエリア(`SECWM1_START=0x00`、`SECWM1_END=0x1F`) |
| 109 | + - Bank2 - フラッシュウォーターマークエリア(`SECWM2_START=0x00`、`SECWM2_END=0x1F`) |
| 110 | + |
| 111 | +8) デバイスの一括消去 |
| 112 | + |
| 113 | + - STM32CubeProgrammer -> フルチップ消去 |
| 114 | + |
| 115 | +9) `make`を使用してwolfBootとテストアプリケーションをビルドする |
| 116 | + |
| 117 | +10) wolfBootとtest-appをフラッシュする |
| 118 | + |
| 119 | +- `wolfboot.bin`を`0x0C000000`にフラッシュする |
| 120 | +- `test-app/image_v1_signed.bin`を`0x08040000`にフラッシュする |
| 121 | + |
| 122 | +11) 切断して再起動すると、赤色LEDが点灯するはず。 |
| 123 | + |
| 124 | +12) コンソール用にNUCLEOボード上のUSB UARTに接続する |
| 125 | + |
| 126 | +コマンドラインを探索する(helpを実行) |
| 127 | + |
| 128 | +```sh |
| 129 | +======================== |
| 130 | +STM32H5 wolfBoot demo Application |
| 131 | +Copyright 2024 wolfSSL Inc |
| 132 | +GPL v3 |
| 133 | +Version : 0x1 |
| 134 | +======================== |
| 135 | + |
| 136 | +cmd> help |
| 137 | +help : shows this help message |
| 138 | +info : display information about the system and partitions |
| 139 | +success : confirm a successful update |
| 140 | +pkcs11 : enable and test crypto calls with PKCS11 in secure mode |
| 141 | +random : generate a random number |
| 142 | +timestamp : print the current timestamp |
| 143 | +benchmark : run the wolfCrypt benchmark |
| 144 | +test : run the wolfCrypt test |
| 145 | +update : update the firmware via XMODEM |
| 146 | +reboot : reboot the system |
| 147 | +``` |
| 148 | + |
| 149 | +13) 更新をテストする |
| 150 | + |
| 151 | + - ファームウェアの新しいバージョンに署名する:`./tools/keytools/sign --lms test-app/image.bin wolfboot_signing_private_key.der 2` |
| 152 | + - シェルで「update」コマンドを実行し、xmodem転送を待つ |
| 153 | + - 「minicom」や「CoolTerm」などのxmodemをサポートするシリアルターミナルを使用する。 |
| 154 | + * `/dev/ttyACM0`で`minicom`を実行し、「CTRL+A; S」を使用してファイル転送を開始する |
| 155 | + * xmodemを選択し、新しい署名付きファームウェアファイル`test-app/image_v2_signed.bin`に移動する |
| 156 | + - 転送中、黄色のLEDが点滅する。 |
| 157 | + - 緑色のLEDはUART RXと同期しているため薄暗い |
| 158 | + - 転送の終わりに、新しいイメージが更新パーティションに配置される。 |
| 159 | + - ボードをリセットして新しいファームウェアをインストールし、新しいバージョン番号を確認する。 |
| 160 | + |
| 161 | +更新出力の例: |
| 162 | + |
| 163 | +```sh |
| 164 | +cmd> update |
| 165 | +Erasing update partition...Done. |
| 166 | +Waiting for XMODEM transfer... |
| 167 | +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. |
| 168 | + |
| 169 | + |
| 170 | + |
| 171 | + |
| 172 | +End of transfer. ret: 0 |
| 173 | +New firmware version: 0x2 |
| 174 | +Triggering update... |
| 175 | +Update completed successfully. |
| 176 | + |
| 177 | +cmd> reboot |
| 178 | + |
| 179 | +======================== |
| 180 | +STM32H5 wolfBoot demo Application |
| 181 | +Copyright 2024 wolfSSL Inc |
| 182 | +GPL v3 |
| 183 | +Version : 0x2 |
| 184 | +======================== |
| 185 | + |
| 186 | +cmd> |
| 187 | +``` |
0 commit comments