2
0

ecc.h 68 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361
  1. /*!
  2. \ingroup ECC
  3. \brief この関数は新しいECC_KEYを生成し、それをキーに格納します。
  4. \return 0 成功に戻りました。
  5. \return ECC_BAD_ARG_E RNGまたはキーがNULLに評価された場合に返されます
  6. \return BAD_FUNC_ARG 指定されたキーサイズがサポートされているキーの正しい範囲にない場合に返されます。
  7. \return MEMORY_E ECCキーの計算中にメモリの割り当てエラーがある場合に返されます。
  8. \return MP_INIT_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  9. \return MP_READ_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  10. \return MP_CMP_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  11. \return MP_INVMOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  12. \return MP_EXPTMOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  13. \return MP_MOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  14. \return MP_MUL_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  15. \return MP_ADD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  16. \return MP_MULMOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  17. \return MP_TO_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  18. \return MP_MEM ECCキーの計算中にエラーが発生した場合に返される可能性があります
  19. \param rng キーを生成するための初期化されたRNGオブジェクトへのポインタ
  20. \param keysize ECC_KEYの希望の長さ
  21. _Example_
  22. \code
  23. ecc_key key;
  24. wc_ecc_init(&key);
  25. WC_WC_RNG rng;
  26. wc_InitRng(&rng);
  27. wc_ecc_make_key(&rng, 32, &key); // initialize 32 byte ecc key
  28. \endcode
  29. \sa wc_ecc_init
  30. \sa wc_ecc_shared_secret
  31. */
  32. int wc_ecc_make_key(WC_RNG* rng, int keysize, ecc_key* key);
  33. /*!
  34. \ingroup ECC
  35. \brief この関数は新しいECC_KEYを生成し、それをキーに格納します。
  36. \return 0 成功に戻りました。
  37. \return ECC_BAD_ARG_E RNGまたはキーがNULLに評価された場合に返されます
  38. \return BAD_FUNC_ARG 指定されたキーサイズがサポートされているキーの正しい範囲にない場合に返されます。
  39. \return MEMORY_E ECCキーの計算中にメモリの割り当てエラーがある場合に返されます。
  40. \return MP_INIT_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  41. \return MP_READ_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  42. \return MP_CMP_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  43. \return MP_INVMOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  44. \return MP_EXPTMOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  45. \return MP_MOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  46. \return MP_MUL_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  47. \return MP_ADD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  48. \return MP_MULMOD_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  49. \return MP_TO_E ECCキーの計算中にエラーが発生した場合に返される可能性があります
  50. \return MP_MEM ECCキーの計算中にエラーが発生した場合に返される可能性があります
  51. \param key 作成したキーを保存するためのポインタ。
  52. \param keysize CavenIDに基づいて設定されたバイト単位で作成するキーのサイズ
  53. \param rng 鍵作成に使用されるRNG
  54. _Example_
  55. \code
  56. ecc_key key;
  57. int ret;
  58. WC_WC_RNG rng;
  59. wc_ecc_init(&key);
  60. wc_InitRng(&rng);
  61. int curveId = ECC_SECP521R1;
  62. int keySize = wc_ecc_get_curve_size_from_id(curveId);
  63. ret = wc_ecc_make_key_ex(&rng, keySize, &key, curveId);
  64. if (ret != MP_OKAY) {
  65. // error handling
  66. }
  67. \endcode
  68. \sa wc_ecc_make_key
  69. \sa wc_ecc_get_curve_size_from_id
  70. */
  71. int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id);
  72. /*!
  73. \ingroup ECC
  74. \brief ECCキーの有効性を有効にします。
  75. \return MP_OKAY 成功、キーは大丈夫です。
  76. \return BAD_FUNC_ARG キーがNULLの場合は返します。
  77. \return ECC_INF_E WC_ECC_POINT_IS_AT_INFINITYが1を返す場合に返します。
  78. _Example_
  79. \code
  80. ecc_key key;
  81. WC_WC_RNG rng;
  82. int check_result;
  83. wc_ecc_init(&key);
  84. wc_InitRng(&rng);
  85. wc_ecc_make_key(&rng, 32, &key);
  86. check_result = wc_ecc_check_key(&key);
  87. if (check_result == MP_OKAY)
  88. {
  89. // key check succeeded
  90. }
  91. else
  92. {
  93. // key check failed
  94. }
  95. \endcode
  96. \sa wc_ecc_point_is_at_infinity
  97. */
  98. int wc_ecc_check_key(ecc_key* key);
  99. /*!
  100. \ingroup ECC
  101. \brief この関数は、使用された後にECC_KEYキーを解放します。
  102. _Example_
  103. \code
  104. // initialize key and perform ECC operations
  105. ...
  106. wc_ecc_key_free(&key);
  107. \endcode
  108. \sa wc_ecc_key_new
  109. \sa wc_ecc_init_ex
  110. */
  111. void wc_ecc_key_free(ecc_key* key);
  112. /*!
  113. \ingroup ECC
  114. \brief この関数は、ローカル秘密鍵と受信した公開鍵を使用して新しい秘密鍵を生成します。この共有秘密鍵をバッファアウトに格納し、出力バッファに書き込まれたバイト数を保持するためにoutlentenを更新します。
  115. \return 0 共有秘密鍵の生成に成功したときに返されます
  116. \return BAD_FUNC_ARG 入力パラメータのいずれかがNULLに評価された場合に返されます。
  117. \return ECC_BAD_ARG_E 引数として与えられた秘密鍵の種類がecc_privatekeyではない場合、またはパブリックキータイプ(ECC-> DPによって与えられた)が同等でない場合に返されます。
  118. \return MEMORY_E 新しいECCポイントを生成するエラーが発生した場合
  119. \return BUFFER_E 生成された共有秘密鍵が提供されたバッファーに格納するのに長すぎる場合に返されます
  120. \return MP_INIT_E 共有キーの計算中にエラーが発生した場合は返される可能性があります
  121. \return MP_READ_E 共有キーの計算中にエラーが発生した場合は返される可能性があります
  122. \return MP_CMP_E 共有キーの計算中にエラーが発生した場合は返される可能性があります
  123. \return MP_INVMOD_E 共有キーの計算中にエラーが発生した場合は返される可能性があります
  124. \return MP_EXPTMOD_E 共有キーの計算中にエラーが発生した場合は返される可能性があります
  125. \return MP_MOD_E 共有キーの計算中にエラーが発生した場合は返される可能性があります
  126. \return MP_MUL_E 共有キーの計算中にエラーが発生した場合は返される可能性があります
  127. \return MP_ADD_E 共有キーの計算中にエラーが発生した場合は返される可能性があります
  128. \return MP_MULMOD_E 共有キーの計算中にエラーが発生した場合は返される可能性があります
  129. \return MP_TO_E 共有キーの計算中にエラーが発生した場合は返される可能性があります
  130. \return MP_MEM 共有キーの計算中にエラーが発生した場合は返される可能性があります
  131. \param private_key ローカル秘密鍵を含むECC_KEY構造体へのポインタ
  132. \param public_key 受信した公開鍵を含むECC_Key構造体へのポインタ
  133. \param out 生成された共有秘密鍵を保存する出力バッファへのポインタ
  134. _Example_
  135. \code
  136. ecc_key priv, pub;
  137. WC_WC_RNG rng;
  138. byte secret[1024]; // can hold 1024 byte shared secret key
  139. word32 secretSz = sizeof(secret);
  140. int ret;
  141. wc_InitRng(&rng); // initialize rng
  142. wc_ecc_init(&priv); // initialize key
  143. wc_ecc_make_key(&rng, 32, &priv); // make public/private key pair
  144. // receive public key, and initialise into pub
  145. ret = wc_ecc_shared_secret(&priv, &pub, secret, &secretSz);
  146. // generate secret key
  147. if ( ret != 0 ) {
  148. // error generating shared secret key
  149. }
  150. \endcode
  151. \sa wc_ecc_init
  152. \sa wc_ecc_make_key
  153. */
  154. int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out,
  155. word32* outlen);
  156. /*!
  157. \ingroup ECC
  158. \brief 秘密鍵とパブリックポイントの間にECC共有秘密を作成します。
  159. \return MP_OKAY 成功を示します。
  160. \return BAD_FUNC_ARG 引数がNULLのときにエラーが返されます。
  161. \return ECC_BAD_ARG_E private_key-> typeがecc_privatekeyまたはprivate_key-> idxが検証できない場合に返されました。
  162. \return BUFFER_E outlenが小さすぎるとエラーが発生します。
  163. \return MEMORY_E 新しいポイントを作成するためのエラー。
  164. \return MP_VAL 初期化失敗が発生したときに可能です。
  165. \return MP_MEM 初期化失敗が発生したときに可能です。
  166. \param private_key プライベートECCキー。
  167. \param point 使用するポイント(公開鍵)。
  168. \param out 共有秘密の出力先。ANSI X9.63からEC-DHに準拠しています。
  169. _Example_
  170. \code
  171. ecc_key key;
  172. ecc_point* point;
  173. byte shared_secret[];
  174. int secret_size;
  175. int result;
  176. point = wc_ecc_new_point();
  177. result = wc_ecc_shared_secret_ex(&key, point,
  178. &shared_secret, &secret_size);
  179. if (result != MP_OKAY)
  180. {
  181. // Handle error
  182. }
  183. \endcode
  184. \sa wc_ecc_verify_hash_ex
  185. */
  186. int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point,
  187. byte* out, word32 *outlen);
  188. /*!
  189. \ingroup ECC
  190. \brief この関数は、信頼性を保証するためにECC_KEYオブジェクトを使用してメッセージダイジェストに署名します。
  191. \return 0 メッセージダイジェストの署名を正常に生成したときに返されました
  192. \return BAD_FUNC_ARG 入力パラメータのいずれかがNULLに評価された場合、または出力バッファが小さすぎて生成された署名を保存する場合は返されます。
  193. \return ECC_BAD_ARG_E 入力キーが秘密鍵ではない場合、またはECC OIDが無効な場合
  194. \return RNG_FAILURE_E RNGが満足のいくキーを正常に生成できない場合に返されます。
  195. \return MP_INIT_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  196. \return MP_READ_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  197. \return MP_CMP_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  198. \return MP_INVMOD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  199. \return MP_EXPTMOD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  200. \return MP_MOD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  201. \return MP_MUL_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  202. \return MP_ADD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  203. \return MP_MULMOD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  204. \return MP_TO_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  205. \return MP_MEM メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  206. \param in サインするメッセージハッシュを含むバッファへのポインタ
  207. \param inlen 署名するメッセージの長さ
  208. \param out 生成された署名を保存するためのバッファ
  209. \param outlen 出力バッファの最大長。メッセージ署名の生成に成功したときに書き込まれたバイトを保存します
  210. _Example_
  211. \code
  212. ecc_key key;
  213. WC_WC_RNG rng;
  214. int ret, sigSz;
  215. byte sig[512]; // will hold generated signature
  216. sigSz = sizeof(sig);
  217. byte digest[] = { // initialize with message hash };
  218. wc_InitRng(&rng); // initialize rng
  219. wc_ecc_init(&key); // initialize key
  220. wc_ecc_make_key(&rng, 32, &key); // make public/private key pair
  221. ret = wc_ecc_sign_hash(digest, sizeof(digest), sig, &sigSz, &key);
  222. if ( ret != 0 ) {
  223. // error generating message signature
  224. }
  225. \endcode
  226. \sa wc_ecc_verify_hash
  227. */
  228. int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen,
  229. WC_RNG* rng, ecc_key* key);
  230. /*!
  231. \ingroup ECC
  232. \brief メッセージダイジェストに署名します。
  233. \return MP_OKAY メッセージダイジェストの署名を正常に生成したときに返されました
  234. \return ECC_BAD_ARG_E 入力キーが秘密鍵ではない場合、またはECC IDXが無効な場合、またはいずれかの入力パラメータがNULLに評価されている場合、または出力バッファが小さすぎて生成された署名を保存するには小さすぎる場合
  235. \return RNG_FAILURE_E RNGが満足のいくキーを正常に生成できない場合に返されます。
  236. \return MP_INIT_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  237. \return MP_READ_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  238. \return MP_CMP_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  239. \return MP_INVMOD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  240. \return MP_EXPTMOD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  241. \return MP_MOD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  242. \return MP_MUL_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  243. \return MP_ADD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  244. \return MP_MULMOD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  245. \return MP_TO_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  246. \return MP_MEM メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  247. \param in メッセージがサインにダイジェスト。
  248. \param inlen ダイジェストの長さ。
  249. \param rng WC_RNG構造体へのポインタ。
  250. \param key プライベートECCキー。
  251. \param r 署名のRコンポーネントの宛先。
  252. _Example_
  253. \code
  254. ecc_key key;
  255. WC_WC_WC_RNG rng;
  256. int ret, sigSz;
  257. mp_int r; // destination for r component of signature.
  258. mp_int s; // destination for s component of signature.
  259. byte sig[512]; // will hold generated signature
  260. sigSz = sizeof(sig);
  261. byte digest[] = { initialize with message hash };
  262. wc_InitRng(&rng); // initialize rng
  263. wc_ecc_init(&key); // initialize key
  264. mp_init(&r); // initialize r component
  265. mp_init(&s); // initialize s component
  266. wc_ecc_make_key(&rng, 32, &key); // make public/private key pair
  267. ret = wc_ecc_sign_hash_ex(digest, sizeof(digest), &rng, &key, &r, &s);
  268. if ( ret != MP_OKAY ) {
  269. // error generating message signature
  270. }
  271. \endcode
  272. \sa wc_ecc_verify_hash_ex
  273. */
  274. int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
  275. ecc_key* key, mp_int *r, mp_int *s);
  276. /*!
  277. \ingroup ECC
  278. \brief この関数は、真正性を確保するためにハッシュのECCシグネチャを検証します。答えを介して、有効な署名に対応する1、無効な署名に対応する0で答えを返します。
  279. \return 0 署名検証に正常に実行されたときに返されます。注:これは署名が検証されていることを意味するわけではありません。信頼性情報は代わりにSTATで格納されます
  280. \return BAD_FUNC_ARG 返された入力パラメータはNULLに評価されます
  281. \return MEMORY_E メモリの割り当て中にエラーが発生した場合に返されます
  282. \return MP_INIT_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  283. \return MP_READ_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  284. \return MP_CMP_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  285. \return MP_INVMOD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  286. \return MP_EXPTMOD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  287. \return MP_MOD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  288. \return MP_MUL_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  289. \return MP_ADD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  290. \return MP_MULMOD_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  291. \return MP_TO_E メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  292. \return MP_MEM メッセージ署名の計算中にエラーが発生した場合に返される可能性があります。
  293. \param sig 確認する署名を含むバッファへのポインタ
  294. \param siglen 検証する署名の長さ
  295. \param hash 確認されたメッセージのハッシュを含むバッファへのポインタ
  296. \param hashlen 認証されたメッセージのハッシュの長さ
  297. \param stat 検証の結果へのポインタ。1メッセージが正常に認証されたことを示します
  298. _Example_
  299. \code
  300. ecc_key key;
  301. int ret, verified = 0;
  302. byte sig[1024] { initialize with received signature };
  303. byte digest[] = { initialize with message hash };
  304. // initialize key with received public key
  305. ret = wc_ecc_verify_hash(sig, sizeof(sig), digest,sizeof(digest),
  306. &verified, &key);
  307. if ( ret != 0 ) {
  308. // error performing verification
  309. } else if ( verified == 0 ) {
  310. // the signature is invalid
  311. }
  312. \endcode
  313. \sa wc_ecc_sign_hash
  314. \sa wc_ecc_verify_hash_ex
  315. */
  316. int wc_ecc_verify_hash(const byte* sig, word32 siglen, const byte* hash,
  317. word32 hashlen, int* stat, ecc_key* key);
  318. /*!
  319. \ingroup ECC
  320. \brief ECC署名を確認してください。結果はstatに書き込まれます。1が有効で、0が無効です。注:有効なテストに戻り値を使用しないでください。statのみを使用してください。
  321. \return MP_OKAY 成功した場合(署名が無効であっても)
  322. \return ECC_BAD_ARG_E 引数がNULLの場合、またはkey-idxが無効な場合は返します。
  323. \return MEMORY_E INTまたはポイントの割り当て中にエラーが発生しました。
  324. \param r 検証する署名Rコンポーネント
  325. \param s 検証するシグネチャSコンポーネント
  326. \param hash 署名されたハッシュ(メッセージダイジェスト)
  327. \param hashlen ハッシュの長さ(オクテット)
  328. \param stat 署名の結果、1 ==有効、0 ==無効
  329. _Example_
  330. \code
  331. mp_int r;
  332. mp_int s;
  333. int stat;
  334. byte hash[] = { Some hash }
  335. ecc_key key;
  336. if(wc_ecc_verify_hash_ex(&r, &s, hash, hashlen, &stat, &key) == MP_OKAY)
  337. {
  338. // Check stat
  339. }
  340. \endcode
  341. \sa wc_ecc_verify_hash
  342. */
  343. int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
  344. word32 hashlen, int* stat, ecc_key* key);
  345. /*!
  346. \ingroup ECC
  347. \brief この関数は、メッセージ検証または鍵交渉で将来の使用のためにECC_KEYオブジェクトを初期化します。
  348. \return 0 ECC_Keyオブジェクトの初期化に成功したときに返されます
  349. \return MEMORY_E メモリの割り当て中にエラーが発生した場合に返されます
  350. _Example_
  351. \code
  352. ecc_key key;
  353. wc_ecc_init(&key);
  354. \endcode
  355. \sa wc_ecc_make_key
  356. \sa wc_ecc_free
  357. */
  358. int wc_ecc_init(ecc_key* key);
  359. /*!
  360. \ingroup ECC
  361. \brief この関数は、メッセージ検証または鍵交渉で将来の使用のためにECC_KEYオブジェクトを初期化します。
  362. \return 0 ECC_Keyオブジェクトの初期化に成功したときに返されます
  363. \return MEMORY_E メモリの割り当て中にエラーが発生した場合に返されます
  364. \param key 初期化するECC_Keyオブジェクトへのポインタ
  365. \param devId 非同期ハードウェアで使用するID
  366. _Example_
  367. \code
  368. ecc_key key;
  369. wc_ecc_init_ex(&key, heap, devId);
  370. \endcode
  371. \sa wc_ecc_make_key
  372. \sa wc_ecc_free
  373. \sa wc_ecc_init
  374. */
  375. int wc_ecc_init_ex(ecc_key* key, void* heap, int devId);
  376. /*!
  377. \ingroup ECC
  378. \brief この関数はユーザー定義ヒープを使用し、キー構造のスペースを割り当てます。
  379. \return 0 ECC_Keyオブジェクトの初期化に成功したときに返されます
  380. _Example_
  381. \code
  382. wc_ecc_key_new(&heap);
  383. \endcode
  384. \sa wc_ecc_make_key
  385. \sa wc_ecc_key_free
  386. \sa wc_ecc_init
  387. */
  388. ecc_key* wc_ecc_key_new(void* heap);
  389. /*!
  390. \ingroup ECC
  391. \brief この関数は、使用後にECC_KEYオブジェクトを解放します。
  392. \return int integerがWolfSSLエラーまたは成功状況を示すことを返しました。
  393. _Example_
  394. \code
  395. // initialize key and perform secure exchanges
  396. ...
  397. wc_ecc_free(&key);
  398. \endcode
  399. \sa wc_ecc_init
  400. */
  401. int wc_ecc_free(ecc_key* key);
  402. /*!
  403. \ingroup ECC
  404. \brief この関数は固定小数点キャッシュを解放します。これはECCで使用でき、計算時間を高速化します。この機能を使用するには、FP_ECC(固定小数点ECC)を定義する必要があります。
  405. \return none いいえ返します。
  406. _Example_
  407. \code
  408. ecc_key key;
  409. // initialize key and perform secure exchanges
  410. ...
  411. wc_ecc_fp_free();
  412. \endcode
  413. \sa wc_ecc_free
  414. */
  415. void wc_ecc_fp_free(void);
  416. /*!
  417. \ingroup ECC
  418. \brief ECC IDXが有効かどうかを確認します。
  419. \return 1 有効な場合は返品してください。
  420. \return 0 無効な場合は返します。
  421. _Example_
  422. \code
  423. ecc_key key;
  424. WC_WC_RNG rng;
  425. int is_valid;
  426. wc_ecc_init(&key);
  427. wc_InitRng(&rng);
  428. wc_ecc_make_key(&rng, 32, &key);
  429. is_valid = wc_ecc_is_valid_idx(key.idx);
  430. if (is_valid == 1)
  431. {
  432. // idx is valid
  433. }
  434. else if (is_valid == 0)
  435. {
  436. // idx is not valid
  437. }
  438. \endcode
  439. \sa none
  440. */
  441. int wc_ecc_is_valid_idx(int n);
  442. /*!
  443. \ingroup ECC
  444. \brief 新しいECCポイントを割り当てます。
  445. \return p 新しく割り当てられたポイント。
  446. \return NULL エラー時にNULLを返します。
  447. _Example_
  448. \code
  449. ecc_point* point;
  450. point = wc_ecc_new_point();
  451. if (point == NULL)
  452. {
  453. // Handle point creation error
  454. }
  455. // Do stuff with point
  456. \endcode
  457. \sa wc_ecc_del_point
  458. \sa wc_ecc_cmp_point
  459. \sa wc_ecc_copy_point
  460. */
  461. ecc_point* wc_ecc_new_point(void);
  462. /*!
  463. \ingroup ECC
  464. \brief メモリからECCポイントを解放します。
  465. \return none いいえ返します。
  466. _Example_
  467. \code
  468. ecc_point* point;
  469. point = wc_ecc_new_point();
  470. if (point == NULL)
  471. {
  472. // Handle point creation error
  473. }
  474. // Do stuff with point
  475. wc_ecc_del_point(point);
  476. \endcode
  477. \sa wc_ecc_new_point
  478. \sa wc_ecc_cmp_point
  479. \sa wc_ecc_copy_point
  480. */
  481. void wc_ecc_del_point(ecc_point* p);
  482. /*!
  483. \ingroup ECC
  484. \brief あるポイントの値を別のポイントにコピーします。
  485. \return ECC_BAD_ARG_E PまたはRがNULLのときにスローされたエラー。
  486. \return MP_OKAY ポイントが正常にコピーされました
  487. \return ret 内部関数からのエラー。になることができます...
  488. \param p コピーするポイント。
  489. _Example_
  490. \code
  491. ecc_point* point;
  492. ecc_point* copied_point;
  493. int copy_return;
  494. point = wc_ecc_new_point();
  495. copy_return = wc_ecc_copy_point(point, copied_point);
  496. if (copy_return != MP_OKAY)
  497. {
  498. // Handle error
  499. }
  500. \endcode
  501. \sa wc_ecc_new_point
  502. \sa wc_ecc_cmp_point
  503. \sa wc_ecc_del_point
  504. */
  505. int wc_ecc_copy_point(ecc_point* p, ecc_point *r);
  506. /*!
  507. \ingroup ECC
  508. \brief ポイントの値を別のものと比較してください。
  509. \return BAD_FUNC_ARG 1つまたは両方の引数はnullです。
  510. \return MP_EQ ポイントは同じです。
  511. \return ret mp_ltまたはmp_gtのどちらかで、ポイントが等しくないことを意味します。
  512. \param a 比較する最初のポイント。
  513. _Example_
  514. \code
  515. ecc_point* point;
  516. ecc_point* point_to_compare;
  517. int cmp_result;
  518. point = wc_ecc_new_point();
  519. point_to_compare = wc_ecc_new_point();
  520. cmp_result = wc_ecc_cmp_point(point, point_to_compare);
  521. if (cmp_result == BAD_FUNC_ARG)
  522. {
  523. // arguments are invalid
  524. }
  525. else if (cmp_result == MP_EQ)
  526. {
  527. // Points are equal
  528. }
  529. else
  530. {
  531. // Points are not equal
  532. }
  533. \endcode
  534. \sa wc_ecc_new_point
  535. \sa wc_ecc_del_point
  536. \sa wc_ecc_copy_point
  537. */
  538. int wc_ecc_cmp_point(ecc_point* a, ecc_point *b);
  539. /*!
  540. \ingroup ECC
  541. \brief ポイントが無限大にあるかどうかを確認します。返品1が無限大である場合は0、そうでない場合は0、<0エラー時の0
  542. \return 1 Pは無限大です。
  543. \return 0 Pは無限大ではありません。
  544. \return <0 エラー。
  545. _Example_
  546. \code
  547. ecc_point* point;
  548. int is_infinity;
  549. point = wc_ecc_new_point();
  550. is_infinity = wc_ecc_point_is_at_infinity(point);
  551. if (is_infinity < 0)
  552. {
  553. // Handle error
  554. }
  555. else if (is_infinity == 0)
  556. {
  557. // Point is not at infinity
  558. }
  559. else if (is_infinity == 1)
  560. {
  561. // Point is at infinity
  562. }
  563. \endcode
  564. \sa wc_ecc_new_point
  565. \sa wc_ecc_del_point
  566. \sa wc_ecc_cmp_point
  567. \sa wc_ecc_copy_point
  568. */
  569. int wc_ecc_point_is_at_infinity(ecc_point *p);
  570. /*!
  571. \ingroup ECC
  572. \brief ECC固定点乗算を実行します。
  573. \return MP_OKAY 成功した操作で返します。
  574. \return MP_INIT_E 複数のPrecision Integer(MP_INT)ライブラリで使用するための整数を初期化するエラーがある場合に返されます。
  575. \param k 計量。
  576. \param G 乗算する基点。
  577. \param R 商品の目的地
  578. \param modulus 曲線の弾性率
  579. _Example_
  580. \code
  581. ecc_point* base;
  582. ecc_point* destination;
  583. // Initialize points
  584. base = wc_ecc_new_point();
  585. destination = wc_ecc_new_point();
  586. // Setup other arguments
  587. mp_int multiplicand;
  588. mp_int modulus;
  589. int map;
  590. \endcode
  591. \sa none
  592. */
  593. int wc_ecc_mulmod(mp_int* k, ecc_point *G, ecc_point *R,
  594. mp_int* a, mp_int* modulus, int map);
  595. /*!
  596. \ingroup ECC
  597. \brief この関数はECCキーをECC_KEY構造体からエクスポートし、結果をOUTに格納します。キーはANSI X9.63フォーマットに保存されます。outlenの出力バッファに書き込まれたバイトを格納します。
  598. \return 0 ECC_KEYのエクスポートに正常に返されました
  599. \return LENGTH_ONLY_E 出力バッファがNULLに評価されている場合は返されますが、他の2つの入力パラメータは有効です。関数がキーを保存するのに必要な長さを返すだけであることを示します
  600. \return ECC_BAD_ARG_E 入力パラメータのいずれかがNULLの場合、またはキーがサポートされていない場合(無効なインデックスがあります)
  601. \return BUFFER_E 出力バッファが小さすぎてECCキーを保存する場合は返されます。出力バッファが小さすぎると、必要なサイズはoutlenに返されます。
  602. \return MEMORY_E xmallocでメモリを割り当てるエラーがある場合
  603. \return MP_INIT_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  604. \return MP_READ_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  605. \return MP_CMP_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  606. \return MP_INVMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  607. \return MP_EXPTMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  608. \return MP_MOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  609. \return MP_MUL_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  610. \return MP_ADD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  611. \return MP_MULMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  612. \return MP_TO_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  613. \return MP_MEM ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  614. \param key エクスポートするECC_KEYオブジェクトへのポインタ
  615. \param out ANSI X9.63フォーマット済みキーを保存するバッファへのポインタ
  616. _Example_
  617. \code
  618. int ret;
  619. byte buff[1024];
  620. word32 buffSz = sizeof(buff);
  621. ecc_key key;
  622. // initialize key, make key
  623. ret = wc_ecc_export_x963(&key, buff, &buffSz);
  624. if ( ret != 0) {
  625. // error exporting key
  626. }
  627. \endcode
  628. \sa wc_ecc_export_x963_ex
  629. \sa wc_ecc_import_x963
  630. */
  631. int wc_ecc_export_x963(ecc_key* key, byte* out, word32* outLen);
  632. /*!
  633. \ingroup ECC
  634. \brief この関数はECCキーをECC_KEY構造体からエクスポートし、結果をOUTに格納します。キーはANSI X9.63フォーマットに保存されます。outlenの出力バッファに書き込まれたバイトを格納します。この関数は、圧縮されたパラメータを介して証明書を圧縮する追加のオプションを使用する。このパラメータがtrueの場合、キーはANSI X9.63圧縮形式で保存されます。
  635. \return 0 ECC_KEYのエクスポートに正常に返されました
  636. \return NOT_COMPILED_IN hand_comp_keyがコンパイル時に有効になっていない場合は返されますが、キーは圧縮形式で要求されました
  637. \return LENGTH_ONLY_E 出力バッファがNULLに評価されている場合は返されますが、他の2つの入力パラメータは有効です。関数がキーを保存するのに必要な長さを返すだけであることを示します
  638. \return ECC_BAD_ARG_E 入力パラメータのいずれかがNULLの場合、またはキーがサポートされていない場合(無効なインデックスがあります)
  639. \return BUFFER_E 出力バッファが小さすぎてECCキーを保存する場合は返されます。出力バッファが小さすぎると、必要なサイズはoutlenに返されます。
  640. \return MEMORY_E xmallocでメモリを割り当てるエラーがある場合
  641. \return MP_INIT_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  642. \return MP_READ_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  643. \return MP_CMP_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  644. \return MP_INVMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  645. \return MP_EXPTMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  646. \return MP_MOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  647. \return MP_MUL_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  648. \return MP_ADD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  649. \return MP_MULMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  650. \return MP_TO_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  651. \return MP_MEM ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  652. \param key エクスポートするECC_KEYオブジェクトへのポインタ
  653. \param out ANSI X9.63フォーマット済みキーを保存するバッファへのポインタ
  654. \param outLen 出力バッファのサイズ。キーの保存に成功した場合は、出力バッファに書き込まれたバイトを保持します。
  655. _Example_
  656. \code
  657. int ret;
  658. byte buff[1024];
  659. word32 buffSz = sizeof(buff);
  660. ecc_key key;
  661. // initialize key, make key
  662. ret = wc_ecc_export_x963_ex(&key, buff, &buffSz, 1);
  663. if ( ret != 0) {
  664. // error exporting key
  665. }
  666. \endcode
  667. \sa wc_ecc_export_x963
  668. \sa wc_ecc_import_x963
  669. */
  670. int wc_ecc_export_x963_ex(ecc_key* key, byte* out, word32* outLen, int compressed);
  671. /*!
  672. \ingroup ECC
  673. \brief この関数は、ANSI X9.63形式で保存されているキーを含むバッファからパブリックECCキーをインポートします。この関数は、圧縮キーがhand_comp_keyオプションを介してコンパイル時に有効になっている限り、圧縮キーと非圧縮キーの両方を処理します。
  674. \return 0 ECC_KEYのインポートに成功しました
  675. \return NOT_COMPILED_IN hand_comp_keyがコンパイル時に有効になっていない場合は返されますが、キーは圧縮形式で保存されます。
  676. \return ECC_BAD_ARG_E INまたはKEYがNULLに評価された場合、またはInlenが偶数の場合(X9.63規格によれば、キーは奇数でなければなりません)。
  677. \return MEMORY_E メモリの割り当て中にエラーが発生した場合に返されます
  678. \return ASN_PARSE_E ECCキーの解析中にエラーがある場合は返されます。ECCキーが有効なANSI X9.63フォーマットに格納されていないことを示すことがあります。
  679. \return IS_POINT_E エクスポートされた公開鍵がECC曲線上の点ではない場合に返されます
  680. \return MP_INIT_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  681. \return MP_READ_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  682. \return MP_CMP_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  683. \return MP_INVMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  684. \return MP_EXPTMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  685. \return MP_MOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  686. \return MP_MUL_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  687. \return MP_ADD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  688. \return MP_MULMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  689. \return MP_TO_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  690. \return MP_MEM ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  691. \param in ANSI x9.63フォーマットされたECCキーを含むバッファへのポインタ
  692. \param inLen 入力バッファの長さ
  693. _Example_
  694. \code
  695. int ret;
  696. byte buff[] = { initialize with ANSI X9.63 formatted key };
  697. ecc_key pubKey;
  698. wc_ecc_init(&pubKey);
  699. ret = wc_ecc_import_x963(buff, sizeof(buff), &pubKey);
  700. if ( ret != 0) {
  701. // error importing key
  702. }
  703. \endcode
  704. \sa wc_ecc_export_x963
  705. \sa wc_ecc_import_private_key
  706. */
  707. int wc_ecc_import_x963(const byte* in, word32 inLen, ecc_key* key);
  708. /*!
  709. \ingroup ECC
  710. \brief この関数は、生の秘密鍵を含むバッファと、ANSI X9.63フォーマットされた公開鍵を含む2番目のバッファーからパブリック/プライベートECCキーのペアをインポートします。この関数は、圧縮キーがhand_comp_keyオプションを介してコンパイル時に有効になっている限り、圧縮キーと非圧縮キーの両方を処理します。
  711. \return 0 habe_comp_keyがコンパイル時に有効になっていない場合は、ecc_key not_compiled_inを正常にインポートしましたが、キーは圧縮形式で保存されます。
  712. \return ECC_BAD_ARG_E INまたはKEYがNULLに評価された場合、またはInlenが偶数の場合(X9.63規格によれば、キーは奇数でなければなりません)。
  713. \return MEMORY_E メモリの割り当て中にエラーが発生した場合に返されます
  714. \return ASN_PARSE_E ECCキーの解析中にエラーがある場合は返されます。ECCキーが有効なANSI X9.63フォーマットに格納されていないことを示すことがあります。
  715. \return IS_POINT_E エクスポートされた公開鍵がECC曲線上の点ではない場合に返されます
  716. \return MP_INIT_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  717. \return MP_READ_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  718. \return MP_CMP_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  719. \return MP_INVMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  720. \return MP_EXPTMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  721. \return MP_MOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  722. \return MP_MUL_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  723. \return MP_ADD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  724. \return MP_MULMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  725. \return MP_TO_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  726. \return MP_MEM ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  727. \param priv RAW秘密鍵を含むバッファへのポインタ
  728. \param privSz 秘密鍵バッファのサイズ
  729. \param pub ANSI x9.63フォーマットされたECC公開鍵を含むバッファへのポインタ
  730. \param pubSz 公開鍵入力バッファの長さ
  731. _Example_
  732. \code
  733. int ret;
  734. byte pub[] = { initialize with ANSI X9.63 formatted key };
  735. byte priv[] = { initialize with the raw private key };
  736. ecc_key key;
  737. wc_ecc_init(&key);
  738. ret = wc_ecc_import_private_key(priv, sizeof(priv), pub, sizeof(pub),
  739. &key);
  740. if ( ret != 0) {
  741. // error importing key
  742. }
  743. \endcode
  744. \sa wc_ecc_export_x963
  745. \sa wc_ecc_import_private_key
  746. */
  747. int wc_ecc_import_private_key(const byte* priv, word32 privSz, const byte* pub,
  748. word32 pubSz, ecc_key* key);
  749. /*!
  750. \ingroup ECC
  751. \brief この関数は、ECCシグネチャのR部分とS部分をDER符号化ECDSAシグネチャに変換します。この機能は、outlenでは、出力バッファに書き込まれた長さも記憶されています。
  752. \return 0 署名の変換に成功したことに戻りました
  753. \return ECC_BAD_ARG_E いずれかの入力パラメータがNULLに評価された場合、または入力バッファがDERエンコードされたECDSAシグネチャを保持するのに十分な大きさでない場合に返されます。
  754. \return MP_INIT_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  755. \return MP_READ_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  756. \return MP_CMP_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  757. \return MP_INVMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  758. \return MP_EXPTMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  759. \return MP_MOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  760. \return MP_MUL_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  761. \return MP_ADD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  762. \return MP_MULMOD_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  763. \return MP_TO_E ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  764. \return MP_MEM ECC_KEYの処理中にエラーが発生した場合に返される可能性があります
  765. \param r 署名のR部分を文字列として含むバッファへのポインタ
  766. \param s シグネチャのS部分を含むバッファへのポインタ文字列としてのポインタ
  767. \param out DERエンコードされたECDSAシグネチャを保存するバッファへのポインタ
  768. _Example_
  769. \code
  770. int ret;
  771. ecc_key key;
  772. // initialize key, generate R and S
  773. char r[] = { initialize with R };
  774. char s[] = { initialize with S };
  775. byte sig[wc_ecc_sig_size(key)];
  776. // signature size will be 2 * ECC key size + ~10 bytes for ASN.1 overhead
  777. word32 sigSz = sizeof(sig);
  778. ret = wc_ecc_rs_to_sig(r, s, sig, &sigSz);
  779. if ( ret != 0) {
  780. // error converting parameters to signature
  781. }
  782. \endcode
  783. \sa wc_ecc_sign_hash
  784. \sa wc_ecc_sig_size
  785. */
  786. int wc_ecc_rs_to_sig(const char* r, const char* s, byte* out, word32* outlen);
  787. /*!
  788. \ingroup ECC
  789. \brief この関数は、ECC署名のRAW成分を持つECC_KEY構造体を埋めます。
  790. \return 0 ECC_Key構造体に正常にインポートされたときに返されます
  791. \return ECC_BAD_ARG_E いずれかの入力値がNULLに評価された場合に返されます。
  792. \return MEMORY_E ECC_Keyのパラメータを格納するためのエラーの初期化スペースがある場合に返されます。
  793. \return ASN_PARSE_E 入力カーベナデがECC_SETSで定義されていない場合
  794. \return MP_INIT_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  795. \return MP_READ_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  796. \return MP_CMP_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  797. \return MP_INVMOD_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  798. \return MP_EXPTMOD_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  799. \return MP_MOD_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  800. \return MP_MUL_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  801. \return MP_ADD_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  802. \return MP_MULMOD_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  803. \return MP_TO_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  804. \return MP_MEM 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  805. \param key 塗りつぶすためのECC_KEY構造体へのポインタ
  806. \param qx ASCII六角文字列として基点のXコンポーネントを含むバッファへのポインタ
  807. \param qy ASCII六角文字列として基点のY成分を含むバッファへのポインタ
  808. \param d ASCII hex文字列として秘密鍵を含むバッファへのポインタ
  809. _Example_
  810. \code
  811. int ret;
  812. ecc_key key;
  813. wc_ecc_init(&key);
  814. char qx[] = { initialize with x component of base point };
  815. char qy[] = { initialize with y component of base point };
  816. char d[] = { initialize with private key };
  817. ret = wc_ecc_import_raw(&key,qx, qy, d, "ECC-256");
  818. if ( ret != 0) {
  819. // error initializing key with given inputs
  820. }
  821. \endcode
  822. \sa wc_ecc_import_private_key
  823. */
  824. int wc_ecc_import_raw(ecc_key* key, const char* qx, const char* qy,
  825. const char* d, const char* curveName);
  826. /*!
  827. \ingroup ECC
  828. \brief この関数は、ECC_KEY構造体から秘密鍵のみをエクスポートします。秘密鍵をバッファアウトに格納し、outlenにこのバッファに書き込まれたバイトを設定します。
  829. \return 0 秘密鍵のエクスポートに成功したときに返されます
  830. \return ECC_BAD_ARG_E いずれかの入力値がNULLに評価された場合に返されます。
  831. \return MEMORY_E ECC_Keyのパラメータを格納するためのエラーの初期化スペースがある場合に返されます。
  832. \return ASN_PARSE_E 入力カーベナデがECC_SETSで定義されていない場合
  833. \return MP_INIT_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  834. \return MP_READ_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  835. \return MP_CMP_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  836. \return MP_INVMOD_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  837. \return MP_EXPTMOD_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  838. \return MP_MOD_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  839. \return MP_MUL_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  840. \return MP_ADD_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  841. \return MP_MULMOD_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  842. \return MP_TO_E 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  843. \return MP_MEM 入力パラメータの処理中にエラーが発生した場合に返される可能性があります。
  844. \param key 秘密鍵をエクスポートするECC_Key構造体へのポインタ
  845. \param out 秘密鍵を保存するバッファへのポインタ
  846. _Example_
  847. \code
  848. int ret;
  849. ecc_key key;
  850. // initialize key, make key
  851. char priv[ECC_KEY_SIZE];
  852. word32 privSz = sizeof(priv);
  853. ret = wc_ecc_export_private_only(&key, priv, &privSz);
  854. if ( ret != 0) {
  855. // error exporting private key
  856. }
  857. \endcode
  858. \sa wc_ecc_import_private_key
  859. */
  860. int wc_ecc_export_private_only(ecc_key* key, byte* out, word32* outLen);
  861. /*!
  862. \ingroup ECC
  863. \brief DERへのエクスポートポイント。
  864. \return 0 成功に戻りました。
  865. \return ECC_BAD_ARG_E curve_idxが0未満または無効である場合は返します。いつ来るのか
  866. \return LENGTH_ONLY_E outlenは設定されていますが、他にはありません。
  867. \return BUFFER_E outlennが1 + 2 *曲線サイズよりも小さい場合は返します。
  868. \return MEMORY_E メモリの割り当てに問題がある場合は返します。
  869. \param curve_idx ECC_SETSから使用される曲線のインデックス。
  870. \param point Derへのエクスポートを指す。
  871. \param out 出力の目的地
  872. _Example_
  873. \code
  874. int curve_idx;
  875. ecc_point* point;
  876. byte out[];
  877. word32 outLen;
  878. wc_ecc_export_point_der(curve_idx, point, out, &outLen);
  879. \endcode
  880. \sa wc_ecc_import_point_der
  881. */
  882. int wc_ecc_export_point_der(const int curve_idx, ecc_point* point,
  883. byte* out, word32* outLen);
  884. /*!
  885. \ingroup ECC
  886. \brief Derフォーマットからのインポートポイント。
  887. \return ECC_BAD_ARG_E 引数がnullの場合、またはInlenが偶数の場合は返します。
  888. \return MEMORY_E エラー初期化がある場合に返します
  889. \return NOT_COMPILED_IN habe_comp_keyが真実でない場合は返され、inは圧縮証明書です
  890. \return MP_OKAY 操作が成功しました。
  891. \param in からのポイントをインポートするためのDer Buffer。
  892. \param inLen DERバッファの長さ
  893. \param curve_idx 曲線のインデックス
  894. _Example_
  895. \code
  896. byte in[];
  897. word32 inLen;
  898. int curve_idx;
  899. ecc_point* point;
  900. wc_ecc_import_point_der(in, inLen, curve_idx, point);
  901. \endcode
  902. \sa wc_ecc_export_point_der
  903. */
  904. int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx,
  905. ecc_point* point);
  906. /*!
  907. \ingroup ECC
  908. \brief この関数は、ecc_key構造体のキーサイズをオクテットで返します。
  909. \return Given 有効なキー、オクテットのキーサイズを返します
  910. \return 0 与えられたキーがNULLの場合に返されます
  911. _Example_
  912. \code
  913. int keySz;
  914. ecc_key key;
  915. // initialize key, make key
  916. keySz = wc_ecc_size(&key);
  917. if ( keySz == 0) {
  918. // error determining key size
  919. }
  920. \endcode
  921. \sa wc_ecc_make_key
  922. */
  923. int wc_ecc_size(ecc_key* key);
  924. /*!
  925. \ingroup ECC
  926. \brief この関数は、次のようにして指定されたECCシグネチャの最悪の場合のサイズを返します。(KEYSZ * 2)+ SIG_HEADER_SZ + ECC_MAX_PAD_SZ。実際のシグネチャサイズは、WC_ECC_SIGN_HASHで計算できます。
  927. \return returns 最大署名サイズ(オクテット)
  928. _Example_
  929. \code
  930. int sigSz = wc_ecc_sig_size_calc(32);
  931. if ( sigSz == 0) {
  932. // error determining sig size
  933. }
  934. \endcode
  935. \sa wc_ecc_sign_hash
  936. \sa wc_ecc_sig_size
  937. */
  938. int wc_ecc_sig_size_calc(int sz);
  939. /*!
  940. \ingroup ECC
  941. \brief この関数は、次のようにして指定されたECCシグネチャの最悪の場合のサイズを返します。(KEYSZ * 2)+ SIG_HEADER_SZ + ECC_MAX_PAD_SZ。実際のシグネチャサイズは、WC_ECC_SIGN_HASHで計算できます。
  942. \return Success 有効なキーを考えると、最大署名サイズをオクテットで返します。
  943. \return 0 与えられたキーがNULLの場合に返されます
  944. _Example_
  945. \code
  946. int sigSz;
  947. ecc_key key;
  948. // initialize key, make key
  949. sigSz = wc_ecc_sig_size(&key);
  950. if ( sigSz == 0) {
  951. // error determining sig size
  952. }
  953. \endcode
  954. \sa wc_ecc_sign_hash
  955. \sa wc_ecc_sig_size_calc
  956. */
  957. int wc_ecc_sig_size(ecc_key* key);
  958. /*!
  959. \ingroup ECC
  960. \brief この機能は、ECCとの安全なメッセージ交換を可能にするために、新しいECCコンテキストオブジェクトのスペースを割り当て、初期化します。
  961. \return Success 新しいECENCCTXオブジェクトの生成に成功した場合は、そのオブジェクトへのポインタを返します
  962. \return NULL 関数が新しいECENCCTXオブジェクトを生成できない場合に返されます
  963. \param flags これがサーバーであるかクライアントのコンテキストオプションがあるかどうかを示します.req_resp_client、およびreq_resp_server
  964. _Example_
  965. \code
  966. ecEncCtx* ctx;
  967. WC_WC_RNG rng;
  968. wc_InitRng(&rng);
  969. ctx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng);
  970. if(ctx == NULL) {
  971. // error generating new ecEncCtx object
  972. }
  973. \endcode
  974. \sa wc_ecc_encrypt
  975. \sa wc_ecc_encrypt_ex
  976. \sa wc_ecc_decrypt
  977. */
  978. ecEncCtx* wc_ecc_ctx_new(int flags, WC_RNG* rng);
  979. /*!
  980. \ingroup ECC
  981. \brief この関数は、メッセージの暗号化と復号化に使用されるECENCCTXオブジェクトを解放します。
  982. \return none 戻り値。
  983. _Example_
  984. \code
  985. ecEncCtx* ctx;
  986. WC_WC_RNG rng;
  987. wc_InitRng(&rng);
  988. ctx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng);
  989. // do secure communication
  990. ...
  991. wc_ecc_ctx_free(&ctx);
  992. \endcode
  993. \sa wc_ecc_ctx_new
  994. */
  995. void wc_ecc_ctx_free(ecEncCtx*);
  996. /*!
  997. \ingroup ECC
  998. \brief この関数はECENCCTX構造をリセットして、新しいコンテキストオブジェクトを解放し、新しいコンテキストオブジェクトを割り当てます。
  999. \return 0 ecencctx構造が正常にリセットされた場合に返されます
  1000. \return BAD_FUNC_ARG RNGまたはCTXがNULLの場合に返されます
  1001. \return RNG_FAILURE_E ECCオブジェクトに新しい塩を生成するエラーがある場合
  1002. \param ctx リセットするECENCCTXオブジェクトへのポインタ
  1003. _Example_
  1004. \code
  1005. ecEncCtx* ctx;
  1006. WC_WC_RNG rng;
  1007. wc_InitRng(&rng);
  1008. ctx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng);
  1009. // do secure communication
  1010. ...
  1011. wc_ecc_ctx_reset(&ctx, &rng);
  1012. // do more secure communication
  1013. \endcode
  1014. \sa wc_ecc_ctx_new
  1015. */
  1016. int wc_ecc_ctx_reset(ecEncCtx* ctx, WC_RNG* rng); /* reset for use again w/o alloc/free */
  1017. /*!
  1018. \ingroup ECC
  1019. \brief この関数は、wc_ecc_ctx_newの後にオプションで呼び出されることができます。暗号化、KDF、およびMACアルゴリズムをECENCENCCTXオブジェクトに設定します。
  1020. \return 0 ECENCCTXオブジェクトの情報を正常に設定すると返されます。
  1021. \return BAD_FUNC_ARG 指定されたecencctxオブジェクトがNULLの場合に返されます。
  1022. \param ctx 情報を設定するECENCCTXへのポインタ
  1023. \param encAlgo 使用する暗号化アルゴリズム
  1024. \param kdfAlgo 使用するKDFアルゴリズム
  1025. _Example_
  1026. \code
  1027. ecEncCtx* ctx;
  1028. // initialize ctx
  1029. if(wc_ecc_ctx_set_algo(&ctx, ecAES_128_CTR, ecHKDF_SHA256, ecHMAC_SHA256))) {
  1030. // error setting info
  1031. }
  1032. \endcode
  1033. \sa wc_ecc_ctx_new
  1034. */
  1035. int wc_ecc_ctx_set_algo(ecEncCtx* ctx, byte encAlgo, byte kdfAlgo,
  1036. byte macAlgo);
  1037. /*!
  1038. \ingroup ECC
  1039. \brief この関数はECENCENCCTXオブジェクトの塩を返します。この関数は、ECENCCTXの状態がECSRV_INITまたはECCLI_INITの場合にのみ呼び出す必要があります。
  1040. \return Success 成功すると、ECENCENTX塩を返します
  1041. \return NULL ecencctxオブジェクトがNULLの場合、またはECENCCTXの状態がECSRV_INITまたはECCLI_INITでない場合に返されます。後者の2つのケースでは、この機能はそれぞれECSRV_BAD_STATEまたはECCLI_BAD_STATEにECENCCTXの状態を設定します。
  1042. _Example_
  1043. \code
  1044. ecEncCtx* ctx;
  1045. WC_WC_RNG rng;
  1046. const byte* salt;
  1047. wc_InitRng(&rng);
  1048. ctx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng);
  1049. salt = wc_ecc_ctx_get_own_salt(&ctx);
  1050. if(salt == NULL) {
  1051. // error getting salt
  1052. }
  1053. \endcode
  1054. \sa wc_ecc_ctx_new
  1055. \sa wc_ecc_ctx_set_peer_salt
  1056. */
  1057. const byte* wc_ecc_ctx_get_own_salt(ecEncCtx*);
  1058. /*!
  1059. \ingroup ECC
  1060. \brief この関数は、ECENCENCCTXオブジェクトのピアソルトを設定します。
  1061. \return 0 ECENCCTXオブジェクトのピアソルトの設定に成功したときに返されます。
  1062. \return BAD_FUNC_ARG 指定されたecencctxオブジェクトがnullまたは無効なプロトコルがある場合、または指定された塩がNULLの場合
  1063. \return BAD_ENC_STATE_E ecencctxの状態がECSRV_SALT_GETまたはECCLI_SALT_GETの場合に返されます。後者の2つのケースでは、この機能はそれぞれECSRV_BAD_STATEまたはECCLI_BAD_STATEにECENCCTXの状態を設定します。
  1064. \param ctx 塩を設定するためのecencctxへのポインタ
  1065. _Example_
  1066. \code
  1067. ecEncCtx* cliCtx, srvCtx;
  1068. WC_WC_RNG rng;
  1069. const byte* cliSalt, srvSalt;
  1070. int ret;
  1071. wc_InitRng(&rng);
  1072. cliCtx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng);
  1073. srvCtx = wc_ecc_ctx_new(REQ_RESP_SERVER, &rng);
  1074. cliSalt = wc_ecc_ctx_get_own_salt(&cliCtx);
  1075. srvSalt = wc_ecc_ctx_get_own_salt(&srvCtx);
  1076. ret = wc_ecc_ctx_set_peer_salt(&cliCtx, srvSalt);
  1077. \endcode
  1078. \sa wc_ecc_ctx_get_own_salt
  1079. */
  1080. int wc_ecc_ctx_set_peer_salt(ecEncCtx* ctx, const byte* salt);
  1081. /*!
  1082. \ingroup ECC
  1083. \brief この関数は、wc_ecc_ctx_set_peer_saltの前後にオプションで呼び出されることができます。ECENCCTXオブジェクトのオプションの情報を設定します。
  1084. \return 0 ECENCCTXオブジェクトの情報を正常に設定すると返されます。
  1085. \return BAD_FUNC_ARG 与えられたECENCCTXオブジェクトがNULLの場合、入力情報はNULLまたはサイズが無効です。
  1086. \param ctx 情報を設定するECENCCTXへのポインタ
  1087. \param info 設定する情報を含むバッファへのポインタ
  1088. _Example_
  1089. \code
  1090. ecEncCtx* ctx;
  1091. byte info[] = { initialize with information };
  1092. // initialize ctx, get salt,
  1093. if(wc_ecc_ctx_set_info(&ctx, info, sizeof(info))) {
  1094. // error setting info
  1095. }
  1096. \endcode
  1097. \sa wc_ecc_ctx_new
  1098. */
  1099. int wc_ecc_ctx_set_info(ecEncCtx* ctx, const byte* info, int sz);
  1100. /*!
  1101. \ingroup ECC
  1102. \brief この関数は指定された入力メッセージをMSGからOUTに暗号化します。この関数はパラメータとしてオプションのCTXオブジェクトを取ります。提供されている場合、ECENCCTXのEncalgo、Kdfalgo、およびMacalgoに基づいて暗号化が進みます。CTXが指定されていない場合、処理はデフォルトのアルゴリズム、ECAES_128_CBC、ECHKDF_SHA256、ECHMAC_SHA256で完了します。この機能は、メッセージがCTXで指定された暗号化タイプに従って埋め込まれている必要があります。
  1103. \return 0 入力メッセージの暗号化に成功したら返されます
  1104. \return BAD_FUNC_ARG PRIVKEY、PUBKEY、MSG、MSGSZ、OUT、OUTSZがNULLの場合、またはCTXオブジェクトがサポートされていない暗号化タイプを指定します。
  1105. \return BAD_ENC_STATE_E 指定されたCTXオブジェクトが暗号化に適していない状態にある場合に返されます。
  1106. \return BUFFER_E 指定された出力バッファが小さすぎて暗号化された暗号文を保存する場合に返されます
  1107. \return MEMORY_E 共有秘密鍵のメモリの割り当て中にエラーがある場合に返されます
  1108. \param privKey 暗号化に使用する秘密鍵を含むECC_KEYオブジェクトへのポインタ
  1109. \param pubKey コミュニケーションを希望するピアの公開鍵を含むECC_Keyオブジェクトへのポインタ
  1110. \param msg 暗号化するメッセージを保持しているバッファへのポインタ
  1111. \param msgSz 暗号化するバッファのサイズ
  1112. \param out 暗号化された暗号文を保存するバッファへのポインタ
  1113. \param outSz OUTバッファ内の使用可能なサイズを含むWord32オブジェクトへのポインタ。メッセージの暗号化に成功したら、出力バッファに書き込まれたバイト数を保持します。
  1114. _Example_
  1115. \code
  1116. byte msg[] = { initialize with msg to encrypt. Ensure padded to block size };
  1117. byte out[sizeof(msg)];
  1118. word32 outSz = sizeof(out);
  1119. int ret;
  1120. ecc_key cli, serv;
  1121. // initialize cli with private key
  1122. // initialize serv with received public key
  1123. ecEncCtx* cliCtx, servCtx;
  1124. // initialize cliCtx and servCtx
  1125. // exchange salts
  1126. ret = wc_ecc_encrypt(&cli, &serv, msg, sizeof(msg), out, &outSz, cliCtx);
  1127. if(ret != 0) {
  1128. // error encrypting message
  1129. }
  1130. \endcode
  1131. \sa wc_ecc_encrypt_ex
  1132. \sa wc_ecc_decrypt
  1133. */
  1134. int wc_ecc_encrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
  1135. word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx);
  1136. /*!
  1137. \ingroup ECC
  1138. \brief この関数は指定された入力メッセージをMSGからOUTに暗号化します。この関数はパラメータとしてオプションのCTXオブジェクトを取ります。提供されている場合、ECENCCTXのEncalgo、Kdfalgo、およびMacalgoに基づいて暗号化が進みます。CTXが指定されていない場合、処理はデフォルトのアルゴリズム、ECAES_128_CBC、ECHKDF_SHA256、ECHMAC_SHA256で完了します。この機能は、メッセージがCTXで指定された暗号化タイプに従って埋め込まれている必要があります。
  1139. \return 0 入力メッセージの暗号化に成功したら返されます
  1140. \return BAD_FUNC_ARG PRIVKEY、PUBKEY、MSG、MSGSZ、OUT、OUTSZがNULLの場合、またはCTXオブジェクトがサポートされていない暗号化タイプを指定します。
  1141. \return BAD_ENC_STATE_E 指定されたCTXオブジェクトが暗号化に適していない状態にある場合に返されます。
  1142. \return BUFFER_E 指定された出力バッファが小さすぎて暗号化された暗号文を保存する場合に返されます
  1143. \return MEMORY_E 共有秘密鍵のメモリの割り当て中にエラーがある場合に返されます
  1144. \param privKey 暗号化に使用する秘密鍵を含むECC_KEYオブジェクトへのポインタ
  1145. \param pubKey コミュニケーションを希望するピアの公開鍵を含むECC_Keyオブジェクトへのポインタ
  1146. \param msg 暗号化するメッセージを保持しているバッファへのポインタ
  1147. \param msgSz 暗号化するバッファのサイズ
  1148. \param out 暗号化された暗号文を保存するバッファへのポインタ
  1149. \param outSz OUTバッファ内の使用可能なサイズを含むWord32オブジェクトへのポインタ。メッセージの暗号化に成功したら、出力バッファに書き込まれたバイト数を保持します。
  1150. \param ctx オプション:使用するさまざまな暗号化アルゴリズムを指定するECENCCTXオブジェクトへのポインタ
  1151. _Example_
  1152. \code
  1153. byte msg[] = { initialize with msg to encrypt. Ensure padded to block size };
  1154. byte out[sizeof(msg)];
  1155. word32 outSz = sizeof(out);
  1156. int ret;
  1157. ecc_key cli, serv;
  1158. // initialize cli with private key
  1159. // initialize serv with received public key
  1160. ecEncCtx* cliCtx, servCtx;
  1161. // initialize cliCtx and servCtx
  1162. // exchange salts
  1163. ret = wc_ecc_encrypt_ex(&cli, &serv, msg, sizeof(msg), out, &outSz, cliCtx,
  1164. 1);
  1165. if(ret != 0) {
  1166. // error encrypting message
  1167. }
  1168. \endcode
  1169. \sa wc_ecc_encrypt
  1170. \sa wc_ecc_decrypt
  1171. */
  1172. int wc_ecc_encrypt_ex(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
  1173. word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx, int compressed);
  1174. /*!
  1175. \ingroup ECC
  1176. \brief この関数はMSGからOUTへの暗号文を復号化します。この関数はパラメータとしてオプションのCTXオブジェクトを取ります。提供されている場合、ECENCCTXのEncalgo、Kdfalgo、およびMacalgoに基づいて暗号化が進みます。CTXが指定されていない場合、処理はデフォルトのアルゴリズム、ECAES_128_CBC、ECHKDF_SHA256、ECHMAC_SHA256で完了します。この機能は、メッセージがCTXで指定された暗号化タイプに従って埋め込まれている必要があります。
  1177. \return 0 入力メッセージの復号化に成功したときに返されます
  1178. \return BAD_FUNC_ARG PRIVKEY、PUBKEY、MSG、MSGSZ、OUT、OUTSZがNULLの場合、またはCTXオブジェクトがサポートされていない暗号化タイプを指定します。
  1179. \return BAD_ENC_STATE_E 指定されたCTXオブジェクトが復号化に適していない状態にある場合に返されます。
  1180. \return BUFFER_E 供給された出力バッファが小さすぎて復号化された平文を保存する場合は返されます。
  1181. \return MEMORY_E 共有秘密鍵のメモリの割り当て中にエラーがある場合に返されます
  1182. \param privKey 復号化に使用する秘密鍵を含むECC_Keyオブジェクトへのポインタ
  1183. \param pubKey コミュニケーションを希望するピアの公開鍵を含むECC_Keyオブジェクトへのポインタ
  1184. \param msg 暗号文を復号化するためのバッファへのポインタ
  1185. \param msgSz 復号化するバッファのサイズ
  1186. \param out 復号化された平文を保存するバッファへのポインタ
  1187. \param outSz OUTバッファ内の使用可能なサイズを含むWord32オブジェクトへのポインタ。暗号文を正常に復号化すると、出力バッファに書き込まれたバイト数を保持します。
  1188. _Example_
  1189. \code
  1190. byte cipher[] = { initialize with
  1191. ciphertext to decrypt. Ensure padded to block size };
  1192. byte plain[sizeof(cipher)];
  1193. word32 plainSz = sizeof(plain);
  1194. int ret;
  1195. ecc_key cli, serv;
  1196. // initialize cli with private key
  1197. // initialize serv with received public key
  1198. ecEncCtx* cliCtx, servCtx;
  1199. // initialize cliCtx and servCtx
  1200. // exchange salts
  1201. ret = wc_ecc_decrypt(&cli, &serv, cipher, sizeof(cipher),
  1202. plain, &plainSz, cliCtx);
  1203. if(ret != 0) {
  1204. // error decrypting message
  1205. }
  1206. \endcode
  1207. \sa wc_ecc_encrypt
  1208. \sa wc_ecc_encrypt_ex
  1209. */
  1210. int wc_ecc_decrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
  1211. word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx);
  1212. /*!
  1213. \ingroup ECC
  1214. \brief 非ブロック操作のためのECCサポートを有効にします。次のビルドオプションを使用した単精度(SP)数学でサポートされています.WolfSSL_SP_SP_SMALL WOLFSSL_SP_NO_MALLOC WC_ECC_NONBLOCK
  1215. \return 0 コールバックコンテキストを入力メッセージに正常に設定すると返されます。
  1216. \param key ECC_KEYオブジェクトへのポインタ
  1217. _Example_
  1218. \code
  1219. int ret;
  1220. ecc_key ecc;
  1221. ecc_nb_ctx_t nb_ctx;
  1222. ret = wc_ecc_init(&ecc);
  1223. if (ret == 0) {
  1224. ret = wc_ecc_set_nonblock(&ecc, &nb_ctx);
  1225. if (ret == 0) {
  1226. do {
  1227. ret = wc_ecc_verify_hash_ex(
  1228. &r, &s, // r/s as mp_int
  1229. hash, hashSz, // computed hash digest
  1230. &verify_res, // verification result 1=success
  1231. &key
  1232. );
  1233. // TODO: Real-time work can be called here
  1234. } while (ret == FP_WOULDBLOCK);
  1235. }
  1236. wc_ecc_free(&key);
  1237. }
  1238. \endcode
  1239. */
  1240. int wc_ecc_set_nonblock(ecc_key *key, ecc_nb_ctx_t* ctx);