今回はTRNG(True Random Number Generator)です。Pico2のRP2350にはTRNGが搭載されとりますが、PicoのRP2040には不在。2チップの比較というとそれでおしまいになってしまいます。それでは寂しいので乱数素人老人が、コマケー話を追加してみましたぞ。大丈夫か?
※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。
※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。
True Random Number Generator
TRNG、「真性乱数生成器」と訳したら良いですかね?セキュリティに配慮したモダーンなマイコンではいまや搭載必須のIP、といっても良いかもしれませぬ。昔は乱数というと数式で生成できる「疑似乱数」を計算してお茶を濁して?おったものです。しかし疑似乱数(あるいは決定論的に数式で計算できる乱数)であると、タネ(シード)を見破られてしまうと乱数の意味を成しませぬ。高まるセキュリティへの要求もあり、人為の及ばぬ?物理現象から乱数のタネ(エントロピー・ソースなどと呼ばれているみたい)を取り出すというのが最近の流れです。まあ、アナログ回路の権化の方々からすると今頃になってようやく気付いたのかよ、という感じでしょうか。抵抗一個あれば乱数のタネは尽きまじ。ノイズは乱数の宝庫っす。そういえば遥か太古の時代のApple IIも乱数生成するのに物理現象使っていたような。知らんけど。
さて本サイトでも何度かTRNGを取り上げさせていただいております。リンクが以下に。
IoT何をいまさら(92) ATSAMD51、TRNG、「真性」乱数ジェネレータ
GoにいればGoに従え(21) TinyGo、乱数発生器よみとり、micro:bit v2
上のATSAMD51は、米国マイコン業界の雄、Microchip社のマイコンです。下のmicro:bit v2 は「電子工作業界で人気」の小型ボードですが、搭載しているマイコンはBluetooth業界にその名がとどろくノルウエーのNordic Semiconductor社のnRF52833です。どちらもArm Cortex M4をコアに搭載しております。
一応、上記で2機種のTRNGを動かしてみているので、後でPico2のTRNGとちょいと比較してみたいと思います。
RP2350搭載のTRNG
データシートを拝見すると、搭載のTRNGはArm社のIPであるようです。Arm社はTrustZoneというセキュリティの仕様というか規格というかIP群を強力に推し進めているのでその一環のIPみたいです。Arm社のIPサイトへのリンクが以下に。
True Random Number Generator (TRNG)
どうもこのTRNGは内蔵のROSC(リングオシレータ、TRNG専用のもの。他にもRP2350はROSCを各所に搭載しております。一体何個ROSC搭載しているんだ?)を使って「エントロピー」を得ているみたいです。ううむ、エントロピーです。大昔、学校で熱力学を習ったとき、エンタルピーくらいまではよかったけれども、エントロピーが出てきて落ちこぼれた遠い記憶。熱力学や統計力学のことはおいておいて、ここではエントロピーソース=乱数のタネ(seed)だと浅墓な理解で行きたいと思います。
さすがArm社、本IPに関して各種規格に準拠しておることを表明されてます。
まずは米国NIST様の以下のエントロピー・ソース規格です。
NIST SP 800-90B Recommendation for the Entropy Sources Used for Random Bit Generation
そこから、暗号やセキュリティのプロの人々が気にする以下のFederal Information Processing StandardもOKみたい。
FIPS 140-2 Security Requirements for Cryptographic Modules
米国だけではありませぬ。ドイツ連邦はFederal Office for Information Security様の以下の規格もバッチリみたいです。
BSI AIS-31 Random Number Generators
RP2350搭載のTRNGの弱点?
上記のように、乱数素人老人は流石Arm、スゲー立派なIPじゃん、と圧倒されてしまうのです。しかし、よくみると若干の弱点も見える気がしないでもないです。まずそのスペックについて1か所データシートから引用させていただきます。
Produces approximately 7.5 kb/s of entropy when the core runs at 150 MHz. On request, the TRNG block generates a block of 192 entropy bits
秒速7.5kビットで種を振り出せるようです。物理現象から種を取り出すのに若干の時間がかかると。他社のTRNGでも物理現象を扱うのに時間が掛かるのは同様なので問題にはなりません。しかし、このIPの場合、平均2ミリ秒でタネを生成できる、といいつつ、その正確な完了時間は予測不能であります。おっと。
ちなみにMicrochip製ATSAMD51のTRNGでは以下のように表明されとります。
provides a 32-bit random number every 84 clock cycles
おお、決まったクロック数で結果がでるのね。これは安心。でも精度は、といってみると(多少古い石なので)NIST 800-22規格に準拠しており、FIPS PUB 140-2もOKらしいデス。やるな Microchip。
一方、NORDICのnRF52833のRNG(彼らはTRNGと呼ばず素っ気なくRNGと唱えてます)の場合は、生成時間はunpredictableらしいです。生成は1バイト単位。伝統の?サーマルノイズ起源らしいです。なお、nRF52833の場合は特に乱数規格についての言及はありませんでした。
まあ、RP2350の場合、弱点という認識があためか、内蔵のbootromにalternative approachesがあるみたいです。乱数素人老人は調べる気力なく。トホホ。
後でとりあえずTRNG、動かしてみろよ、自分。※2024年12月19日追記:ということで動かしてみた記事は ココ(ラズパイPico2でもuLisp、TRNG、真性乱数の生成) です。