rsa.h 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202
  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_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. \return MP_EXPTMOD_E - fastmathを使用する様に構成されている場合にFP_MAX_BITSが鍵サイズの少なくとも2倍に設定されていない(例えば4096-bit長の鍵を使用する場合にはFP_MAX_BITSは8192以上に設定すること)。
  301. \param in 復号される署名データが格納されているバッファ
  302. \param inLen 署名データの長さ
  303. \param out 復号データの出力先バッファ
  304. \param outLen 出力先バッファサイズ
  305. \param hash メッセージに入るハッシュ型
  306. \param mgf マスク生成機能識別子
  307. _Example_
  308. \code
  309. ret = wc_InitRsaKey(&key, NULL);
  310. if (ret == 0) {
  311. ret = wc_InitRng(&rng);
  312. } else return -1;
  313. if (ret == 0) {
  314. ret = wc_RsaSetRNG(&key, &rng);
  315. } else return -1;
  316. if (ret == 0) {
  317. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  318. } else return -1;
  319. ret = wc_RsaPSS_Sign((byte*)szMessage, (word32)XSTRLEN(szMessage)+1,
  320. pSignature, sizeof(pSignature),
  321. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  322. if (ret > 0 ){
  323. sz = ret;
  324. } else return -1;
  325. ret = wc_RsaPSS_Verify(pSignature, sz, pt, outLen,
  326. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  327. if (ret <= 0)return -1;
  328. wc_FreeRsaKey(&key);
  329. wc_FreeRng(&rng);
  330. \endcode
  331. \sa wc_RsaPSS_Sign
  332. \sa wc_RsaPSS_VerifyInline
  333. \sa wc_RsaPSS_CheckPadding
  334. \sa wc_RsaSetRNG
  335. */
  336. int wc_RsaPSS_Verify(byte* in, word32 inLen, byte* out,
  337. word32 outLen, enum wc_HashType hash, int mgf,
  338. RsaKey* key);
  339. /*!
  340. \ingroup RSA
  341. \brief 入力署名を復号化して、メッセージがRSAキーによって署名されたことを確認します。出力は入力と同じバイト配列を使用します。WC_RSA_BLINDINGが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  342. \return >0 テキストの長さ
  343. \return <0 エラーが発生しました。
  344. \param in 復号化されるバイト配列。
  345. \param inLen バッファ入力の長さ。
  346. \param out PSSデータを含むアドレスへのポインタ。
  347. \param hash メッセージに入るハッシュ型
  348. \param mgf マスク生成機能識別子
  349. _Example_
  350. \code
  351. ret = wc_InitRsaKey(&key, NULL);
  352. if (ret == 0) {
  353. ret = wc_InitRng(&rng);
  354. } else return -1;
  355. if (ret == 0) {
  356. ret = wc_RsaSetRNG(&key, &rng);
  357. } else return -1;
  358. if (ret == 0) {
  359. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  360. } else return -1;
  361. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
  362. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  363. if (ret > 0 ){
  364. sz = ret;
  365. } else return -1;
  366. ret = wc_RsaPSS_VerifyInline(pSignature, sz, pt,
  367. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  368. if (ret <= 0)return -1;
  369. wc_FreeRsaKey(&key);
  370. wc_FreeRng(&rng);
  371. \endcode
  372. \sa wc_RsaPSS_Verify
  373. \sa wc_RsaPSS_Sign
  374. \sa wc_RsaPSS_VerifyCheck
  375. \sa wc_RsaPSS_VerifyCheck_ex
  376. \sa wc_RsaPSS_VerifyCheckInline
  377. \sa wc_RsaPSS_VerifyCheckInline_ex
  378. \sa wc_RsaPSS_CheckPadding
  379. \sa wc_RsaPSS_CheckPadding_ex
  380. \sa wc_RsaSetRNG
  381. */
  382. int wc_RsaPSS_VerifyInline(byte* in, word32 inLen, byte** out,
  383. enum wc_HashType hash, int mgf,
  384. RsaKey* key);
  385. /*!
  386. \ingroup RSA
  387. \brief RSA-PSSで署名されたメッセージを確認してください。ソルトの長さはハッシュ長に等しい。WC_RSA_BLINDINGが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  388. \return the PSSデータの長さが成功し、負に障害が発生します。
  389. \return MEMORY_E メモリ例外
  390. \param in 復号化されるバイト配列。
  391. \param inLen の長さ
  392. \param out PSSデータを含むアドレスへのポインタ。
  393. \param outLen の長さ
  394. \param digest 検証中のデータのハッシュ。
  395. \param digestLen ハッシュの長さ
  396. \param hash ハッシュアルゴリズム
  397. \param mgf マスク生成機能
  398. _Example_
  399. \code
  400. ret = wc_InitRsaKey(&key, NULL);
  401. if (ret == 0) {
  402. ret = wc_InitRng(&rng);
  403. } else return -1;
  404. if (ret == 0) {
  405. ret = wc_RsaSetRNG(&key, &rng);
  406. } else return -1;
  407. if (ret == 0) {
  408. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  409. } else return -1;
  410. if (ret == 0) {
  411. digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
  412. ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
  413. } else return -1;
  414. if (ret == 0) {
  415. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
  416. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  417. if (ret > 0 ){
  418. sz = ret;
  419. } else return -1;
  420. } else return -1;
  421. if (ret == 0) {
  422. ret = wc_RsaPSS_VerifyCheck(pSignature, sz, pt, outLen,
  423. digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  424. if (ret <= 0) return -1;
  425. } else return -1;
  426. wc_FreeRsaKey(&key);
  427. wc_FreeRng(&rng);
  428. \endcode
  429. \sa wc_RsaPSS_Sign
  430. \sa wc_RsaPSS_Verify
  431. \sa wc_RsaPSS_VerifyCheck_ex
  432. \sa wc_RsaPSS_VerifyCheckInline
  433. \sa wc_RsaPSS_VerifyCheckInline_ex
  434. \sa wc_RsaPSS_CheckPadding
  435. \sa wc_RsaPSS_CheckPadding_ex
  436. \sa wc_RsaSetRNG
  437. */
  438. int wc_RsaPSS_VerifyCheck(byte* in, word32 inLen,
  439. byte* out, word32 outLen,
  440. const byte* digest, word32 digestLen,
  441. enum wc_HashType hash, int mgf,
  442. RsaKey* key);
  443. /*!
  444. \ingroup RSA
  445. \brief RSA-PSSで署名されたメッセージを確認してください。WC_RSA_BLINDINGが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  446. \return the PSSデータの長さが成功し、負に障害が発生します。
  447. \return MEMORY_E メモリ例外
  448. \param in 復号化されるバイト配列。
  449. \param inLen の長さ
  450. \param out PSSデータを含むアドレスへのポインタ。
  451. \param outLen の長さ
  452. \param digest 検証中のデータのハッシュ。
  453. \param digestLen ハッシュの長さ
  454. \param hash ハッシュアルゴリズム
  455. \param mgf マスク生成機能
  456. \param saltLen 使用されるソルトの長さ。RSA_PSSS_SALT_LEN_DEFAULT(-1)ソルトの長さはハッシュ長と同じです。RSA_PSS_SALT_LEN_DISCOVERは、ソルトの長さがデータから決定されます。
  457. _Example_
  458. \code
  459. ret = wc_InitRsaKey(&key, NULL);
  460. if (ret == 0) {
  461. ret = wc_InitRng(&rng);
  462. } else return -1;
  463. if (ret == 0) {
  464. ret = wc_RsaSetRNG(&key, &rng);
  465. } else return -1;
  466. if (ret == 0) {
  467. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  468. } else return -1;
  469. if (ret == 0) {
  470. digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
  471. ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
  472. } else return -1;
  473. if (ret == 0) {
  474. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
  475. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  476. if (ret > 0 ){
  477. sz = ret;
  478. } else return -1;
  479. } else return -1;
  480. if (ret == 0) {
  481. ret = wc_RsaPSS_VerifyCheck_ex(pSignature, sz, pt, outLen,
  482. digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, saltLen, &key);
  483. if (ret <= 0) return -1;
  484. } else return -1;
  485. wc_FreeRsaKey(&key);
  486. wc_FreeRng(&rng);
  487. \endcode
  488. \sa wc_RsaPSS_Sign
  489. \sa wc_RsaPSS_Verify
  490. \sa wc_RsaPSS_VerifyCheck
  491. \sa wc_RsaPSS_VerifyCheckInline
  492. \sa wc_RsaPSS_VerifyCheckInline_ex
  493. \sa wc_RsaPSS_CheckPadding
  494. \sa wc_RsaPSS_CheckPadding_ex
  495. \sa wc_RsaSetRNG
  496. */
  497. int wc_RsaPSS_VerifyCheck_ex(byte* in, word32 inLen,
  498. byte* out, word32 outLen,
  499. const byte* digest, word32 digestLen,
  500. enum wc_HashType hash, int mgf, int saltLen,
  501. RsaKey* key);
  502. /*!
  503. \ingroup RSA
  504. \brief RSA-PSSで署名されたメッセージを確認してください。入力バッファは出力バッファに再利用されます。ソルトの長さはハッシュ長に等しい。WC_RSA_BLINDINGが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  505. \return the PSSデータの長さが成功し、負に障害が発生します。
  506. \param in 復号化されるバイト配列。
  507. \param inLen の長さ
  508. \param out 格納する復号化データのバイト配列。
  509. \param digest 検証中のデータのハッシュ。
  510. \param digestLen ハッシュの長さ
  511. \param hash メッセージに入るハッシュ型
  512. \param mgf マスク生成機能識別子
  513. _Example_
  514. \code
  515. ret = wc_InitRsaKey(&key, NULL);
  516. if (ret == 0) {
  517. ret = wc_InitRng(&rng);
  518. } else return -1;
  519. if (ret == 0) {
  520. ret = wc_RsaSetRNG(&key, &rng);
  521. } else return -1;
  522. if (ret == 0) {
  523. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  524. } else return -1;
  525. if (ret == 0) {
  526. digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
  527. ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
  528. } else return -1;
  529. if (ret == 0) {
  530. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
  531. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  532. if (ret > 0 ){
  533. sz = ret;
  534. } else return -1;
  535. } else return -1;
  536. if (ret == 0) {
  537. ret = wc_RsaPSS_VerifyCheckInline(pSignature, sz, pt,
  538. digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  539. if (ret <= 0) return -1;
  540. } else return -1;
  541. wc_FreeRsaKey(&key);
  542. wc_FreeRng(&rng);
  543. \endcode
  544. \sa wc_RsaPSS_Sign
  545. \sa wc_RsaPSS_Verify
  546. \sa wc_RsaPSS_VerifyCheck
  547. \sa wc_RsaPSS_VerifyCheck_ex
  548. \sa wc_RsaPSS_VerifyCheckInline_ex
  549. \sa wc_RsaPSS_CheckPadding
  550. \sa wc_RsaPSS_CheckPadding_ex
  551. \sa wc_RsaSetRNG
  552. */
  553. int wc_RsaPSS_VerifyCheckInline(byte* in, word32 inLen, byte** out,
  554. const byte* digest, word32 digentLen,
  555. enum wc_HashType hash, int mgf,
  556. RsaKey* key);
  557. /*!
  558. \ingroup RSA
  559. \brief RSA-PSSで署名されたメッセージを確認してください。入力バッファは出力バッファに再利用されます。WC_RSA_BLINDINGが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  560. \return the PSSデータの長さが成功し、負に障害が発生します。
  561. \param in 復号化されるバイト配列。
  562. \param inLen の長さ
  563. \param out 格納する復号化データのバイト配列。
  564. \param digest 検証中のデータのハッシュ。
  565. \param digestLen ハッシュの長さ
  566. \param hash メッセージに入るハッシュ型
  567. \param mgf マスク生成機能識別子
  568. \param saltLen 使用されるソルトの長さ。RSA_PSSS_SALT_LEN_DEFAULT(-1)ソルトの長さはハッシュ長と同じです。RSA_PSS_SALT_LEN_DISCOVERは、ソルトの長さがデータから決定されます。
  569. _Example_
  570. \code
  571. ret = wc_InitRsaKey(&key, NULL);
  572. if (ret == 0) {
  573. ret = wc_InitRng(&rng);
  574. } else return -1;
  575. if (ret == 0) {
  576. ret = wc_RsaSetRNG(&key, &rng);
  577. } else return -1;
  578. if (ret == 0) {
  579. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  580. } else return -1;
  581. if (ret == 0) {
  582. digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
  583. ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
  584. } else return -1;
  585. if (ret == 0) {
  586. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz,
  587. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  588. if (ret > 0 ){
  589. sz = ret;
  590. } else return -1;
  591. } else return -1;
  592. if (ret == 0) {
  593. ret = wc_RsaPSS_VerifyCheckInline_ex(pSignature, sz, pt,
  594. digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, saltLen, &key);
  595. if (ret <= 0) return -1;
  596. } else return -1;
  597. wc_FreeRsaKey(&key);
  598. wc_FreeRng(&rng);
  599. \endcode
  600. \sa wc_RsaPSS_Sign
  601. \sa wc_RsaPSS_Verify
  602. \sa wc_RsaPSS_VerifyCheck
  603. \sa wc_RsaPSS_VerifyCheck_ex
  604. \sa wc_RsaPSS_VerifyCheckInline
  605. \sa wc_RsaPSS_CheckPadding
  606. \sa wc_RsaPSS_CheckPadding_ex
  607. \sa wc_RsaSetRNG
  608. */
  609. int wc_RsaPSS_VerifyCheckInline_ex(byte* in, word32 inLen, byte** out,
  610. const byte* digest, word32 digentLen,
  611. enum wc_HashType hash, int mgf, int saltLen,
  612. RsaKey* key);
  613. /*!
  614. \ingroup RSA
  615. \brief PSSデータを確認して、署名が一致するようにします。ソルトの長さはハッシュ長に等しい。WC_RSA_BLINDINGが有効な場合、キーはWC_RSASETRNGによってRNGに関連付けられなければなりません。
  616. \return BAD_PADDING_E PSSデータが無効な場合、NULLがINまたはSIGまたはINSZに渡されると、BAD_FUNC_ARGはハッシュアルゴリズムの長さと同じではありません。
  617. \return MEMORY_E メモリ例外
  618. \param in 検証中のデータのハッシュ。
  619. \param inSz ハッシュの長さ
  620. \param sig PSSデータを保持するバッファ。
  621. \param sigSz PSSデータのサイズ。
  622. _Example_
  623. \code
  624. ret = wc_InitRsaKey(&key, NULL);
  625. if (ret == 0) {
  626. ret = wc_InitRng(&rng);
  627. } else return -1;
  628. if (ret == 0) {
  629. ret = wc_RsaSetRNG(&key, &rng);
  630. } else return -1;
  631. if (ret == 0) {
  632. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  633. } else return -1;
  634. if (ret == 0) {
  635. digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
  636. ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
  637. } else return -1;
  638. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, sizeof(pSignature),
  639. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  640. if (ret > 0 ){
  641. sz = ret;
  642. } else return -1;
  643. verify = wc_RsaPSS_Verify(pSignature, sz, out, outLen,
  644. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  645. if (verify <= 0)return -1;
  646. ret = wc_RsaPSS_CheckPadding(digest, digestSz, out, verify, hash);
  647. wc_FreeRsaKey(&key);
  648. wc_FreeRng(&rng);
  649. \endcode
  650. \sa wc_RsaPSS_Sign
  651. \sa wc_RsaPSS_Verify
  652. \sa wc_RsaPSS_VerifyInline
  653. \sa wc_RsaPSS_VerifyCheck
  654. \sa wc_RsaPSS_VerifyCheck_ex
  655. \sa wc_RsaPSS_VerifyCheckInline
  656. \sa wc_RsaPSS_VerifyCheckInline_ex
  657. \sa wc_RsaPSS_CheckPadding_ex
  658. \sa wc_RsaSetRNG
  659. */
  660. int wc_RsaPSS_CheckPadding(const byte* in, word32 inLen, byte* sig,
  661. word32 sigSz,
  662. enum wc_HashType hashType);
  663. /*!
  664. \ingroup RSA
  665. \brief PSSデータを確認して、署名が一致するようにします。ソルトの長さはハッシュ長に等しい。
  666. \return BAD_PADDING_E PSSデータが無効な場合、NULLがINまたはSIGまたはINSZに渡されると、BAD_FUNC_ARGはハッシュアルゴリズムの長さと同じではありません。
  667. \return MEMORY_E メモリ例外
  668. \param in 検証中のデータのハッシュ。
  669. \param inSz ハッシュの長さ
  670. \param sig PSSデータを保持するバッファ。
  671. \param sigSz PSSデータのサイズ。
  672. \param hashType ハッシュアルゴリズム
  673. \param saltLen 使用されるソルトの長さ。RSA_PSSS_SALT_LEN_DEFAULT(-1)ソルトの長さはハッシュ長と同じです。RSA_PSS_SALT_LEN_DISCOVERは、ソルトの長さがデータから決定されます。
  674. _Example_
  675. \code
  676. ret = wc_InitRsaKey(&key, NULL);
  677. if (ret == 0) {
  678. ret = wc_InitRng(&rng);
  679. } else return -1;
  680. if (ret == 0) {
  681. ret = wc_RsaSetRNG(&key, &rng);
  682. } else return -1;
  683. if (ret == 0) {
  684. ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng);
  685. } else return -1;
  686. if (ret == 0) {
  687. digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256);
  688. ret = wc_Hash(WC_HASH_TYPE_SHA256, message, sz, digest, digestSz);
  689. } else return -1;
  690. ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, sizeof(pSignature),
  691. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng);
  692. if (ret > 0 ){
  693. sz = ret;
  694. } else return -1;
  695. verify = wc_RsaPSS_Verify(pSignature, sz, out, outLen,
  696. WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key);
  697. if (verify <= 0)return -1;
  698. ret = wc_RsaPSS_CheckPadding_ex(digest, digestSz, out, verify, hash, saltLen, 0);
  699. wc_FreeRsaKey(&key);
  700. wc_FreeRng(&rng);
  701. \endcode
  702. \sa wc_RsaPSS_Sign
  703. \sa wc_RsaPSS_Verify
  704. \sa wc_RsaPSS_VerifyInline
  705. \sa wc_RsaPSS_VerifyCheck
  706. \sa wc_RsaPSS_VerifyCheck_ex
  707. \sa wc_RsaPSS_VerifyCheckInline
  708. \sa wc_RsaPSS_VerifyCheckInline_ex
  709. \sa wc_RsaPSS_CheckPadding
  710. */
  711. int wc_RsaPSS_CheckPadding_ex(const byte* in, word32 inLen, byte* sig,
  712. word32 sigSz, enum wc_HashType hashType, int saltLen, int bits);
  713. /*!
  714. \ingroup RSA
  715. \brief 提供されたキー構造の暗号化サイズを返します。
  716. \return Success 提供されたキー構造の暗号化サイズ。
  717. _Example_
  718. \code
  719. int sz = wc_RsaEncryptSize(&key);
  720. \endcode
  721. \sa wc_InitRsaKey
  722. \sa wc_InitRsaKey_ex
  723. \sa wc_MakeRsaKey
  724. */
  725. int wc_RsaEncryptSize(RsaKey* key);
  726. /*!
  727. \ingroup RSA
  728. \brief この関数はDerフォーマットされたRSA秘密鍵を解析し、秘密鍵を抽出し、それを与えられたResakey構造に格納します。IDXに解析された距離も設定します。
  729. \return 0 DERエンコード入力から秘密鍵の解析に成功したときに返されます
  730. \return ASN_PARSE_E 入力バッファから秘密鍵を解析するエラーがある場合に返されます。これは、入力秘密鍵がASN.1規格に従って正しくフォーマットされていない場合に発生する可能性があります。
  731. \return ASN_RSA_KEY_E RSAキー入力の秘密鍵要素を読み取るエラーがある場合
  732. \param input デコードするDERフォーマット秘密鍵を含むバッファへのポインタ
  733. \param inOutIdx キーが始まるバッファ内のインデックスへのポインタ(通常は0)。この関数の副作用として、InoutIDXは入力バッファを介して解析された距離を記憶します
  734. \param key デコードされた秘密鍵を保存するRSAKEY構造へのポインタ
  735. _Example_
  736. \code
  737. RsaKey enc;
  738. word32 idx = 0;
  739. int ret = 0;
  740. byte der[] = { // initialize with DER-encoded RSA private key };
  741. wc_InitRsaKey(&enc, NULL); // not using heap hint. No custom memory
  742. ret = wc_RsaPrivateKeyDecode(der, &idx, &enc, sizeof(der));
  743. if( ret != 0 ) {
  744. // error parsing private key
  745. }
  746. \endcode
  747. \sa wc_RsaPublicKeyDecode
  748. \sa wc_MakeRsaKey
  749. */
  750. int wc_RsaPrivateKeyDecode(const byte* input, word32* inOutIdx,
  751. RsaKey* key, word32 inSz);
  752. /*!
  753. \ingroup RSA
  754. \brief この関数はDerフォーマットのRSA公開鍵を解析し、公開鍵を抽出し、それを指定されたRsaKey構造体に格納します。IDXに解析された距離も設定します。
  755. \return 0 DERエンコード入力から公開鍵の解析に成功したときに返された
  756. \return ASN_PARSE_E 入力バッファから公開鍵を解析したエラーがある場合に返されます。これは、入力公開鍵がASN.1規格に従って正しくフォーマットされていない場合に発生する可能性があります。
  757. \return ASN_OBJECT_ID_E ASN.1オブジェクトIDがRSA公開鍵のそれと一致しない場合に返されます。
  758. \return ASN_EXPECT_0_E 入力キーがASN.1規格に従って正しくフォーマットされていない場合
  759. \return ASN_BITSTR_E 入力キーがASN.1規格に従って正しくフォーマットされていない場合
  760. \return ASN_RSA_KEY_E RSAキー入力の公開鍵要素を読み取るエラーがある場合
  761. \param input 復号する入力DERエンコードRSA公開鍵を含むバッファへのポインタ
  762. \param inOutIdx キーが始まるバッファ内のインデックスへのポインタ(通常は0)。この関数の副作用として、InoutIDXは入力バッファを介して解析された距離を記憶します
  763. \param key デコードされた公開鍵を保存するRsaKey構造体へのポインタ
  764. _Example_
  765. \code
  766. RsaKey pub;
  767. word32 idx = 0;
  768. int ret = 0;
  769. byte der[] = { // initialize with DER-encoded RSA public key };
  770. wc_InitRsaKey(&pub, NULL); // not using heap hint. No custom memory
  771. ret = wc_RsaPublicKeyDecode(der, &idx, &pub, sizeof(der));
  772. if( ret != 0 ) {
  773. // error parsing public key
  774. }
  775. \endcode
  776. \sa wc_RsaPublicKeyDecodeRaw
  777. */
  778. int wc_RsaPublicKeyDecode(const byte* input, word32* inOutIdx,
  779. RsaKey* key, word32 inSz);
  780. /*!
  781. \ingroup RSA
  782. \brief この関数は、公開弾性率(n)と指数(e)を撮影して、RSA公開鍵の生の要素を復号します。これらの生の要素を提供されたRsaKey構造体に格納し、暗号化/復号化プロセスで使用することができます。
  783. \return 0 公開鍵の生の要素をRsaKey構造体に復号したときに返された
  784. \return BAD_FUNC_ARG いずれかの入力引数がNULLに評価された場合に返されます。
  785. \return MP_INIT_E 複数の精密整数(MP_INT)ライブラリで使用するための整数の初期化中にエラーがある場合
  786. \return ASN_GETINT_E 提供されたRSAキー要素、nまたはeのいずれかを読むエラーがある場合に返されます
  787. \param n Public RSAキーのRAWモジュラスパラメータを含むバッファへのポインタ
  788. \param nSz Nを含むバッファのサイズ
  789. \param e Public RSAキーのRAW指数パラメータを含むバッファへのポインタ
  790. \param eSz Eを含むバッファのサイズ
  791. _Example_
  792. \code
  793. RsaKey pub;
  794. int ret = 0;
  795. byte n[] = { // initialize with received n component of public key };
  796. byte e[] = { // initialize with received e component of public key };
  797. wc_InitRsaKey(&pub, NULL); // not using heap hint. No custom memory
  798. ret = wc_RsaPublicKeyDecodeRaw(n, sizeof(n), e, sizeof(e), &pub);
  799. if( ret != 0 ) {
  800. // error parsing public key elements
  801. }
  802. \endcode
  803. \sa wc_RsaPublicKeyDecode
  804. */
  805. int wc_RsaPublicKeyDecodeRaw(const byte* n, word32 nSz,
  806. const byte* e, word32 eSz, RsaKey* key);
  807. /*!
  808. \ingroup RSA
  809. \brief この機能はRSAKEYキーをDERフォーマットに変換します。結果は出力に書き込まれ、書き込まれたバイト数を返します。
  810. \return >0 成功、書かれたバイト数。
  811. \return BAD_FUNC_ARG キーまたは出力がNULLの場合、またはキー - >タイプがRSA_PRIVATEでない場合、またはINLENが出力バッファに十分な大きさでない場合は返されます。
  812. \return MEMORY_E メモリの割り当て中にエラーが発生した場合に返されます。
  813. \param key 初期化されたRsaKey構造体
  814. \param output 出力バッファへのポインタ。
  815. _Example_
  816. \code
  817. byte* der;
  818. // Allocate memory for der
  819. int derSz = // Amount of memory allocated for der;
  820. RsaKey key;
  821. WC_RNG rng;
  822. long e = 65537; // standard value to use for exponent
  823. ret = wc_MakeRsaKey(&key, 2048, e, &rng); // generate 2048 bit long
  824. private key
  825. wc_InitRsaKey(&key, NULL);
  826. wc_InitRng(&rng);
  827. if(wc_RsaKeyToDer(&key, der, derSz) != 0)
  828. {
  829. // Handle the error thrown
  830. }
  831. \endcode
  832. \sa wc_RsaKeyToPublicDer
  833. \sa wc_InitRsaKey
  834. \sa wc_MakeRsaKey
  835. \sa wc_InitRng
  836. */
  837. int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen);
  838. /*!
  839. \ingroup RSA
  840. \brief この機能は、どのパディングを使用するかを選択しながらRSA暗号化を実行します。
  841. \return size 正常に暗号化されていると、暗号化されたバッファのサイズが返されます
  842. \return RSA_BUFFER_E RSAバッファエラー、出力が小さすぎたり入力が大きすぎたりする
  843. \param in 暗号化のためのバッファへのポインタ
  844. \param inLen 暗号化するバッファの長さ
  845. \param out 暗号化されたMSGが作成されました
  846. \param outLen 暗号化されたMSGを保持するために利用可能なバッファの長さ
  847. \param key 初期化ずみRsaKey構造体
  848. \param rng 初期化されたWC_RNG構造体
  849. \param type 使用するパディングの種類(WC_RSA_OAEP_PADまたはWC_RSA_PKCSV15_PAD)
  850. \param hash 使用するハッシュの種類(選択はhash.hにあります)
  851. \param mgf 使用するマスク生成機能の種類
  852. \param label 暗号化されたメッセージに関連付けるオプションのラベル
  853. _Example_
  854. \code
  855. WC_RNG rng;
  856. RsaKey key;
  857. byte in[] = “I use Turing Machines to ask questions”
  858. byte out[256];
  859. int ret;
  860. ret = wc_RsaPublicEncrypt_ex(in, sizeof(in), out, sizeof(out), &key, &rng,
  861. WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
  862. if (ret < 0) {
  863. //handle error
  864. }
  865. \endcode
  866. \sa wc_RsaPublicEncrypt
  867. \sa wc_RsaPrivateDecrypt_ex
  868. */
  869. int wc_RsaPublicEncrypt_ex(const byte* in, word32 inLen, byte* out,
  870. word32 outLen, RsaKey* key, WC_RNG* rng, int type,
  871. enum wc_HashType hash, int mgf, byte* label, word32 labelSz);
  872. /*!
  873. \ingroup RSA
  874. \brief この関数はRSAを使用してメッセージを復号化し、どのパディングタイプのオプションを指定します。
  875. \return size 復号化が成功すると、復号化されたメッセージのサイズが返されます。
  876. \return MEMORY_E 必要な配列をMallocにMallocにするのに十分なメモリがない場合は返されます。
  877. \return BAD_FUNC_ARG 関数に渡された引数が渡された場合に返されます。
  878. \param in 復号化のためのバッファへのポインタ
  879. \param inLen 復号化するバッファの長さ
  880. \param out 復号化されたMSGが作成されました
  881. \param outLen 復号化されたMSGを保持するために利用可能なバッファの長さ
  882. \param key 初期化ずみRsaKey構造体
  883. \param type 使用するパディングの種類(WC_RSA_OAEP_PADまたはWC_RSA_PKCSV15_PAD)
  884. \param hash 使用するハッシュの種類(選択はhash.hにあります)
  885. \param mgf 使用するマスク生成機能の種類
  886. \param label 暗号化されたメッセージに関連付けるオプションのラベル
  887. _Example_
  888. \code
  889. WC_RNG rng;
  890. RsaKey key;
  891. byte in[] = “I use Turing Machines to ask questions”
  892. byte out[256];
  893. byte plain[256];
  894. int ret;
  895. ret = wc_RsaPublicEncrypt_ex(in, sizeof(in), out, sizeof(out), &key,
  896. &rng, WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
  897. if (ret < 0) {
  898. //handle error
  899. }
  900. ret = wc_RsaPrivateDecrypt_ex(out, ret, plain, sizeof(plain), &key,
  901. WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
  902. if (ret < 0) {
  903. //handle error
  904. }
  905. \endcode
  906. \sa none
  907. */
  908. int wc_RsaPrivateDecrypt_ex(const byte* in, word32 inLen,
  909. byte* out, word32 outLen, RsaKey* key, int type,
  910. enum wc_HashType hash, int mgf, byte* label, word32 labelSz);
  911. /*!
  912. \ingroup RSA
  913. \brief この関数はRSAを使用してメッセージをインラインで復号化し、どのパディングタイプのオプションを示します。INバッファには、呼び出された後に復号化されたメッセージが含まれ、アウトバイトポインタはプレーンテキストがある「IN」バッファ内の場所を指します。
  914. \return size 復号化が成功すると、復号化されたメッセージのサイズが返されます。
  915. \return MEMORY_E: 必要な配列をMallocにMallocにするのに十分なメモリがない場合は返されます。
  916. \return RSA_PAD_E: パディングのエラーが発生した場合に返されます。
  917. \return BAD_PADDING_E: 過去のパディングの解析中にエラーが発生した場合に返されます。
  918. \return BAD_FUNC_ARG: 関数に渡された引数が渡された場合に返されます。
  919. \param in 復号化のためのバッファへのポインタ
  920. \param inLen 復号化するバッファの長さ
  921. \param out "in"バッファの復号化されたメッセージの位置へのポインタ
  922. \param key 初期化ずみRsaKey構造体
  923. \param type 使用するパディングの種類(WC_RSA_OAEP_PADまたはWC_RSA_PKCSV15_PAD)
  924. \param hash 使用するハッシュの種類(選択はhash.hにあります)
  925. \param mgf 使用するマスク生成機能の種類
  926. \param label 暗号化されたメッセージに関連付けるオプションのラベル
  927. _Example_
  928. \code
  929. WC_RNG rng;
  930. RsaKey key;
  931. byte in[] = “I use Turing Machines to ask questions”
  932. byte out[256];
  933. byte* plain;
  934. int ret;
  935. ret = wc_RsaPublicEncrypt_ex(in, sizeof(in), out, sizeof(out), &key,
  936. &rng, WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
  937. if (ret < 0) {
  938. //handle error
  939. }
  940. ret = wc_RsaPrivateDecryptInline_ex(out, ret, &plain, &key,
  941. WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0);
  942. if (ret < 0) {
  943. //handle error
  944. }
  945. \endcode
  946. \sa none
  947. */
  948. int wc_RsaPrivateDecryptInline_ex(byte* in, word32 inLen,
  949. byte** out, RsaKey* key, int type, enum wc_HashType hash,
  950. int mgf, byte* label, word32 labelSz);
  951. /*!
  952. \ingroup RSA
  953. \brief RSAアルゴリズムに使用されるRsaKey構造体の個々の要素(E、N)をバッファに取り出します。
  954. \return 0 関数が正常に実行された場合は、エラーなしで返されます。
  955. \return BAD_FUNC_ARG: いずれかのパラメータがNULL値で渡された場合に返されます。
  956. \return RSA_BUFFER_E: 渡されたeまたはnバッファが正しいサイズではない場合に返されます。
  957. \return MP_MEM: 内部関数にメモリエラーがある場合に返されます。
  958. \return MP_VAL: 内部関数引数が無効な場合に返されます。
  959. \param key 検証に使用する鍵。
  960. \param e eの値のバッファー。eはRSAモジュラ演算での大きな正の整数です。
  961. \param eSz eバッファのサイズ。
  962. \param n nの値のバッファー。NはRSAモジュラー演算では大きな正の整数です。
  963. _Example_
  964. \code
  965. Rsa key; // A valid RSA key.
  966. byte e[ buffer sz E.g. 256 ];
  967. byte n[256];
  968. int ret;
  969. word32 eSz = sizeof(e);
  970. word32 nSz = sizeof(n);
  971. ...
  972. ret = wc_RsaFlattenPublicKey(&key, e, &eSz, n, &nSz);
  973. if (ret != 0) {
  974. // Failure case.
  975. }
  976. \endcode
  977. \sa wc_InitRsaKey
  978. \sa wc_InitRsaKey_ex
  979. \sa wc_MakeRsaKey
  980. */
  981. int wc_RsaFlattenPublicKey(RsaKey* key, byte* e, word32* eSz, byte* n,
  982. word32* nSz);
  983. /*!
  984. \ingroup RSA
  985. \brief RSA公開鍵をDERフォーマットに変換します。出力に書き込み、書き込まれたバイト数を返します。
  986. \return >0 成功、書かれたバイト数。
  987. \return BAD_FUNC_ARG キーまたは出力がNULLの場合に返されます。
  988. \return MEMORY_E エラー割り当てメモリが発生したときに返されます。
  989. \return <0 エラー
  990. \param key 変換するRsaKey構造体。
  991. \param output 保留された出力バッファー。(NULLが長さのみを返す場合)
  992. _Example_
  993. \code
  994. RsaKey key;
  995. wc_InitRsaKey(&key, NULL);
  996. // Use key
  997. const int BUFFER_SIZE = 1024; // Some adequate size for the buffer
  998. byte output[BUFFER_SIZE];
  999. if (wc_RsaKeyToPublicDer(&key, output, sizeof(output)) != 0) {
  1000. // Handle Error
  1001. }
  1002. \endcode
  1003. \sa wc_RsaPublicKeyDerSize
  1004. \sa wc_RsaKeyToPublicDer_ex
  1005. \sa wc_InitRsaKey
  1006. */
  1007. int wc_RsaKeyToPublicDer(RsaKey* key, byte* output, word32 inLen);
  1008. /*!
  1009. \ingroup RSA
  1010. \brief RSA公開鍵をDERフォーマットに変換します。出力に書き込み、書き込まれたバイト数を返します。with_headerが0の場合(seq + n + e)だけがASN.1 Derフォーマットで返され、ヘッダーを除外します。
  1011. \return >0 成功、書かれたバイト数。
  1012. \return BAD_FUNC_ARG キーまたは出力がNULLの場合に返されます。
  1013. \return MEMORY_E エラー割り当てメモリが発生したときに返されます。
  1014. \return <0 エラー
  1015. \param key 変換するRsaKey構造体。
  1016. \param output 保留された出力バッファー。(NULLが長さのみを返す場合)
  1017. _Example_
  1018. \code
  1019. RsaKey key;
  1020. wc_InitRsaKey(&key, NULL);
  1021. // Use key
  1022. const int BUFFER_SIZE = 1024; // Some adequate size for the buffer
  1023. byte output[BUFFER_SIZE];
  1024. if (wc_RsaKeyToPublicDer_ex(&key, output, sizeof(output), 0) != 0) {
  1025. // Handle Error
  1026. }
  1027. \endcode
  1028. \sa wc_RsaPublicKeyDerSize
  1029. \sa wc_RsaKeyToPublicDer
  1030. \sa wc_InitRsaKey
  1031. */
  1032. int wc_RsaKeyToPublicDer_ex(RsaKey* key, byte* output, word32 inLen,
  1033. int with_header);
  1034. /*!
  1035. \ingroup RSA
  1036. \brief この関数は、長さサイズ(ビット単位)のRSA秘密鍵を生成し、指数(e)を指定します。次に、このキーを提供されたRsaKey構造体に格納するため、暗号化/復号化に使用できます。Eに使用するセキュア番号は65537です。サイズは、RSA_MIN_SIZEよりも大きく、RSA_MAX_SIZEよりも大きくなる必要があります。この機能が利用可能であるため、コンパイル時にオプションwolfssl_key_genを有効にする必要があります。これは、 - を使用してください./configureを使用する場合は、-enable-keygenで実現できます。
  1037. \return 0 RSA秘密鍵の生成に成功したら返されました
  1038. \return BAD_FUNC_ARG 入力引数のいずれかがNULLの場合、サイズパラメータは必要な範囲外にあるか、eが誤って選択されている場合
  1039. \return RNG_FAILURE_E 提供されたRNG構造体を使用してランダムブロックを生成するエラーがある場合
  1040. \return MP_INIT_E
  1041. \return MP_READ_E RSAキーの生成中に使用された数学ライブラリにエラーがある場合に返されたRSAキーの生成中に使用された数学ライブラリにエラーがある場合に返される可能性があります。
  1042. \return MP_CMP_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1043. \return MP_INVMOD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1044. \return MP_EXPTMOD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1045. \return MP_MOD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1046. \return MP_MUL_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1047. \return MP_ADD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1048. \return MP_MULMOD_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1049. \return MP_TO_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1050. \return MP_MEM RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1051. \return MP_ZERO_E RSAキーの生成中に使用されている数学ライブラリにエラーがある場合は返される可能性があります。
  1052. \param key 生成された秘密鍵を保存するRSAKEY構造体へのポインタ
  1053. \param size ビット単位の希望のキー長。rsa_min_sizeより大きく、rsa_max_sizeよりも大きくなる必要があります。
  1054. \param e キーを生成するために使用する指数パラメータ。安全な選択は65537です
  1055. _Example_
  1056. \code
  1057. RsaKey priv;
  1058. WC_RNG rng;
  1059. int ret = 0;
  1060. long e = 65537; // standard value to use for exponent
  1061. wc_InitRsaKey(&priv, NULL); // not using heap hint. No custom memory
  1062. wc_InitRng(&rng);
  1063. // generate 2048 bit long private key
  1064. ret = wc_MakeRsaKey(&priv, 2048, e, &rng);
  1065. if( ret != 0 ) {
  1066. // error generating private key
  1067. }
  1068. \endcode
  1069. \sa none
  1070. */
  1071. int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng);
  1072. /*!
  1073. \ingroup RSA
  1074. \brief この関数は、ブロックされていないRSAコンテキストを設定します。RSANBコンテキストが設定されている場合、RSA関数を多くの小さな操作に分割する高速数学ベースの非ブロッキングEXPTMODが可能になります。wc_rsa_nonblockが定義されているときに有効になっています。
  1075. \return 0 成功
  1076. \return BAD_FUNC_ARG キーまたはNBがNULLの場合に返されます。
  1077. \param key RSAキー構造
  1078. _Example_
  1079. \code
  1080. int ret, count = 0;
  1081. RsaKey key;
  1082. RsaNb nb;
  1083. wc_InitRsaKey(&key, NULL);
  1084. // Enable non-blocking RSA mode - provide context
  1085. ret = wc_RsaSetNonBlock(key, &nb);
  1086. if (ret != 0)
  1087. return ret;
  1088. do {
  1089. ret = wc_RsaSSL_Sign(in, inLen, out, outSz, key, rng);
  1090. count++; // track number of would blocks
  1091. if (ret == FP_WOULDBLOCK) {
  1092. // do "other" work here
  1093. }
  1094. } while (ret == FP_WOULDBLOCK);
  1095. if (ret < 0) {
  1096. return ret;
  1097. }
  1098. printf("RSA non-block sign: size %d, %d times\n", ret, count);
  1099. \endcode
  1100. \sa wc_RsaSetNonBlockTime
  1101. */
  1102. int wc_RsaSetNonBlock(RsaKey* key, RsaNb* nb);
  1103. /*!
  1104. \ingroup RSA
  1105. \brief この関数は最大ブロック時間の最大ブロック時間をマイクロ秒単位で設定します。それは、メガヘルツのCPU速度と共に事前計算されたテーブル(TFM.cexptModnbinstを参照)を使用して、提供された最大ブロック時間内に次の動作を完了できるかどうかを判断します。wc_rsa_nonblock_timeが定義されているときに有効になります。
  1106. \return 0 成功
  1107. \return BAD_FUNC_ARG キーがNULLの場合、またはWC_RSASETNONBLOCKが以前に呼び出され、キー - > NBはNULLの場合に返されます。
  1108. \param key RsaKey構造体
  1109. \param maxBlockUs マイクロ秒をブロックする最大時間。
  1110. _Example_
  1111. \code
  1112. RsaKey key;
  1113. RsaNb nb;
  1114. wc_InitRsaKey(&key, NULL);
  1115. wc_RsaSetNonBlock(key, &nb);
  1116. wc_RsaSetNonBlockTime(&key, 4000, 160); // Block Max = 4 ms, CPU = 160MHz
  1117. \endcode
  1118. \sa wc_RsaSetNonBlock
  1119. */
  1120. int wc_RsaSetNonBlockTime(RsaKey* key, word32 maxBlockUs,
  1121. word32 cpuMHz);