2
0

rsa.h 53 KB

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