Edited at
FreeBSDDay 3

FreeBSD 11で変わったrandomドライバの実装

More than 1 year has passed since last update.

この記事ではFreeBSD 11.0から変わったrandomドライバの実装とその影響について書く。


10.xまでのrandomドライバ

暗号学的強度の高いベースアルゴリズムにはYarrowを使っていた。このアルゴリズムへ外部からデータを供給するときは、与えたデータの中のエントロピーがどれくらいかということをユーザ側で評価して教える必要があった。



ベースアルゴリズムへのデータ供給には、カーネルモードから呼べる1random_harvest()という関数があって、これを使ってデータを渡すようになっていた。さらにrndtestというドライバをフックすることで2、FIPS 140-2の各種アルゴリズムによる定期的なサンプリング検査を行うことができた。


11.0からのrandomドライバ

暗号学的強度の高いベースアルゴリズムはFortunaとYarrowから選べるようになったが、既定値はFortunaである。Fortunaでは与えたデータの中の有効エントロピービット数は評価しない。また、10.xまでに比べ、内部エントロピー供給源の選択肢が増えている。

ベースアルゴリズムへのデータ供給には3種類の関数が用意されるようになった。



  • random_harvest_queue(): 従来のrandom_harvest()と同様の扱い。比較的低頻度に発生するイベント用。


  • random_harvest_fast(): より高速なイベント用。エントロピー評価は厳しくなるが、その分イベント数が増えるので問題ないだろうという設計になっている。


  • random_harvest_direct(): OSがマルチタスクモードに移行する前のデータ取得用。

rndtestドライバからは、random_harvest_queue()を呼ぶように変更されている。


rndtestについて今後どうすべきかの私見



  • FIPS 140-2(PDF)のChange Notice 2では、rndtestドライバでやっているテストについては、すべて削除されている。実際にrndtestドライバを使って数ヶ月以上運用してみているが、発生手順の上で問題がないとされる物理乱数ベースのデータでも1日に数回弾かれることがあった。そういう意味ではrndtestがやっている試験は、少なくともFIPS 140-2に準拠する上では必要ないのだと思う。もちろん何らかの検定はシステムの異常検知という意味では定期的にやったほうがよいだろう。

  • rndtestはFreeBSD 11.0ではローダブルモジュールではないので、カーネルを再構築しないと組み込めない。GENERICカーネルで動かせないコードをあえて組み込んでもらうにはそれなりの対価を提供することが必要だが、そこまでやるべきかどうか、この記事を書いている時点(2016年12月3日)では疑問に思っている。

  • 上記2点を考えると、rndtestドライバはOSから外しても良いのでは、という提案をしてみてもいいかもしれない。CURRENTの該当箇所をsvnweb.freebsd.orgで見てみると、特にコードは変わっていないことがわかる。

現在外部の物理乱数モジュールを動かすために運用しているfreebsd-dev-trngというコードでは、もうrndtestは使わない設定にしている。


参考文献

技術評論社のSoftware Design誌2016年10月号pp. 102-107の拙稿「乱数を使いこなす(第3回)」でFreeBSDでの実装について言及している。

昨年のアドベントカレンダーにもrndtestドライバに関する関連記事を書いた。





  1. 当然だが非特権のユーザモードからは呼べない。 



  2. そのためには元のドライバを疑似ドライバではなくバスにattachした正しいドライバにする必要がある。