quic.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. /*!
  2. \ingroup QUIC
  3. \brief ハンドシェイク中にシークレットが生成されたときに呼び出されるコールバック。
  4. QUIC プロトコル ハンドラはパケットの暗号化/復号化を実行するため、
  5. レベル Early_data/handshake/application のネゴシエートされたシークレットが必要です。
  6. コールバックは、ハンドシェイク中に数回呼び出されます。 両方のどちらか
  7. または、読み取りシークレットまたは書き込みシークレットのみが提供される場合があります。 これは、
  8. 指定された暗号化レベルはすでに有効になっています。
  9. \return 成功すると 1 を返し、失敗すると 0 を返します。
  10. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  11. \param level - シークレットの暗号化レベル
  12. \param read_secret - 特定のレベルで復号化に使用されるシークレット。NULL の場合があります。
  13. \param write_secret - 特定のレベルで暗号化に使用されるシークレット。NULL の場合があります。
  14. \param secret_len - シークレットの長さ
  15. \sa wolfSSL_set_quic_method
  16. */
  17. int (*set_encryption_secrets)(WOLFSSL *ssl, WOLFSSL_ENCRYPTION_LEVEL レベル,
  18. const uint8_t *read_secret,
  19. const uint8_t *write_secret, size_t secret_len);
  20. /*!
  21. \ingroup QUIC
  22. \brief ハンドシェイク CRYPTO データをピアに転送するために呼び出されるコールバック。
  23. この方法で転送されるデータは暗号化されません。 QUICの仕事です
  24. これを行うためのプロトコル実装。 どのシークレットを使用するか
  25. 指定された暗号化レベルによって決まります。
  26. このコールバックは、ハンドシェイク中またはポスト ハンドシェイク中に数回呼び出される場合があります。
  27. 処理。 データは完全な CRYPTO レコードをカバーする場合がありますが、
  28. 部分的であること。 ただし、コールバックは以前にすべてのレコード データを受信しています。
  29. 別の暗号化レベルを使用しています。
  30. \return 成功すると 1 を返し、失敗すると 0 を返します。
  31. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  32. \param level - データの暗号化に使用する暗号化レベル
  33. \param data - データ自体
  34. \param len - データの長さ
  35. \sa wolfSSL_set_quic_method
  36. */
  37. int (*add_handshake_data)(WOLFSSL *ssl, WOLFSSL_ENCRYPTION_LEVEL レベル,
  38. const uint8_t *data, size_t len);
  39. /*!
  40. \ingroup QUIC
  41. \brief 送信するデータのアドバイザリ フラッシュのために呼び出されるコールバック。
  42. \return 成功すると 1 を返し、失敗すると 0 を返します。
  43. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  44. \sa wolfSSL_set_quic_method
  45. */
  46. int (*flush_flight)(WOLFSSL *ssl);
  47. /*!
  48. \ingroup QUIC
  49. \brief 処理中に SSL アラートが発生したときに呼び出されるコールバック。
  50. \return 成功すると 1 を返し、失敗すると 0 を返します。
  51. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  52. \param level - アラートが発生したときに有効だった暗号化レベル
  53. \param alert - エラー
  54. \sa wolfSSL_set_quic_method
  55. */
  56. int (*send_alert)(WOLFSSL *ssl, WOLFSSL_ENCRYPTION_LEVEL レベル, uint8_t アラート);
  57. /*!
  58. \ingroup QUIC
  59. \brief WOLFSSL_CTX および派生したすべての WOLFSSL インスタンスに対して QUIC プロトコルを有効にします
  60. 必要な 4 つのコールバックを提供します。 CTX は TLSv1.3 である必要があります。
  61. 渡された quic_method には、SSL インスタンスよりも長い寿命が必要です。
  62. コピーされません。 すべてのコールバックを提供する必要があります。
  63. \return WOLFSSL_SUCCESS 成功した場合。
  64. \param ctx - wolfSSL_CTX_new() を使用して作成された WOLFSSL_CTX 構造体へのポインター。
  65. \param quic_method - コールバック構造
  66. \sa wolfSSL_is_quic
  67. \sa wolfSSL_set_quic_method
  68. */
  69. int wolfSSL_CTX_set_quic_method(WOLFSSL_CTX *ctx, const WOLFSSL_QUIC_METHOD *quic_method);
  70. /*!
  71. \ingroup QUIC
  72. \brief を提供して、WOLFSSL インスタンスの QUIC プロトコルを有効にします。
  73. 4 つのコールバックが必要です。 WOLFSSL は TLSv1.3 である必要があります。
  74. 渡された quic_method には、SSL インスタンスよりも長い寿命が必要です。
  75. コピーされません。 すべてのコールバックを提供する必要があります。
  76. \return WOLFSSL_SUCCESS 成功した場合。
  77. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  78. \param quic_method - コールバック構造
  79. \sa wolfSSL_is_quic
  80. \sa wolfSSL_CTX_set_quic_method
  81. */
  82. int wolfSSL_set_quic_method(WOLFSSL *ssl, const WOLFSSL_QUIC_METHOD *quic_method);
  83. /*!
  84. \ingroup QUIC
  85. \brief QUIC が WOLFSSL インスタンスでアクティブ化されているかどうかを確認します。
  86. \return WOLFSSL が QUIC を使用している場合は 1 を返します。
  87. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  88. \sa wolfSSL_CTX_quic_method
  89. \sa wolfSSL_CTX_set_quic_method
  90. */
  91. int wolfSSL_is_quic(WOLFSSL *ssl);
  92. /*!
  93. \ingroup QUIC
  94. \brief 現在使用中の読み取りの暗号化レベルを決定します。 場合にのみ意味があります。
  95. WOLFSSL インスタンスは QUIC を使用しています。
  96. 有効レベルは、データを返すときは常にパラメーターであることに注意してください。
  97. 前方へ。 ピアからのデータは、これを介して報告される以外のレベルで到着する可能性があります
  98. 関数。
  99. \return 暗号化レベル。
  100. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  101. \sa wolfSSL_quic_write_level
  102. */
  103. WOLFSSL_ENCRYPTION_LEVEL wolfSSL_quic_read_level(const WOLFSSL *ssl);
  104. /*!
  105. \ingroup QUIC
  106. \brief 現在使用中の書き込みの暗号化レベルを決定します。 場合にのみ意味があります。
  107. WOLFSSL インスタンスは QUIC を使用しています。
  108. 有効レベルは、データを返すときは常にパラメーターであることに注意してください。
  109. 前方へ。 ピアからのデータは、これを介して報告される以外のレベルで到着する可能性があります
  110. 関数。
  111. \return 暗号化レベル。
  112. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  113. \sa wolfSSL_quic_read_level
  114. */
  115. WOLFSSL_ENCRYPTION_LEVEL wolfSSL_quic_write_level(const WOLFSSL *ssl);
  116. /*!
  117. \ingroup QUIC
  118. \brief どの QUIC バージョンを使用するかを設定します。 これを呼ばずに、
  119. WOLFSSL は両方 (draft-27 と v1) をサーバーに提供します。 受け入れる
  120. クライアントからの両方と、最新のものをネゴシエートします。
  121. \return WOLFSSL_SUCCESS 成功した場合。
  122. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  123. \param use_legacy - ドラフト 27 を使用する場合は true、QUICv1 のみを使用する場合は 0。
  124. \sa wolfSSL_set_quic_transport_version
  125. */
  126. void wolfSSL_set_quic_use_legacy_codepoint(WOLFSSL *ssl, int use_legacy);
  127. /*!
  128. \ingroup QUIC
  129. \brief どの QUIC バージョンを使用するかを設定します。
  130. \return WOLFSSL_SUCCESS 成功した場合。
  131. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  132. \param version - QUIC バージョン用に定義された TLS 拡張。
  133. \sa wolfSSL_set_quic_use_legacy_codepoint
  134. */
  135. void wolfSSL_set_quic_transport_version(WOLFSSL *ssl, int バージョン);
  136. /*!
  137. \ingroup QUIC
  138. \brief 構成された QUIC バージョンを取得します。
  139. \return 構成されたバージョンの TLS 拡張。
  140. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  141. \sa wolfSSL_set_quic_use_legacy_codepoint
  142. \sa wolfSSL_set_quic_transport_version
  143. */
  144. int wolfSSL_get_quic_transport_version(const WOLFSSL *ssl);
  145. /*!
  146. \ingroup QUIC
  147. \brief 使用する QUIC トランスポート パラメータを設定します。
  148. \return WOLFSSL_SUCCESS 成功した場合。
  149. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  150. \param params - 使用するパラメータ バイト
  151. ·param params_len - パラメータの長さ
  152. \sa wolfSSL_set_quic_use_legacy_codepoint
  153. \sa wolfSSL_set_quic_transport_version
  154. */
  155. int wolfSSL_set_quic_transport_params(WOLFSSL *ssl, const uint8_t *params, size_t params_len);
  156. /*!
  157. \ingroup QUIC
  158. \brief ネゴシエートされた QUIC トランスポート バージョンを取得します。 これは与えるだけです
  159. それぞれの TLS 拡張機能が有効になった後に呼び出されると、意味のある結果が得られます。
  160. ピアから見られました。
  161. \return ネゴシエートされたバージョンまたは -1 を返します。
  162. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  163. \sa wolfSSL_set_quic_use_legacy_codepoint
  164. \sa wolfSSL_set_quic_transport_version
  165. */
  166. int wolfSSL_get_peer_quic_transport_version(const WOLFSSL *ssl);
  167. /*!
  168. \ingroup QUIC
  169. \brief ネゴシエートされた QUIC トランスポート パラメータを取得します。 これは与えるだけです
  170. それぞれの TLS 拡張機能が有効になった後に呼び出されると、意味のある結果が得られます。
  171. ピアから見られました。
  172. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  173. \param out_params - ピアに送信されるパラメーター。利用できない場合は NULL に設定されます。
  174. \param out_params_len - ピアに送信されるパラメータの長さ。利用できない場合は 0 に設定
  175. \sa wolfSSL_get_peer_quic_transport_version
  176. */
  177. void wolfSSL_get_peer_quic_transport_params(const WOLFSSL *ssl, const uint8_t **out_params, size_t *out_params_len);
  178. /*!
  179. \ingroup QUIC
  180. \brief 初期データを有効にするかどうかを構成します。 サーバーがシグナルを送ることを目的としています
  181. これをクライアントに。
  182. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  183. \param enabled - != 初期データが有効な場合は 0
  184. */
  185. void wolfSSL_set_quic_early_data_enabled(WOLFSSL *ssl, int enabled);
  186. /*!
  187. \ingroup QUIC
  188. \brief 「飛行中」のデータ量についてアドバイスを得る。 未承認
  189. 指定された暗号化レベルで。 これはWOLFSSLインスタンスのデータ量です
  190. バッファする準備ができています。
  191. \return 飛行中の推奨最大データを返す
  192. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  193. \param level - 問い合わせる暗号化レベル
  194. */
  195. size_t wolfSSL_quic_max_handshake_flight_len(const WOLFSSL *ssl, WOLFSSL_ENCRYPTION_LEVEL レベル);
  196. /*!
  197. \ingroup QUIC
  198. \brief 復号化された CRYPTO データを、さらに処理するために WOLFSSL インスタンスに渡します。
  199. 通話間の暗号化レベルは、すべて増加することが許可されており、
  200. また、暗号化の変更前にデータレコードが完全であることを確認しました
  201. レベルが受け入れられます。
  202. \return WOLFSSL_SUCCESS 成功した場合。
  203. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  204. \param level - データが暗号化されたレベル
  205. \param data - データ自体
  206. \param len - データの長さ
  207. \sa wolfSSL_process_quic_post_handshake
  208. */
  209. int wolfSSL_provide_quic_data(WOLFSSL *ssl, WOLFSSL_ENCRYPTION_LEVEL レベル, const uint8_t *data, size_t len);
  210. /*!
  211. \ingroup QUIC
  212. \brief ハンドシェイク後に提供されたすべての CRYPTO レコードを処理します
  213. 完了しました。 それより前に呼び出すと失敗します。
  214. \return WOLFSSL_SUCCESS 成功した場合。
  215. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  216. \sa wolfSSL_provide_quic_data
  217. \sa wolfSSL_quic_read_write
  218. \sa wolfSSL_accept
  219. \sa wolfSSL_connect
  220. */
  221. WOLFSSL_API int wolfSSL_process_quic_post_handshake(WOLFSSL *ssl);
  222. /*!
  223. \ingroup QUIC
  224. \brief ハンドシェイク中またはハンドシェイク後に提供されたすべての CRYPTO レコードを処理します。
  225. ハンドシェイクがまだ完了していない場合は進行し、そうでない場合は次のように機能します
  226. wolfSSL_process_quic_post_handshake()。
  227. \return WOLFSSL_SUCCESS 成功した場合。
  228. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  229. \sa wolfSSL_provide_quic_data
  230. \sa wolfSSL_quic_read_write
  231. \sa wolfSSL_accept
  232. \sa wolfSSL_connect
  233. */
  234. int wolfSSL_quic_read_write(WOLFSSL *ssl);
  235. /*!
  236. \ingroup QUIC
  237. \brief TLS ハンドシェイクでネゴシエートされた AEAD 暗号を取得します。
  238. \return ネゴシエートされた暗号、または決定されない場合は NULL を返します。
  239. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  240. \sa wolfSSL_quic_aad_is_gcm
  241. \sa wolfSSL_quic_aad_is_ccm
  242. \sa wolfSSL_quic_aad_is_chacha20
  243. \sa wolfSSL_quic_get_aad_tag_len
  244. \sa wolfSSL_quic_get_md
  245. \sa wolfSSL_quic_get_hp
  246. \sa wolfSSL_quic_crypt_new
  247. \sa wolfSSL_quic_aad_encrypt
  248. \sa wolfSSL_quic_aad_decrypt
  249. */
  250. const WOLFSSL_EVP_CIPHER *wolfSSL_quic_get_aad(WOLFSSL *ssl);
  251. /*!
  252. \ingroup QUIC
  253. \brief AEAD 暗号が GCM かどうかを確認します。
  254. \return != 0 (AEAD 暗号が GCM の場合)。
  255. \param cipher - 暗号
  256. \sa wolfSSL_quic_get_aad
  257. \sa wolfSSL_quic_aad_is_ccm
  258. \sa wolfSSL_quic_aad_is_chacha20
  259. \sa wolfSSL_quic_get_aad_tag_len
  260. \sa wolfSSL_quic_get_md
  261. \sa wolfSSL_quic_get_hp
  262. \sa wolfSSL_quic_crypt_new
  263. \sa wolfSSL_quic_aad_encrypt
  264. \sa wolfSSL_quic_aad_decrypt
  265. */
  266. int wolfSSL_quic_aead_is_gcm(const WOLFSSL_EVP_CIPHER *aead_cipher);
  267. /*!
  268. \ingroup QUIC
  269. \brief AEAD 暗号が CCM かどうかを確認します。
  270. \return != 0 AEAD 暗号が CCM の場合。
  271. \param cipher - 暗号
  272. \sa wolfSSL_quic_get_aad
  273. \sa wolfSSL_quic_aad_is_gcm
  274. \sa wolfSSL_quic_aad_is_chacha20
  275. \sa wolfSSL_quic_get_aad_tag_len
  276. \sa wolfSSL_quic_get_md
  277. \sa wolfSSL_quic_get_hp
  278. \sa wolfSSL_quic_crypt_new
  279. \sa wolfSSL_quic_aad_encrypt
  280. \sa wolfSSL_quic_aad_decrypt
  281. */
  282. int wolfSSL_quic_aead_is_ccm(const WOLFSSL_EVP_CIPHER *aead_cipher);
  283. /*!
  284. \ingroup QUIC
  285. \brief AEAD 暗号が CHACHA20 かどうかを確認します。
  286. \return != 0 は、AEAD 暗号が CHACHA20 の場合です。
  287. \param cipher - 暗号
  288. \sa wolfSSL_quic_get_aad
  289. \sa wolfSSL_quic_aad_is_ccm
  290. \sa wolfSSL_quic_aad_is_gcm
  291. \sa wolfSSL_quic_get_aad_tag_len
  292. \sa wolfSSL_quic_get_md
  293. \sa wolfSSL_quic_get_hp
  294. \sa wolfSSL_quic_crypt_new
  295. \sa wolfSSL_quic_aad_encrypt
  296. \sa wolfSSL_quic_aad_decrypt
  297. */
  298. int wolfSSL_quic_aead_is_chacha20(const WOLFSSL_EVP_CIPHER *aead_cipher);
  299. /*!
  300. \ingroup QUIC
  301. \brief AEAD 暗号のタグの長さを決定します。
  302. \return AEAD 暗号のタグ長。
  303. \param cipher - 暗号
  304. \sa wolfSSL_quic_get_aad
  305. */
  306. WOLFSSL_API size_t wolfSSL_quic_get_aead_tag_len(const WOLFSSL_EVP_CIPHER *aead_cipher);
  307. /*!
  308. \ingroup QUIC
  309. \brief TLS ハンドシェイクでネゴシエートされたメッセージ ダイジェストを決定します。
  310. \return TLS ハンドシェイクでネゴシエートされたメッセージ ダイジェストを返す
  311. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  312. \sa wolfSSL_quic_get_aad
  313. \sa wolfSSL_quic_get_hp
  314. */
  315. WOLFSSL_API const WOLFSSL_EVP_MD *wolfSSL_quic_get_md(WOLFSSL *ssl);
  316. /*!
  317. \ingroup QUIC
  318. \brief TLS ハンドシェイクでネゴシエートされたヘッダー保護暗号を決定します。
  319. \return TLS ハンドシェイクでネゴシエートされたヘッダー保護暗号を返します
  320. \param ssl - wolfSSL_new() を使用して作成された WOLFSSL 構造体へのポインタ。
  321. \sa wolfSSL_quic_get_aad
  322. \sa wolfSSL_quic_get_md
  323. */
  324. const WOLFSSL_EVP_CIPHER *wolfSSL_quic_get_hp(WOLFSSL *ssl);
  325. /*!
  326. \ingroup QUIC
  327. \brief 暗号化/復号化のための暗号コンテキストを作成します。
  328. \return エラーの場合は、作成されたコンテキストまたは NULL を返します。
  329. \param cipher - コンテキストで使用する暗号。
  330. \param key - コンテキストで使用するキー。
  331. \param iv - コンテキストで使用する iv。
  332. \param encrypt - 暗号化の場合は != 0、それ以外の場合は復号化
  333. \sa wolfSSL_quic_get_aad
  334. \sa wolfSSL_quic_get_hp
  335. \sa wolfSSL_quic_aad_encrypt
  336. \sa wolfSSL_quic_aad_decrypt
  337. */
  338. WOLFSSL_EVP_CIPHER_CTX *wolfSSL_quic_crypt_new(const WOLFSSL_EVP_CIPHER *cipher,
  339. const uint8_t *key, const uint8_t *iv, int encrypt);
  340. /*!
  341. \ingroup QUIC
  342. \brief 指定されたコンテキストでプレーン テキストを暗号化します。
  343. \return WOLFSSL_SUCCESS 成功した場合。
  344. \param dest - 暗号化されたデータの書き込み先
  345. \param aead_ctx - 使用する暗号コンテキスト
  346. \param plain - 暗号化するプレーン データ
  347. \param plainlen - プレーン データの長さ
  348. \param iv - 使用する iv
  349. \param aad - 使用する追加
  350. \param aadlen - aad の長さ
  351. \sa wolfSSL_quic_get_aad
  352. \sa wolfSSL_quic_get_hp
  353. \sa wolfSSL_quic_crypt_new
  354. \sa wolfSSL_quic_aad_decrypt
  355. */
  356. int wolfSSL_quic_aead_encrypt(uint8_t *dest, WOLFSSL_EVP_CIPHER_CTX *aead_ctx,
  357. const uint8_t *plain, size_t plainlen,
  358. const uint8_t *iv, const uint8_t *aad, size_t aadlen);
  359. /*!
  360. \ingroup QUIC
  361. \brief 指定されたコンテキストで暗号文を復号化します。
  362. \return WOLFSSL_SUCCESS 成功した場合。
  363. \param dest - プレーンテキストの書き込み先
  364. \param ctx - 使用する暗号コンテキスト
  365. \param enc - 復号化する暗号化データ
  366. \param envlen - 暗号化されたデータの長さ
  367. \param iv - 使用する iv
  368. \param aad - 使用する追加
  369. \param aadlen - aad の長さ
  370. \sa wolfSSL_quic_get_aad
  371. \sa wolfSSL_quic_get_hp
  372. \sa wolfSSL_quic_crypt_new
  373. \sa wolfSSL_quic_aad_encrypt
  374. */
  375. int wolfSSL_quic_aad_decrypt(uint8_t *dest, WOLFSSL_EVP_CIPHER_CTX *ctx,
  376. const uint8_t *enc, size_t enclen,
  377. const uint8_t *iv, const uint8_t *aad, size_t aadlen);
  378. /*!
  379. \ingroup QUIC
  380. \brief 擬似乱数キーを抽出します。
  381. \return WOLFSSL_SUCCESS 成功した場合。
  382. \param dest - キーの書き込み先
  383. \param md - 使用するメッセージ ダイジェスト
  384. \param secret - 使用するシークレット
  385. \param secretlen - シークレットの長さ
  386. \param salt - 使用するソルト
  387. \param saltlen - ソルトの長さ
  388. \sa wolfSSL_quic_hkdf_expand
  389. \sa wolfSSL_quic_hkdf
  390. */
  391. int wolfSSL_quic_hkdf_extract(uint8_t *dest, const WOLFSSL_EVP_MD *md,
  392. const uint8_t *secret, size_t secretlen,
  393. const uint8_t *salt, size_t saltlen);
  394. /*!
  395. \ingroup QUIC
  396. \brief 疑似ランダム キーを新しいキーに展開します。
  397. \return WOLFSSL_SUCCESS 成功した場合。
  398. \param dest - キーの書き込み先
  399. \param destlen - 展開するキーの長さ
  400. \param md - 使用するメッセージ ダイジェスト
  401. \param secret - 使用するシークレット
  402. \param secretlen - シークレットの長さ
  403. \param info - 使用する情報
  404. \param infolen - 情報の長さ
  405. \sa wolfSSL_quic_hkdf_extract
  406. \sa wolfSSL_quic_hkdf
  407. */
  408. int wolfSSL_quic_hkdf_expand(uint8_t *dest, size_t destlen,
  409. const WOLFSSL_EVP_MD *md,
  410. const uint8_t *secret, size_t secretlen,
  411. const uint8_t *info, size_t infolen);
  412. /*!
  413. \ingroup QUIC
  414. \brief 疑似乱数キーを展開して抽出します。
  415. \return WOLFSSL_SUCCESS 成功した場合。
  416. \param dest - キーの書き込み先
  417. \param destlen - キーの長さ
  418. \param md - 使用するメッセージ ダイジェスト
  419. \param secret - 使用するシークレット
  420. \param secretlen - シークレットの長さ
  421. \param salt - 使用するソルト
  422. \param saltlen - ソルトの長さ
  423. \param info - 使用する情報
  424. \param infolen - 情報の長さ
  425. \sa wolfSSL_quic_hkdf_extract
  426. \sa wolfSSL_quic_hkdf_expand
  427. */
  428. int wolfSSL_quic_hkdf(uint8_t *dest, size_t destlen,
  429. const WOLFSSL_EVP_MD *md,
  430. const uint8_t *secret, size_t secretlen,
  431. const uint8_t *salt, size_t saltlen,
  432. const uint8_t *info, size_t infolen);