random.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. /*!
  2. \ingroup Random
  3. \brief Init Global WhiteWood Netrandomのコンテキスト
  4. \return 0 成功
  5. \return BAD_FUNC_ARG configfileがnullまたはタイムアウトのどちらかが否定的です。
  6. \return RNG_FAILURE_E RNGの初期化に失敗しました。
  7. \param configFile 設定ファイルへのパス
  8. \param hmac_cb HMACコールバックを作成するにはオプションです。
  9. _Example_
  10. \code
  11. char* config = "path/to/config/example.conf";
  12. int time = // Some sufficient timeout value;
  13. if (wc_InitNetRandom(config, NULL, time) != 0)
  14. {
  15. // Some error occurred
  16. }
  17. \endcode
  18. \sa wc_FreeNetRandom
  19. */
  20. int wc_InitNetRandom(const char* configFile, wnr_hmac_key hmac_cb, int timeout);
  21. /*!
  22. \ingroup Random
  23. \brief 無料のGlobal WhiteWood Netrandomコンテキスト。
  24. \return 0 成功
  25. \return BAD_MUTEX_E Wnr_Mutexでミューテックスをロックするエラー
  26. _Example_
  27. \code
  28. int ret = wc_FreeNetRandom();
  29. if(ret != 0)
  30. {
  31. // Handle the error
  32. }
  33. \endcode
  34. \sa wc_InitNetRandom
  35. */
  36. int wc_FreeNetRandom(void);
  37. /*!
  38. \ingroup Random
  39. \brief RNGのシード(OSから)とキー暗号を取得します。割り当てられたRNG-> DRBG(決定論的ランダムビットジェネレータ)が割り当てられます(WC_FREERNGで割り当てられている必要があります)。これはブロッキング操作です。
  40. \return 0 成功しています。
  41. \return MEMORY_E XMallocに失敗しました
  42. \return WINCRYPT_E WC_GENERATSEED:コンテキストの取得に失敗しました
  43. \return CRYPTGEN_E WC_GENERATSEED:ランダムになりました
  44. \return BAD_FUNC_ARG WC_RNG_GenerateBlock入力はNULLまたはSZがMAX_REQUEST_LENを超えています
  45. \return DRBG_CONT_FIPS_E wc_rng_generateblock:hash_genはdrbg_cont_failureを返しました
  46. \return RNG_FAILURE_E wc_rng_generateBlock:デフォルトエラーです。RNGのステータスはもともとOKではなく、drbg_failedに設定されています
  47. _Example_
  48. \code
  49. RNG rng;
  50. int ret;
  51. #ifdef HAVE_CAVIUM
  52. ret = wc_InitRngCavium(&rng, CAVIUM_DEV_ID);
  53. if (ret != 0){
  54. printf(“RNG Nitrox init for device: %d failed”, CAVIUM_DEV_ID);
  55. return -1;
  56. }
  57. #endif
  58. ret = wc_InitRng(&rng);
  59. if (ret != 0){
  60. printf(“RNG init failed”);
  61. return -1;
  62. }
  63. \endcode
  64. \sa wc_InitRngCavium
  65. \sa wc_RNG_GenerateBlock
  66. \sa wc_RNG_GenerateByte
  67. \sa wc_FreeRng
  68. \sa wc_RNG_HealthTest
  69. */
  70. int wc_InitRng(WC_RNG*);
  71. /*!
  72. \ingroup Random
  73. \brief 疑似ランダムデータのSZバイトを出力にコピーします。必要に応じてRNG(ブロッキング)します。
  74. \return 0 成功した
  75. \return BAD_FUNC_ARG 入力はNULLまたはSZがMAX_REQUEST_LENを超えています
  76. \return DRBG_CONT_FIPS_E hash_genはdrbg_cont_failureを返しました
  77. \return RNG_FAILURE_E デフォルトのエラーRNGのステータスはもともとOKではなく、drbg_failedに設定されています
  78. \param rng 乱数発生器はWC_INITRNGで初期化された
  79. \param output ブロックがコピーされるバッファ
  80. _Example_
  81. \code
  82. RNG rng;
  83. int sz = 32;
  84. byte block[sz];
  85. int ret = wc_InitRng(&rng);
  86. if (ret != 0) {
  87. return -1; //init of rng failed!
  88. }
  89. ret = wc_RNG_GenerateBlock(&rng, block, sz);
  90. if (ret != 0) {
  91. return -1; //generating block failed!
  92. }
  93. \endcode
  94. \sa wc_InitRngCavium, wc_InitRng
  95. \sa wc_RNG_GenerateByte
  96. \sa wc_FreeRng
  97. \sa wc_RNG_HealthTest
  98. */
  99. int wc_RNG_GenerateBlock(WC_RNG* rng, byte* b, word32 sz);
  100. /*!
  101. \ingroup Random
  102. \brief 新しいWC_RNG構造を作成します。
  103. \return WC_RNG 成功の構造
  104. \return NULL 誤りに
  105. \param heap ヒープ識別子へのポインタ
  106. \param nonce nonceを含むバッファへのポインタ
  107. _Example_
  108. \code
  109. RNG rng;
  110. byte nonce[] = { initialize nonce };
  111. word32 nonceSz = sizeof(nonce);
  112. wc_rng_new(&nonce, nonceSz, &heap);
  113. \endcode
  114. \sa wc_InitRng
  115. \sa wc_rng_free
  116. \sa wc_FreeRng
  117. \sa wc_RNG_HealthTest
  118. */
  119. WC_RNG* wc_rng_new(byte* nonce, word32 nonceSz, void* heap)
  120. /*!
  121. \ingroup Random
  122. \brief wc_rng_generateBlockを呼び出して、疑似ランダムデータのバイトをbにコピーします。必要に応じてRNGが再販されます。
  123. \return 0 成功した
  124. \return BAD_FUNC_ARG 入力はNULLまたはSZがMAX_REQUEST_LENを超えています
  125. \return DRBG_CONT_FIPS_E hash_genはdrbg_cont_failureを返しました
  126. \return RNG_FAILURE_E デフォルトのエラーRNGのステータスはもともとOKではなく、drbg_failedに設定されています
  127. \param rng: 乱数発生器はWC_INITRNGで初期化された
  128. _Example_
  129. \code
  130. RNG rng;
  131. int sz = 32;
  132. byte b[1];
  133. int ret = wc_InitRng(&rng);
  134. if (ret != 0) {
  135. return -1; //init of rng failed!
  136. }
  137. ret = wc_RNG_GenerateByte(&rng, b);
  138. if (ret != 0) {
  139. return -1; //generating block failed!
  140. }
  141. \endcode
  142. \sa wc_InitRngCavium
  143. \sa wc_InitRng
  144. \sa wc_RNG_GenerateBlock
  145. \sa wc_FreeRng
  146. \sa wc_RNG_HealthTest
  147. */
  148. int wc_RNG_GenerateByte(WC_RNG* rng, byte* b);
  149. /*!
  150. \ingroup Random
  151. \brief RNGがDRGBを安全に解放するために必要なときに呼び出されるべきです。ゼロとXfrees RNG-DRBG。
  152. \return 0 成功した
  153. \return BAD_FUNC_ARG RNGまたはRNG-> DRGB NULL
  154. \return RNG_FAILURE_E DRBGの割り当て解除に失敗しました
  155. _Example_
  156. \code
  157. RNG rng;
  158. int ret = wc_InitRng(&rng);
  159. if (ret != 0) {
  160. return -1; //init of rng failed!
  161. }
  162. int ret = wc_FreeRng(&rng);
  163. if (ret != 0) {
  164. return -1; //free of rng failed!
  165. }
  166. \endcode
  167. \sa wc_InitRngCavium
  168. \sa wc_InitRng
  169. \sa wc_RNG_GenerateBlock
  170. \sa wc_RNG_GenerateByte,
  171. \sa wc_RNG_HealthTest
  172. */
  173. int wc_FreeRng(WC_RNG*);
  174. /*!
  175. \ingroup Random
  176. \brief RNGを安全に自由に解放するためにRNGが不要になったときに呼び出されるべきです。
  177. _Example_
  178. \code
  179. RNG rng;
  180. byte nonce[] = { initialize nonce };
  181. word32 nonceSz = sizeof(nonce);
  182. rng = wc_rng_new(&nonce, nonceSz, &heap);
  183. // use rng
  184. wc_rng_free(&rng);
  185. \endcode
  186. \sa wc_InitRng
  187. \sa wc_rng_new
  188. \sa wc_FreeRng
  189. \sa wc_RNG_HealthTest
  190. */
  191. WC_RNG* wc_rng_free(WC_RNG* rng);
  192. /*!
  193. \ingroup Random
  194. \brief DRBGの機能を作成しテストします。
  195. \return 0 成功した
  196. \return BAD_FUNC_ARG ELTOPYAと出力はNULLにしないでください。Reseed Set EntropybがNULLでなければならない場合
  197. \return -1 テスト失敗
  198. \param int RESEED:設定されている場合は、Reseed機能をテストします
  199. \param entropyA: DRGBをインスタンス化するエントロピー
  200. \param entropyASz: バイト数のエントロピヤのサイズ
  201. \param entropyB: Reseed Setを設定した場合、DRBGはEntropybでリサイードされます
  202. \param entropyBSz: バイト単位のEntropybのサイズ
  203. \param output: SEADRANDOMが設定されている場合は、Entropybに播種されたランダムなデータに初期化され、それ以外の場合はEntropya
  204. _Example_
  205. \code
  206. byte output[SHA256_DIGEST_SIZE * 4];
  207. const byte test1EntropyB[] = ....; // test input for reseed false
  208. const byte test1Output[] = ....; // testvector: expected output of
  209. // reseed false
  210. ret = wc_RNG_HealthTest(0, test1Entropy, sizeof(test1Entropy), NULL, 0,
  211. output, sizeof(output));
  212. if (ret != 0)
  213. return -1;//healthtest without reseed failed
  214. if (XMEMCMP(test1Output, output, sizeof(output)) != 0)
  215. return -1; //compare to testvector failed: unexpected output
  216. const byte test2EntropyB[] = ....; // test input for reseed
  217. const byte test2Output[] = ....; // testvector expected output of reseed
  218. ret = wc_RNG_HealthTest(1, test2EntropyA, sizeof(test2EntropyA),
  219. test2EntropyB, sizeof(test2EntropyB),
  220. output, sizeof(output));
  221. if (XMEMCMP(test2Output, output, sizeof(output)) != 0)
  222. return -1; //compare to testvector failed
  223. \endcode
  224. \sa wc_InitRngCavium
  225. \sa wc_InitRng
  226. \sa wc_RNG_GenerateBlock
  227. \sa wc_RNG_GenerateByte
  228. \sa wc_FreeRng
  229. */
  230. int wc_RNG_HealthTest(int reseed,
  231. const byte* entropyA, word32 entropyASz,
  232. const byte* entropyB, word32 entropyBSz,
  233. byte* output, word32 outputSz);