コンテンツにスキップ

【ハンズオン5】簡易的な正規ボード認証機能を追加

前提条件

  • 仮想環境の起動が完了していること
  • 【ハンズオン1】が完了していること

手順

1. PicoボードをBOOTSELモードで起動・仮想環境に接続する

2. ターミナルを起動する

3. ターミナル上で次のコマンドを実行する

$ sudo picotool info --all

4. フラッシュメモリ固有IDを確認する

出力の中にある、 flash id: 0xXXXXXXXXXXXXXXXX の部分がフラッシュメモリ固有IDとなるので、0x以降をコピーしておく。

5. 認証を行うためのプログラムを追記する

1章で作成したコードのvoid loop()内に、以下の方針を基に、ボード認証を行うコードを追記する。

  • 以下のコードにより、フラッシュメモリ固有IDがuniqueID[8]に格納される。

uint8_t uniqueID[8];
flash_get_unique_id(uniqueID); // フラッシュメモリ固有IDを取得
なお、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は以下のようになる。

uint8_t KNOWN_UNIQUE_ID[8] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
  • 判定処理を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/CompileCtrl+R) を選択して、スケッチをコンパイルする。 その後、パッチが適用されたファームウェアを書き込む。 書き込みについては、【ハンズオン1】ファームウェアの作成 第8節を参照。 (上記の手順ではbinファイルをpicotoolを用いて書き込んでいるが、コンパイル後、Arduino IDEで直接書き込んでも良い)

書き込み後、LEDが正しく点灯することを確認する。