@@ -146,9 +146,224 @@ wolfSSLをマルチスレッド環境で使用する場合、wolfSSLミューテ
146146
147147A: `/dev/random` や `/dev/urandom` を利用できない、あるいはハードウェアRNGに統合する必要がある場合です。
148148
149- デフォルトでは、wolfSSLは `/dev/urandom` または `/dev/random` を使用して RNG シードを生成します。wolfSSLをビルドするときに `NO_DEV_RANDOM` 定義を使用して、デフォルトの `GenerateSeed()` 関数を無効にすることができます。これが定義されている場合は、ターゲットプラットフォームに固有の `./wolfcrypt/src/random.c` にカスタム `GenerateSeed()` 関数を記述する必要があります。これにより、ハードウェアベースのランダムエントロピーソースが利用可能な場合は、wolfSSLのPRNGにシードを設定できます。
149+ ### 概要
150150
151- `GenerateSeed()` の記述方法の例については、`./wolfcrypt/src/random.c` にある wolfSSL の既存の `GenerateSeed()` 実装を参照してください。
151+ wolfSSLはデフォルトでSHA-256に基づくFIPS認証済みのHash_DRBG(Deterministic Random Bit Generator)を使用します。このDRBGはNIST SP 800-90Aに準拠しており、すべてのSSL/TLS操作に対して暗号学的に安全な乱数生成を提供します。DRBGは初期化および定期的な再シードのためにエントロピーソース(シード)を必要とします。
152+
153+ ### デフォルトの動作
154+
155+ デフォルトでは、wolfSSLのDRBGは以下の優先順位でエントロピーソースを選択します。
156+
157+ 1. **ハードウェアエントロピーソース**(利用可能で有効な場合)
158+ - Intel RDSEED命令(`HAVE_INTEL_RDSEED`)
159+ - AMD RDSEED命令(`HAVE_AMD_RDSEED`)
160+ - プラットフォーム固有のハードウェアRNG(各種組み込みプラットフォーム)
161+
162+ 2. **オペレーティングシステムのエントロピーソース**
163+ - `/dev/urandom`(Unix系システムで優先)
164+ - `/dev/random`(/dev/urandomが利用できない場合のフォールバック)
165+ - Linuxでの`getrandom()`システムコール(`WOLFSSL_GETRANDOM`が定義されている場合)
166+
167+ DRBGはデフォルトで有効になっており、`./wolfcrypt/src/random.c`に実装されています。Hash_DRBG実装はSHA-256を使用し、継続的なエントロピーを確保するために定期的に再シードされる内部状態を維持します。
168+
169+ ### /dev/urandomまたは/dev/randomの無効化
170+
171+ お使いのプラットフォームに`/dev/urandom`や`/dev/random`がない場合、またはこれらを使用しないように構成したい場合は、以下のいずれかを定義してください。
172+
173+ - **`NO_DEV_URANDOM`**:`/dev/urandom`の使用を無効化(`/dev/random`にフォールバック)
174+ - **`NO_DEV_RANDOM`**:`/dev/urandom`と`/dev/random`の両方の使用を無効化
175+
176+ `NO_DEV_RANDOM`を定義する場合、以下の方法のいずれかを使用して代替のエントロピーソースを提供する必要があります。
177+
178+ ### DRBGの無効化
179+
180+ Hash_DRBG全体を`WC_NO_HASHDRBG`を定義することで無効化できます。ただし、DRBGを無効化した場合、`CUSTOM_RAND_GENERATE_BLOCK`を使用してカスタム乱数生成器を別途提供する必要があります。
181+
182+ `user_settings.h`には、次のように定義します。
183+ ```c
184+ #define WC_NO_HASHDRBG
185+ #define CUSTOM_RAND_GENERATE_BLOCK myHardwareRNG
186+ ```
187+
188+ `myHardwareRNG`は以下のシグネチャを持つ関数です。
189+ ```c
190+ int myHardwareRNG (unsigned char* output, unsigned int sz);
191+ ```
192+
193+ この関数は`output`バッファにハードウェアRNGから`sz`バイトのランダムデータを書き込み、成功時に0を返す必要があります。
194+
195+ ### カスタムシード生成方法
196+
197+ wolfSSLはDRBGがシードを取得する方法をカスタマイズするためのいくつかの方法を提供しています。
198+
199+ #### 1. CUSTOM_RAND_GENERATE_SEED
200+
201+ シードデータを生成するカスタム関数を定義します。これはエントロピーを提供する最も直接的な方法です。
202+
203+ ```c
204+ #define CUSTOM_RAND_GENERATE_SEED myGenerateSeed
205+
206+ int myGenerateSeed(unsigned char* output, unsigned int sz)
207+ {
208+ /* エントロピーソースからszバイトのエントロピーでoutputバッファを埋める */
209+ /* 成功時は0を、エラー時は非ゼロを返す */
210+ }
211+ ```
212+
213+ #### 2. CUSTOM_RAND_GENERATE
214+
215+ 一度に1つずつランダム値を返す関数を定義します。wolfSSLはシードバッファを埋めるためにこの関数を繰り返し呼び出します。
216+
217+ ``` c
218+ #define CUSTOM_RAND_GENERATE myRandFunc
219+ #define CUSTOM_RAND_TYPE unsigned int
220+
221+ unsigned int myRandFunc (void)
222+ {
223+ /* エントロピーソースからランダム値を返す * /
224+ }
225+ ```
226+
227+ `CUSTOM_RAND_TYPE`は関数の戻り値の型と一致する必要があります(例:`unsigned int`、`unsigned long`など)。
228+
229+ `./wolfcrypt/src/random.c`における使用例:
230+ ```c
231+ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
232+ {
233+ word32 i = 0;
234+ while (i < sz) {
235+ if ((i + sizeof(CUSTOM_RAND_TYPE)) > sz ||
236+ ((wc_ptr_t)&output[i] % sizeof(CUSTOM_RAND_TYPE)) != 0) {
237+ output[i++] = (byte)CUSTOM_RAND_GENERATE();
238+ }
239+ else {
240+ *((CUSTOM_RAND_TYPE*)&output[i]) = CUSTOM_RAND_GENERATE();
241+ i += sizeof(CUSTOM_RAND_TYPE);
242+ }
243+ }
244+ return 0;
245+ }
246+ ```
247+
248+ #### 3. wc_SetSeed_Cb(ランタイムコールバック)
249+
250+ ` wc_SetSeed_Cb() ` を使用してランタイムにシード生成コールバックを設定します。有効にするにはビルド時に` WC_RNG_SEED_CB ` の定義が必要です。
251+
252+ ビルド設定:
253+ ``` c
254+ #define WC_RNG_SEED_CB
255+ ```
256+
257+ ランタイムでの使用:
258+ ``` c
259+ #include < wolfssl/wolfcrypt/random.h>
260+
261+ int myCustomSeedFunc (OS_Seed* os, byte* seed, word32 sz)
262+ {
263+ /* seedバッファにszバイトのエントロピーを生成 * /
264+ /* 成功時は0を返す * /
265+ }
266+
267+ /* RNGを初期化する前にコールバックを設定 * /
268+ wc_SetSeed_Cb(myCustomSeedFunc);
269+
270+ /* 通常通りRNGを初期化して使用 * /
271+ WC_RNG rng;
272+ wc_InitRng(&rng);
273+ ```
274+
275+ `wc_SetSeed_Cb`関数は`./wolfcrypt/src/random.c`で定義されています。
276+
277+ #### 4. 暗号コールバック(WC_ALGO_TYPE_SEED)
278+
279+ wolfSSLの暗号コールバックメカニズムを使用して、ハードウェアセキュリティモジュールやカスタム暗号デバイスを通じてシード生成を提供します。有効にするには`WOLF_CRYPTO_CB`の定義が必要です。
280+
281+ ビルド設定:
282+ ```c
283+ #define WOLF_CRYPTO_CB
284+ ```
285+
286+ 実装例(` wolfssl-examples/tls/cryptocb-common.c ` ):
287+ ``` c
288+ int myCryptoCb (int devIdArg, wc_CryptoInfo* info, void* ctx)
289+ {
290+ if (info->algo_type == WC_ALGO_TYPE_SEED) {
291+ /* ランダムシードデータを生成 * /
292+ /* info->seed.seed = 出力バッファ * /
293+ /* info->seed.sz = 要求されたサイズ * /
294+
295+ /* 例:ハードウェアからのエントロピーで埋める場合 * /
296+ while (info->seed.sz > 0) {
297+ word32 len = (info->seed.sz < BLOCK_SIZE) ? info->seed.sz : BLOCK_SIZE;
298+ /* ハードウェアからエントロピーを取得 * /
299+ getHardwareEntropy(info->seed.seed, len);
300+ info->seed.seed += len;
301+ info->seed.sz -= len;
302+ }
303+ return 0;
304+ }
305+ return CRYPTOCB_UNAVAILABLE;
306+ }
307+
308+ /* コールバックを登録 * /
309+ int devId = 1;
310+ wc_CryptoCb_RegisterDevice(devId, myCryptoCb, NULL);
311+
312+ /* RNGを初期化する際にデバイスIDを使用 * /
313+ WC_RNG rng;
314+ wc_InitRng_ex(&rng, NULL, devId);
315+ ```
316+
317+ この方法は、HSM、TPM、またはその他のハードウェアセキュリティデバイスとの統合に特に有用です。
318+
319+ ### テストと開発
320+
321+ #### WOLFSSL_GENSEED_FORTEST
322+
323+ 開発およびテスト目的のみで、`WOLFSSL_GENSEED_FORTEST`を定義して偽の予測可能なシードを使用できます。**これは本番環境では絶対にお使いにならないでください**。一切の安全性がなくなります。
324+
325+ ```c
326+ #define WOLFSSL_GENSEED_FORTEST
327+ ```
328+
329+ これはテストとデバッグにのみ適した決定論的なシードパターン(0x00、0x01、0x02、...)を生成します。実装は` ./wolfcrypt/src/random.c ` にあります。
330+
331+ ### プラットフォーム固有の例
332+
333+ プラットフォーム固有の` wc_GenerateSeed() ` 実装の例については、` ./wolfcrypt/src/random.c ` の既存の実装をご参照ください:
334+
335+ - ** Windows** :` CryptGenRandom() ` または` BCryptGenRandom() ` を使用
336+ - ** SGX** :` sgx_read_rand() ` を使用
337+ - ** 組み込みプラットフォーム** :FreeRTOS、Zephyr、Micriumなどの各種実装
338+ - ** ハードウェアRNG** :STM32、NXP、Renesas、Infineonおよびその他のプラットフォームの例
339+
340+ ### 設定オプションの概要
341+
342+ | 定義 | 目的 | 必要条件 |
343+ | --------| ---------| ----------|
344+ | ` NO_DEV_URANDOM ` | ` /dev/urandom ` を無効化 | ` /dev/random ` にフォールバック |
345+ | ` NO_DEV_RANDOM ` | ` /dev/urandom ` と` /dev/random ` を無効化 | 代替シードソース |
346+ | ` WC_NO_HASHDRBG ` | Hash_DRBG全体を無効化 | ` CUSTOM_RAND_GENERATE_BLOCK ` |
347+ | ` CUSTOM_RAND_GENERATE_BLOCK ` | 完全なRNG代替を提供 | 関数の実装 |
348+ | ` CUSTOM_RAND_GENERATE_SEED ` | カスタムシード生成関数 | 関数の実装 |
349+ | ` CUSTOM_RAND_GENERATE ` | カスタムランダム値関数 | 関数 + ` CUSTOM_RAND_TYPE ` |
350+ | ` WC_RNG_SEED_CB ` | ランタイムシードコールバックを有効化 | ` wc_SetSeed_Cb() ` の使用 |
351+ | ` WOLF_CRYPTO_CB ` | 暗号コールバックを有効化 | コールバックの登録 |
352+ | ` WOLFSSL_GENSEED_FORTEST ` | テスト用の偽シード | ** テスト専用** |
353+
354+ ### 推奨事項
355+
356+ 1 . 可能な限り** デフォルトのDRBGを** お使いください。FIPS認証済みであり、十分にテストされています。
357+ 2 . ** /dev/randomがない組み込みシステムの場合** :ハードウェアRNGと共に` CUSTOM_RAND_GENERATE_SEED ` をお使いください。
358+ 3 . ** HSM/TPMを使用する場合** :` WC_ALGO_TYPE_SEED ` と共に暗号コールバックをお使いください。
359+ 4 . ** 最大限の柔軟性を必要とする場合** :` wc_SetSeed_Cb() ` を使用して、ランタイムにコールバックを設定ください。
360+ 5 . ** 本番環境では絶対に** ` WOLFSSL_GENSEED_FORTEST ` を** お使いにならないでください** 。
361+
362+ さらなる実装例とリファレンス実装を、以下にも掲載しております。
363+
364+ - ` ./wolfcrypt/src/random.c ` - すべてのシード生成実装
365+ - ` wolfssl-examples/tls/cryptocb-common.c ` - ` WC_ALGO_TYPE_SEED ` を使用した暗号コールバックの例
366+ - ` ./wolfcrypt/src/port/ ` ディレクトリ内のプラットフォーム固有の例
152367
153368
154369## メモリー
0 commit comments