この記事は、インテル® デベロッパー・ゾーンに公開されている「Changes to RDRAND integration in OpenSSL」(https://software.intel.com/en-us/blogs/2014/10/03/changes-to-rdrand-integration-in-openssl) の日本語参考訳です。
OpenSSL の 1.0.1f リリース以降からは、RDRAND エンジンはデフォルトではロード[1] されなくなりました。
これによるユーザーと開発者への影響は、近い将来 RAND_bytes() 関数による乱数の生成が、RDRAND 命令による直接的なものから OpenSSL ソフトウェア・ベースの PRNG によるものになるということです。 この変更は、単一エントロピーによる乱数生成のため、OpenSSL リライアンスに関連するユーザーコミュニティーによって行われました。本来、OpenSSL は、それが行われていることを意識することなく、開発者やユーザーに単一エントロピーによる発生を強制することは意図していませんでした。
残念ながら、この変更は RDRAND がもはや OpenSSL の乱数発生器のデフォルトではないことを意味します。
この変更は、将来的に OpenSSL と RDRAND にどのような影響があるのでしょうか?
RDRAND エンジンの扱いの変更は永続的です。OpenSSL は、バージョン 1.0.1f 以降デフォルトでは RDRAND エンジンをロードしません。
しかし、これからも RDRAND は OpenSSL に残されます。今後の 1.0.2 リリースにおいても OpenSSL の PRNG は、利用可能であれば RDRAND と RDSEED 命令を使用します。これは、次の 2 つの方法で行われます:
- RDRAND (非 FPIS モード)から取得した値と、ソフトウェア PRNG から取得したランダムな値を XOR する。
- ソフトウェア PRNG をシードするため、エントロピーのソースとして RDRAND もしくは RDSEED を使用する (FIPS および非 FIPS モードの両方で)。
PRNG に組み込まれたこの新しい振る舞いは、OpenSSL ソースツリーの 1.0.2-stable ブランチで承認されています。これにはリリースバージョンや対象の変更期日はありませんが、これらの変更が実装される前に 1.0.2 の初期リリースが凍結されることはないでしょう。また、この変更が 1.0.1 ブランチにも反映されるかどうかは分かりません。
開発者はその間に何をすべきでしょうか?
OpenSSL アーキテクチャーにおける変更は、開発者にどのような影響を与えるでしょう。それは、開発者の目的に依存し、どれくらいまで行うかに依ります。
RDRAND エンジンを有効にする
もし、RAND_bytes() 関数の戻り値を RDRAND 命令によるものであることを確実にしたい場合、How to use the rdrand engine in OpenSSL for random number generation (https://software.intel.com/en-us/articles/how-to-use-the-rdrand-engine-in-openssl-for-random-number-generation) の記事で説明する方法で、RDRAND エンジンを有効にすることができます。これにより、手動操作を介して 1.0.1f 以前の OpenSSL の振る舞いに戻ります。また、エンドユーザーがシステムにインストールしている OpenSSL にバージョンにかかわりなく、以降もこの動作は保証されます。
何も行う必要はありません
別の方法として、何もせず OpenSSL の RAND_bytes() 関数のデフォルト動作を受け入れることもできます。これは、OpenSSL のバージョンによって RAND_bytes() で生成される乱数のソースが変わることを意味します。エンドユーザーが 1.0.1e から 1.0.1f へアップグレードを行った場合、RDRAND 命令の恩恵は受けられなくなります。また、RDRAND サポートが再び有効となった 1.0.2 へアップグレードすると、ユーザーは OpenSSL PRNG を利用できますが、RDRAND からの値と混在するものになります。
幸いなことに、 RDRAND が RAND_bytes() 関数に統合されないこの期間は、長く続きはしません。
注 [1]: 厳密には、ロードはされていますが有効になっていません。そのため、”openssl engine” を実行すると、エンジンのリストには表示されます。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。