1
0

ed25519.h 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877
  1. /*!
  2. \ingroup ED25519
  3. \brief この関数はEd25519秘密鍵からEd25519公開鍵を生成します。公開鍵をバッファpubkeyに出力します。
  4. この関数の呼び出しに先立ち、ed25519_key構造体にはEd25519秘密鍵がインポートされている必要があります。
  5. \return 0 公開鍵の作成に成功したときに返されます。
  6. \return BAD_FUNC_ARG 引数keyまたはpubKeyがNULLの場合、または指定された鍵サイズが32バイトではない場合(ED25519に32バイトのキーがあります)。
  7. \return ECC_PRIV_KEY_E ed25519_key構造体にEd25519秘密鍵がインポートされていない場合に返されます。
  8. \return MEMORY_E 関数の実行中にメモリを割り当てエラーがある場合に返されます。
  9. \param [in] key Ed25519秘密鍵がインポートされているed25519_key構造体へのポインタ。
  10. \param [out] pubKey 公開鍵を出力するバッファへのポインタ。
  11. \param [in] pubKeySz バッファのサイズ。常にED25519_PUB_KEY_SIZE(32)でなければなりません。
  12. _Example_
  13. \code
  14. int ret;
  15. ed25519_key key;
  16. byte priv[] = { initialize with 32 byte private key };
  17. byte pub[32];
  18. word32 pubSz = sizeof(pub);
  19. wc_ed25519_init(&key);
  20. wc_ed25519_import_private_only(priv, sizeof(priv), &key);
  21. ret = wc_ed25519_make_public(&key, pub, &pubSz);
  22. if (ret != 0) {
  23. // error making public key
  24. }
  25. \endcode
  26. \sa wc_ed25519_init
  27. \sa wc_ed25519_import_private_only
  28. \sa wc_ed25519_make_key
  29. */
  30. int wc_ed25519_make_public(ed25519_key* key, unsigned char* pubKey,
  31. word32 pubKeySz);
  32. /*!
  33. \ingroup ED25519
  34. \brief この関数は新しいed25519_key構造体を生成し、それを引数keyのバッファに格納します。
  35. \return 0 ed25519_key構造体を正常に生成すると返されます。
  36. \return BAD_FUNC_ARG RNGまたはKEYがNULLに評価された場合、または指定されたkeysizeが32バイトではない場合(Ed25519鍵には常に32バイトを指定する必要があります)。
  37. \return MEMORY_E 関数の実行中にメモリ割り当てエラーが発生した場合に返されます。
  38. \param [in] rng RNGキーを生成する初期化されたRNGオブジェクトへのポインタ。
  39. \param [in] keysize keyの長さ。ED25519の場合は常に32になります。
  40. _Example_
  41. \code
  42. int ret;
  43. WC_RNG rng;
  44. ed25519_key key;
  45. wc_InitRng(&rng);
  46. wc_ed25519_init(&key);
  47. wc_ed25519_make_key(&rng, 32, &key);
  48. if (ret != 0) {
  49. // error making key
  50. }
  51. \endcode
  52. \sa wc_ed25519_init
  53. */
  54. int wc_ed25519_make_key(WC_RNG* rng, int keysize, ed25519_key* key);
  55. /*!
  56. \ingroup ED25519
  57. \brief この関数は、ed25519_key構造体を使用してメッセージに署名します。
  58. \return 0 メッセージの署名を正常に生成すると返されます。
  59. \return BAD_FUNC_ARG 入力パラメータのいずれかがNULLに評価された場合、または出力バッファが小さすぎて生成された署名を保存する場合は返されます。
  60. \return MEMORY_E 関数の実行中にメモリ割り当てエラーが発生した場合に返されます。
  61. \param [in] in 署名するメッセージを含むバッファへのポインタ。
  62. \param [in] inlen 署名するメッセージのサイズ
  63. \param [out] out 生成された署名を格納するためのバッファ。
  64. \param [in,out] outlen 出力バッファの最大長。メッセージ署名の生成に成功したときに、書き込まれたバイト数を保持します。
  65. \param [in] key 署名を生成するために使用する秘密鍵を保持しているed25519_key構造体へのポインタ。
  66. _Example_
  67. \code
  68. ed25519_key key;
  69. WC_RNG rng;
  70. int ret, sigSz;
  71. byte sig[64]; // will hold generated signature
  72. sigSz = sizeof(sig);
  73. byte message[] = { initialize with message };
  74. wc_InitRng(&rng); // initialize rng
  75. wc_ed25519_init(&key); // initialize key
  76. wc_ed25519_make_key(&rng, 32, &key); // make public/private key pair
  77. ret = wc_ed25519_sign_msg(message, sizeof(message), sig, &sigSz, &key);
  78. if (ret != 0) {
  79. // error generating message signature
  80. }
  81. \endcode
  82. \sa wc_ed25519ctx_sign_msg
  83. \sa wc_ed25519ph_sign_hash
  84. \sa wc_ed25519ph_sign_msg
  85. \sa wc_ed25519_verify_msg
  86. */
  87. int wc_ed25519_sign_msg(const byte* in, word32 inlen, byte* out,
  88. word32 *outlen, ed25519_key* key);
  89. /*!
  90. \ingroup ED25519
  91. \brief この関数は、ed25519_key構造体を使用してメッセージに署名します。
  92. コンテキストは署名されるデータの一部です。
  93. \return 0 メッセージの署名を正常に生成すると返されます。
  94. \return BAD_FUNC_ARG 返された入力パラメータはNULLに評価されます。出力バッファが小さすぎて生成された署名を保存するには小さすぎます。
  95. \return MEMORY_E 関数の実行中にメモリ割り当てエラーが発生した場合に返されます。
  96. \param [in] in 署名するメッセージを含むバッファへのポインタ。
  97. \param [in] inlen 署名するメッセージのサイズ
  98. \param [out] out 生成された署名を格納するためのバッファ。
  99. \param [in,out] outlen 出力バッファの最大長。メッセージ署名の生成に成功したときに、書き込まれたバイトを保存します。
  100. \param [in] key 署名を生成するために使用する秘密鍵を保持しているed25519_key構造体へのポインタ。
  101. \param [in] context メッセージが署名されているコンテキストを含むバッファへのポインタ。
  102. \param [in] contextLen コンテキストバッファのサイズ
  103. _Example_
  104. \code
  105. ed25519_key key;
  106. WC_RNG rng;
  107. int ret, sigSz;
  108. byte sig[64]; // will hold generated signature
  109. sigSz = sizeof(sig);
  110. byte message[] = { initialize with message };
  111. byte context[] = { initialize with context of signing };
  112. wc_InitRng(&rng); // initialize rng
  113. wc_ed25519_init(&key); // initialize key
  114. wc_ed25519_make_key(&rng, 32, &key); // make public/private key pair
  115. ret = wc_ed25519ctx_sign_msg(message, sizeof(message), sig, &sigSz, &key,
  116. context, sizeof(context));
  117. if (ret != 0) {
  118. // error generating message signature
  119. }
  120. \endcode
  121. \sa wc_ed25519_sign_msg
  122. \sa wc_ed25519ph_sign_hash
  123. \sa wc_ed25519ph_sign_msg
  124. \sa wc_ed25519_verify_msg
  125. */
  126. int wc_ed25519ctx_sign_msg(const byte* in, word32 inlen, byte* out,
  127. word32 *outlen, ed25519_key* key,
  128. const byte* context, byte contextLen);
  129. /*!
  130. \ingroup ED25519
  131. \brief この関数は、ed25519_key構造体を使用してメッセージダイジェストに署名します。
  132. コンテキストは署名されるデータの一部として含まれています。
  133. 署名計算の前にメッセージは事前にハッシュされています。
  134. メッセージダイジェストを作成するために使用されるハッシュアルゴリズムはShake-256でなければなりません。
  135. \return 0 メッセージダイジェストの署名を正常に生成すると返されます。
  136. \return BAD_FUNC_ARG 返された入力パラメータはNULLに評価されます。出力バッファが小さすぎて生成された署名を保存するには小さすぎます。
  137. \return MEMORY_E 関数の実行中にメモリ割り当てエラーが発生した場合に返されます。
  138. \param [in] hash 署名するメッセージのハッシュを含むバッファへのポインタ。
  139. \param [in] hashLen 署名するメッセージのハッシュのサイズ
  140. \param [out] out 生成された署名を格納するためのバッファ。
  141. \param [in,out] outlen 出力バッファの最大長。メッセージ署名の生成に成功したときに、書き込まれたバイトを保存します。
  142. \param [in] key 署名を生成するのに使用する秘密鍵を含んだed25519_key構造体へのポインタ。
  143. \param [in] context メッセージが署名されているコンテキストを含むバッファへのポインタ。
  144. \param [in] contextLen コンテキストバッファのサイズ
  145. _Example_
  146. \code
  147. ed25519_key key;
  148. WC_RNG rng;
  149. int ret, sigSz;
  150. byte sig[64]; // will hold generated signature
  151. sigSz = sizeof(sig);
  152. byte hash[] = { initialize with SHA-512 hash of message };
  153. byte context[] = { initialize with context of signing };
  154. wc_InitRng(&rng); // initialize rng
  155. wc_ed25519_init(&key); // initialize key
  156. wc_ed25519_make_key(&rng, 32, &key); // make public/private key pair
  157. ret = wc_ed25519ph_sign_hash(hash, sizeof(hash), sig, &sigSz, &key,
  158. context, sizeof(context));
  159. if (ret != 0) {
  160. // error generating message signature
  161. }
  162. \endcode
  163. \sa wc_ed25519_sign_msg
  164. \sa wc_ed25519ctx_sign_msg
  165. \sa wc_ed25519ph_sign_msg
  166. \sa wc_ed25519_verify_msg
  167. */
  168. int wc_ed25519ph_sign_hash(const byte* hash, word32 hashLen, byte* out,
  169. word32 *outLen, ed25519_key* key,
  170. const byte* context, byte contextLen);
  171. /*!
  172. \ingroup ED25519
  173. \brief この関数は、ed25519_key構造体を使用して認証を保証するメッセージに署名します。コンテキストは署名されたデータの一部として含まれています。署名計算の前にメッセージは事前にハッシュされています。
  174. \return 0 メッセージの署名を正常に生成すると返されます。
  175. \return BAD_FUNC_ARG 返された入力パラメータはNULLに評価されます。出力バッファが小さすぎて生成された署名を保存するには小さすぎます。
  176. \return MEMORY_E 関数の実行中にメモリを割り当てエラーが発生した場合に返されます。
  177. \param [in] in 署名するメッセージを含むバッファへのポインタ。
  178. \param [in] inlen 署名するメッセージのインレル長。
  179. \param [out] out 生成された署名を格納するためのバッファ。
  180. \param [in,out] outlen 出力バッファの最大長。メッセージ署名の生成に成功したときに、書き込まれたバイトを保存します。
  181. \param [in] key 署名を生成するプライベートed25519_key構造体へのポインタ。
  182. \param [in] context メッセージが署名されているコンテキストを含むバッファへのポインタ。
  183. \param [in] contextLen コンテキストバッファのサイズ
  184. _Example_
  185. \code
  186. ed25519_key key;
  187. WC_RNG rng;
  188. int ret, sigSz;
  189. byte sig[64]; // will hold generated signature
  190. sigSz = sizeof(sig);
  191. byte message[] = { initialize with message };
  192. byte context[] = { initialize with context of signing };
  193. wc_InitRng(&rng); // initialize rng
  194. wc_ed25519_init(&key); // initialize key
  195. wc_ed25519_make_key(&rng, 32, &key); // make public/private key pair
  196. ret = wc_ed25519ph_sign_msg(message, sizeof(message), sig, &sigSz, &key,
  197. context, sizeof(context));
  198. if (ret != 0) {
  199. // error generating message signature
  200. }
  201. \endcode
  202. \sa wc_ed25519_sign_msg
  203. \sa wc_ed25519ctx_sign_msg
  204. \sa wc_ed25519ph_sign_hash
  205. \sa wc_ed25519_verify_msg
  206. */
  207. int wc_ed25519ph_sign_msg(const byte* in, word32 inlen, byte* out,
  208. word32 *outlen, ed25519_key* key,
  209. const byte* context, byte contextLen);
  210. /*!
  211. \ingroup ED25519
  212. \brief この関数はメッセージのEd25519署名を検証します。
  213. retを介して答えを返し、有効な署名の場合は1、無効な署名の場合には0を返します。
  214. \return 0 署名検証と認証を正常に実行したときに返されます。
  215. \return BAD_FUNC_ARG いずれかの入力パラメータがNULLに評価された場合、またはSIGLENが署名の実際の長さと一致しない場合に返されます。
  216. \return SIG_VERIFY_E 検証が完了した場合は返されますが、生成された署名は提供された署名と一致しません。
  217. \param [in] sig 検証するシグネチャを含むバッファへのポインタ。
  218. \param [in] siglen 検証するシグネチャのサイズ
  219. \param [in] msg メッセージを含むバッファへのポインタ
  220. \param [in] msgLen 検証するメッセージのサイズ
  221. \param [out] ret 検証の結果を格納する変数へのポインタ。1はメッセージが正常に検証されたことを示します。
  222. \param [in] key 署名を検証するためのEd25519公開鍵へのポインタ。
  223. _Example_
  224. \code
  225. ed25519_key key;
  226. int ret, verified = 0;
  227. byte sig[] { initialize with received signature };
  228. byte msg[] = { initialize with message };
  229. // initialize key with received public key
  230. ret = wc_ed25519_verify_msg(sig, sizeof(sig), msg, sizeof(msg), &verified,
  231. &key);
  232. if (ret < 0) {
  233. // error performing verification
  234. } else if (verified == 0)
  235. // the signature is invalid
  236. }
  237. \endcode
  238. \sa wc_ed25519ctx_verify_msg
  239. \sa wc_ed25519ph_verify_hash
  240. \sa wc_ed25519ph_verify_msg
  241. \sa wc_ed25519_sign_msg
  242. */
  243. int wc_ed25519_verify_msg(const byte* sig, word32 siglen, const byte* msg,
  244. word32 msgLen, int* ret, ed25519_key* key);
  245. /*!
  246. \ingroup ED25519
  247. \brief この関数はメッセージのEd25519署名を検証します。
  248. コンテキストは署名されたデータの一部として含まれています。
  249. 答えは変数retを介して返され、署名が有効ならば1、無効ならば0を返します。
  250. \return 0 署名検証と認証を正常に実行したときに返されます。
  251. \return BAD_FUNC_ARG いずれかの入力パラメータがNULLに評価された場合、またはSIGLENが署名の実際の長さと一致しない場合に返されます。
  252. \return SIG_VERIFY_E 検証が完了した場合は返されますが、生成された署名は提供された署名と一致しません。
  253. \param [in] sig 検証するシグネチャを含むバッファへのポインタ。
  254. \param [in] siglen 検証するシグネチャのサイズ
  255. \param [in] msg メッセージを含むバッファへのポインタ
  256. \param [in] msgLen 検証するメッセージのサイズ
  257. \param [out] ret 検証の結果を格納する変数へのポインタ。1はメッセージが正常に検証されたことを示します。
  258. \param [in] key 署名を検証するためのEd25519公開鍵へのポインタ。
  259. \param [in] context メッセージが署名されているコンテキストを含むバッファへのポインタ。
  260. \param [in] contextLen コンテキストバッファのサイズ
  261. _Example_
  262. \code
  263. ed25519_key key;
  264. int ret, verified = 0;
  265. byte sig[] { initialize with received signature };
  266. byte msg[] = { initialize with message };
  267. byte context[] = { initialize with context of signature };
  268. // initialize key with received public key
  269. ret = wc_ed25519ctx_verify_msg(sig, sizeof(sig), msg, sizeof(msg),
  270. &verified, &key, );
  271. if (ret < 0) {
  272. // error performing verification
  273. } else if (verified == 0)
  274. // the signature is invalid
  275. }
  276. \endcode
  277. \sa wc_ed25519_verify_msg
  278. \sa wc_ed25519ph_verify_hash
  279. \sa wc_ed25519ph_verify_msg
  280. \sa wc_ed25519_sign_msg
  281. */
  282. int wc_ed25519ctx_verify_msg(const byte* sig, word32 siglen, const byte* msg,
  283. word32 msgLen, int* ret, ed25519_key* key,
  284. const byte* context, byte contextLen);
  285. /*!
  286. \ingroup ED25519
  287. \brief この関数は、メッセージのダイジェストのEd25519署名を検証します。
  288. 引数hashは、署名計算前のプリハッシュメッセージです。
  289. メッセージダイジェストを作成するために使用されるハッシュアルゴリズムはSHA-512でなければなりません。
  290. 答えは変数retを介して返され、署名が有効ならば1、無効ならば0を返します。
  291. \return 0 署名検証と認証を正常に実行したときに返されます。
  292. \return BAD_FUNC_ARG いずれかの入力パラメータがNULLに評価された場合、またはSIGLENが署名の実際の長さと一致しない場合に返されます。
  293. \return SIG_VERIFY_E 検証が完了した場合は返されますが、生成された署名は提供された署名と一致しません。
  294. \param [in] sig 検証するシグネチャを含むバッファへのポインタ。
  295. \param [in] siglen 検証するシグネチャのサイズ
  296. \param [in] msg メッセージを含むバッファへのポインタ
  297. \param [in] msgLen 検証するメッセージのサイズ
  298. \param [out] ret 検証の結果を格納する変数へのポインタ。1はメッセージが正常に検証されたことを示します。
  299. \param [in] key 署名を検証するためのEd25519公開鍵へのポインタ。
  300. \param [in] context メッセージが署名されたコンテキストを含むバッファへのポインタ。
  301. \param [in] contextLen コンテキストのサイズ
  302. _Example_
  303. \code
  304. ed25519_key key;
  305. int ret, verified = 0;
  306. byte sig[] { initialize with received signature };
  307. byte hash[] = { initialize with SHA-512 hash of message };
  308. byte context[] = { initialize with context of signature };
  309. // initialize key with received public key
  310. ret = wc_ed25519ph_verify_hash(sig, sizeof(sig), msg, sizeof(msg),
  311. &verified, &key, );
  312. if (ret < 0) {
  313. // error performing verification
  314. } else if (verified == 0)
  315. // the signature is invalid
  316. }
  317. \endcode
  318. \sa wc_ed25519_verify_msg
  319. \sa wc_ed25519ctx_verify_msg
  320. \sa wc_ed25519ph_verify_msg
  321. \sa wc_ed25519_sign_msg
  322. */
  323. int wc_ed25519ph_verify_hash(const byte* sig, word32 siglen, const byte* hash,
  324. word32 hashLen, int* ret, ed25519_key* key,
  325. const byte* context, byte contextLen);
  326. /*!
  327. \ingroup ED25519
  328. \brief この関数は、メッセージのダイジェストのEd25519署名を検証します。
  329. 引数contextは検証すべきデータの一部として含まれています。
  330. 検証前にメッセージがプリハッシュされています。
  331. 答えは変数resを介して返され、署名が有効ならば1、無効ならば0を返します。
  332. \return 0 署名検証と認証を正常に実行したときに返されます。
  333. \return BAD_FUNC_ARG いずれかの入力パラメータがNULLに評価された場合、またはSIGLENが署名の実際の長さと一致しない場合に返されます。
  334. \return SIG_VERIFY_E 検証が完了した場合は返されますが、生成された署名は提供された署名と一致しません。
  335. \param [in] sig 検証するシグネチャを含むバッファへのポインタ。
  336. \param [in] siglen 検証するシグネチャのサイズ
  337. \param [in] msg メッセージを含むバッファへのポインタ
  338. \param [in] msgLen 検証するメッセージのサイズ
  339. \param [out] ret 検証の結果を格納する変数へのポインタ。1はメッセージが正常に検証されたことを示します。
  340. \param [in] key 署名を検証するためのEd25519公開鍵へのポインタ。
  341. \param [in] context メッセージが署名されたコンテキストを含むバッファへのポインタ。
  342. \param [in] contextLen コンテキストのサイズ
  343. _Example_
  344. \code
  345. ed25519_key key;
  346. int ret, verified = 0;
  347. byte sig[] { initialize with received signature };
  348. byte msg[] = { initialize with message };
  349. byte context[] = { initialize with context of signature };
  350. // initialize key with received public key
  351. ret = wc_ed25519ctx_verify_msg(sig, sizeof(sig), msg, sizeof(msg),
  352. &verified, &key, );
  353. if (ret < 0) {
  354. // error performing verification
  355. } else if (verified == 0)
  356. // the signature is invalid
  357. }
  358. \endcode
  359. \sa wc_ed25519_verify_msg
  360. \sa wc_ed25519ph_verify_hash
  361. \sa wc_ed25519ph_verify_msg
  362. \sa wc_ed25519_sign_msg
  363. */
  364. int wc_ed25519ph_verify_msg(const byte* sig, word32 siglen, const byte* msg,
  365. word32 msgLen, int* ret, ed25519_key* key,
  366. const byte* context, byte contextLen);
  367. /*!
  368. \ingroup ED25519
  369. \brief この関数は、後のメッセージ検証で使用のためにed25519_key構造体を初期化します。
  370. \return 0 ed25519_key構造体の初期化に成功したときに返されます。
  371. \return BAD_FUNC_ARG 引数keyがNULLの場合に返されます。
  372. \param [in,out] key ed25519_key構造体へのポインタ
  373. _Example_
  374. \code
  375. ed25519_key key;
  376. wc_ed25519_init(&key);
  377. \endcode
  378. \sa wc_ed25519_make_key
  379. \sa wc_ed25519_free
  380. */
  381. int wc_ed25519_init(ed25519_key* key);
  382. /*!
  383. \ingroup ED25519
  384. \brief この関数は、使用済みのed25519_key構造体を解放します。
  385. \param [in,out] key ed25519_key構造体へのポインタ
  386. _Example_
  387. \code
  388. ed25519_key key;
  389. // initialize key and perform secure exchanges
  390. ...
  391. wc_ed25519_free(&key);
  392. \endcode
  393. \sa wc_ed25519_init
  394. */
  395. void wc_ed25519_free(ed25519_key* key);
  396. /*!
  397. \ingroup ED25519
  398. \brief この関数はバッファからed25519公開鍵をed25519_key構造体へインポートします。
  399. 圧縮あるいは非圧縮の両方の形式の鍵を扱います。
  400. \return 0 ed25519公開鍵のインポートに成功した場合に返されます。
  401. \return BAD_FUNC_ARG inまたはkeyがnullに評価された場合、またはinlenがED25519鍵のサイズよりも小さい場合に返されます。
  402. \param [in] in 公開鍵を含んだバッファへのポインタ
  403. \param [in] inLen 公開鍵を含んだバッファのサイズ
  404. \param [in,out] key ed25519_key構造体へのポインタ
  405. _Example_
  406. \code
  407. int ret;
  408. byte pub[] = { initialize Ed25519 public key };
  409. ed_25519 key;
  410. wc_ed25519_init_key(&key);
  411. ret = wc_ed25519_import_public(pub, sizeof(pub), &key);
  412. if (ret != 0) {
  413. // error importing key
  414. }
  415. \endcode
  416. \sa wc_ed25519_import_public_ex
  417. \sa wc_ed25519_import_private_key
  418. \sa wc_ed25519_import_private_key_ex
  419. \sa wc_ed25519_export_public
  420. */
  421. int wc_ed25519_import_public(const byte* in, word32 inLen, ed25519_key* key);
  422. /*!
  423. \ingroup ED25519
  424. \brief この関数はバッファからed25519公開鍵をed25519_key構造体へインポートします。
  425. 圧縮あるいは非圧縮の両方の形式の鍵を扱います。
  426. 秘密鍵が既にインポートされている場合で、trusted引数が1以外の場合は両鍵が対応しているかをチェックします。
  427. \return 0 ed25519公開鍵のインポートに成功した場合に返されます。
  428. \return BAD_FUNC_ARG Returned 引数inあるいはkeyがNULLの場合,あるいは引数inLenがEd25519鍵のサイズより小さい場合に返されます。
  429. \param [in] in 公開鍵を含んだバッファへのポインタ
  430. \param [in] inLen 公開鍵を含んだバッファのサイズ
  431. \param [in,out] key ed25519_key構造体へのポインタ
  432. \param [in] trusted 公開鍵が信頼おけるか否かを示すフラグ
  433. _Example_
  434. \code
  435. int ret;
  436. byte pub[] = { initialize Ed25519 public key };
  437. ed_25519 key;
  438. wc_ed25519_init_key(&key);
  439. ret = wc_ed25519_import_public_ex(pub, sizeof(pub), &key, 1);
  440. if (ret != 0) {
  441. // error importing key
  442. }
  443. \endcode
  444. \sa wc_ed25519_import_public
  445. \sa wc_ed25519_import_private_key
  446. \sa wc_ed25519_import_private_key_ex
  447. \sa wc_ed25519_export_public
  448. */
  449. int wc_ed25519_import_public_ex(const byte* in, word32 inLen, ed25519_key* key,
  450. int trusted);
  451. /*!
  452. \ingroup ED25519
  453. \brief この関数は、ed25519秘密鍵のみをバッファからインポートします。
  454. \return 0 Ed25519秘密鍵のインポートに成功した際に返されます。
  455. \return BAD_FUNC_ARG privまたはkeyがNULLに評価された場合、またはprivSzがED25519_KEY_SIZEと異なる場合に返されます。
  456. \param [in] priv 秘密鍵を含むバッファへのポインタ。
  457. \param [in] privSz 秘密鍵を含むバッファのサイズ
  458. _Example_
  459. \code
  460. int ret;
  461. byte priv[] = { initialize with 32 byte private key };
  462. ed25519_key key;
  463. wc_ed25519_init_key(&key);
  464. ret = wc_ed25519_import_private_key(priv, sizeof(priv), &key);
  465. if (ret != 0) {
  466. // error importing private key
  467. }
  468. \endcode
  469. \sa wc_ed25519_import_public
  470. \sa wc_ed25519_import_private_key
  471. \sa wc_ed25519_export_private_only
  472. */
  473. int wc_ed25519_import_private_only(const byte* priv, word32 privSz,
  474. ed25519_key* key);
  475. /*!
  476. \ingroup ED25519
  477. \brief この関数は、Ed25519公開鍵/秘密鍵をそれぞれ含む一対のバッファからEd25519鍵ペアをインポートします。
  478. この関数は圧縮と非圧縮の両方の鍵を処理します。
  479. \return 0 Ed25519_KEYのインポートに成功しました。
  480. \return BAD_FUNC_ARG privまたはkeyがNULLに評価された場合、privSzがED25519_KEY_SIZEと異なるあるいはED25519_PRV_KEY_SIZEとも異なる場合、pubSzがED25519_PUB_KEY_SIZEよりも小さい場合に返されます。
  481. \param [in] priv 秘密鍵を含むバッファへのポインタ。
  482. \param [in] privSz 秘密鍵バッファのサイズ
  483. \param [in] pub 公開鍵を含むバッファへのポインタ。
  484. \param [in] pubSz 公開鍵バッファのサイズ
  485. _Example_
  486. \code
  487. int ret;
  488. byte priv[] = { initialize with 32 byte private key };
  489. byte pub[] = { initialize with the corresponding public key };
  490. ed25519_key key;
  491. wc_ed25519_init_key(&key);
  492. ret = wc_ed25519_import_private_key(priv, sizeof(priv), pub, sizeof(pub),
  493. &key);
  494. if (ret != 0) {
  495. // error importing key
  496. }
  497. \endcode
  498. \sa wc_ed25519_import_public
  499. \sa wc_ed25519_import_private_only
  500. \sa wc_ed25519_export_private
  501. */
  502. int wc_ed25519_import_private_key(const byte* priv, word32 privSz,
  503. const byte* pub, word32 pubSz, ed25519_key* key);
  504. /*!
  505. \ingroup ED25519
  506. \brief この関数は一対のバッファからEd25519公開鍵/秘密鍵ペアをインポートします。この関数は圧縮キーと非圧縮キーの両方を処理します。公開鍵はtrusted引数により信頼されていないとされた場合には秘密鍵に対して検証されます。
  507. \return 0 ed25519_keyのインポートに成功しました。
  508. \return BAD_FUNC_ARG Returned if privあるいはkeyがNULLに評価された場合、privSzがED25519_KEY_SIZEともED25519_PRV_KEY_SIZEとも異なる場合、pubSzがED25519_PUB_KEY_SIZEより小さい場合に返されます。
  509. \param [in] priv 秘密鍵を保持するバッファへのポインタ
  510. \param [in] privSz 秘密鍵バッファのサイズ
  511. \param [in] pub 公開鍵を保持するバッファへのポインタ
  512. \param [in] pubSz 公開鍵バッファのサイズ
  513. \param [in,out] key インポートされた公開鍵/秘密鍵を保持するed25519_keyオブジェクトへのポインター
  514. \param [in] trusted 公開鍵が信頼できるか否かを指定するフラグ
  515. _Example_
  516. \code
  517. int ret;
  518. byte priv[] = { initialize with 32 byte private key };
  519. byte pub[] = { initialize with the corresponding public key };
  520. ed25519_key key;
  521. wc_ed25519_init_key(&key);
  522. ret = wc_ed25519_import_private_key(priv, sizeof(priv), pub, sizeof(pub),
  523. &key, 1);
  524. if (ret != 0) {
  525. // error importing key
  526. }
  527. \endcode
  528. \sa wc_ed25519_import_public
  529. \sa wc_ed25519_import_public_ex
  530. \sa wc_ed25519_import_private_only
  531. \sa wc_ed25519_import_private_key
  532. \sa wc_ed25519_export_private
  533. */
  534. int wc_ed25519_import_private_key_ex(const byte* priv, word32 privSz,
  535. const byte* pub, word32 pubSz, ed25519_key* key, int trusted);
  536. /*!
  537. \ingroup ED25519
  538. \brief この関数は、ed25519_key構造体から公開鍵をエクスポートします。公開鍵をバッファoutに格納し、outLenにこのバッファに書き込まれたバイトを設定します。
  539. \return 0 公開鍵のエクスポートに成功したら返されます。
  540. \return BAD_FUNC_ARG いずれかの入力値がNULLに評価された場合に返されます。
  541. \return BUFFER_E 提供されたバッファーが公開鍵を保存するのに十分な大きさでない場合に返されます。このエラーを返すと、outlenに必要なサイズを設定します。
  542. \param [in] key 公開鍵をエクスポートするためのed25519_key構造体へのポインタ。
  543. \param [out] out 公開鍵を保存するバッファへのポインタ。
  544. \param [in,out] outLen 公開鍵を出力する先のバッファサイズを格納するword32型変数へのポインタ。
  545. 入力の際はバッファサイズを格納して渡し、出力の際はエクスポートした公開鍵のサイズを格納します。
  546. _Example_
  547. \code
  548. int ret;
  549. ed25519_key key;
  550. // initialize key, make key
  551. char pub[32];
  552. word32 pubSz = sizeof(pub);
  553. ret = wc_ed25519_export_public(&key, pub, &pubSz);
  554. if (ret != 0) {
  555. // error exporting public key
  556. }
  557. \endcode
  558. \sa wc_ed25519_import_public
  559. \sa wc_ed25519_export_private_only
  560. */
  561. int wc_ed25519_export_public(ed25519_key* key, byte* out, word32* outLen);
  562. /*!
  563. \ingroup ED25519
  564. \brief この関数は、ed25519_key構造体からの秘密鍵のみをエクスポートします。秘密鍵をバッファアウトに格納し、outlenにこのバッファに書き込まれたバイトを設定します。
  565. \return 0 秘密鍵のエクスポートに成功したら返されます。
  566. \return BAD_FUNC_ARG いずれかの入力値がNULLに評価された場合に返されます。
  567. \return BUFFER_E 提供されたバッファーが秘密鍵を保存するのに十分な大きさでない場合に返されます。
  568. \param [in] key 秘密鍵をエクスポートするためのed25519_key構造体へのポインタ。
  569. \param [out] out 秘密鍵を保存するバッファへのポインタ。
  570. \param [in,out] outLen 秘密鍵を出力する先のバッファサイズを格納するword32型変数へのポインタ。
  571. 入力の際はバッファサイズを格納して渡し、出力の際はエクスポートした秘密鍵のサイズを格納します。
  572. _Example_
  573. \code
  574. int ret;
  575. ed25519_key key;
  576. // initialize key, make key
  577. char priv[32]; // 32 bytes because only private key
  578. word32 privSz = sizeof(priv);
  579. ret = wc_ed25519_export_private_only(&key, priv, &privSz);
  580. if (ret != 0) {
  581. // error exporting private key
  582. }
  583. \endcode
  584. \sa wc_ed25519_export_public
  585. \sa wc_ed25519_import_private_key
  586. */
  587. int wc_ed25519_export_private_only(ed25519_key* key, byte* out, word32* outLen);
  588. /*!
  589. \ingroup ED25519
  590. \brief この関数は、ed25519_key構造体から鍵ペアをエクスポートします。鍵ペアをバッファoutに格納し、ounterenでこのバッファに書き込まれたバイトを設定します。
  591. \return 0 鍵ペアのエクスポートに成功したら返されます。
  592. \return BAD_FUNC_ARG いずれかの入力値がNULLに評価された場合に返されます。
  593. \return BUFFER_E 提供されているバッファーが鍵ペアを保存するのに十分な大きさでない場合に返されます。
  594. \param [in] 鍵ペアをエクスポートするためのed25519_key構造体へのポインタ。
  595. \param [out] 鍵ペアを保存するバッファへのポインタ。
  596. \param [in,out] outLen 鍵ペアを出力する先のバッファサイズを格納するword32型変数へのポインタ。
  597. 入力の際はバッファサイズを格納して渡し、出力の際はエクスポートした鍵ペアのサイズを格納します。
  598. _Example_
  599. \code
  600. ed25519_key key;
  601. wc_ed25519_init(&key);
  602. WC_RNG rng;
  603. wc_InitRng(&rng);
  604. wc_ed25519_make_key(&rng, 32, &key); // initialize 32 byte Ed25519 key
  605. byte out[64]; // out needs to be a sufficient buffer size
  606. word32 outLen = sizeof(out);
  607. int key_size = wc_ed25519_export_private(&key, out, &outLen);
  608. if (key_size == BUFFER_E) {
  609. // Check size of out compared to outLen to see if function reset outLen
  610. }
  611. \endcode
  612. \sa wc_ed25519_import_private_key
  613. \sa wc_ed25519_export_private_only
  614. */
  615. int wc_ed25519_export_private(ed25519_key* key, byte* out, word32* outLen);
  616. /*!
  617. \ingroup ED25519
  618. \brief この関数は、ed25519_key構造体から秘密鍵と公開鍵を別々にエクスポートします。
  619. 秘密鍵をバッファprivに格納し、priovSzにこのバッファに書き込んだバイト数を設定します。
  620. 公開鍵をバッファpubに格納し、pubSzにこのバッファに書き込んだバイト数を設定します。
  621. \return 0 鍵ペアのエクスポートに成功したら返されます。
  622. \return BAD_FUNC_ARG いずれかの入力値がNULLに評価された場合に返されます。
  623. \return BUFFER_E 提供されているバッファが鍵ペアを保存するのに十分な大きさでない場合に返されます。
  624. \param [in] key 鍵ペアをエクスポートするためのed25519_key構造体へのポインタ。
  625. \param [out] priv 秘密鍵を出力するバッファへのポインタ。
  626. \param [in,out] privSz 秘密鍵を出力する先のバッファのサイズを保持するword32型変数へのポインタ。
  627. 秘密鍵のエクスポート後には書き込まれたバイト数がセットされます。
  628. \param [out] pub パブリックキーを出力するバッファへのポインタ
  629. \param [in,out] pubSz 公開鍵を出力する先のバッファのサイズを保持するword32型変数へのポインタ。
  630. 公開鍵のエクスポート後には書き込まれたバイト数がセットされます。
  631. _Example_
  632. \code
  633. int ret;
  634. ed25519_key key;
  635. // initialize key, make key
  636. char pub[32];
  637. word32 pubSz = sizeof(pub);
  638. char priv[32];
  639. word32 privSz = sizeof(priv);
  640. ret = wc_ed25519_export_key(&key, priv, &pubSz, pub, &pubSz);
  641. if (ret != 0) {
  642. // error exporting public key
  643. }
  644. \endcode
  645. \sa wc_ed25519_export_private
  646. \sa wc_ed25519_export_public
  647. */
  648. int wc_ed25519_export_key(ed25519_key* key,
  649. byte* priv, word32 *privSz,
  650. byte* pub, word32 *pubSz);
  651. /*!
  652. \ingroup ED25519
  653. \brief この関数は、ed25519_key構造体の公開鍵をチェックします。
  654. \return 0 プライベートキーと公開鍵が一致した場合に返されます。
  655. \return BAD_FUNC_ARG 与えられた鍵がNULLの場合に返されます。
  656. \return PUBLIC_KEY_E 公開鍵が参照できないか無効の場合に返されます。
  657. \param [in] key 公開鍵と秘密鍵の両方を保持しているed25519_key構造体へのポインタ
  658. _Example_
  659. \code
  660. int ret;
  661. byte priv[] = { initialize with 57 byte private key };
  662. byte pub[] = { initialize with the corresponding public key };
  663. ed25519_key key;
  664. wc_ed25519_init_key(&key);
  665. wc_ed25519_import_private_key(priv, sizeof(priv), pub, sizeof(pub), &key);
  666. ret = wc_ed25519_check_key(&key);
  667. if (ret != 0) {
  668. // error checking key
  669. }
  670. \endcode
  671. \sa wc_ed25519_import_private_key
  672. */
  673. int wc_ed25519_check_key(ed25519_key* key);
  674. /*!
  675. \ingroup ED25519
  676. \brief この関数は、Ed25519 - 32バイトのサイズを返します。
  677. \return ED25519_KEY_SIZE 有効な秘密鍵のサイズ(32バイト)。
  678. \return BAD_FUNC_ARG 与えられた引数keyがNULLの場合に返されます。
  679. \param [in] key ed25519_key構造体へのポインタ
  680. _Example_
  681. \code
  682. int keySz;
  683. ed25519_key key;
  684. // initialize key, make key
  685. keySz = wc_ed25519_size(&key);
  686. if (keySz == 0) {
  687. // error determining key size
  688. }
  689. \endcode
  690. \sa wc_ed25519_make_key
  691. */
  692. int wc_ed25519_size(ed25519_key* key);
  693. /*!
  694. \ingroup ED25519
  695. \brief この関数は、秘密鍵サイズ(secret + public)をバイト単位で返します。
  696. \return ED25519_PRV_KEY_SIZE 秘密鍵のサイズ(64バイト)。
  697. \return BAD_FUNC_ARG key引数がnullの場合に返されます。
  698. \param [in] key ed25519_key構造体へのポインタ
  699. _Example_
  700. \code
  701. ed25519_key key;
  702. wc_ed25519_init(&key);
  703. WC_RNG rng;
  704. wc_InitRng(&rng);
  705. wc_ed25519_make_key(&rng, 32, &key); // initialize 32 byte Ed25519 key
  706. int key_size = wc_ed25519_priv_size(&key);
  707. \endcode
  708. \sa wc_ed25519_pub_size
  709. */
  710. int wc_ed25519_priv_size(ed25519_key* key);
  711. /*!
  712. \ingroup ED25519
  713. \brief この関数は圧縮鍵サイズをバイト単位で返します(公開鍵)。
  714. \return ED25519_PUB_KEY_SIZE 圧縮公開鍵のサイズ(32バイト)。
  715. \return BAD_FUNC_ARG key引数がnullの場合は返します。
  716. \param [in] key ed25519_key構造体へのポインタ
  717. _Example_
  718. \code
  719. ed25519_key key;
  720. wc_ed25519_init(&key);
  721. WC_RNG rng;
  722. wc_InitRng(&rng);
  723. wc_ed25519_make_key(&rng, 32, &key); // initialize 32 byte Ed25519 key
  724. int key_size = wc_ed25519_pub_size(&key);
  725. \endcode
  726. \sa wc_ed25519_priv_size
  727. */
  728. int wc_ed25519_pub_size(ed25519_key* key);
  729. /*!
  730. \ingroup ED25519
  731. \brief この関数は、ED25519シグネチャのサイズ(バイト数64)を返します。
  732. \return ED25519_SIG_SIZE ED25519シグネチャ(64バイト)のサイズ。
  733. \return BAD_FUNC_ARG key引数がnullの場合は返します。
  734. \param [in] key ed25519_key構造体へのポインタ
  735. _Example_
  736. \code
  737. int sigSz;
  738. ed25519_key key;
  739. // initialize key, make key
  740. sigSz = wc_ed25519_sig_size(&key);
  741. if (sigSz == 0) {
  742. // error determining sig size
  743. }
  744. \endcode
  745. \sa wc_ed25519_sign_msg
  746. */
  747. int wc_ed25519_sig_size(ed25519_key* key);