2
0

srp.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. /*!
  2. \ingroup SRP
  3. \brief 使用方法のためにSRP構造体を初期化します。
  4. \return 0 成功しています。
  5. \return BAD_FUNC_ARG SRPなどの引数がNULLまたはSRPSIDEの問題がある場合は、SRP_CLIENT_SIESまたはSRP_SERVER_SIEDでは問題がある場合に返します。
  6. \return NOT_COMPILED_IN タイプが引数として渡されたが、WolfCryptビルドに設定されていない場合。
  7. \return <0 エラー時に。
  8. \param srp 初期化されるSRP構造。
  9. \param type 使用するハッシュ型。
  10. _Example_
  11. \code
  12. Srp srp;
  13. if (wc_SrpInit(&srp, SRP_TYPE_SHA, SRP_CLIENT_SIDE) != 0)
  14. {
  15. // Initialization error
  16. }
  17. else
  18. {
  19. wc_SrpTerm(&srp);
  20. }
  21. \endcode
  22. \sa wc_SrpTerm
  23. \sa wc_SrpSetUsername
  24. */
  25. int wc_SrpInit(Srp* srp, SrpType type, SrpSide side);
  26. /*!
  27. \ingroup SRP
  28. \brief 使用後にSRP構造リソースを解放します。
  29. \return none いいえ返します。
  30. _Example_
  31. \code
  32. Srp srp;
  33. wc_SrpInit(&srp, SRP_TYPE_SHA, SRP_CLIENT_SIDE);
  34. // Use srp
  35. wc_SrpTerm(&srp)
  36. \endcode
  37. \sa wc_SrpInit
  38. */
  39. void wc_SrpTerm(Srp* srp);
  40. /*!
  41. \ingroup SRP
  42. \brief ユーザー名を設定します。この関数は、wc_srpinitの後に呼び出す必要があります。
  43. \return 0 ユーザー名は正常に設定されました。
  44. \return BAD_FUNC_ARG: srpまたはusernameがnullの場合に返します。
  45. \return MEMORY_E: SRP->ユーザーにメモリを割り当てる問題がある場合
  46. \return < 0:エラー。
  47. \param srp SRP構造
  48. \param username ユーザー名を含むバッファ。
  49. _Example_
  50. \code
  51. Srp srp;
  52. byte username[] = "user";
  53. word32 usernameSize = 4;
  54. wc_SrpInit(&srp, SRP_TYPE_SHA, SRP_CLIENT_SIDE);
  55. if(wc_SrpSetUsername(&srp, username, usernameSize) != 0)
  56. {
  57. // Error occurred setting username.
  58. }
  59. wc_SrpTerm(&srp);
  60. \endcode
  61. \sa wc_SrpInit
  62. \sa wc_SrpSetParams
  63. \sa wc_SrpTerm
  64. */
  65. int wc_SrpSetUsername(Srp* srp, const byte* username, word32 size);
  66. /*!
  67. \ingroup SRP
  68. \brief ユーザー名に基づいてSRPパラメータを設定します.. wc_srpsetuserNameの後に呼び出す必要があります。
  69. \return 0 成功
  70. \return BAD_FUNC_ARG SRP、N、G、またはSALTがNULLの場合、またはNSZ <GSZの場合は返します。
  71. \return SRP_CALL_ORDER_E wc_srpsetuserNameの前にwc_srpsetparamsが呼び出された場合、返します。
  72. \return <0 エラー
  73. \param srp SRP構造
  74. \param N 弾性率n = 2q + 1、[q、n]はプリムです。
  75. \param nSz nサイズをバイト単位で。
  76. \param g ジェネレータモジュロN.
  77. \param gSz バイト数のGサイズ
  78. \param salt 小さいランダムなソルト。各ユーザー名に特有のものです。
  79. _Example_
  80. \code
  81. Srp srp;
  82. byte username[] = "user";
  83. word32 usernameSize = 4;
  84. byte N[] = { }; // Contents of byte array N
  85. byte g[] = { }; // Contents of byte array g
  86. byte salt[] = { }; // Contents of byte array salt
  87. wc_SrpInit(&srp, SRP_TYPE_SHA, SRP_CLIENT_SIDE);
  88. wc_SrpSetUsername(&srp, username, usernameSize);
  89. if(wc_SrpSetParams(&srp, N, sizeof(N), g, sizeof(g), salt,
  90. sizeof(salt)) != 0)
  91. {
  92. // Error setting params
  93. }
  94. wc_SrpTerm(&srp);
  95. \endcode
  96. \sa wc_SrpInit
  97. \sa wc_SrpSetUsername
  98. \sa wc_SrpTerm
  99. */
  100. int wc_SrpSetParams(Srp* srp, const byte* N, word32 nSz,
  101. const byte* g, word32 gSz,
  102. const byte* salt, word32 saltSz);
  103. /*!
  104. \ingroup SRP
  105. \brief パスワードを設定します。パスワードを設定しても、SRP構造内のパスワードデータが消去されません。クライアントは、x = h(salt + h(user:pswd))を計算し、それを認証フィールドに格納します。この関数は、wc_srpsetparamsの後に呼び出されなければならず、クライアント側のみです。
  106. \return 0 成功
  107. \return BAD_FUNC_ARG srpまたはpasswordがnullの場合、またはsrp-> sideがsrp_client_sideに設定されていない場合。
  108. \return SRP_CALL_ORDER_E WC_SRPSETPASSWORDが順不同で呼び出されたときに戻ります。
  109. \return <0 エラー
  110. \param srp SRP構造
  111. \param password パスワードを含むバッファ。
  112. _Example_
  113. \code
  114. Srp srp;
  115. byte username[] = "user";
  116. word32 usernameSize = 4;
  117. byte password[] = "password";
  118. word32 passwordSize = 8;
  119. byte N[] = { }; // Contents of byte array N
  120. byte g[] = { }; // Contents of byte array g
  121. byte salt[] = { }; // Contents of byte array salt
  122. wc_SrpInit(&srp, SRP_TYPE_SHA, SRP_CLIENT_SIDE);
  123. wc_SrpSetUsername(&srp, username, usernameSize);
  124. wc_SrpSetParams(&srp, N, sizeof(N), g, sizeof(g), salt, sizeof(salt));
  125. if(wc_SrpSetPassword(&srp, password, passwordSize) != 0)
  126. {
  127. // Error setting password
  128. }
  129. wc_SrpTerm(&srp);
  130. \endcode
  131. \sa wc_SrpInit
  132. \sa wc_SrpSetUsername
  133. \sa wc_SrpSetParams
  134. */
  135. int wc_SrpSetPassword(Srp* srp, const byte* password, word32 size);
  136. /*!
  137. \ingroup SRP
  138. \brief 検証者を設定します。この関数は、wc_srpsetparamsの後に呼び出され、サーバー側のみです。
  139. \return 0 成功
  140. \return BAD_FUNC_ARG SRPまたはVerifierがNULLまたはSRP-> ISの場合、SRP_SERVER_SIEDではなく返されます。
  141. \return <0 エラー
  142. \param srp SRP構造
  143. \param verifier 検証者を含む構造体。
  144. _Example_
  145. \code
  146. Srp srp;
  147. byte username[] = "user";
  148. word32 usernameSize = 4;
  149. byte N[] = { }; // Contents of byte array N
  150. byte g[] = { }; // Contents of byte array g
  151. byte salt[] = { }; // Contents of byte array salt
  152. wc_SrpInit(&srp, SRP_TYPE_SHA, SRP_SERVER_SIDE);
  153. wc_SrpSetUsername(&srp, username, usernameSize);
  154. wc_SrpSetParams(&srp, N, sizeof(N), g, sizeof(g), salt, sizeof(salt))
  155. byte verifier[] = { }; // Contents of some verifier
  156. if(wc_SrpSetVerifier(&srp, verifier, sizeof(verifier)) != 0)
  157. {
  158. // Error setting verifier
  159. }
  160. wc_SrpTerm(&srp);
  161. \endcode
  162. \sa wc_SrpInit
  163. \sa wc_SrpSetParams
  164. \sa wc_SrpGetVerifier
  165. */
  166. int wc_SrpSetVerifier(Srp* srp, const byte* verifier, word32 size);
  167. /*!
  168. \ingroup SRP
  169. \brief 検証者を取得します。クライアントはV = g ^ x%Nで検証者を計算します。この関数は、wc_srpsetpasswordの後に呼び出され、クライアント側のみです。
  170. \return 0 成功
  171. \return BAD_FUNC_ARG SRP、Verifier、またはSizeがNULLの場合、またはSRP-> SIDEがSRP_CLIENT_SIEDではない場合に返されます。
  172. \return SRP_CALL_ORDER_E WC_SRPGetverifierが順不同で呼び出された場合に返されます。
  173. \return <0 エラー
  174. \param srp SRP構造
  175. \param verifier 検証者を書き込むためのバッファー。
  176. _Example_
  177. \code
  178. Srp srp;
  179. byte username[] = "user";
  180. word32 usernameSize = 4;
  181. byte password[] = "password";
  182. word32 passwordSize = 8;
  183. byte N[] = { }; // Contents of byte array N
  184. byte g[] = { }; // Contents of byte array g
  185. byte salt[] = { }; // Contents of byte array salt
  186. byte v[64];
  187. word32 vSz = 0;
  188. vSz = sizeof(v);
  189. wc_SrpInit(&srp, SRP_TYPE_SHA, SRP_CLIENT_SIDE);
  190. wc_SrpSetUsername(&srp, username, usernameSize);
  191. wc_SrpSetParams(&srp, N, sizeof(N), g, sizeof(g), salt, sizeof(salt))
  192. wc_SrpSetPassword(&srp, password, passwordSize)
  193. if( wc_SrpGetVerifier(&srp, v, &vSz ) != 0)
  194. {
  195. // Error getting verifier
  196. }
  197. wc_SrpTerm(&srp);
  198. \endcode
  199. \sa wc_SrpSetVerifier
  200. \sa wc_SrpSetPassword
  201. */
  202. int wc_SrpGetVerifier(Srp* srp, byte* verifier, word32* size);
  203. /*!
  204. \ingroup SRP
  205. \brief プライベートのエフェラル値を設定します。プライベートの一時的な値は、クライアント側のAとして知られています。サーバー側のand random()b。b = random()この関数は、ユニットテストケース、または開発者が外部ランダムソースを使用してエフェメラル値を設定したい場合は便利です。この関数は、WC_SRPGetPublicの前に呼び出されることがあります。
  206. \return 0 成功
  207. \return BAD_FUNC_ARG SRP、Private、またはSizeがNULLの場合に返されます。
  208. \return SRP_CALL_ORDER_E WC_SRPSetPrivateが順不同で呼び出された場合に返されます。
  209. \return <0 エラー
  210. \param srp SRP構造
  211. \param priv 一時的な値。
  212. _Example_
  213. \code
  214. Srp srp;
  215. byte username[] = "user";
  216. word32 usernameSize = 4;
  217. byte N[] = { }; // Contents of byte array N
  218. byte g[] = { }; // Contents of byte array g
  219. byte salt[] = { }; // Contents of byte array salt
  220. byte verifier = { }; // Contents of some verifier
  221. wc_SrpInit(&srp, SRP_TYPE_SHA, SRP_SERVER_SIDE);
  222. wc_SrpSetUsername(&srp, username, usernameSize);
  223. wc_SrpSetParams(&srp, N, sizeof(N), g, sizeof(g), salt, sizeof(salt))
  224. wc_SrpSetVerifier(&srp, verifier, sizeof(verifier))
  225. byte b[] = { }; // Some ephemeral value
  226. if( wc_SrpSetPrivate(&srp, b, sizeof(b)) != 0)
  227. {
  228. // Error setting private ephemeral
  229. }
  230. wc_SrpTerm(&srp);
  231. \endcode
  232. \sa wc_SrpGetPublic
  233. */
  234. int wc_SrpSetPrivate(Srp* srp, const byte* priv, word32 size);
  235. /*!
  236. \ingroup SRP
  237. \brief 公共の一時的な値を取得します。公共の一時的な値は、クライアント側のAとして知られています。サーバ側のA = g ^ A%n b。B =(k * v +(g b%n))%n wc_srpsetpasswordまたはwc_srpsetverifierの後に呼び出す必要があります。関数WC_SRPSetPrivateは、WC_SRPGetPublicの前に呼び出されることがあります。
  238. \return 0 成功
  239. \return BAD_FUNC_ARG srp、pub、またはsizeがnullの場合に返されます。
  240. \return SRP_CALL_ORDER_E WC_SRPGetPublicが順不同で呼び出された場合に返されます。
  241. \return BUFFER_E サイズ<srp.nの場合は返しました。
  242. \return <0 エラー
  243. \param srp SRP構造
  244. \param pub パブリックエフェラル値を書き込むためのバッファ。
  245. _Example_
  246. \code
  247. Srp srp;
  248. byte username[] = "user";
  249. word32 usernameSize = 4;
  250. byte password[] = "password";
  251. word32 passwordSize = 8;
  252. byte N[] = { }; // Contents of byte array N
  253. byte g[] = { }; // Contents of byte array g
  254. byte salt[] = { }; // Contents of byte array salt
  255. wc_SrpInit(&srp, SRP_TYPE_SHA, SRP_CLIENT_SIDE);
  256. wc_SrpSetUsername(&srp, username, usernameSize);
  257. wc_SrpSetParams(&srp, N, sizeof(N), g, sizeof(g), salt, sizeof(salt));
  258. wc_SrpSetPassword(&srp, password, passwordSize)
  259. byte public[64];
  260. word32 publicSz = 0;
  261. if( wc_SrpGetPublic(&srp, public, &publicSz) != 0)
  262. {
  263. // Error getting public ephemeral
  264. }
  265. wc_SrpTerm(&srp);
  266. \endcode
  267. \sa wc_SrpSetPrivate
  268. \sa wc_SrpSetPassword
  269. \sa wc_SrpSetVerifier
  270. */
  271. int wc_SrpGetPublic(Srp* srp, byte* pub, word32* size);
  272. /*!
  273. \ingroup SRP
  274. \brief セッションキーを計算します。成功後にSRP->キーでキーをアクセスできます。
  275. \return 0 成功
  276. \return BAD_FUNC_ARG SRP、ClientPubKey、またはServerPubKeyの場合、またはClientPubkeyszまたはServerPubKeyszが0の場合に返されます。
  277. \return SRP_CALL_ORDER_E WC_SRPComputeKeyが順不同で呼び出された場合に返されます。
  278. \return <0 エラー
  279. \param srp SRP構造
  280. \param clientPubKey クライアントの公共の一時的な価値。
  281. \param clientPubKeySz クライアントの公共の一時的な値のサイズ。
  282. \param serverPubKey サーバーの一般の一時的な値。
  283. _Example_
  284. \code
  285. Srp server;
  286. byte username[] = "user";
  287. word32 usernameSize = 4;
  288. byte password[] = "password";
  289. word32 passwordSize = 8;
  290. byte N[] = { }; // Contents of byte array N
  291. byte g[] = { }; // Contents of byte array g
  292. byte salt[] = { }; // Contents of byte array salt
  293. byte verifier[] = { }; // Contents of some verifier
  294. byte serverPubKey[] = { }; // Contents of server pub key
  295. word32 serverPubKeySize = sizeof(serverPubKey);
  296. byte clientPubKey[64];
  297. word32 clientPubKeySize = 64;
  298. wc_SrpInit(&server, SRP_TYPE_SHA, SRP_SERVER_SIDE);
  299. wc_SrpSetUsername(&server, username, usernameSize);
  300. wc_SrpSetParams(&server, N, sizeof(N), g, sizeof(g), salt, sizeof(salt));
  301. wc_SrpSetVerifier(&server, verifier, sizeof(verifier));
  302. wc_SrpGetPublic(&server, serverPubKey, &serverPubKeySize);
  303. wc_SrpComputeKey(&server, clientPubKey, clientPubKeySz,
  304. serverPubKey, serverPubKeySize)
  305. wc_SrpTerm(&server);
  306. \endcode
  307. \sa wc_SrpGetPublic
  308. */
  309. int wc_SrpComputeKey(Srp* srp,
  310. byte* clientPubKey, word32 clientPubKeySz,
  311. byte* serverPubKey, word32 serverPubKeySz);
  312. /*!
  313. \ingroup SRP
  314. \brief 証明を取得します。この関数は、wc_srpcomputekeyの後に呼び出す必要があります。
  315. \return 0 成功
  316. \return BAD_FUNC_ARG SRP、PROV、またはSIZEがNULLの場合に返します。
  317. \return BUFFER_E サイズがSRP-> Typeのハッシュサイズより小さい場合に返します。
  318. \return <0 エラー
  319. \param srp SRP構造
  320. \param proof ピアプルーフ。
  321. _Example_
  322. \code
  323. Srp cli;
  324. byte clientProof[SRP_MAX_DIGEST_SIZE];
  325. word32 clientProofSz = SRP_MAX_DIGEST_SIZE;
  326. // Initialize Srp following steps from previous examples
  327. if (wc_SrpGetProof(&cli, clientProof, &clientProofSz) != 0)
  328. {
  329. // Error getting proof
  330. }
  331. \endcode
  332. \sa wc_SrpComputeKey
  333. */
  334. int wc_SrpGetProof(Srp* srp, byte* proof, word32* size);
  335. /*!
  336. \ingroup SRP
  337. \brief ピアプルーフを確認します。この関数は、WC_SRPGetSessionKeyの前に呼び出す必要があります。
  338. \return 0 成功
  339. \return <0 エラー
  340. \param srp SRP構造
  341. \param proof ピアプルーフ。
  342. _Example_
  343. \code
  344. Srp cli;
  345. Srp srv;
  346. byte clientProof[SRP_MAX_DIGEST_SIZE];
  347. word32 clientProofSz = SRP_MAX_DIGEST_SIZE;
  348. // Initialize Srp following steps from previous examples
  349. // First get the proof
  350. wc_SrpGetProof(&cli, clientProof, &clientProofSz)
  351. if (wc_SrpVerifyPeersProof(&srv, clientProof, clientProofSz) != 0)
  352. {
  353. // Error verifying proof
  354. }
  355. \endcode
  356. \sa wc_SrpGetSessionKey
  357. \sa wc_SrpGetProof
  358. \sa wc_SrpTerm
  359. */
  360. int wc_SrpVerifyPeersProof(Srp* srp, byte* proof, word32 size);