ちょっと考えていることがあって、「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で読み込めば、よい雑音源になりそうです。
などと考えている時に面白い論文にあたりました。
新潟大学大学院の茂呂友子氏による2005年の論文です。要旨としては
- ADCのFsの1/100以上の周波数の発振器をサンプルして
- LSBだけ取り出したbit列を乱数として使う
ということです。
FIPS 140-2(米国連邦政府のセキュリティ標準)が定める暗号検定にパスするということで、大変に筋がよいです。FIPS 140-2は古い標準で、すでにFIPS 140-3へのアップグレードが求められています。しかし、私の目的は暗号通信ではないので、十分安心して使えます。
論文を読めばわかるように、周波数範囲や安定度に対して寛容な方法です。ですので、 「1kHzのRC発信機をFs=10kHzで読む」といった方法であれば、回路規模もプログラム規模も非常に小さなものになりそうです。もっとも、発振器は発振器で難しいんですけどね。