Arduino MKR WAN 1310に搭載されたECC508を利用して乱数を生成してみる

Arduino MKR WAN 1310にはECC508というセキュアエレメントが搭載されており、これを用いて公開鍵認証などを安全に実現することができます。
ハードウェア乱数生成器を搭載しているため、暗号論的にセキュアな乱数を生成することもできます。

以前の記事で紹介したLoRa GPSノードでは公開鍵認証は利用しませんでしたが、共通鍵暗号のIVの初期化にこのチップを利用しているため、利用方法を書いておきます。

まず、ArduinoECCX08 ライブラリをライブラリマネージャで導入します。
f:id:NeoCat:20220412035243p:plain:w600

するとスケッチ例 > ArduinoECCX08 以下に幾つかのサンプルが追加されます。

このうちECCX08RandomNumberがまさに乱数生成をするサンプルなのですが、これを利用する前に lock という作業が必要です。これは設定をチップに書き込んで二度と改変できないようにする操作です。以下ではデフォルト設定 ECCX08_DEFAULT_TLS_CONFIG を利用するので、特定の用途で使う予定がある場合はそれを使う必要があるかもしれません。

スケッチ例の Tools > ECCX08CSR を書き込み、シリアルコンソールをつなぎます。

すると購入したばかりのMKRであれば、

The ECCX08 on your board is not locked, would you like to PERMANENTLY configure and lock it now? (y/N)

と聞かれますので、 y を入力すると、チップに初期設定が書き込まれます。

それ以降の操作はここでは不要です。

改めて ECCX08RandomNumber を書き込んでやると、乱数値がシリアル出力されるはずです。

最小では

// setup
ECCX08.begin();
if (!ECCX08.locked()) { error(...) }

long random = ECCX08.random(65535);

などと指定すれば乱数値が得られます。
なおlockせずに利用しようとするとRNGがテスト用に常に特定パターンを返すため、lockされていない場合はエラーにしてこの値を使用してはいけません。

他に以下のような乱数を取得するための関数が用意されています。

  long random(long max);
  long random(long min, long max);
  int random(byte data[], size_t length);