【ハンズオン5】簡易的な正規ボード認証機能を追加¶
前提条件¶
- 仮想環境の起動が完了していること
- 【ハンズオン1】が完了していること
手順¶
1. PicoボードをBOOTSELモードで起動・仮想環境に接続する¶
2. ターミナルを起動する¶
- 共通の手順 1節を参照。
3. ターミナル上で次のコマンドを実行する¶
4. フラッシュメモリ固有IDを確認する¶
出力の中にある、
flash id: 0xXXXXXXXXXXXXXXXX の部分がフラッシュメモリ固有IDとなるので、0x以降をコピーしておく。
5. 認証を行うためのプログラムを追記する¶
1章で作成したコードのvoid loop()内に、以下の方針を基に、ボード認証を行うコードを追記する。
- 以下のコードにより、フラッシュメモリ固有IDが
uniqueID[8]に格納される。
flash_get_unique_id()関数はライブラリ上の関数のため、#include <hardware/flash.h>をコードの1行目に追加することで使用可能になる。
- chipID[8]と、4.で確認したフラッシュメモリ固有IDを比較し、一致する場合のみ、
loop()内の処理を実行する。判定は、例えば以下のようなコードで行うことができる。
uint8_t KNOWN_UNIQUE_ID[8] = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX}; // 4.で確認したフラッシュメモリ固有IDをここに入力
for(int i = 0; i < 8; i++) {
if (uniqueID[i] != KNOWN_UNIQUE_ID[i]) {
// 認証失敗時の処理
return;
}
}
KNOWN_UNIQUE_IDには、4.で確認したフラッシュメモリ固有IDを入力する。例えばflash id: 0x1234567890ABCDEFであれば、KNOWN_UNIQUE_IDは以下のようになる。
- 判定処理を
setup()内で実行し、認証結果を変数に格納し、loop()内でその変数を参照し、認証結果に応じてloop()内の処理を実行するかどうかを制御することで、無駄な処理を避けることができる。
プログラミングが難しい場合は、以下のサンプルコードを参考にする。
サンプルコード
#include "hardware/flash.h" //1行目に追記
////
///既存のLED関連コード(変数の宣言・定義など)があればここに記述
////
bool verified = false; // 認証結果を格納する変数を定義
void setup() {
uint8_t uniqueID[8];
flash_get_unique_id(uniqueID);
uint8_t KNOWN_UNIQUE_ID[8] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; // ここに事前に調査したフラッシュメモリ固有IDを入力
for (int i = 0; i < 8; i++) {
if (uniqueID[i] != KNOWN_UNIQUE_ID[i]) {
return; // 認証失敗時の処理
}
}
verified = true; // 認証成功時にtrueを設定
}
void loop() {
if (!verified) { // 認証に失敗した場合
digitalWrite(LED_BUILTIN, LOW); // LEDを消灯
delay(1000); // 1秒待機(任意)
return; // 認証失敗時は以降の処理を実行しない
}
////////////////////////////////
/// 既存のLED制御に関するコードをここに記述
////////////////////////////////
}
6. ファームウェアのコンパイル・書込¶
メニューのSketch > Verify/Compile (Ctrl+R) を選択して、スケッチをコンパイルする。
その後、パッチが適用されたファームウェアを書き込む。
書き込みについては、【ハンズオン1】ファームウェアの作成 第8節を参照。
(上記の手順ではbinファイルをpicotoolを用いて書き込んでいるが、コンパイル後、Arduino IDEで直接書き込んでも良い)
書き込み後、LEDが正しく点灯することを確認する。