BSD界隈四方山話

第17回/dev/randomがカーネルモジュールへ

動的に切替ができる擬似乱数アルゴリズム実装へ

FreeBSDプロジェクトは今年の6月末に実施したコミットで、FreeBSD 11-CURRENTのカーネルデフォルトのエントロピー処理アルゴリズムをYarrowからFortuna(フォーチュナ、フォルトゥナ)に変更しました。FortunaはYarrowの後継にあたるアルゴリズムで、より安全側へ実装を振ったということが言えると思います。

6月の段階ではデフォルトの実装をFortunaに変更し、従来のYarrowを使いたい場合には次のカーネルオプションを指定してカーネルを再構築する必要がありました。

リスト1 6月末の段階のカーネルでYarrowを有効にするためのカーネルオプション
options RANDOM_YARROW

8月半ばに実施されたコミットで、/dev/random (random(4))の実装を静的に固定するのではなく、動的に入れ替えができるようになりました。次のカーネルオプションを指定した状態でカーネルをビルドすると、/dev/randomの実体としてrandom_fortuna.koまたはrandom_yarrow.koのどちらかを指定できるようになります。当然、random_fortuna.koがFortunaでrandom_yarrow.koがYarrowです。

リスト2 8月17日以降で利用できる動的抜き差し可能な/dev/randomを実現する機能
device  random
options RANDOM_LOADABLE

カーネルモジュールの読み込みにはkldload(8)コマンドを使用します。動的に切り替えができるようにした場合には、kldstat(8)で読み込んでいるカーネルモジュールの一覧を表示させることで、現在どちらが使われているか判断できます。カーネルモジュール版の/dev/randomはカーネルモジュールとして動作させるために間接的に関数コールを実施しているため、カーネルに組み込まれたバージョンの/dev/randomに比べるとわずかに動作が遅くなるという説明もあります。

6月の段階では別のカーネルオプションとして次のオプションも提供されていました。

リスト3 8月のコミットで廃止されたカーネルオプション
options RANDOM_DUMMY

8月半ばのコミットでこのカーネルオプションは廃止されました。あまり使われていなかったことなどが理由として挙げられています。

別の乱数機能の実装がかんたんに

カーネルモジュールとして動的な読み込みが可能になったことの効果の一つに、擬似乱数アルゴリズムの実装追加が簡単にできるようになった、という点を挙げることができます。今回、Fortunaへの切り替えやカーネルモジュールとして動的に処理できるようにするため、コードのリファクタリングが実施されました。コードの見通しがよくなったことそれ自身がすばらしいことですが、新しく実装を追加するのが簡単になったというのも大きなポイントです。

しかも、新しく乱数生成器を開発するためのテンプレートが/head/sys/dev/random/other_algorithm.cおよび/head/sys/dev/random/other_algorithm.hとして追加されています。ここに何を書けばよいといったコメントまで含まれていますので、実装をはじめるのはそう難しくないと思います。

このテンプレートや擬似乱数アルゴリズムの実装のみならず、ハードウェアの提供する乱数機能を利用するといった場合にも使用できます。今後YarrowやFortuna以外のアルゴリズムが追加されることもあるかもしれませんね。

おすすめ記事

記事・ニュース一覧