1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
/*!
\ingroup Random
\brief グローバルWhitewood netRandomコンテキストを初期化します
\return 0 成功
\return BAD_FUNC_ARG configFileがnullまたはtimeoutが負の値の場合。
\return RNG_FAILURE_E rngの初期化に失敗しました。
\param configFile 設定ファイルへのパス
\param hmac_cb HMACコールバックを作成するためのオプション。
\param timeout タイムアウト期間。
_Example_
\code
char* config = "path/to/config/example.conf";
int time = // 十分なタイムアウト値;
if (wc_InitNetRandom(config, NULL, time) != 0)
{
// エラーが発生しました
}
\endcode
\sa wc_FreeNetRandom
*/
int ;
/*!
\ingroup Random
\brief グローバルWhitewood netRandomコンテキストを解放します。
\return 0 成功
\return BAD_MUTEX_E wnr_mutexのミューテックスロックエラー
\param none 戻り値なし。
_Example_
\code
int ret = wc_FreeNetRandom();
if(ret != 0)
{
// エラーを処理
}
\endcode
\sa wc_InitNetRandom
*/
int ;
/*!
\ingroup Random
\brief rng用のシード(OSから)と鍵暗号を取得します。rng->drbg(決定論的乱数ビット生成器)が割り当てられます(wc_FreeRngで割り当て解除する必要があります)。これはブロッキング操作です。
\return 0 成功時。
\return MEMORY_E XMALLOCが失敗しました
\return WINCRYPT_E wc_GenerateSeed: コンテキストの取得に失敗しました
\return CRYPTGEN_E wc_GenerateSeed: ランダムの取得に失敗しました
\return BAD_FUNC_ARG wc_RNG_GenerateBlock入力がnullまたはszがMAX_REQUEST_LENを超えています
\return DRBG_CONT_FIPS_E wc_RNG_GenerateBlock: Hash_genがDRBG_CONT_FAILUREを返しました
\return RNG_FAILURE_E wc_RNG_GenerateBlock: デフォルトエラー。rngのステータスが元々okでないか、DRBG_FAILEDに設定されています
\param rng シードと鍵暗号で使用するために初期化される乱数生成器
_Example_
\code
RNG rng;
int ret;
#ifdef HAVE_CAVIUM
ret = wc_InitRngCavium(&rng, CAVIUM_DEV_ID);
if (ret != 0){
printf("RNG Nitrox init for device: %d failed", CAVIUM_DEV_ID);
return -1;
}
#endif
ret = wc_InitRng(&rng);
if (ret != 0){
printf("RNG init failed");
return -1;
}
\endcode
\sa wc_InitRngCavium
\sa wc_RNG_GenerateBlock
\sa wc_RNG_GenerateByte
\sa wc_FreeRng
\sa wc_RNG_HealthTest
*/
int ;
/*!
\ingroup Random
\brief 疑似乱数データのszバイトをoutputにコピーします。必要に応じてrngを再シードします(ブロッキング)。
\return 0 成功時
\return BAD_FUNC_ARG 入力がnullまたはszがMAX_REQUEST_LENを超えています
\return DRBG_CONT_FIPS_E Hash_genがDRBG_CONT_FAILUREを返しました
\return RNG_FAILURE_E デフォルトエラー。rngのステータスが元々okでないか、DRBG_FAILEDに設定されています
\param rng wc_InitRngで初期化された乱数生成器
\param output ブロックがコピーされるバッファ
\param sz 出力のサイズ(バイト単位)
_Example_
\code
RNG rng;
int sz = 32;
byte block[sz];
int ret = wc_InitRng(&rng);
if (ret != 0) {
return -1; //rngの初期化失敗!
}
ret = wc_RNG_GenerateBlock(&rng, block, sz);
if (ret != 0) {
return -1; //ブロック生成失敗!
}
\endcode
\sa wc_InitRngCavium, wc_InitRng
\sa wc_RNG_GenerateByte
\sa wc_FreeRng
\sa wc_RNG_HealthTest
*/
int ;
/*!
\ingroup Random
\brief 新しいWC_RNG構造体を作成します。
\return WC_RNG 成功時の構造体
\return NULL エラー時
\param heap ヒープ識別子へのポインタ
\param nonce nonceを含むバッファへのポインタ
\param nonceSz nonceの長さ
_Example_
\code
RNG rng;
byte nonce[] = { nonceを初期化 };
word32 nonceSz = sizeof(nonce);
wc_rng_new(&nonce, nonceSz, &heap);
\endcode
\sa wc_InitRng
\sa wc_rng_free
\sa wc_FreeRng
\sa wc_RNG_HealthTest
*/
WC_RNG* int ;
/*!
\ingroup Random
\brief drgbを安全に解放するために、RNGが不要になったときに呼び出す必要があります。rng-drbgをゼロ化しXFREEします。
\return 0 成功時
\return BAD_FUNC_ARG rngまたはrng->drgbがnull
\return RNG_FAILURE_E drbgの割り当て解除に失敗しました
\param rng wc_InitRngで初期化された乱数生成器
_Example_
\code
RNG rng;
int ret = wc_InitRng(&rng);
if (ret != 0) {
return -1; //rngの初期化失敗!
}
int ret = wc_FreeRng(&rng);
if (ret != 0) {
return -1; //rngの解放失敗!
}
\endcode
\sa wc_InitRngCavium
\sa wc_InitRng
\sa wc_RNG_GenerateBlock
\sa wc_RNG_GenerateByte,
\sa wc_RNG_HealthTest
*/
int ;
/*!
\ingroup Random
\brief rngを安全に解放するために、RNGが不要になったときに呼び出す必要があります。
\param rng wc_InitRngで初期化された乱数生成器
_Example_
\code
RNG rng;
byte nonce[] = { nonceを初期化 };
word32 nonceSz = sizeof(nonce);
rng = wc_rng_new(&nonce, nonceSz, &heap);
// rngを使用
wc_rng_free(&rng);
\endcode
\sa wc_InitRng
\sa wc_rng_new
\sa wc_FreeRng
\sa wc_RNG_HealthTest
*/
WC_RNG* ;
/*!
\ingroup Random
\brief drbgの機能を作成してテストします。
\return 0 成功時
\return BAD_FUNC_ARG seedAとoutputはnullであってはなりません。reseedが設定されている場合、seedBはnullであってはなりません
\return -1 テスト失敗
\param int reseed: 設定されている場合、再シード機能をテストします
\param seedA: drgbをインスタンス化するシード
\param seedASz: seedAのサイズ(バイト単位)
\param seedB: reseedが設定されている場合、drbgはseedBで再シードされます
\param seedBSz: seedBのサイズ(バイト単位)
\param output: seedrandomが設定されている場合はseedBでシードされたランダムデータに初期化され、それ以外の場合はseedAでシードされます
\param outputSz: outputの長さ(バイト単位)
_Example_
\code
byte output[SHA256_DIGEST_SIZE * 4];
const byte test1EntropyB[] = ....; // reseed falseのテスト入力
const byte test1Output[] = ....; // テストベクター: reseed falseの期待出力
ret = wc_RNG_HealthTest(0, test1Entropy, sizeof(test1Entropy), NULL, 0,
output, sizeof(output));
if (ret != 0)
return -1;//再シードなしのヘルステスト失敗
if (XMEMCMP(test1Output, output, sizeof(output)) != 0)
return -1; //テストベクターとの比較失敗: 予期しない出力
const byte test2EntropyB[] = ....; // reseedのテスト入力
const byte test2Output[] = ....; // テストベクターreseedの期待出力
ret = wc_RNG_HealthTest(1, test2EntropyA, sizeof(test2EntropyA),
test2EntropyB, sizeof(test2EntropyB),
output, sizeof(output));
if (XMEMCMP(test2Output, output, sizeof(output)) != 0)
return -1; //テストベクターとの比較失敗
\endcode
\sa wc_InitRngCavium
\sa wc_InitRng
\sa wc_RNG_GenerateBlock
\sa wc_RNG_GenerateByte
\sa wc_FreeRng
*/
int ;