ベアメタル・システム用のMACアドレス生成法

ちょっと考えていることがあって、「MACアドレスを内蔵していないEthernetアダプタ用のMACアドレス生成」について調べてみました。非常に興味深い手法があったので記録しておくする次第です。

MACアドレスにはグローバルとプライベートがあります。プライベートなMACアドレスは、そのアドレス空間内で好きに設定して構いません。ただし、ローカルネットワーク内部での使用に限ります。ルーターの内側で使う家庭用機器ならプライベートMACアドレスでよいでしょう。

さて、プライベートMACアドレスと言えどもローカルネットワーク内部でのアドレス衝突は避けなければなりません。言い換えると、ローカルネットワーク中のプライベートMACアドレスはそれぞれ異なっていなければなりません。自作で使われる低価格のEthernetアダプタの中にはMACアドレスを持っていないものがあり、これに対して適切なプライベートMACアドレスを与える必要があります。

マイコンに乱数発生器(RNG)が内蔵されているなら話は簡単です。ST Microelectronicsの一部のマイコンにはRNGが搭載されています。また、ESP32にも高周波入力をもとにした乱数発生器が搭載されています。これらを使った乱数から48bitのMACアドレスを生成すれば、家庭内でのMACアドレスの衝突に関しては心配する必要はなくなるでしょう。

一方で、Raspberry Pi PicoやPico Wには乱数発生器が搭載されていません。Raspberry Pi ZeroであればLinuxの乱数発生器を使うことができる(システムレベルでかなり執拗に作っている)のですが、ベアメタル・システムではそうはいきません。

そこで、外部回路でよいノイズ源が無いか調べてみました。ノイズ源としてすぐに思いつくのはシンセサイザーのノイズ・ジェネレータです。PN接合の特性を使ったこだわりのノイズ源が多数発表され、いろいろと(主に聞き心地の面で)評価されています。これをバッファアンプで増幅してADCで読み込めば、よい雑音源になりそうです。

などと考えている時に面白い論文にあたりました。

A-D 変換器の最下位ピットを用いた暗号用乱数生成法

新潟大学大学院の茂呂友子氏による2005年の論文です。要旨としては

  • ADCのFsの1/100以上の周波数の発振器をサンプルして
  • LSBだけ取り出したbit列を乱数として使う

ということです。

FIPS 140-2(米国連邦政府のセキュリティ標準)が定める暗号検定にパスするということで、大変に筋がよいです。FIPS 140-2は古い標準で、すでにFIPS 140-3へのアップグレードが求められています。しかし、私の目的は暗号通信ではないので、十分安心して使えます。

論文を読めばわかるように、周波数範囲や安定度に対して寛容な方法です。ですので、 「1kHzのRC発信機をFs=10kHzで読む」といった方法であれば、回路規模もプログラム規模も非常に小さなものになりそうです。もっとも、発振器は発振器で難しいんですけどね。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください