2016-04-04 11 views
2
の等価get_random_bytes()

LinuxBSDカーネルから使用するRNGに素敵なインターフェイスを提供:KMDは簡単にデバイスのファイルを開くことができませんので、Solarisの

void get_random_bytes(void *buf, int nbytes); 

を。しかし、私はSolarisのKernel functions for driversで同様のものを見つけることができません。

SolarisのカーネルモジュールがCS乱数(usermodeで/dev/urandomから得る数字)を取得するための意図した方法は何ですか?

+1

Solarisカーネル乱数生成の良い議論がここにあります: //blogs.oracle.com/darren/entry/solaris_random_number_generationカーネル関数 'random_get_pseudo_bytes()'、 'random_get_bytes()'、 'random_get_blocking_bytes()'の古いOpenSolarisソースコードは、http:// srcにあります。 .illumos.org/source/xref/illumos-gate/usr/src/uts/common/crypto/api/kcf_random.c#1100 –

+0

@AndrewHenleありがとう!非常に役立ちます。 – mtijanic

+0

@AndrewHenleおそらく答えにあなたのコメントを入れてください。 – jlliagre

答えて

2

上記の私のコメントを拡張し、Solarisカーネル乱数生成の良い議論がここにあります:https://blogs.oracle.com/darren/entry/solaris_random_number_generation

/dev/randomと/ devの両方を実装するための単一カーネルモジュール(ランダム)があります/ urandomデバイス。 2つのプライマリエントリポイントは、それぞれ コールのread(2)とwrite(2)サービスのためのrnd_read()とrnd_write()です。

rnd_read()は、デバイスノードを枯れに応じて)(kcf_rnd_get_bytes()または kcf_rnd_get_pseudo_bytesのいずれかを呼び出し、それぞれ/ dev/randomまたは/ dev/urandomの インスタンスです。 FIPSモードで、ブロックされていない読み取り(O_NBLOCK もO_NDELAYも設定されていない)のために /dev/randomが開かれている場合、rnd_read呼び出しはfips_random_get_bytes()を呼び出します。 に転送できる最大バイト数に上限がありますMAXRETBYTES_RANDOM(1040)と (MAXRETBYTES_URANDOM(128 * 1040))をそれぞれ1回読み込みます。カーネル空間で

...

1.2インタフェース

KCFモジュールカーネルKCFで 消費者のためのランダムのためのAPIを提供します。これは、リード(2)/(2)コールを書き込むサービスする と呼ばれる上記の機能を実現し、またランダムでurandomのプールにアクセスするためにカーネル消費者のためのインターフェース を提供します。

5.0ランダム鍵生成用

非対称鍵生成用のカーネル内の特殊 random_get_nzero_bytes()APIはprovided.Itが2で random_get_bytes()と異なっています方法は、第一回のみ 140-2初期化が完了したすべてのFIPSを返し random_get_bytes_fips140()関数を呼び出します。 の早いカーネル関数が必要です(特に、VMシステムのセットアップ 、そしてZFSがルート ファイルシステムのマウントの一部として書き込みを行う必要がある場合)random_get_bytes()関数を少し前に使用する必要があります。第二に、それは、出力にはバイトは、それらが新たに抽出された付加的なランダム バイトに置き換えられ、 0値を有していないことを確実に全体の要求された長さが完全に非ゼロバイトの最大 がなされるまで、継続します。

対応random_get_nzero_pseduo_bytesは()私たちは、このような セッション鍵、ナンスやクッキーなどの他のランダムな配列では0バイトをしたくないし、また 例のために利用可能です。

カーネル関数のrandom_get_pseudo_bytesの古いOpenSolarisのソースコード()、random_get_bytes()、およびrandom_get_blocking_bytesは()ここで見つけることができます。https:http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/crypto/api/kcf_random.c#1100