Intel/AMD/VIA 乱数生成器用ハードウェアドライバ Copyright 2000,2001 Jeff Garzik Copyright 2000,2001 Philipp Rumpf はじめに: hw_random デバイスドライバは、CPU やマザーボード上の特別な ハードウェア、乱数生成器 (RNG; Random Number Generator) を 使うためのソフトウェアです。 このデバイスドライバを効果的に使用するためには、サポートソフト ウェアも同じくダウンロードするのがよいでしょう。"rng-tools" パッケージの最新バージョンを、hw_random ドライバ公式 Web サイト からダウンロードしてください。 http://sourceforge.net/projects/gkernel/ Intel RNG ハードウェアについて。ファームウェアハブデータシートより: ファームウェアハブは、本質的にランダム量であるシリコンの量子 力学的属性から生成される熱雑音を利用し、乱数生成器 (RNG; Random Number Generator) を完全化します。新しいランダムなビットを生成 していないときには、RNG 回路は低消費電力状態となります。サード パーティのソフトウェアがセキュリティ機構として使用するため RNG にアクセスできるようにするバイナリソフトウェアドライバが、Intel から提供されるでしょう。現時点では、RNG は OS が存在するシス テムでのみ使用できます。 操作方法: キャラクタドライバです。標準の open() および read() システム コールを使い、ハードウェア RNG デバイスからランダムデータを 読み出すことができます。このデータは、何らかの適正テストに よってチェックを受けることはなく、潜在的に本物ではない可能性 があります (ハードウェアに障害があるか、改ざんされている場合)。 ハードウェアの "has-data" フラグがセットされている場合、データ は出力のみとなります。しかし、セキュリティに対して意識の高い 人なら、これが真にランダムなデータであると仮定する前に、この データに対して適性テストを実行するでしょう。 /dev/hwrandom は、メジャー番号 10, マイナー番号 183 のキャラ クタデバイスです。 ドライバメモ: * FIXME: poll(2) サポート 注意: 三つの理由により、request_mem_region は削除されました。 1) このドライバでは一つの RNG しかサポートしない。 2) RNG により使用される場所は、メモリマップト I/O アド レッシングが可能なメモリ内の固定的な場所である。 3) BIOS e820 操作が適切に機能しているユーザの場合、RNG が置かれている領域は常に予約済みになっているので、 適切なセットアップに対しては、request_mem_region 呼出しが常に失敗してしまう。しかしながら、mem=XX を 使うと、BIOS e820 情報は /proc/iomem に現れず、 request_mem_region(RNG_ADDR) は成功します。 ドライバ詳細: 参考にしたもの: Intel 82802AB/82802AC Firmware Hub (FWH) Datasheet 1999 年 5 月 注文番号: 290658-002 R Intel 82802 Firmware Hub: Random Number Generator Programmer's Reference Manual 1999 年 12 月 注文番号: 298029-001 R Intel 82802 Firmware HUB Random Number Generator Driver Copyright (c) 2000 Matt Sottek Matt Sottek には特に感謝します。私は「根性」、彼は「頭脳」で、 全てのテストもしてくれました。 変更履歴: Version 1.0.0: * Intel, AMD, VIA の RNG ドライバ群を一つに統合。BitKeeper 内にさらに変更ログがあります。 Version 0.9.8: * 82801E 検出追加により、他の i8xx チップセットをサポート * 82801CA と同様の 82801DB 検出 Version 0.9.7: * 他の i8xx チップもサポート (82801BA(M) と 82801CA(M) の検出 追加によって) Version 0.9.6: * ドライバ内部のクリーンアップ。1.0.0 リリースに向けての準備 Version 0.9.5: * タイマ経由のエントロピー注入を除去。今まで機能していません でしたが、今はよりよい解決方法 (rngd) があります。 Version 0.9.4: * 修正: request_mem_region を削除 * 修正: FIPS 計算とテスト実行におけるひどいバグ Version 0.9.3: * rng_read を少しクリーンアップ * i810_rng ドライバの Web サイト URL を更新 * デフォルトのタイマインターバルを毎秒 4 サンプルへ増加 * メモリリージョンが得られない場合に abort * BSS ゼロ初期化クリーンアップ * rng_init_one から misc_register() を呼び出し * スケジュール前に発生するように O_NONBLOCK を修正 Version 0.9.2: * オープンブロックのロジックを簡素化 Version 0.9.1: * i815 チップセットもサポート (Matt Sottek) * 静的にコンパイルされたときの参照数カウントを修正 (prumpf) * rng_dev_read の書き直し (prumpf) * モジュールの競合を発生しにくくしました (prumpf) * いろいろと小さなバグを修正 (prumpf) * PCI ID リスト用の PCI テーブルを使用 Version 0.9.0: * pci_driver を登録しないようにしました。というのは、私達は 実際に PCI ブリッジベンダ/デバイス ID を使用しており、また、 誰かがブリッジ用にドライバを登録したいと思うかもしれないから です (バグ修正) * 使用カウントが負数にならないようにしました (バグ修正) * スピンロックのクリーンアップ (バグ修正) * 必要な場合に PCI デバイスを有効化 (バグ修正) * モジュールアンロード時に iounmap (バグ修正) * open(2) が呼ばれたときに RNG キャラクタデバイスが既に使用され ている場合、使用可能となるまでスリープするようにしました。 * 冗長なグローバル変数 rng_allocated, rng_use_count を削除 * 数値のグローバル変数を unsigned に変更 * モジュールアンロードのクリーンアップ Version 0.6.2: * スピンロックのクリーンアップ。注目している割込みはありません が、注目しているタイマはあるので、タイマ関数自身以外の全ての 場所において、spin_lock_bh を使用するようにしました。 * モジュールのロード/アンロードを修正 * タイマ関数および h/w 有効/無効ロジックを修正 * 新しいタイマインターバル sysctl * sysctl 名のクリーンアップ ------------------------------------------------------------ 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ > 翻訳日: 2004/05/23 翻訳者: 川崎 貴彦 校正: Seiji Kaneko