2
0

rsa.h 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200
  1. /*!
  2. \ingroup RSA
  3. \brief この関数は提供されたRsaKey構造体を初期化します。また、ユーザー定義メモリオーバーライドで使用するためのヒープ識別子も取ります(XMALLOC、XFREE、XREALLOCを参照)。wc_rsa_blindingが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  4. \return 0 暗号化と復号化で使用するためのRSA構造の初期化に成功したときに返されます。
  5. \return BAD_FUNC_ARGS RSAキーポインタがNULLに評価された場合に返されます
  6. \param key 初期化するRSAKEY構造へのポインタ
  7. _Example_
  8. \code
  9. RsaKey enc;
  10. int ret;
  11. ret = wc_InitRsaKey(&enc, NULL); // not using heap hint. No custom memory
  12. if ( ret != 0 ) {
  13. // error initializing RSA key
  14. }
  15. \endcode
  16. \sa wc_FreeRsaKey
  17. \sa wc_RsaSetRNG
  18. */
  19. int wc_InitRsaKey(RsaKey* key, void* heap);
  20. /*!
  21. \ingroup RSA
  22. \brief この関数は提供されたRsaKey構造体を初期化します。IDとLENは、DEVIDがデバイスを識別している間にデバイス上のキーを識別するために使用されます。また、ユーザー定義メモリオーバーライドで使用するためのヒープ識別子も取ります(XMALLOC、XFREE、XREALLOCを参照)。wc_rsa_blindingが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  23. \return 0 暗号化と復号化で使用するためのRSA構造の初期化に成功したときに返されます。
  24. \return BAD_FUNC_ARGS RSAキーポインタがNULLに評価された場合に返されます
  25. \return BUFFER_E LENがRSA_MAX_ID_LENよりも小さい場合、または大きい場合は返されます。
  26. \param key 初期化するRsaKey構造体へのポインタ
  27. \param id デバイス上のキーの識別子
  28. \param len バイト数の識別子の長さ
  29. \param heap メモリオーバーライドで使用するためのヒープ識別子へのポインタ。メモリ割り当てのカスタム処理を可能にします。このヒープは、このRSAオブジェクトで使用するためにメモリを割り当てるときに使用されるデフォルトになります。
  30. _Example_
  31. \code
  32. RsaKey enc;
  33. unsigned char* id = (unsigned char*)"RSA2048";
  34. int len = 6;
  35. int devId = 1;
  36. int ret;
  37. ret = wc_CryptoDev_RegisterDevice(devId, wc_Pkcs11_CryptoDevCb,
  38. &token);
  39. if ( ret != 0) {
  40. // error associating callback and token with device id
  41. }
  42. ret = wc_InitRsaKey_Id(&enc, id, len, NULL, devId); // not using heap hint
  43. if ( ret != 0 ) {
  44. // error initializing RSA key
  45. }
  46. \endcode
  47. \sa wc_InitRsaKey
  48. \sa wc_FreeRsaKey
  49. \sa wc_RsaSetRNG
  50. */
  51. int wc_InitRsaKey_Id(RsaKey* key, unsigned char* id, int len,
  52. void* heap, int devId);
  53. /*!
  54. \ingroup RSA
  55. \brief この関数はRNGをキーに関連付けます。WC_RSA_BLINDINGが有効になっている場合は必要です。
  56. \return 0 成功に戻った
  57. \return BAD_FUNC_ARGS RSAキーの場合、RNGポインタがNULLに評価された場合
  58. \param key 関連付けられるRsaKey構造体へのポインタ
  59. _Example_
  60. \code
  61. ret = wc_InitRsaKey(&key, NULL);
  62. if (ret == 0) {
  63. ret = wc_InitRng(&rng);
  64. } else return -1;
  65. if (ret == 0) {
  66. ret = wc_RsaSetRNG(&key, &rng);
  67. \endcode
  68. \sa wc_InitRsaKey
  69. \sa wc_RsaSetRNG
  70. */
  71. int wc_RsaSetRNG(RsaKey* key, WC_RNG* rng);
  72. /*!
  73. \ingroup RSA
  74. \brief この関数は、MP_Clearを使用して提供されたRsaKey構造体を解放します。
  75. \return 0 キーの解放に成功したら返品されます
  76. _Example_
  77. \code
  78. RsaKey enc;
  79. wc_InitRsaKey(&enc, NULL); // not using heap hint. No custom memory
  80. ... set key, do encryption
  81. wc_FreeRsaKey(&enc);
  82. \endcode
  83. \sa wc_InitRsaKey
  84. */
  85. int wc_FreeRsaKey(RsaKey* key);
  86. /*!
  87. \ingroup RSA
  88. \brief この関数はメッセージをINから暗号化し、その結果を格納します。初期化された公開鍵と乱数発生器が必要です。副作用として、この関数はounlenの中で書き込まれたバイトを返します。
  89. \return Success 入力メッセージの暗号化に成功したら、成功の場合は0を返し、障害の場合はゼロ未満です。また、outlenの値を格納することによって、OUTに書き込まれた数のバイト数を返します。
  90. \return BAD_FUNC_ARG 入力パラメータのいずれかが無効な場合に返されます
  91. \return RSA_BUFFER_E CipherTextを保存するには、出力バッファが小さすぎる場合は返されます。
  92. \return RNG_FAILURE_E 提供されたRNG構造体を使用してランダムブロックを生成するエラーがある場合
  93. \return MP_INIT_E メッセージの暗号化中に使用されている数学ライブラリにエラーがある場合に返される可能性があります。
  94. \return MP_READ_E メッセージの暗号化中に使用されている数学ライブラリにエラーがある場合に返される可能性があります。
  95. \return MP_CMP_E メッセージの暗号化中に使用されている数学ライブラリにエラーがある場合に返される可能性があります。
  96. \return MP_INVMOD_E メッセージの暗号化中に使用されている数学ライブラリにエラーがある場合に返される可能性があります。
  97. \return MP_EXPTMOD_E メッセージの暗号化中に使用されている数学ライブラリにエラーがある場合に返される可能性があります。
  98. \return MP_MOD_E メッセージの暗号化中に使用されている数学ライブラリにエラーがある場合に返される可能性があります。
  99. \return MP_MUL_E メッセージの暗号化中に使用されている数学ライブラリにエラーがある場合に返される可能性があります。
  100. \return MP_ADD_E メッセージの暗号化中に使用されている数学ライブラリにエラーがある場合に返される可能性があります。
  101. \return MP_MULMOD_E メッセージの暗号化中に使用されている数学ライブラリにエラーがある場合に返される可能性があります。
  102. \return MP_TO_E メッセージの暗号化中に使用されている数学ライブラリにエラーがある場合に返される可能性があります。
  103. \return MP_MEM メッセージの暗号化中に使用されている数学ライブラリにエラーがある場合に返される可能性があります。
  104. \return MP_ZERO_E メッセージの暗号化中に使用されている数学ライブラリにエラーがある場合に返される可能性があります。
  105. \param in 暗号化する入力メッセージを含むバッファへのポインタ
  106. \param inLen 暗号化するメッセージの長さ
  107. \param out 出力暗号文を保存するバッファへのポインタ
  108. \param outLen 出力バッファの長さ
  109. \param key 暗号化に使用する公開鍵を含むRsaKey構造体へのポインタ
  110. _Example_
  111. \code
  112. RsaKey pub;
  113. int ret = 0;
  114. byte n[] = { // initialize with received n component of public key };
  115. byte e[] = { // initialize with received e component of public key };
  116. byte msg[] = { // initialize with plaintext of message to encrypt };
  117. byte cipher[256]; // 256 bytes is large enough to store 2048 bit RSA
  118. ciphertext
  119. wc_InitRsaKey(&pub, NULL); // not using heap hint. No custom memory
  120. wc_RsaPublicKeyDecodeRaw(n, sizeof(n), e, sizeof(e), &pub);
  121. // initialize with received public key parameters
  122. ret = wc_RsaPublicEncrypt(msg, sizeof(msg), out, sizeof(out), &pub, &rng);
  123. if ( ret != 0 ) {
  124. // error encrypting message
  125. }
  126. \endcode
  127. \sa wc_RsaPrivateDecrypt
  128. */
  129. int wc_RsaPublicEncrypt(const byte* in, word32 inLen, byte* out,
  130. word32 outLen, RsaKey* key, WC_RNG* rng);
  131. /*!
  132. \ingroup RSA
  133. \brief この関数は復号化のためにWC_RSAPrivateCrypt関数によって利用されます。
  134. \return Success 復号化データの長さ
  135. \return RSA_PAD_E RSAUNPADエラー、フォーマットの悪いフォーマット
  136. \param in 復号化されるバイト配列。
  137. \param inLen の長さ
  138. \param out 格納する復号化データのバイト配列。
  139. _Example_
  140. \code
  141. none
  142. \endcode
  143. \sa wc_RsaPrivateDecrypt
  144. */
  145. int wc_RsaPrivateDecryptInline(byte* in, word32 inLen, byte** out,
  146. RsaKey* key);
  147. /*!
  148. \ingroup RSA
  149. \brief この関数は秘密のRSA復号化を提供します。
  150. \return Success 復号化データの長さ
  151. \return MEMORY_E -125、メモリエラーが発生しました
  152. \return BAD_FUNC_ARG -173、関数の不良引数が提供されています
  153. \param in 復号化されるバイト配列。
  154. \param inLen の長さ
  155. \param out 格納する復号化データのバイト配列。
  156. \param outLen の長さ
  157. _Example_
  158. \code
  159. ret = wc_RsaPublicEncrypt(in, inLen, out, sizeof(out), &key, &rng);
  160. if (ret < 0) {
  161. return -1;
  162. }
  163. ret = wc_RsaPrivateDecrypt(out, ret, plain, sizeof(plain), &key);
  164. if (ret < 0) {
  165. return -1;
  166. }
  167. \endcode
  168. \sa RsaUnPad
  169. \sa wc_RsaFunction
  170. \sa wc_RsaPrivateDecryptInline
  171. */
  172. int wc_RsaPrivateDecrypt(const byte* in, word32 inLen, byte* out,
  173. word32 outLen, RsaKey* key);
  174. /*!
  175. \ingroup RSA
  176. \brief 提供された配列に秘密鍵と署名します。
  177. \return RSA_BUFFER_E: -131、RSAバッファエラー、出力が小さすぎたり入力が大きすぎたりする
  178. \param in 暗号化されるバイト配列。
  179. \param inLen の長さ
  180. \param out 格納する暗号化データのバイト配列。
  181. \param outLen の長さ
  182. \param key 暗号化に使用する鍵。
  183. _Example_
  184. \code
  185. ret = wc_RsaSSL_Sign(in, inLen, out, sizeof(out), &key, &rng);
  186. if (ret < 0) {
  187. return -1;
  188. }
  189. memset(plain, 0, sizeof(plain));
  190. ret = wc_RsaSSL_Verify(out, ret, plain, sizeof(plain), &key);
  191. if (ret < 0) {
  192. return -1;
  193. }
  194. \endcode
  195. \sa wc_RsaPad
  196. */
  197. int wc_RsaSSL_Sign(const byte* in, word32 inLen, byte* out,
  198. word32 outLen, RsaKey* key, WC_RNG* rng);
  199. /*!
  200. \ingroup RSA
  201. \brief メッセージがRSAキーによって署名されたことを確認するために使用されます。出力は入力と同じバイト配列を使用します。
  202. \return >0 テキストの長さ
  203. \return <0 エラーが発生しました。
  204. \param in 復号化されるバイト配列。
  205. \param inLen バッファ入力の長さ。
  206. \param out 復号化された情報のポインタへのポインタ。
  207. _Example_
  208. \code
  209. RsaKey key;
  210. WC_RNG rng;
  211. int ret = 0;
  212. long e = 65537; // standard value to use for exponent
  213. wc_InitRsaKey(&key, NULL); // not using heap hint. No custom memory
  214. wc_InitRng(&rng);
  215. wc_MakeRsaKey(&key, 2048, e, &rng);
  216. byte in[] = { // Initialize with some RSA encrypted information }
  217. byte* out;
  218. if(wc_RsaSSL_VerifyInline(in, sizeof(in), &out, &key) < 0)
  219. {
  220. // handle error
  221. }
  222. \endcode
  223. \sa wc_RsaSSL_Verify
  224. \sa wc_RsaSSL_Sign
  225. */
  226. int wc_RsaSSL_VerifyInline(byte* in, word32 inLen, byte** out,
  227. RsaKey* key);
  228. /*!
  229. \ingroup RSA
  230. \brief メッセージがキーによって署名されたことを確認するために使用されます。
  231. \return Success エラーのないテキストの長さ。
  232. \return MEMORY_E メモリ例外
  233. \param in 復号化されるバイト配列。
  234. \param inLen の長さ
  235. \param out 格納する復号化データのバイト配列。
  236. \param outLen の長さ
  237. _Example_
  238. \code
  239. ret = wc_RsaSSL_Sign(in, inLen, out, sizeof(out), &key, &rng);
  240. if (ret < 0) {
  241. return -1;
  242. }
  243. memset(plain, 0, sizeof(plain));
  244. ret = wc_RsaSSL_Verify(out, ret, plain, sizeof(plain), &key);
  245. if (ret < 0) {
  246. return -1;
  247. }
  248. \endcode
  249. \sa wc_RsaSSL_Sign
  250. */
  251. int wc_RsaSSL_Verify(const byte* in, word32 inLen, byte* out,
  252. word32 outLen, RsaKey* key);
  253. /*!
  254. \ingroup RSA
  255. \brief 提供された配列に秘密鍵と署名します。
  256. \return RSA_BUFFER_E: -131、RSAバッファエラー、出力が小さすぎたり入力が大きすぎたりする
  257. \param in 暗号化されるバイト配列。
  258. \param inLen の長さ
  259. \param out 格納する暗号化データのバイト配列。
  260. \param outLen の長さ
  261. \param hash メッセージに入るハッシュ型
  262. \param mgf マスク生成機能識別子
  263. _Example_
  264. \code
  265. ret = wc_InitRsaKey(&key, NULL);
  266. if (ret == 0) {
  267. ret = wc_InitRng(&rng);
  268. } else return -1;
  269. if (ret == 0) {
  270. ret = wc_RsaSetRNG(&key, &rng);
  271. } else return -1;
  272. if (ret == 0) {
  273. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  274. } else return -1;
  275. ret = wc_RsaPSS_Sign((byte*)szMessage, (word32)XSTRLEN(szMessage)+1,
  276. pSignature, sizeof(pSignature),
  277. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  278. if (ret > 0 ){
  279. sz = ret;
  280. } else return -1;
  281. ret = wc_RsaPSS_Verify(pSignature, sz, pt, outLen,
  282. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  283. if (ret <= 0)return -1;
  284. wc_FreeRsaKey(&key);
  285. wc_FreeRng(&rng);
  286. \endcode
  287. \sa wc_RsaPSS_Verify
  288. \sa wc_RsaSetRNG
  289. */
  290. int wc_RsaPSS_Sign(const byte* in, word32 inLen, byte* out,
  291. word32 outLen, enum wc_HashType hash, int mgf,
  292. RsaKey* key, WC_RNG* rng);
  293. /*!
  294. \ingroup RSA
  295. \brief 入力署名を復号して、メッセージが鍵によって署名されたことを確認します。WC_RSA_BLINDINGが有効な場合、鍵はwc_RsaSetRNGによってRNGに関連付けられなければなりません。
  296. \return Success エラーのない場合はテキストの長さを返します
  297. \return MEMORY_E メモリ例外
  298. \return MP_EXPTMOD_E - fastmathを使用する様に構成されている場合にFP_MAX_BITSが鍵サイズの少なくとも2倍に設定されていない(例えば4096-bit長の鍵を使用する場合にはFP_MAX_BITSは8192以上に設定すること)。
  299. \param in 復号される署名データが格納されているバッファ
  300. \param inLen 署名データの長さ
  301. \param out 復号データの出力先バッファ
  302. \param outLen 出力先バッファサイズ
  303. \param hash メッセージに入るハッシュ型
  304. \param mgf マスク生成機能識別子
  305. _Example_
  306. \code
  307. ret = wc_InitRsaKey(&key, NULL);
  308. if (ret == 0) {
  309. ret = wc_InitRng(&rng);
  310. } else return -1;
  311. if (ret == 0) {
  312. ret = wc_RsaSetRNG(&key, &rng);
  313. } else return -1;
  314. if (ret == 0) {
  315. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  316. } else return -1;
  317. ret = wc_RsaPSS_Sign((byte*)szMessage, (word32)XSTRLEN(szMessage)+1,
  318. pSignature, sizeof(pSignature),
  319. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  320. if (ret > 0 ){
  321. sz = ret;
  322. } else return -1;
  323. ret = wc_RsaPSS_Verify(pSignature, sz, pt, outLen,
  324. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  325. if (ret <= 0)return -1;
  326. wc_FreeRsaKey(&key);
  327. wc_FreeRng(&rng);
  328. \endcode
  329. \sa wc_RsaPSS_Sign
  330. \sa wc_RsaPSS_VerifyInline
  331. \sa wc_RsaPSS_CheckPadding
  332. \sa wc_RsaSetRNG
  333. */
  334. int wc_RsaPSS_Verify(byte* in, word32 inLen, byte* out,
  335. word32 outLen, enum wc_HashType hash, int mgf,
  336. RsaKey* key);
  337. /*!
  338. \ingroup RSA
  339. \brief 入力署名を復号化して、メッセージがRSAキーによって署名されたことを確認します。出力は入力と同じバイト配列を使用します。WC_RSA_BLINDINGが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  340. \return >0 テキストの長さ
  341. \return <0 エラーが発生しました。
  342. \param in 復号化されるバイト配列。
  343. \param inLen バッファ入力の長さ。
  344. \param out PSSデータを含むアドレスへのポインタ。
  345. \param hash メッセージに入るハッシュ型
  346. \param mgf マスク生成機能識別子
  347. _Example_
  348. \code
  349. ret = wc_InitRsaKey(&key, NULL);
  350. if (ret == 0) {
  351. ret = wc_InitRng(&rng);
  352. } else return -1;
  353. if (ret == 0) {
  354. ret = wc_RsaSetRNG(&key, &rng);
  355. } else return -1;
  356. if (ret == 0) {
  357. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  358. } else return -1;
  359. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
  360. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  361. if (ret > 0 ){
  362. sz = ret;
  363. } else return -1;
  364. ret = wc_RsaPSS_VerifyInline(pSignature, sz, pt,
  365. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  366. if (ret <= 0)return -1;
  367. wc_FreeRsaKey(&key);
  368. wc_FreeRng(&rng);
  369. \endcode
  370. \sa wc_RsaPSS_Verify
  371. \sa wc_RsaPSS_Sign
  372. \sa wc_RsaPSS_VerifyCheck
  373. \sa wc_RsaPSS_VerifyCheck_ex
  374. \sa wc_RsaPSS_VerifyCheckInline
  375. \sa wc_RsaPSS_VerifyCheckInline_ex
  376. \sa wc_RsaPSS_CheckPadding
  377. \sa wc_RsaPSS_CheckPadding_ex
  378. \sa wc_RsaSetRNG
  379. */
  380. int wc_RsaPSS_VerifyInline(byte* in, word32 inLen, byte** out,
  381. enum wc_HashType hash, int mgf,
  382. RsaKey* key);
  383. /*!
  384. \ingroup RSA
  385. \brief RSA-PSSで署名されたメッセージを確認してください。ソルトの長さはハッシュ長に等しい。WC_RSA_BLINDINGが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  386. \return the PSSデータの長さが成功し、負に障害が発生します。
  387. \return MEMORY_E メモリ例外
  388. \param in 復号化されるバイト配列。
  389. \param inLen の長さ
  390. \param out PSSデータを含むアドレスへのポインタ。
  391. \param outLen の長さ
  392. \param digest 検証中のデータのハッシュ。
  393. \param digestLen ハッシュの長さ
  394. \param hash ハッシュアルゴリズム
  395. \param mgf マスク生成機能
  396. _Example_
  397. \code
  398. ret = wc_InitRsaKey(&key, NULL);
  399. if (ret == 0) {
  400. ret = wc_InitRng(&rng);
  401. } else return -1;
  402. if (ret == 0) {
  403. ret = wc_RsaSetRNG(&key, &rng);
  404. } else return -1;
  405. if (ret == 0) {
  406. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  407. } else return -1;
  408. if (ret == 0) {
  409. digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
  410. ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
  411. } else return -1;
  412. if (ret == 0) {
  413. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
  414. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  415. if (ret > 0 ){
  416. sz = ret;
  417. } else return -1;
  418. } else return -1;
  419. if (ret == 0) {
  420. ret = wc_RsaPSS_VerifyCheck(pSignature, sz, pt, outLen,
  421. digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  422. if (ret <= 0) return -1;
  423. } else return -1;
  424. wc_FreeRsaKey(&key);
  425. wc_FreeRng(&rng);
  426. \endcode
  427. \sa wc_RsaPSS_Sign
  428. \sa wc_RsaPSS_Verify
  429. \sa wc_RsaPSS_VerifyCheck_ex
  430. \sa wc_RsaPSS_VerifyCheckInline
  431. \sa wc_RsaPSS_VerifyCheckInline_ex
  432. \sa wc_RsaPSS_CheckPadding
  433. \sa wc_RsaPSS_CheckPadding_ex
  434. \sa wc_RsaSetRNG
  435. */
  436. int wc_RsaPSS_VerifyCheck(byte* in, word32 inLen,
  437. byte* out, word32 outLen,
  438. const byte* digest, word32 digestLen,
  439. enum wc_HashType hash, int mgf,
  440. RsaKey* key);
  441. /*!
  442. \ingroup RSA
  443. \brief RSA-PSSで署名されたメッセージを確認してください。WC_RSA_BLINDINGが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  444. \return the PSSデータの長さが成功し、負に障害が発生します。
  445. \return MEMORY_E メモリ例外
  446. \param in 復号化されるバイト配列。
  447. \param inLen の長さ
  448. \param out PSSデータを含むアドレスへのポインタ。
  449. \param outLen の長さ
  450. \param digest 検証中のデータのハッシュ。
  451. \param digestLen ハッシュの長さ
  452. \param hash ハッシュアルゴリズム
  453. \param mgf マスク生成機能
  454. \param saltLen 使用されるソルトの長さ。RSA_PSSS_SALT_LEN_DEFAULT(-1)ソルトの長さはハッシュ長と同じです。RSA_PSS_SALT_LEN_DISCOVERは、ソルトの長さがデータから決定されます。
  455. _Example_
  456. \code
  457. ret = wc_InitRsaKey(&key, NULL);
  458. if (ret == 0) {
  459. ret = wc_InitRng(&rng);
  460. } else return -1;
  461. if (ret == 0) {
  462. ret = wc_RsaSetRNG(&key, &rng);
  463. } else return -1;
  464. if (ret == 0) {
  465. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  466. } else return -1;
  467. if (ret == 0) {
  468. digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
  469. ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
  470. } else return -1;
  471. if (ret == 0) {
  472. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
  473. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  474. if (ret > 0 ){
  475. sz = ret;
  476. } else return -1;
  477. } else return -1;
  478. if (ret == 0) {
  479. ret = wc_RsaPSS_VerifyCheck_ex(pSignature, sz, pt, outLen,
  480. digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, saltLen, &key);
  481. if (ret <= 0) return -1;
  482. } else return -1;
  483. wc_FreeRsaKey(&key);
  484. wc_FreeRng(&rng);
  485. \endcode
  486. \sa wc_RsaPSS_Sign
  487. \sa wc_RsaPSS_Verify
  488. \sa wc_RsaPSS_VerifyCheck
  489. \sa wc_RsaPSS_VerifyCheckInline
  490. \sa wc_RsaPSS_VerifyCheckInline_ex
  491. \sa wc_RsaPSS_CheckPadding
  492. \sa wc_RsaPSS_CheckPadding_ex
  493. \sa wc_RsaSetRNG
  494. */
  495. int wc_RsaPSS_VerifyCheck_ex(byte* in, word32 inLen,
  496. byte* out, word32 outLen,
  497. const byte* digest, word32 digestLen,
  498. enum wc_HashType hash, int mgf, int saltLen,
  499. RsaKey* key);
  500. /*!
  501. \ingroup RSA
  502. \brief RSA-PSSで署名されたメッセージを確認してください。入力バッファは出力バッファに再利用されます。ソルトの長さはハッシュ長に等しい。WC_RSA_BLINDINGが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  503. \return the PSSデータの長さが成功し、負に障害が発生します。
  504. \param in 復号化されるバイト配列。
  505. \param inLen の長さ
  506. \param out 格納する復号化データのバイト配列。
  507. \param digest 検証中のデータのハッシュ。
  508. \param digestLen ハッシュの長さ
  509. \param hash メッセージに入るハッシュ型
  510. \param mgf マスク生成機能識別子
  511. _Example_
  512. \code
  513. ret = wc_InitRsaKey(&key, NULL);
  514. if (ret == 0) {
  515. ret = wc_InitRng(&rng);
  516. } else return -1;
  517. if (ret == 0) {
  518. ret = wc_RsaSetRNG(&key, &rng);
  519. } else return -1;
  520. if (ret == 0) {
  521. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  522. } else return -1;
  523. if (ret == 0) {
  524. digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
  525. ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
  526. } else return -1;
  527. if (ret == 0) {
  528. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
  529. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  530. if (ret > 0 ){
  531. sz = ret;
  532. } else return -1;
  533. } else return -1;
  534. if (ret == 0) {
  535. ret = wc_RsaPSS_VerifyCheckInline(pSignature, sz, pt,
  536. digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  537. if (ret <= 0) return -1;
  538. } else return -1;
  539. wc_FreeRsaKey(&key);
  540. wc_FreeRng(&rng);
  541. \endcode
  542. \sa wc_RsaPSS_Sign
  543. \sa wc_RsaPSS_Verify
  544. \sa wc_RsaPSS_VerifyCheck
  545. \sa wc_RsaPSS_VerifyCheck_ex
  546. \sa wc_RsaPSS_VerifyCheckInline_ex
  547. \sa wc_RsaPSS_CheckPadding
  548. \sa wc_RsaPSS_CheckPadding_ex
  549. \sa wc_RsaSetRNG
  550. */
  551. int wc_RsaPSS_VerifyCheckInline(byte* in, word32 inLen, byte** out,
  552. const byte* digest, word32 digentLen,
  553. enum wc_HashType hash, int mgf,
  554. RsaKey* key);
  555. /*!
  556. \ingroup RSA
  557. \brief RSA-PSSで署名されたメッセージを確認してください。入力バッファは出力バッファに再利用されます。WC_RSA_BLINDINGが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  558. \return the PSSデータの長さが成功し、負に障害が発生します。
  559. \param in 復号化されるバイト配列。
  560. \param inLen の長さ
  561. \param out 格納する復号化データのバイト配列。
  562. \param digest 検証中のデータのハッシュ。
  563. \param digestLen ハッシュの長さ
  564. \param hash メッセージに入るハッシュ型
  565. \param mgf マスク生成機能識別子
  566. \param saltLen 使用されるソルトの長さ。RSA_PSSS_SALT_LEN_DEFAULT(-1)ソルトの長さはハッシュ長と同じです。RSA_PSS_SALT_LEN_DISCOVERは、ソルトの長さがデータから決定されます。
  567. _Example_
  568. \code
  569. ret = wc_InitRsaKey(&key, NULL);
  570. if (ret == 0) {
  571. ret = wc_InitRng(&rng);
  572. } else return -1;
  573. if (ret == 0) {
  574. ret = wc_RsaSetRNG(&key, &rng);
  575. } else return -1;
  576. if (ret == 0) {
  577. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  578. } else return -1;
  579. if (ret == 0) {
  580. digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
  581. ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
  582. } else return -1;
  583. if (ret == 0) {
  584. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
  585. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  586. if (ret > 0 ){
  587. sz = ret;
  588. } else return -1;
  589. } else return -1;
  590. if (ret == 0) {
  591. ret = wc_RsaPSS_VerifyCheckInline_ex(pSignature, sz, pt,
  592. digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, saltLen, &key);
  593. if (ret <= 0) return -1;
  594. } else return -1;
  595. wc_FreeRsaKey(&key);
  596. wc_FreeRng(&rng);
  597. \endcode
  598. \sa wc_RsaPSS_Sign
  599. \sa wc_RsaPSS_Verify
  600. \sa wc_RsaPSS_VerifyCheck
  601. \sa wc_RsaPSS_VerifyCheck_ex
  602. \sa wc_RsaPSS_VerifyCheckInline
  603. \sa wc_RsaPSS_CheckPadding
  604. \sa wc_RsaPSS_CheckPadding_ex
  605. \sa wc_RsaSetRNG
  606. */
  607. int wc_RsaPSS_VerifyCheckInline_ex(byte* in, word32 inLen, byte** out,
  608. const byte* digest, word32 digentLen,
  609. enum wc_HashType hash, int mgf, int saltLen,
  610. RsaKey* key);
  611. /*!
  612. \ingroup RSA
  613. \brief PSSデータを確認して、署名が一致するようにします。ソルトの長さはハッシュ長に等しい。WC_RSA_BLINDINGが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  614. \return BAD_PADDING_E PSSデータが無効な場合、NULLがINまたはSIGまたはINSZに渡されると、BAD_FUNC_ARGはハッシュアルゴリズムの長さと同じではありません。
  615. \return MEMORY_E メモリ例外
  616. \param in 検証中のデータのハッシュ。
  617. \param inSz ハッシュの長さ
  618. \param sig PSSデータを保持するバッファ。
  619. \param sigSz PSSデータのサイズ。
  620. _Example_
  621. \code
  622. ret = wc_InitRsaKey(&key, NULL);
  623. if (ret == 0) {
  624. ret = wc_InitRng(&rng);
  625. } else return -1;
  626. if (ret == 0) {
  627. ret = wc_RsaSetRNG(&key, &rng);
  628. } else return -1;
  629. if (ret == 0) {
  630. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  631. } else return -1;
  632. if (ret == 0) {
  633. digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
  634. ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
  635. } else return -1;
  636. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, sizeof(pSignature),
  637. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  638. if (ret > 0 ){
  639. sz = ret;
  640. } else return -1;
  641. verify = wc_RsaPSS_Verify(pSignature, sz, out, outLen,
  642. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  643. if (verify <= 0)return -1;
  644. ret = wc_RsaPSS_CheckPadding(digest, digestSz, out, verify, hash);
  645. wc_FreeRsaKey(&key);
  646. wc_FreeRng(&rng);
  647. \endcode
  648. \sa wc_RsaPSS_Sign
  649. \sa wc_RsaPSS_Verify
  650. \sa wc_RsaPSS_VerifyInline
  651. \sa wc_RsaPSS_VerifyCheck
  652. \sa wc_RsaPSS_VerifyCheck_ex
  653. \sa wc_RsaPSS_VerifyCheckInline
  654. \sa wc_RsaPSS_VerifyCheckInline_ex
  655. \sa wc_RsaPSS_CheckPadding_ex
  656. \sa wc_RsaSetRNG
  657. */
  658. int wc_RsaPSS_CheckPadding(const byte* in, word32 inLen, byte* sig,
  659. word32 sigSz,
  660. enum wc_HashType hashType);
  661. /*!
  662. \ingroup RSA
  663. \brief PSSデータを確認して、署名が一致するようにします。ソルトの長さはハッシュ長に等しい。
  664. \return BAD_PADDING_E PSSデータが無効な場合、NULLがINまたはSIGまたはINSZに渡されると、BAD_FUNC_ARGはハッシュアルゴリズムの長さと同じではありません。
  665. \return MEMORY_E メモリ例外
  666. \param in 検証中のデータのハッシュ。
  667. \param inSz ハッシュの長さ
  668. \param sig PSSデータを保持するバッファ。
  669. \param sigSz PSSデータのサイズ。
  670. \param hashType ハッシュアルゴリズム
  671. \param saltLen 使用されるソルトの長さ。RSA_PSSS_SALT_LEN_DEFAULT(-1)ソルトの長さはハッシュ長と同じです。RSA_PSS_SALT_LEN_DISCOVERは、ソルトの長さがデータから決定されます。
  672. _Example_
  673. \code
  674. ret = wc_InitRsaKey(&key, NULL);
  675. if (ret == 0) {
  676. ret = wc_InitRng(&rng);
  677. } else return -1;
  678. if (ret == 0) {
  679. ret = wc_RsaSetRNG(&key, &rng);
  680. } else return -1;
  681. if (ret == 0) {
  682. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  683. } else return -1;
  684. if (ret == 0) {
  685. digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
  686. ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
  687. } else return -1;
  688. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, sizeof(pSignature),
  689. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  690. if (ret > 0 ){
  691. sz = ret;
  692. } else return -1;
  693. verify = wc_RsaPSS_Verify(pSignature, sz, out, outLen,
  694. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  695. if (verify <= 0)return -1;
  696. ret = wc_RsaPSS_CheckPadding_ex(digest, digestSz, out, verify, hash, saltLen, 0);
  697. wc_FreeRsaKey(&key);
  698. wc_FreeRng(&rng);
  699. \endcode
  700. \sa wc_RsaPSS_Sign
  701. \sa wc_RsaPSS_Verify
  702. \sa wc_RsaPSS_VerifyInline
  703. \sa wc_RsaPSS_VerifyCheck
  704. \sa wc_RsaPSS_VerifyCheck_ex
  705. \sa wc_RsaPSS_VerifyCheckInline
  706. \sa wc_RsaPSS_VerifyCheckInline_ex
  707. \sa wc_RsaPSS_CheckPadding
  708. */
  709. int wc_RsaPSS_CheckPadding_ex(const byte* in, word32 inLen, byte* sig,
  710. word32 sigSz, enum wc_HashType hashType, int saltLen, int bits);
  711. /*!
  712. \ingroup RSA
  713. \brief 提供されたキー構造の暗号化サイズを返します。
  714. \return Success 提供されたキー構造の暗号化サイズ。
  715. _Example_
  716. \code
  717. int sz = wc_RsaEncryptSize(&key);
  718. \endcode
  719. \sa wc_InitRsaKey
  720. \sa wc_InitRsaKey_ex
  721. \sa wc_MakeRsaKey
  722. */
  723. int wc_RsaEncryptSize(RsaKey* key);
  724. /*!
  725. \ingroup RSA
  726. \brief この関数はDerフォーマットされたRSA秘密鍵を解析し、秘密鍵を抽出し、それを与えられたResakey構造に格納します。IDXに解析された距離も設定します。
  727. \return 0 DERエンコード入力から秘密鍵の解析に成功したときに返されます
  728. \return ASN_PARSE_E 入力バッファから秘密鍵を解析するエラーがある場合に返されます。これは、入力秘密鍵がASN.1規格に従って正しくフォーマットされていない場合に発生する可能性があります。
  729. \return ASN_RSA_KEY_E RSAキー入力の秘密鍵要素を読み取るエラーがある場合
  730. \param input デコードするDERフォーマット秘密鍵を含むバッファへのポインタ
  731. \param inOutIdx キーが始まるバッファ内のインデックスへのポインタ(通常は0)。この関数の副作用として、InoutIDXは入力バッファを介して解析された距離を記憶します
  732. \param key デコードされた秘密鍵を保存するRSAKEY構造へのポインタ
  733. _Example_
  734. \code
  735. RsaKey enc;
  736. word32 idx = 0;
  737. int ret = 0;
  738. byte der[] = { // initialize with DER-encoded RSA private key };
  739. wc_InitRsaKey(&enc, NULL); // not using heap hint. No custom memory
  740. ret = wc_RsaPrivateKeyDecode(der, &idx, &enc, sizeof(der));
  741. if( ret != 0 ) {
  742. // error parsing private key
  743. }
  744. \endcode
  745. \sa wc_RsaPublicKeyDecode
  746. \sa wc_MakeRsaKey
  747. */
  748. int wc_RsaPrivateKeyDecode(const byte* input, word32* inOutIdx,
  749. RsaKey* key, word32 inSz);
  750. /*!
  751. \ingroup RSA
  752. \brief この関数はDerフォーマットのRSA公開鍵を解析し、公開鍵を抽出し、それを指定されたRsaKey構造体に格納します。IDXに解析された距離も設定します。
  753. \return 0 DERエンコード入力から公開鍵の解析に成功したときに返された
  754. \return ASN_PARSE_E 入力バッファから公開鍵を解析したエラーがある場合に返されます。これは、入力公開鍵がASN.1規格に従って正しくフォーマットされていない場合に発生する可能性があります。
  755. \return ASN_OBJECT_ID_E ASN.1オブジェクトIDがRSA公開鍵のそれと一致しない場合に返されます。
  756. \return ASN_EXPECT_0_E 入力キーがASN.1規格に従って正しくフォーマットされていない場合
  757. \return ASN_BITSTR_E 入力キーがASN.1規格に従って正しくフォーマットされていない場合
  758. \return ASN_RSA_KEY_E RSAキー入力の公開鍵要素を読み取るエラーがある場合
  759. \param input 復号する入力DERエンコードRSA公開鍵を含むバッファへのポインタ
  760. \param inOutIdx キーが始まるバッファ内のインデックスへのポインタ(通常は0)。この関数の副作用として、InoutIDXは入力バッファを介して解析された距離を記憶します
  761. \param key デコードされた公開鍵を保存するRsaKey構造体へのポインタ
  762. _Example_
  763. \code
  764. RsaKey pub;
  765. word32 idx = 0;
  766. int ret = 0;
  767. byte der[] = { // initialize with DER-encoded RSA public key };
  768. wc_InitRsaKey(&pub, NULL); // not using heap hint. No custom memory
  769. ret = wc_RsaPublicKeyDecode(der, &idx, &pub, sizeof(der));
  770. if( ret != 0 ) {
  771. // error parsing public key
  772. }
  773. \endcode
  774. \sa wc_RsaPublicKeyDecodeRaw
  775. */
  776. int wc_RsaPublicKeyDecode(const byte* input, word32* inOutIdx,
  777. RsaKey* key, word32 inSz);
  778. /*!
  779. \ingroup RSA
  780. \brief この関数は、公開弾性率(n)と指数(e)を撮影して、RSA公開鍵の生の要素を復号します。これらの生の要素を提供されたRsaKey構造体に格納し、暗号化/復号化プロセスで使用することができます。
  781. \return 0 公開鍵の生の要素をRsaKey構造体に復号したときに返された
  782. \return BAD_FUNC_ARG いずれかの入力引数がNULLに評価された場合に返されます。
  783. \return MP_INIT_E 複数の精密整数(MP_INT)ライブラリで使用するための整数の初期化中にエラーがある場合
  784. \return ASN_GETINT_E 提供されたRSAキー要素、nまたはeのいずれかを読むエラーがある場合に返されます
  785. \param n Public RSAキーのRAWモジュラスパラメータを含むバッファへのポインタ
  786. \param nSz Nを含むバッファのサイズ
  787. \param e Public RSAキーのRAW指数パラメータを含むバッファへのポインタ
  788. \param eSz Eを含むバッファのサイズ
  789. _Example_
  790. \code
  791. RsaKey pub;
  792. int ret = 0;
  793. byte n[] = { // initialize with received n component of public key };
  794. byte e[] = { // initialize with received e component of public key };
  795. wc_InitRsaKey(&pub, NULL); // not using heap hint. No custom memory
  796. ret = wc_RsaPublicKeyDecodeRaw(n, sizeof(n), e, sizeof(e), &pub);
  797. if( ret != 0 ) {
  798. // error parsing public key elements
  799. }
  800. \endcode
  801. \sa wc_RsaPublicKeyDecode
  802. */
  803. int wc_RsaPublicKeyDecodeRaw(const byte* n, word32 nSz,
  804. const byte* e, word32 eSz, RsaKey* key);
  805. /*!
  806. \ingroup RSA
  807. \brief この機能はRSAKEYキーをDERフォーマットに変換します。結果は出力に書き込まれ、書き込まれたバイト数を返します。
  808. \return >0 成功、書かれたバイト数。
  809. \return BAD_FUNC_ARG キーまたは出力がNULLの場合、またはキー - >タイプがRSA_PRIVATEでない場合、またはINLENが出力バッファに十分な大きさでない場合は返されます。
  810. \return MEMORY_E メモリの割り当て中にエラーが発生した場合に返されます。
  811. \param key 初期化されたRsaKey構造体
  812. \param output 出力バッファへのポインタ。
  813. _Example_
  814. \code
  815. byte* der;
  816. // Allocate memory for der
  817. int derSz = // Amount of memory allocated for der;
  818. RsaKey key;
  819. WC_RNG rng;
  820. long e = 65537; // standard value to use for exponent
  821. ret = wc_MakeRsaKey(&key, 2048, e, &rng); // generate 2048 bit long
  822. private key
  823. wc_InitRsaKey(&key, NULL);
  824. wc_InitRng(&rng);
  825. if(wc_RsaKeyToDer(&key, der, derSz) != 0)
  826. {
  827. // Handle the error thrown
  828. }
  829. \endcode
  830. \sa wc_RsaKeyToPublicDer
  831. \sa wc_InitRsaKey
  832. \sa wc_MakeRsaKey
  833. \sa wc_InitRng
  834. */
  835. int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen);
  836. /*!
  837. \ingroup RSA
  838. \brief この機能は、どのパディングを使用するかを選択しながらRSA暗号化を実行します。
  839. \return size 正常に暗号化されていると、暗号化されたバッファのサイズが返されます
  840. \return RSA_BUFFER_E RSAバッファエラー、出力が小さすぎたり入力が大きすぎたりする
  841. \param in 暗号化のためのバッファへのポインタ
  842. \param inLen 暗号化するバッファの長さ
  843. \param out 暗号化されたMSGが作成されました
  844. \param outLen 暗号化されたMSGを保持するために利用可能なバッファの長さ
  845. \param key 初期化ずみRsaKey構造体
  846. \param rng 初期化されたWC_RNG構造体
  847. \param type 使用するパディングの種類(WC_RSA_OAEP_PADまたはWC_RSA_PKCSV15_PAD)
  848. \param hash 使用するハッシュの種類(選択はhash.hにあります)
  849. \param mgf 使用するマスク生成機能の種類
  850. \param label 暗号化されたメッセージに関連付けるオプションのラベル
  851. _Example_
  852. \code
  853. WC_RNG rng;
  854. RsaKey key;
  855. byte in[] = “I use Turing Machines to ask questions”
  856. byte out[256];
  857. int ret;
  858. ret = wc_RsaPublicEncrypt_ex(in, sizeof(in), out, sizeof(out), &key, &rng,
  859. WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
  860. if (ret < 0) {
  861. //handle error
  862. }
  863. \endcode
  864. \sa wc_RsaPublicEncrypt
  865. \sa wc_RsaPrivateDecrypt_ex
  866. */
  867. int wc_RsaPublicEncrypt_ex(const byte* in, word32 inLen, byte* out,
  868. word32 outLen, RsaKey* key, WC_RNG* rng, int type,
  869. enum wc_HashType hash, int mgf, byte* label, word32 labelSz);
  870. /*!
  871. \ingroup RSA
  872. \brief この関数はRSAを使用してメッセージを復号化し、どのパディングタイプのオプションを指定します。
  873. \return size 復号化が成功すると、復号化されたメッセージのサイズが返されます。
  874. \return MEMORY_E 必要な配列をMallocにMallocにするのに十分なメモリがない場合は返されます。
  875. \return BAD_FUNC_ARG 関数に渡された引数が渡された場合に返されます。
  876. \param in 復号化のためのバッファへのポインタ
  877. \param inLen 復号化するバッファの長さ
  878. \param out 復号化されたMSGが作成されました
  879. \param outLen 復号化されたMSGを保持するために利用可能なバッファの長さ
  880. \param key 初期化ずみRsaKey構造体
  881. \param type 使用するパディングの種類(WC_RSA_OAEP_PADまたはWC_RSA_PKCSV15_PAD)
  882. \param hash 使用するハッシュの種類(選択はhash.hにあります)
  883. \param mgf 使用するマスク生成機能の種類
  884. \param label 暗号化されたメッセージに関連付けるオプションのラベル
  885. _Example_
  886. \code
  887. WC_RNG rng;
  888. RsaKey key;
  889. byte in[] = “I use Turing Machines to ask questions”
  890. byte out[256];
  891. byte plain[256];
  892. int ret;
  893. ret = wc_RsaPublicEncrypt_ex(in, sizeof(in), out, sizeof(out), &key,
  894. &rng, WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
  895. if (ret < 0) {
  896. //handle error
  897. }
  898. ret = wc_RsaPrivateDecrypt_ex(out, ret, plain, sizeof(plain), &key,
  899. WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
  900. if (ret < 0) {
  901. //handle error
  902. }
  903. \endcode
  904. \sa none
  905. */
  906. int wc_RsaPrivateDecrypt_ex(const byte* in, word32 inLen,
  907. byte* out, word32 outLen, RsaKey* key, int type,
  908. enum wc_HashType hash, int mgf, byte* label, word32 labelSz);
  909. /*!
  910. \ingroup RSA
  911. \brief この関数はRSAを使用してメッセージをインラインで復号化し、どのパディングタイプのオプションを示します。INバッファには、呼び出された後に復号化されたメッセージが含まれ、アウトバイトポインタはプレーンテキストがある「IN」バッファ内の場所を指します。
  912. \return size 復号化が成功すると、復号化されたメッセージのサイズが返されます。
  913. \return MEMORY_E: 必要な配列をMallocにMallocにするのに十分なメモリがない場合は返されます。
  914. \return RSA_PAD_E: パディングのエラーが発生した場合に返されます。
  915. \return BAD_PADDING_E: 過去のパディングの解析中にエラーが発生した場合に返されます。
  916. \return BAD_FUNC_ARG: 関数に渡された引数が渡された場合に返されます。
  917. \param in 復号化のためのバッファへのポインタ
  918. \param inLen 復号化するバッファの長さ
  919. \param out "in"バッファの復号化されたメッセージの位置へのポインタ
  920. \param key 初期化ずみRsaKey構造体
  921. \param type 使用するパディングの種類(WC_RSA_OAEP_PADまたはWC_RSA_PKCSV15_PAD)
  922. \param hash 使用するハッシュの種類(選択はhash.hにあります)
  923. \param mgf 使用するマスク生成機能の種類
  924. \param label 暗号化されたメッセージに関連付けるオプションのラベル
  925. _Example_
  926. \code
  927. WC_RNG rng;
  928. RsaKey key;
  929. byte in[] = “I use Turing Machines to ask questions”
  930. byte out[256];
  931. byte* plain;
  932. int ret;
  933. ret = wc_RsaPublicEncrypt_ex(in, sizeof(in), out, sizeof(out), &key,
  934. &rng, WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
  935. if (ret < 0) {
  936. //handle error
  937. }
  938. ret = wc_RsaPrivateDecryptInline_ex(out, ret, &plain, &key,
  939. WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
  940. if (ret < 0) {
  941. //handle error
  942. }
  943. \endcode
  944. \sa none
  945. */
  946. int wc_RsaPrivateDecryptInline_ex(byte* in, word32 inLen,
  947. byte** out, RsaKey* key, int type, enum wc_HashType hash,
  948. int mgf, byte* label, word32 labelSz);
  949. /*!
  950. \ingroup RSA
  951. \brief RSAアルゴリズムに使用されるRsaKey構造体の個々の要素(E、N)をバッファに取り出します。
  952. \return 0 関数が正常に実行された場合は、エラーなしで返されます。
  953. \return BAD_FUNC_ARG: いずれかのパラメータがNULL値で渡された場合に返されます。
  954. \return RSA_BUFFER_E: 渡されたeまたはnバッファが正しいサイズではない場合に返されます。
  955. \return MP_MEM: 内部関数にメモリエラーがある場合に返されます。
  956. \return MP_VAL: 内部関数引数が無効な場合に返されます。
  957. \param key 検証に使用する鍵。
  958. \param e eの値のバッファー。eはRSAモジュラ演算での大きな正の整数です。
  959. \param eSz eバッファのサイズ。
  960. \param n nの値のバッファー。NはRSAモジュラー演算では大きな正の整数です。
  961. _Example_
  962. \code
  963. Rsa key; // A valid RSA key.
  964. byte e[ buffer sz E.g. 256 ];
  965. byte n[256];
  966. int ret;
  967. word32 eSz = sizeof(e);
  968. word32 nSz = sizeof(n);
  969. ...
  970. ret = wc_RsaFlattenPublicKey(&key, e, &eSz, n, &nSz);
  971. if (ret != 0) {
  972. // Failure case.
  973. }
  974. \endcode
  975. \sa wc_InitRsaKey
  976. \sa wc_InitRsaKey_ex
  977. \sa wc_MakeRsaKey
  978. */
  979. int wc_RsaFlattenPublicKey(RsaKey* key, byte* e, word32* eSz, byte* n,
  980. word32* nSz);
  981. /*!
  982. \ingroup RSA
  983. \brief RSA公開鍵をDERフォーマットに変換します。出力に書き込み、書き込まれたバイト数を返します。
  984. \return >0 成功、書かれたバイト数。
  985. \return BAD_FUNC_ARG キーまたは出力がNULLの場合に返されます。
  986. \return MEMORY_E エラー割り当てメモリが発生したときに返されます。
  987. \return <0 エラー
  988. \param key 変換するRsaKey構造体。
  989. \param output 保留された出力バッファー。(NULLが長さのみを返す場合)
  990. _Example_
  991. \code
  992. RsaKey key;
  993. wc_InitRsaKey(&key, NULL);
  994. // Use key
  995. const int BUFFER_SIZE = 1024; // Some adequate size for the buffer
  996. byte output[BUFFER_SIZE];
  997. if (wc_RsaKeyToPublicDer(&key, output, sizeof(output)) != 0) {
  998. // Handle Error
  999. }
  1000. \endcode
  1001. \sa wc_RsaPublicKeyDerSize
  1002. \sa wc_RsaKeyToPublicDer_ex
  1003. \sa wc_InitRsaKey
  1004. */
  1005. int wc_RsaKeyToPublicDer(RsaKey* key, byte* output, word32 inLen);
  1006. /*!
  1007. \ingroup RSA
  1008. \brief RSA公開鍵をDERフォーマットに変換します。出力に書き込み、書き込まれたバイト数を返します。with_headerが0の場合(seq + n + e)だけがASN.1 Derフォーマットで返され、ヘッダーを除外します。
  1009. \return >0 成功、書かれたバイト数。
  1010. \return BAD_FUNC_ARG キーまたは出力がNULLの場合に返されます。
  1011. \return MEMORY_E エラー割り当てメモリが発生したときに返されます。
  1012. \return <0 エラー
  1013. \param key 変換するRsaKey構造体。
  1014. \param output 保留された出力バッファー。(NULLが長さのみを返す場合)
  1015. _Example_
  1016. \code
  1017. RsaKey key;
  1018. wc_InitRsaKey(&key, NULL);
  1019. // Use key
  1020. const int BUFFER_SIZE = 1024; // Some adequate size for the buffer
  1021. byte output[BUFFER_SIZE];
  1022. if (wc_RsaKeyToPublicDer_ex(&key, output, sizeof(output), 0) != 0) {
  1023. // Handle Error
  1024. }
  1025. \endcode
  1026. \sa wc_RsaPublicKeyDerSize
  1027. \sa wc_RsaKeyToPublicDer
  1028. \sa wc_InitRsaKey
  1029. */
  1030. int wc_RsaKeyToPublicDer_ex(RsaKey* key, byte* output, word32 inLen,
  1031. int with_header);
  1032. /*!
  1033. \ingroup RSA
  1034. \brief この関数は、長さサイズ(ビット単位)のRSA秘密鍵を生成し、指数(e)を指定します。次に、このキーを提供されたRsaKey構造体に格納するため、暗号化/復号化に使用できます。Eに使用するセキュア番号は65537です。サイズは、RSA_MIN_SIZEよりも大きく、RSA_MAX_SIZEよりも大きくなる必要があります。この機能が利用可能であるため、コンパイル時にオプションwolfssl_key_genを有効にする必要があります。これは、 - を使用してください./configureを使用する場合は、-enable-keygenで実現できます。
  1035. \return 0 RSA秘密鍵の生成に成功したら返されました
  1036. \return BAD_FUNC_ARG 入力引数のいずれかがNULLの場合、サイズパラメータは必要な範囲外にあるか、eが誤って選択されている場合
  1037. \return RNG_FAILURE_E 提供されたRNG構造体を使用してランダムブロックを生成するエラーがある場合
  1038. \return MP_INIT_E
  1039. \return MP_READ_E RSAキーの生成中に使用された数学ライブラリにエラーがある場合に返されたRSAキーの生成中に使用された数学ライブラリにエラーがある場合に返される可能性があります。
  1040. \return MP_CMP_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1041. \return MP_INVMOD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1042. \return MP_EXPTMOD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1043. \return MP_MOD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1044. \return MP_MUL_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1045. \return MP_ADD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1046. \return MP_MULMOD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1047. \return MP_TO_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1048. \return MP_MEM RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1049. \return MP_ZERO_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1050. \param key 生成された秘密鍵を保存するRSAKEY構造体へのポインタ
  1051. \param size ビット単位の希望のキー長。rsa_min_sizeより大きく、rsa_max_sizeよりも大きくなる必要があります。
  1052. \param e キーを生成するために使用する指数パラメータ。安全な選択は65537です
  1053. _Example_
  1054. \code
  1055. RsaKey priv;
  1056. WC_RNG rng;
  1057. int ret = 0;
  1058. long e = 65537; // standard value to use for exponent
  1059. wc_InitRsaKey(&priv, NULL); // not using heap hint. No custom memory
  1060. wc_InitRng(&rng);
  1061. // generate 2048 bit long private key
  1062. ret = wc_MakeRsaKey(&priv, 2048, e, &rng);
  1063. if( ret != 0 ) {
  1064. // error generating private key
  1065. }
  1066. \endcode
  1067. \sa none
  1068. */
  1069. int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng);
  1070. /*!
  1071. \ingroup RSA
  1072. \brief この関数は、ブロックされていないRSAコンテキストを設定します。RSANBコンテキストが設定されている場合、RSA関数を多くの小さな操作に分割する高速数学ベースの非ブロッキングEXPTMODが可能になります。wc_rsa_nonblockが定義されているときに有効になっています。
  1073. \return 0 成功
  1074. \return BAD_FUNC_ARG キーまたはNBがNULLの場合に返されます。
  1075. \param key RSAキー構造
  1076. _Example_
  1077. \code
  1078. int ret, count = 0;
  1079. RsaKey key;
  1080. RsaNb nb;
  1081. wc_InitRsaKey(&key, NULL);
  1082. // Enable non-blocking RSA mode - provide context
  1083. ret = wc_RsaSetNonBlock(key, &nb);
  1084. if (ret != 0)
  1085. return ret;
  1086. do {
  1087. ret = wc_RsaSSL_Sign(in, inLen, out, outSz, key, rng);
  1088. count++; // track number of would blocks
  1089. if (ret == FP_WOULDBLOCK) {
  1090. // do "other" work here
  1091. }
  1092. } while (ret == FP_WOULDBLOCK);
  1093. if (ret < 0) {
  1094. return ret;
  1095. }
  1096. printf("RSA non-block sign: size %d, %d times\n", ret, count);
  1097. \endcode
  1098. \sa wc_RsaSetNonBlockTime
  1099. */
  1100. int wc_RsaSetNonBlock(RsaKey* key, RsaNb* nb);
  1101. /*!
  1102. \ingroup RSA
  1103. \brief この関数は最大ブロック時間の最大ブロック時間をマイクロ秒単位で設定します。それは、メガヘルツのCPU速度と共に事前計算されたテーブル(TFM.cexptModnbinstを参照)を使用して、提供された最大ブロック時間内に次の動作を完了できるかどうかを判断します。wc_rsa_nonblock_timeが定義されているときに有効になります。
  1104. \return 0 成功
  1105. \return BAD_FUNC_ARG キーがNULLの場合、またはWC_RSASETNONBLOCKが以前に呼び出され、キー - > NBはNULLの場合に返されます。
  1106. \param key RsaKey構造体
  1107. \param maxBlockUs マイクロ秒をブロックする最大時間。
  1108. _Example_
  1109. \code
  1110. RsaKey key;
  1111. RsaNb nb;
  1112. wc_InitRsaKey(&key, NULL);
  1113. wc_RsaSetNonBlock(key, &nb);
  1114. wc_RsaSetNonBlockTime(&key, 4000, 160); // Block Max = 4 ms, CPU = 160MHz
  1115. \endcode
  1116. \sa wc_RsaSetNonBlock
  1117. */
  1118. int wc_RsaSetNonBlockTime(RsaKey* key, word32 maxBlockUs,
  1119. word32 cpuMHz);