@annadata/capacitor-mqtt-quic 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/ios/include/nghttp3/nghttp3.h +3295 -0
  2. package/ios/include/nghttp3/version.h +46 -0
  3. package/ios/include/ngtcp2/ngtcp2.h +6254 -0
  4. package/ios/include/ngtcp2/ngtcp2_crypto.h +1037 -0
  5. package/ios/include/ngtcp2/ngtcp2_crypto_quictls.h +147 -0
  6. package/ios/include/ngtcp2/version.h +51 -0
  7. package/ios/include/openssl/aes.h +111 -0
  8. package/ios/include/openssl/asn1.h +1131 -0
  9. package/ios/include/openssl/asn1_mac.h +10 -0
  10. package/ios/include/openssl/asn1err.h +140 -0
  11. package/ios/include/openssl/asn1t.h +946 -0
  12. package/ios/include/openssl/async.h +96 -0
  13. package/ios/include/openssl/asyncerr.h +29 -0
  14. package/ios/include/openssl/bio.h +887 -0
  15. package/ios/include/openssl/bioerr.h +65 -0
  16. package/ios/include/openssl/blowfish.h +78 -0
  17. package/ios/include/openssl/bn.h +584 -0
  18. package/ios/include/openssl/bnerr.h +47 -0
  19. package/ios/include/openssl/buffer.h +62 -0
  20. package/ios/include/openssl/buffererr.h +25 -0
  21. package/ios/include/openssl/camellia.h +117 -0
  22. package/ios/include/openssl/cast.h +71 -0
  23. package/ios/include/openssl/cmac.h +52 -0
  24. package/ios/include/openssl/cmp.h +597 -0
  25. package/ios/include/openssl/cmp_util.h +56 -0
  26. package/ios/include/openssl/cmperr.h +116 -0
  27. package/ios/include/openssl/cms.h +493 -0
  28. package/ios/include/openssl/cmserr.h +124 -0
  29. package/ios/include/openssl/comp.h +59 -0
  30. package/ios/include/openssl/comperr.h +31 -0
  31. package/ios/include/openssl/conf.h +214 -0
  32. package/ios/include/openssl/conf_api.h +46 -0
  33. package/ios/include/openssl/conferr.h +52 -0
  34. package/ios/include/openssl/configuration.h +149 -0
  35. package/ios/include/openssl/conftypes.h +44 -0
  36. package/ios/include/openssl/core.h +233 -0
  37. package/ios/include/openssl/core_dispatch.h +960 -0
  38. package/ios/include/openssl/core_names.h +561 -0
  39. package/ios/include/openssl/core_object.h +41 -0
  40. package/ios/include/openssl/crmf.h +227 -0
  41. package/ios/include/openssl/crmferr.h +50 -0
  42. package/ios/include/openssl/crypto.h +558 -0
  43. package/ios/include/openssl/cryptoerr.h +55 -0
  44. package/ios/include/openssl/cryptoerr_legacy.h +1466 -0
  45. package/ios/include/openssl/ct.h +573 -0
  46. package/ios/include/openssl/cterr.h +45 -0
  47. package/ios/include/openssl/decoder.h +133 -0
  48. package/ios/include/openssl/decodererr.h +28 -0
  49. package/ios/include/openssl/des.h +211 -0
  50. package/ios/include/openssl/dh.h +335 -0
  51. package/ios/include/openssl/dherr.h +58 -0
  52. package/ios/include/openssl/dsa.h +280 -0
  53. package/ios/include/openssl/dsaerr.h +44 -0
  54. package/ios/include/openssl/dtls1.h +57 -0
  55. package/ios/include/openssl/e_os2.h +308 -0
  56. package/ios/include/openssl/ebcdic.h +39 -0
  57. package/ios/include/openssl/ec.h +1572 -0
  58. package/ios/include/openssl/ecdh.h +10 -0
  59. package/ios/include/openssl/ecdsa.h +10 -0
  60. package/ios/include/openssl/ecerr.h +104 -0
  61. package/ios/include/openssl/encoder.h +124 -0
  62. package/ios/include/openssl/encodererr.h +28 -0
  63. package/ios/include/openssl/engine.h +833 -0
  64. package/ios/include/openssl/engineerr.h +63 -0
  65. package/ios/include/openssl/err.h +504 -0
  66. package/ios/include/openssl/ess.h +128 -0
  67. package/ios/include/openssl/esserr.h +32 -0
  68. package/ios/include/openssl/evp.h +2175 -0
  69. package/ios/include/openssl/evperr.h +134 -0
  70. package/ios/include/openssl/fips_names.h +77 -0
  71. package/ios/include/openssl/fipskey.h +36 -0
  72. package/ios/include/openssl/hmac.h +62 -0
  73. package/ios/include/openssl/http.h +109 -0
  74. package/ios/include/openssl/httperr.h +55 -0
  75. package/ios/include/openssl/idea.h +82 -0
  76. package/ios/include/openssl/kdf.h +138 -0
  77. package/ios/include/openssl/kdferr.h +16 -0
  78. package/ios/include/openssl/lhash.h +331 -0
  79. package/ios/include/openssl/macros.h +325 -0
  80. package/ios/include/openssl/md2.h +56 -0
  81. package/ios/include/openssl/md4.h +63 -0
  82. package/ios/include/openssl/md5.h +62 -0
  83. package/ios/include/openssl/mdc2.h +55 -0
  84. package/ios/include/openssl/modes.h +219 -0
  85. package/ios/include/openssl/obj_mac.h +5481 -0
  86. package/ios/include/openssl/objects.h +183 -0
  87. package/ios/include/openssl/objectserr.h +28 -0
  88. package/ios/include/openssl/ocsp.h +483 -0
  89. package/ios/include/openssl/ocsperr.h +53 -0
  90. package/ios/include/openssl/opensslconf.h +17 -0
  91. package/ios/include/openssl/opensslv.h +114 -0
  92. package/ios/include/openssl/ossl_typ.h +16 -0
  93. package/ios/include/openssl/param_build.h +63 -0
  94. package/ios/include/openssl/params.h +160 -0
  95. package/ios/include/openssl/pem.h +541 -0
  96. package/ios/include/openssl/pem2.h +19 -0
  97. package/ios/include/openssl/pemerr.h +58 -0
  98. package/ios/include/openssl/pkcs12.h +353 -0
  99. package/ios/include/openssl/pkcs12err.h +45 -0
  100. package/ios/include/openssl/pkcs7.h +430 -0
  101. package/ios/include/openssl/pkcs7err.h +63 -0
  102. package/ios/include/openssl/prov_ssl.h +34 -0
  103. package/ios/include/openssl/proverr.h +149 -0
  104. package/ios/include/openssl/provider.h +60 -0
  105. package/ios/include/openssl/quic.h +19 -0
  106. package/ios/include/openssl/rand.h +125 -0
  107. package/ios/include/openssl/randerr.h +69 -0
  108. package/ios/include/openssl/rc2.h +68 -0
  109. package/ios/include/openssl/rc4.h +47 -0
  110. package/ios/include/openssl/rc5.h +79 -0
  111. package/ios/include/openssl/ripemd.h +59 -0
  112. package/ios/include/openssl/rsa.h +610 -0
  113. package/ios/include/openssl/rsaerr.h +107 -0
  114. package/ios/include/openssl/safestack.h +297 -0
  115. package/ios/include/openssl/seed.h +113 -0
  116. package/ios/include/openssl/self_test.h +94 -0
  117. package/ios/include/openssl/sha.h +138 -0
  118. package/ios/include/openssl/srp.h +285 -0
  119. package/ios/include/openssl/srtp.h +56 -0
  120. package/ios/include/openssl/ssl.h +2671 -0
  121. package/ios/include/openssl/ssl2.h +30 -0
  122. package/ios/include/openssl/ssl3.h +347 -0
  123. package/ios/include/openssl/sslerr.h +348 -0
  124. package/ios/include/openssl/sslerr_legacy.h +468 -0
  125. package/ios/include/openssl/stack.h +90 -0
  126. package/ios/include/openssl/store.h +369 -0
  127. package/ios/include/openssl/storeerr.h +49 -0
  128. package/ios/include/openssl/symhacks.h +39 -0
  129. package/ios/include/openssl/tls1.h +1186 -0
  130. package/ios/include/openssl/trace.h +312 -0
  131. package/ios/include/openssl/ts.h +505 -0
  132. package/ios/include/openssl/tserr.h +67 -0
  133. package/ios/include/openssl/txt_db.h +63 -0
  134. package/ios/include/openssl/types.h +239 -0
  135. package/ios/include/openssl/ui.h +407 -0
  136. package/ios/include/openssl/uierr.h +38 -0
  137. package/ios/include/openssl/whrlpool.h +62 -0
  138. package/ios/include/openssl/x509.h +1279 -0
  139. package/ios/include/openssl/x509_vfy.h +894 -0
  140. package/ios/include/openssl/x509err.h +69 -0
  141. package/ios/include/openssl/x509v3.h +1453 -0
  142. package/ios/include/openssl/x509v3err.h +93 -0
  143. package/ios/libs/libcrypto.a +0 -0
  144. package/ios/libs/libnghttp3.a +0 -0
  145. package/ios/libs/libngtcp2.a +0 -0
  146. package/ios/libs/libngtcp2_crypto_quictls.a +0 -0
  147. package/ios/libs/libssl.a +0 -0
  148. package/package.json +2 -2
@@ -0,0 +1,1037 @@
1
+ /*
2
+ * ngtcp2
3
+ *
4
+ * Copyright (c) 2019 ngtcp2 contributors
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining
7
+ * a copy of this software and associated documentation files (the
8
+ * "Software"), to deal in the Software without restriction, including
9
+ * without limitation the rights to use, copy, modify, merge, publish,
10
+ * distribute, sublicense, and/or sell copies of the Software, and to
11
+ * permit persons to whom the Software is furnished to do so, subject to
12
+ * the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be
15
+ * included in all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ */
25
+ #ifndef NGTCP2_CRYPTO_H
26
+ #define NGTCP2_CRYPTO_H
27
+
28
+ #include <ngtcp2/ngtcp2.h>
29
+
30
+ #ifdef __cplusplus
31
+ extern "C" {
32
+ #endif /* defined(__cplusplus) */
33
+
34
+ #ifdef WIN32
35
+ # ifndef WIN32_LEAN_AND_MEAN
36
+ # define WIN32_LEAN_AND_MEAN
37
+ # endif /* !defined(WIN32_LEAN_AND_MEAN) */
38
+ # include <ws2tcpip.h>
39
+ #endif /* defined(WIN32) */
40
+
41
+ /**
42
+ * @macrosection
43
+ *
44
+ * ngtcp2 crypto library error codes
45
+ */
46
+
47
+ /**
48
+ * @macro
49
+ *
50
+ * :macro:`NGTCP2_CRYPTO_ERR_INTERNAL` indicates an internal error.
51
+ */
52
+ #define NGTCP2_CRYPTO_ERR_INTERNAL -201
53
+
54
+ /**
55
+ * @macro
56
+ *
57
+ * :macro:`NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN` indicates that a token
58
+ * is unreadable because it is not correctly formatted; or verifying
59
+ * the integrity protection failed.
60
+ */
61
+ #define NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN -202
62
+
63
+ /**
64
+ * @macro
65
+ *
66
+ * :macro:`NGTCP2_CRYPTO_ERR_VERIFY_TOKEN` indicates that a token does
67
+ * not probe the client address; or the token validity has expired; or
68
+ * it contains invalid Connection ID.
69
+ */
70
+ #define NGTCP2_CRYPTO_ERR_VERIFY_TOKEN -203
71
+
72
+ /**
73
+ * @macro
74
+ *
75
+ * :macro:`NGTCP2_CRYPTO_ERR_NOMEM` indicates out of memory.
76
+ */
77
+ #define NGTCP2_CRYPTO_ERR_NOMEM -501
78
+
79
+ /**
80
+ * @function
81
+ *
82
+ * `ngtcp2_crypto_ctx_tls` initializes |ctx| by extracting negotiated
83
+ * ciphers and message digests from native TLS session
84
+ * |tls_native_handle|. This is used for encrypting/decrypting
85
+ * Handshake and 1-RTT packets. If it is unable to obtain necessary
86
+ * data from |tls_native_handle|, this function returns NULL.
87
+ *
88
+ * If libngtcp2_crypto_quictls is linked, |tls_native_handle| must be
89
+ * a pointer to SSL object.
90
+ */
91
+ NGTCP2_EXTERN ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_tls(ngtcp2_crypto_ctx *ctx,
92
+ void *tls_native_handle);
93
+
94
+ /**
95
+ * @function
96
+ *
97
+ * `ngtcp2_crypto_ctx_tls_early` initializes |ctx| by extracting early
98
+ * ciphers and message digests from native TLS session
99
+ * |tls_native_handle|. This is used for encrypting/decrypting 0-RTT
100
+ * packets. If it is unable to obtain necessary data from
101
+ * |tls_native_handle|, this function returns NULL.
102
+ *
103
+ * If libngtcp2_crypto_quictls is linked, |tls_native_handle| must be
104
+ * a pointer to SSL object.
105
+ */
106
+ NGTCP2_EXTERN ngtcp2_crypto_ctx *
107
+ ngtcp2_crypto_ctx_tls_early(ngtcp2_crypto_ctx *ctx, void *tls_native_handle);
108
+
109
+ /**
110
+ * @function
111
+ *
112
+ * `ngtcp2_crypto_md_init` initializes |md| with the provided
113
+ * |md_native_handle| which is an underlying message digest object.
114
+ *
115
+ * If libngtcp2_crypto_quictls is linked, |md_native_handle| must be a
116
+ * pointer to EVP_MD.
117
+ *
118
+ * If libngtcp2_crypto_gnutls is linked, |md_native_handle| must be
119
+ * gnutls_mac_algorithm_t casted to ``void *``.
120
+ *
121
+ * If libngtcp2_crypto_boringssl is linked, |md_native_handle| must be
122
+ * a pointer to EVP_MD.
123
+ */
124
+ NGTCP2_EXTERN ngtcp2_crypto_md *ngtcp2_crypto_md_init(ngtcp2_crypto_md *md,
125
+ void *md_native_handle);
126
+
127
+ /**
128
+ * @function
129
+ *
130
+ * `ngtcp2_crypto_md_hashlen` returns the length of |md| output.
131
+ */
132
+ NGTCP2_EXTERN size_t ngtcp2_crypto_md_hashlen(const ngtcp2_crypto_md *md);
133
+
134
+ /**
135
+ * @function
136
+ *
137
+ * `ngtcp2_crypto_aead_keylen` returns the length of key for |aead|.
138
+ */
139
+ NGTCP2_EXTERN size_t ngtcp2_crypto_aead_keylen(const ngtcp2_crypto_aead *aead);
140
+
141
+ /**
142
+ * @function
143
+ *
144
+ * `ngtcp2_crypto_aead_noncelen` returns the length of nonce for
145
+ * |aead|.
146
+ */
147
+ NGTCP2_EXTERN size_t
148
+ ngtcp2_crypto_aead_noncelen(const ngtcp2_crypto_aead *aead);
149
+
150
+ /**
151
+ * @function
152
+ *
153
+ * `ngtcp2_crypto_hkdf_extract` performs HKDF extract operation.
154
+ *
155
+ * The length of output is `ngtcp2_crypto_md_hashlen(md)
156
+ * <ngtcp2_crypto_md_hashlen>`. The output is stored in the buffer
157
+ * pointed by |dest|. The caller is responsible to specify the buffer
158
+ * that has enough capacity to store the output.
159
+ *
160
+ * This function returns 0 if it succeeds, or -1.
161
+ */
162
+ NGTCP2_EXTERN int
163
+ ngtcp2_crypto_hkdf_extract(uint8_t *dest, const ngtcp2_crypto_md *md,
164
+ const uint8_t *secret, size_t secretlen,
165
+ const uint8_t *salt, size_t saltlen);
166
+
167
+ /**
168
+ * @function
169
+ *
170
+ * `ngtcp2_crypto_hkdf_expand` performs HKDF expand operation. The
171
+ * result is |destlen| bytes long, and is stored in the buffer pointed
172
+ * by |dest|.
173
+ *
174
+ * This function returns 0 if it succeeds, or -1.
175
+ */
176
+ NGTCP2_EXTERN int ngtcp2_crypto_hkdf_expand(
177
+ uint8_t *dest, size_t destlen, const ngtcp2_crypto_md *md,
178
+ const uint8_t *secret, size_t secretlen, const uint8_t *info, size_t infolen);
179
+
180
+ /**
181
+ * @function
182
+ *
183
+ * `ngtcp2_crypto_hkdf` performs HKDF operation. The result is
184
+ * |destlen| bytes long, and is stored in the buffer pointed by
185
+ * |dest|.
186
+ *
187
+ * This function returns 0 if it succeeds, or -1.
188
+ */
189
+ NGTCP2_EXTERN int ngtcp2_crypto_hkdf(uint8_t *dest, size_t destlen,
190
+ const ngtcp2_crypto_md *md,
191
+ const uint8_t *secret, size_t secretlen,
192
+ const uint8_t *salt, size_t saltlen,
193
+ const uint8_t *info, size_t infolen);
194
+
195
+ /**
196
+ * @function
197
+ *
198
+ * `ngtcp2_crypto_packet_protection_ivlen` returns the length of IV
199
+ * used to encrypt QUIC packet.
200
+ */
201
+ NGTCP2_EXTERN size_t
202
+ ngtcp2_crypto_packet_protection_ivlen(const ngtcp2_crypto_aead *aead);
203
+
204
+ /**
205
+ * @function
206
+ *
207
+ * `ngtcp2_crypto_encrypt` encrypts |plaintext| of length
208
+ * |plaintextlen| and writes the ciphertext into the buffer pointed by
209
+ * |dest|. The length of ciphertext is |plaintextlen| +
210
+ * :member:`aead->max_overhead <ngtcp2_crypto_aead.max_overhead>`
211
+ * bytes long. |dest| must have enough capacity to store the
212
+ * ciphertext. |dest| and |plaintext| may point to the same buffer.
213
+ *
214
+ * This function returns 0 if it succeeds, or -1.
215
+ */
216
+ NGTCP2_EXTERN int ngtcp2_crypto_encrypt(uint8_t *dest,
217
+ const ngtcp2_crypto_aead *aead,
218
+ const ngtcp2_crypto_aead_ctx *aead_ctx,
219
+ const uint8_t *plaintext,
220
+ size_t plaintextlen,
221
+ const uint8_t *nonce, size_t noncelen,
222
+ const uint8_t *aad, size_t aadlen);
223
+
224
+ /**
225
+ * @function
226
+ *
227
+ * `ngtcp2_crypto_encrypt_cb` is a wrapper function around
228
+ * `ngtcp2_crypto_encrypt`. It can be directly passed to
229
+ * :member:`ngtcp2_callbacks.encrypt` field.
230
+ *
231
+ * This function returns 0 if it succeeds, or
232
+ * :macro:`NGTCP2_ERR_CALLBACK_FAILURE`.
233
+ */
234
+ NGTCP2_EXTERN int
235
+ ngtcp2_crypto_encrypt_cb(uint8_t *dest, const ngtcp2_crypto_aead *aead,
236
+ const ngtcp2_crypto_aead_ctx *aead_ctx,
237
+ const uint8_t *plaintext, size_t plaintextlen,
238
+ const uint8_t *nonce, size_t noncelen,
239
+ const uint8_t *aad, size_t aadlen);
240
+
241
+ /**
242
+ * @function
243
+ *
244
+ * `ngtcp2_crypto_decrypt` decrypts |ciphertext| of length
245
+ * |ciphertextlen| and writes the plaintext into the buffer pointed by
246
+ * |dest|. The length of plaintext is |ciphertextlen| -
247
+ * :member:`aead->max_overhead <ngtcp2_crypto_aead.max_overhead>`
248
+ * bytes long. |dest| must have enough capacity to store the
249
+ * plaintext. |dest| and |ciphertext| may point to the same buffer.
250
+ *
251
+ * This function returns 0 if it succeeds, or -1.
252
+ */
253
+ NGTCP2_EXTERN int ngtcp2_crypto_decrypt(uint8_t *dest,
254
+ const ngtcp2_crypto_aead *aead,
255
+ const ngtcp2_crypto_aead_ctx *aead_ctx,
256
+ const uint8_t *ciphertext,
257
+ size_t ciphertextlen,
258
+ const uint8_t *nonce, size_t noncelen,
259
+ const uint8_t *aad, size_t aadlen);
260
+
261
+ /**
262
+ * @function
263
+ *
264
+ * `ngtcp2_crypto_decrypt_cb` is a wrapper function around
265
+ * `ngtcp2_crypto_decrypt`. It can be directly passed to
266
+ * :member:`ngtcp2_callbacks.decrypt` field.
267
+ *
268
+ * This function returns 0 if it succeeds, or
269
+ * :macro:`NGTCP2_ERR_TLS_DECRYPT`.
270
+ */
271
+ NGTCP2_EXTERN int
272
+ ngtcp2_crypto_decrypt_cb(uint8_t *dest, const ngtcp2_crypto_aead *aead,
273
+ const ngtcp2_crypto_aead_ctx *aead_ctx,
274
+ const uint8_t *ciphertext, size_t ciphertextlen,
275
+ const uint8_t *nonce, size_t noncelen,
276
+ const uint8_t *aad, size_t aadlen);
277
+
278
+ /**
279
+ * @function
280
+ *
281
+ * `ngtcp2_crypto_hp_mask` generates a mask which is used in packet
282
+ * header encryption. The mask is written to the buffer pointed by
283
+ * |dest|. The sample is passed as |sample| which is
284
+ * :macro:`NGTCP2_HP_SAMPLELEN` bytes long. The length of mask must
285
+ * be at least :macro:`NGTCP2_HP_MASKLEN`. The library only uses the
286
+ * first :macro:`NGTCP2_HP_MASKLEN` bytes of the produced mask. The
287
+ * buffer pointed by |dest| must have at least
288
+ * :macro:`NGTCP2_HP_SAMPLELEN` bytes available.
289
+ *
290
+ * This function returns 0 if it succeeds, or -1.
291
+ */
292
+ NGTCP2_EXTERN int ngtcp2_crypto_hp_mask(uint8_t *dest,
293
+ const ngtcp2_crypto_cipher *hp,
294
+ const ngtcp2_crypto_cipher_ctx *hp_ctx,
295
+ const uint8_t *sample);
296
+
297
+ /**
298
+ * @function
299
+ *
300
+ * `ngtcp2_crypto_hp_mask_cb` is a wrapper function around
301
+ * `ngtcp2_crypto_hp_mask`. It can be directly passed to
302
+ * :member:`ngtcp2_callbacks.hp_mask` field.
303
+ *
304
+ * This function returns 0 if it succeeds, or
305
+ * :macro:`NGTCP2_ERR_CALLBACK_FAILURE`.
306
+ */
307
+ NGTCP2_EXTERN int
308
+ ngtcp2_crypto_hp_mask_cb(uint8_t *dest, const ngtcp2_crypto_cipher *hp,
309
+ const ngtcp2_crypto_cipher_ctx *hp_ctx,
310
+ const uint8_t *sample);
311
+
312
+ /**
313
+ * @function
314
+ *
315
+ * `ngtcp2_crypto_derive_and_install_rx_key` derives the decryption
316
+ * keying materials from |secret|, and installs them to |conn|.
317
+ *
318
+ * If |key| is not NULL, the derived packet protection key is written
319
+ * to the buffer pointed by |key|. If |iv| is not NULL, the derived
320
+ * packet protection IV is written to the buffer pointed by |iv|. If
321
+ * |hp| is not NULL, the derived header protection key is written to
322
+ * the buffer pointed by |hp|.
323
+ *
324
+ * |secretlen| specifies the length of |secret|.
325
+ *
326
+ * The length of packet protection key and header protection key is
327
+ * `ngtcp2_crypto_aead_keylen(ctx->aead) <ngtcp2_crypto_aead_keylen>`,
328
+ * and the length of packet protection IV is
329
+ * `ngtcp2_crypto_packet_protection_ivlen(ctx->aead)
330
+ * <ngtcp2_crypto_packet_protection_ivlen>` where ctx is obtained by
331
+ * `ngtcp2_crypto_ctx_tls` (or `ngtcp2_crypto_ctx_tls_early` if
332
+ * |level| ==
333
+ * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`).
334
+ *
335
+ * In the first call of this function, it calls
336
+ * `ngtcp2_conn_set_crypto_ctx` (or `ngtcp2_conn_set_early_crypto_ctx`
337
+ * if |level| ==
338
+ * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to
339
+ * set negotiated AEAD and message digest algorithm. After the
340
+ * successful call of this function, application can use
341
+ * `ngtcp2_conn_get_crypto_ctx` (or `ngtcp2_conn_get_0rtt_crypto_ctx`
342
+ * if |level| ==
343
+ * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to
344
+ * get :type:`ngtcp2_crypto_ctx`.
345
+ *
346
+ * If |conn| is initialized as client, and |level| is
347
+ * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_1RTT`, this
348
+ * function retrieves a remote QUIC transport parameters extension
349
+ * from an object obtained by `ngtcp2_conn_get_tls_native_handle`, and
350
+ * sets it to |conn| by calling
351
+ * `ngtcp2_conn_decode_and_set_remote_transport_params`.
352
+ *
353
+ * This function returns 0 if it succeeds, or -1.
354
+ */
355
+ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_rx_key(
356
+ ngtcp2_conn *conn, uint8_t *key, uint8_t *iv, uint8_t *hp,
357
+ ngtcp2_encryption_level level, const uint8_t *secret, size_t secretlen);
358
+
359
+ /**
360
+ * @function
361
+ *
362
+ * `ngtcp2_crypto_derive_and_install_tx_key` derives the encryption
363
+ * keying materials from |secret|, and installs new keys to |conn|.
364
+ *
365
+ * If |key| is not NULL, the derived packet protection key is written
366
+ * to the buffer pointed by |key|. If |iv| is not NULL, the derived
367
+ * packet protection IV is written to the buffer pointed by |iv|. If
368
+ * |hp| is not NULL, the derived header protection key is written to
369
+ * the buffer pointed by |hp|.
370
+ *
371
+ * |secretlen| specifies the length of |secret|.
372
+ *
373
+ * The length of packet protection key and header protection key is
374
+ * `ngtcp2_crypto_aead_keylen(ctx->aead) <ngtcp2_crypto_aead_keylen>`,
375
+ * and the length of packet protection IV is
376
+ * `ngtcp2_crypto_packet_protection_ivlen(ctx->aead)
377
+ * <ngtcp2_crypto_packet_protection_ivlen>` where ctx is obtained by
378
+ * `ngtcp2_crypto_ctx_tls` (or `ngtcp2_crypto_ctx_tls_early` if
379
+ * |level| ==
380
+ * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`).
381
+ *
382
+ * In the first call of this function, it calls
383
+ * `ngtcp2_conn_set_crypto_ctx` (or `ngtcp2_conn_set_early_crypto_ctx`
384
+ * if |level| ==
385
+ * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to
386
+ * set negotiated AEAD and message digest algorithm. After the
387
+ * successful call of this function, application can use
388
+ * `ngtcp2_conn_get_crypto_ctx` (or `ngtcp2_conn_get_0rtt_crypto_ctx`
389
+ * if |level| ==
390
+ * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to
391
+ * get :type:`ngtcp2_crypto_ctx`.
392
+ *
393
+ * If |conn| is initialized as server, and |level| is
394
+ * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_1RTT`, this
395
+ * function retrieves a remote QUIC transport parameters extension
396
+ * from an object obtained by `ngtcp2_conn_get_tls_native_handle`, and
397
+ * sets it to |conn| by calling
398
+ * `ngtcp2_conn_decode_and_set_remote_transport_params`.
399
+ *
400
+ * This function returns 0 if it succeeds, or -1.
401
+ */
402
+ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_tx_key(
403
+ ngtcp2_conn *conn, uint8_t *key, uint8_t *iv, uint8_t *hp,
404
+ ngtcp2_encryption_level level, const uint8_t *secret, size_t secretlen);
405
+
406
+ /**
407
+ * @function
408
+ *
409
+ * `ngtcp2_crypto_update_key` updates traffic keying materials.
410
+ *
411
+ * The new decryption traffic secret is written to the buffer pointed
412
+ * by |rx_secret|. The length of secret is |secretlen| bytes, and
413
+ * |rx_secret| must point to the buffer which has enough capacity.
414
+ *
415
+ * The new encryption traffic secret is written to the buffer pointed
416
+ * by |tx_secret|. The length of secret is |secretlen| bytes, and
417
+ * |tx_secret| must point to the buffer which has enough capacity.
418
+ *
419
+ * The derived decryption packet protection key is written to the
420
+ * buffer pointed by |rx_key|. The derived decryption packet
421
+ * protection IV is written to the buffer pointed by |rx_iv|.
422
+ * |rx_aead_ctx| is initialized with the derived key and IV.
423
+ *
424
+ * The derived encryption packet protection key is written to the
425
+ * buffer pointed by |tx_key|. The derived encryption packet
426
+ * protection IV is written to the buffer pointed by |tx_iv|.
427
+ * |tx_aead_ctx| is initialized with the derived key and IV.
428
+ *
429
+ * |current_rx_secret| and |current_tx_secret| are the current
430
+ * decryption and encryption traffic secrets respectively. They share
431
+ * the same length with |rx_secret| and |tx_secret|.
432
+ *
433
+ * The length of packet protection key and header protection key is
434
+ * `ngtcp2_crypto_aead_keylen(ctx->aead) <ngtcp2_crypto_aead_keylen>`,
435
+ * and the length of packet protection IV is
436
+ * `ngtcp2_crypto_packet_protection_ivlen(ctx->aead)
437
+ * <ngtcp2_crypto_packet_protection_ivlen>` where ctx is obtained by
438
+ * `ngtcp2_crypto_ctx_tls`.
439
+ *
440
+ * This function returns 0 if it succeeds, or -1.
441
+ */
442
+ NGTCP2_EXTERN int ngtcp2_crypto_update_key(
443
+ ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret,
444
+ ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_key, uint8_t *rx_iv,
445
+ ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_key, uint8_t *tx_iv,
446
+ const uint8_t *current_rx_secret, const uint8_t *current_tx_secret,
447
+ size_t secretlen);
448
+
449
+ /**
450
+ * @function
451
+ *
452
+ * `ngtcp2_crypto_update_key_cb` is a wrapper function around
453
+ * `ngtcp2_crypto_update_key`. It can be directly passed to
454
+ * :member:`ngtcp2_callbacks.update_key` field.
455
+ *
456
+ * This function returns 0 if it succeeds, or
457
+ * :macro:`NGTCP2_ERR_CALLBACK_FAILURE`.
458
+ */
459
+ NGTCP2_EXTERN int ngtcp2_crypto_update_key_cb(
460
+ ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret,
461
+ ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv,
462
+ ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv,
463
+ const uint8_t *current_rx_secret, const uint8_t *current_tx_secret,
464
+ size_t secretlen, void *user_data);
465
+
466
+ /**
467
+ * @function
468
+ *
469
+ * `ngtcp2_crypto_client_initial_cb` installs initial secrets and
470
+ * encryption keys, and sets QUIC transport parameters.
471
+ *
472
+ * This function can be directly passed to
473
+ * :member:`ngtcp2_callbacks.client_initial` field. It is only used
474
+ * by client.
475
+ *
476
+ * This function returns 0 if it succeeds, or
477
+ * :macro:`NGTCP2_ERR_CALLBACK_FAILURE`.
478
+ */
479
+ NGTCP2_EXTERN int ngtcp2_crypto_client_initial_cb(ngtcp2_conn *conn,
480
+ void *user_data);
481
+
482
+ /**
483
+ * @function
484
+ *
485
+ * `ngtcp2_crypto_recv_retry_cb` re-installs initial secrets in
486
+ * response to incoming Retry packet.
487
+ *
488
+ * This function can be directly passed to
489
+ * :member:`ngtcp2_callbacks.recv_retry` field. It is only used by
490
+ * client.
491
+ *
492
+ * This function returns 0 if it succeeds, or
493
+ * :macro:`NGTCP2_ERR_CALLBACK_FAILURE`.
494
+ */
495
+ NGTCP2_EXTERN int ngtcp2_crypto_recv_retry_cb(ngtcp2_conn *conn,
496
+ const ngtcp2_pkt_hd *hd,
497
+ void *user_data);
498
+
499
+ /**
500
+ * @function
501
+ *
502
+ * `ngtcp2_crypto_recv_client_initial_cb` installs initial secrets in
503
+ * response to an incoming Initial packet from client, and sets QUIC
504
+ * transport parameters.
505
+ *
506
+ * This function can be directly passed to
507
+ * :member:`ngtcp2_callbacks.recv_client_initial` field. It is only
508
+ * used by server.
509
+ *
510
+ * This function returns 0 if it succeeds, or
511
+ * :macro:`NGTCP2_ERR_CALLBACK_FAILURE`.
512
+ */
513
+ NGTCP2_EXTERN int ngtcp2_crypto_recv_client_initial_cb(ngtcp2_conn *conn,
514
+ const ngtcp2_cid *dcid,
515
+ void *user_data);
516
+
517
+ /**
518
+ * @function
519
+ *
520
+ * `ngtcp2_crypto_read_write_crypto_data` reads CRYPTO data |data| of
521
+ * length |datalen| in an encryption level |encryption_level|, and may
522
+ * feed outgoing CRYPTO data to |conn|. This function can drive
523
+ * handshake. This function can be also used after handshake
524
+ * completes. It is allowed to call this function with |datalen| ==
525
+ * 0. In this case, no additional read operation is done.
526
+ *
527
+ * This function returns 0 if it succeeds, or a negative error code.
528
+ * The generic error code is -1 if a specific error code is not
529
+ * suitable. The error codes less than -10000 are specific to
530
+ * underlying TLS implementation. For quictls, the error codes are
531
+ * defined in *ngtcp2_crypto_quictls.h*.
532
+ */
533
+ NGTCP2_EXTERN int
534
+ ngtcp2_crypto_read_write_crypto_data(ngtcp2_conn *conn,
535
+ ngtcp2_encryption_level encryption_level,
536
+ const uint8_t *data, size_t datalen);
537
+
538
+ /**
539
+ * @function
540
+ *
541
+ * `ngtcp2_crypto_recv_crypto_data_cb` is a wrapper function around
542
+ * `ngtcp2_crypto_read_write_crypto_data`. It can be directly passed
543
+ * to :member:`ngtcp2_callbacks.recv_crypto_data` field.
544
+ *
545
+ * If this function is used, the TLS implementation specific error
546
+ * codes described in `ngtcp2_crypto_read_write_crypto_data` are
547
+ * treated as if it returns -1. Do not use this function if an
548
+ * application wishes to use the TLS implementation specific error
549
+ * codes.
550
+ */
551
+ NGTCP2_EXTERN int ngtcp2_crypto_recv_crypto_data_cb(
552
+ ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, uint64_t offset,
553
+ const uint8_t *data, size_t datalen, void *user_data);
554
+
555
+ /**
556
+ * @function
557
+ *
558
+ * `ngtcp2_crypto_generate_stateless_reset_token` generates a
559
+ * stateless reset token using HKDF extraction using the given |cid|
560
+ * and |secret| as input. The token will be written to the buffer
561
+ * pointed by |token|, and it must have a capacity of at least
562
+ * :macro:`NGTCP2_STATELESS_RESET_TOKENLEN` bytes.
563
+ *
564
+ * This function returns 0 if it succeeds, or -1.
565
+ */
566
+ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token(
567
+ uint8_t *token, const uint8_t *secret, size_t secretlen,
568
+ const ngtcp2_cid *cid);
569
+
570
+ /**
571
+ * @macro
572
+ *
573
+ * :macro:`NGTCP2_CRYPTO_TOKEN_RAND_DATALEN` is the length of random
574
+ * data added to a token generated by
575
+ * `ngtcp2_crypto_generate_retry_token` or
576
+ * `ngtcp2_crypto_generate_regular_token`.
577
+ */
578
+ #define NGTCP2_CRYPTO_TOKEN_RAND_DATALEN 16
579
+
580
+ /**
581
+ * @macro
582
+ *
583
+ * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY` is the magic byte for
584
+ * Retry token generated by `ngtcp2_crypto_generate_retry_token`.
585
+ */
586
+ #define NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY 0xb6
587
+
588
+ /**
589
+ * @macro
590
+ *
591
+ * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2` is the magic byte for
592
+ * Retry token generated by `ngtcp2_crypto_generate_retry_token2`.
593
+ */
594
+ #define NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2 0xb7
595
+
596
+ /**
597
+ * @macro
598
+ *
599
+ * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_REGULAR` is the magic byte for a
600
+ * token generated by `ngtcp2_crypto_generate_regular_token`.
601
+ */
602
+ #define NGTCP2_CRYPTO_TOKEN_MAGIC_REGULAR 0x36
603
+
604
+ /**
605
+ * @macro
606
+ *
607
+ * :macro:`NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN` is the maximum length of
608
+ * a token generated by `ngtcp2_crypto_generate_retry_token`.
609
+ */
610
+ #define NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN \
611
+ (/* magic = */ 1 + /* cid len = */ 1 + NGTCP2_MAX_CIDLEN + \
612
+ sizeof(ngtcp2_tstamp) + /* aead tag = */ 16 + \
613
+ NGTCP2_CRYPTO_TOKEN_RAND_DATALEN)
614
+
615
+ /**
616
+ * @macro
617
+ *
618
+ * :macro:`NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2` is the maximum length of
619
+ * a token generated by `ngtcp2_crypto_generate_retry_token2`.
620
+ */
621
+ #define NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2 \
622
+ (/* magic = */ 1 + sizeof(ngtcp2_sockaddr_union) + /* cid len = */ 1 + \
623
+ NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp) + /* aead tag = */ 16 + \
624
+ NGTCP2_CRYPTO_TOKEN_RAND_DATALEN)
625
+
626
+ /**
627
+ * @macro
628
+ *
629
+ * :macro:`NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN` is the maximum length
630
+ * of a token generated by `ngtcp2_crypto_generate_regular_token`.
631
+ * `ngtcp2_crypto_generate_regular_token2` generates a token of length
632
+ * at most :macro:`NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN` bytes + the
633
+ * length of the provided opaque data.
634
+ */
635
+ #define NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN \
636
+ (/* magic = */ 1 + sizeof(ngtcp2_tstamp) + /* aead tag = */ 16 + \
637
+ NGTCP2_CRYPTO_TOKEN_RAND_DATALEN)
638
+
639
+ /**
640
+ * @function
641
+ *
642
+ * `ngtcp2_crypto_generate_retry_token` generates a token in the
643
+ * buffer pointed by |token| that is sent with Retry packet. The
644
+ * buffer pointed by |token| must have at least
645
+ * :macro:`NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN` bytes long. The
646
+ * successfully generated token starts with
647
+ * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY`. |secret| of length
648
+ * |secretlen| is a keying material to generate keys to encrypt the
649
+ * token. |version| is QUIC version. |remote_addr| of length
650
+ * |remote_addrlen| is an address of client. |retry_scid| is a Source
651
+ * Connection ID chosen by server, and set in Retry packet. |odcid|
652
+ * is a Destination Connection ID in Initial packet sent by client.
653
+ * |ts| is the timestamp when the token is generated.
654
+ *
655
+ * See also `ngtcp2_crypto_generate_retry_token2`.
656
+ *
657
+ * This function returns the length of generated token if it succeeds,
658
+ * or -1.
659
+ */
660
+ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_retry_token(
661
+ uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version,
662
+ const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen,
663
+ const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts);
664
+
665
+ /**
666
+ * @function
667
+ *
668
+ * `ngtcp2_crypto_verify_retry_token` verifies Retry token stored in
669
+ * the buffer pointed by |token| of length |tokenlen|. |secret| of
670
+ * length |secretlen| is a keying material to generate keys to decrypt
671
+ * the token. |version| is QUIC version of the Initial packet that
672
+ * contains this token. |remote_addr| of length |remote_addrlen| is
673
+ * an address of client. |dcid| is a Destination Connection ID in
674
+ * Initial packet sent by client. |timeout| is the period during
675
+ * which the token is valid. |ts| is the current timestamp. When
676
+ * validation succeeds, the extracted Destination Connection ID (which
677
+ * is the Destination Connection ID in Initial packet sent by client
678
+ * that triggered Retry packet) is stored in the buffer pointed by
679
+ * |odcid|.
680
+ *
681
+ * This function returns 0 if it succeeds, or -1.
682
+ */
683
+ NGTCP2_EXTERN int ngtcp2_crypto_verify_retry_token(
684
+ ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen,
685
+ const uint8_t *secret, size_t secretlen, uint32_t version,
686
+ const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen,
687
+ const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts);
688
+
689
+ /**
690
+ * @function
691
+ *
692
+ * `ngtcp2_crypto_generate_retry_token2` generates a token in the
693
+ * buffer pointed by |token| that is sent with Retry packet. The
694
+ * buffer pointed by |token| must have at least
695
+ * :macro:`NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2` bytes long. The
696
+ * successfully generated token starts with
697
+ * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2`. |secret| of length
698
+ * |secretlen| is a keying material to generate keys to encrypt the
699
+ * token. |version| is QUIC version. |remote_addr| of length
700
+ * |remote_addrlen| is an address of client. |retry_scid| is a Source
701
+ * Connection ID chosen by server, and set in Retry packet. |odcid|
702
+ * is a Destination Connection ID in Initial packet sent by client.
703
+ * |ts| is the timestamp when the token is generated.
704
+ *
705
+ * Use this function instead of `ngtcp2_crypto_generate_retry_token`
706
+ * if more detailed error handling is required when verifying the
707
+ * token. `ngtcp2_crypto_verify_retry_token2` must be used to verify
708
+ * the token.
709
+ *
710
+ * This function returns the length of generated token if it succeeds,
711
+ * or -1.
712
+ */
713
+ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_retry_token2(
714
+ uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version,
715
+ const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen,
716
+ const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts);
717
+
718
+ /**
719
+ * @function
720
+ *
721
+ * `ngtcp2_crypto_verify_retry_token2` verifies Retry token stored in
722
+ * the buffer pointed by |token| of length |tokenlen|. |secret| of
723
+ * length |secretlen| is a keying material to generate keys to decrypt
724
+ * the token. |version| is QUIC version of the Initial packet that
725
+ * contains this token. |remote_addr| of length |remote_addrlen| is
726
+ * an address of client. |dcid| is a Destination Connection ID in
727
+ * Initial packet sent by client. |timeout| is the period during
728
+ * which the token is valid. |ts| is the current timestamp. When
729
+ * validation succeeds, the extracted Destination Connection ID (which
730
+ * is the Destination Connection ID in Initial packet sent by client
731
+ * that triggered Retry packet) is stored in the buffer pointed by
732
+ * |odcid|.
733
+ *
734
+ * The token must be generated by
735
+ * `ngtcp2_crypto_generate_retry_token2`.
736
+ *
737
+ * This function returns 0 if it succeeds, or one of the following
738
+ * negative error codes:
739
+ *
740
+ * :macro:`NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN`
741
+ * A token is badly formatted; or verifying the integrity
742
+ * protection failed.
743
+ * :macro:`NGTCP2_CRYPTO_ERR_VERIFY_TOKEN`
744
+ * A token does not probe the client address; or the token
745
+ * validity has expired; or it contains invalid Connection ID.
746
+ * :macro:`NGTCP2_CRYPTO_ERR_INTERNAL`
747
+ * Internal error occurred.
748
+ */
749
+ NGTCP2_EXTERN int ngtcp2_crypto_verify_retry_token2(
750
+ ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen,
751
+ const uint8_t *secret, size_t secretlen, uint32_t version,
752
+ const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen,
753
+ const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts);
754
+
755
+ /**
756
+ * @function
757
+ *
758
+ * `ngtcp2_crypto_generate_regular_token` generates a token in the
759
+ * buffer pointed by |token| that is sent with NEW_TOKEN frame. The
760
+ * buffer pointed by |token| must have at least
761
+ * :macro:`NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN` bytes long. The
762
+ * successfully generated token starts with
763
+ * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_REGULAR`. |secret| of length
764
+ * |secretlen| is a keying material to generate keys to encrypt the
765
+ * token. |remote_addr| of length |remote_addrlen| is an address of
766
+ * client. |ts| is the timestamp when the token is generated.
767
+ *
768
+ * This function returns the length of generated token if it succeeds,
769
+ * or -1.
770
+ */
771
+ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_regular_token(
772
+ uint8_t *token, const uint8_t *secret, size_t secretlen,
773
+ const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen,
774
+ ngtcp2_tstamp ts);
775
+
776
+ /**
777
+ * @function
778
+ *
779
+ * `ngtcp2_crypto_verify_regular_token` verifies a regular token
780
+ * stored in the buffer pointed by |token| of length |tokenlen|.
781
+ * |secret| of length |secretlen| is a keying material to generate
782
+ * keys to decrypt the token. |remote_addr| of length
783
+ * |remote_addrlen| is an address of client. |timeout| is the period
784
+ * during which the token is valid. |ts| is the current timestamp.
785
+ *
786
+ * This function returns 0 if it succeeds, or -1.
787
+ */
788
+ NGTCP2_EXTERN int ngtcp2_crypto_verify_regular_token(
789
+ const uint8_t *token, size_t tokenlen, const uint8_t *secret,
790
+ size_t secretlen, const ngtcp2_sockaddr *remote_addr,
791
+ ngtcp2_socklen remote_addrlen, ngtcp2_duration timeout, ngtcp2_tstamp ts);
792
+
793
+ /**
794
+ * @function
795
+ *
796
+ * `ngtcp2_crypto_generate_regular_token2` generates a token in the
797
+ * buffer pointed by |token| that is sent with NEW_TOKEN frame. The
798
+ * buffer pointed by |token| must have at least
799
+ * :macro:`NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN` + |datalen| bytes long.
800
+ * The successfully generated token starts with
801
+ * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_REGULAR`. |secret| of length
802
+ * |secretlen| is a keying material to generate keys to encrypt the
803
+ * token. |remote_addr| of length |remote_addrlen| is an address of
804
+ * client. |ts| is the timestamp when the token is generated. |data|
805
+ * of length |datalen| is an opaque data embedded in the token.
806
+ * |datalen| must be less than or equal to 256.
807
+ *
808
+ * Calling this function with |datalen| = 0 is equivalent to calling
809
+ * `ngtcp2_crypto_generate_regular_token`.
810
+ *
811
+ * To get the opaque data after successful verification, use
812
+ * `ngtcp2_crypto_verify_regular_token2`.
813
+ * `ngtcp2_crypto_verify_regular_token` can verify the token with
814
+ * |datalen| > 0, but it discards the opaque data.
815
+ *
816
+ * This function returns the length of generated token if it succeeds,
817
+ * or -1.
818
+ */
819
+ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_regular_token2(
820
+ uint8_t *token, const uint8_t *secret, size_t secretlen,
821
+ const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen,
822
+ const void *data, size_t datalen, ngtcp2_tstamp ts);
823
+
824
+ /**
825
+ * @function
826
+ *
827
+ * `ngtcp2_crypto_verify_regular_token2` verifies a regular token
828
+ * stored in the buffer pointed by |token| of length |tokenlen|.
829
+ * |secret| of length |secretlen| is a keying material to generate
830
+ * keys to decrypt the token. |remote_addr| of length
831
+ * |remote_addrlen| is an address of client. |timeout| is the period
832
+ * during which the token is valid. |ts| is the current timestamp.
833
+ * |data| is the pointer to the buffer of length at least
834
+ * |max_datalen| bytes. If the token is verified successfully, the
835
+ * opaque data embedded in the token is copied to the buffer pointed
836
+ * by |data|.
837
+ *
838
+ * If |tokenlen| is less than
839
+ * :macro:`NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN`, this function returns
840
+ * :macro:`NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN`.
841
+ *
842
+ * If the length of opaque data is larger than |max_datalen|, the
843
+ * verification still succeeds, but nothing is written to the buffer
844
+ * pointed by |data|, and this function returns 0. In other words,
845
+ * the opaque data is discarded.
846
+ *
847
+ * This function returns the number of the opaque data written to the
848
+ * buffer pointed by |data| if it succeeds, or one of the following
849
+ * negative error codes:
850
+ *
851
+ * :macro:`NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN`
852
+ * A token is badly formatted; or verifying the integrity
853
+ * protection failed.
854
+ * :macro:`NGTCP2_CRYPTO_ERR_VERIFY_TOKEN`
855
+ * A token validity has expired.
856
+ * :macro:`NGTCP2_CRYPTO_ERR_INTERNAL`
857
+ * Internal error occurred.
858
+ */
859
+ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_verify_regular_token2(
860
+ void *data, size_t max_datalen, const uint8_t *token, size_t tokenlen,
861
+ const uint8_t *secret, size_t secretlen, const ngtcp2_sockaddr *remote_addr,
862
+ ngtcp2_socklen remote_addrlen, ngtcp2_duration timeout, ngtcp2_tstamp ts);
863
+
864
+ /**
865
+ * @function
866
+ *
867
+ * `ngtcp2_crypto_write_connection_close` writes Initial packet
868
+ * containing CONNECTION_CLOSE with the given |error_code| and the
869
+ * optional |reason| of length |reasonlen| to the buffer pointed by
870
+ * |dest| of length |destlen|. This function is designed for server
871
+ * to close connection without committing the state when validating
872
+ * Retry token fails. This function must not be used by client. The
873
+ * |dcid| must be the Source Connection ID in Initial packet from
874
+ * client. The |scid| must be the Destination Connection ID in
875
+ * Initial packet from client. |scid| is used to derive initial
876
+ * keying materials.
877
+ *
878
+ * This function wraps around `ngtcp2_pkt_write_connection_close` for
879
+ * easier use.
880
+ *
881
+ * This function returns 0 if it succeeds, or -1.
882
+ */
883
+ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_write_connection_close(
884
+ uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid,
885
+ const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason,
886
+ size_t reasonlen);
887
+
888
+ /**
889
+ * @function
890
+ *
891
+ * `ngtcp2_crypto_write_retry` writes Retry packet to the buffer
892
+ * pointed by |dest| of length |destlen|. |dcid| is the Connection ID
893
+ * which appeared in a packet as a Source Connection ID sent by
894
+ * client. |scid| is a server chosen Source Connection ID. |odcid|
895
+ * specifies Original Destination Connection ID which appeared in a
896
+ * packet as a Destination Connection ID sent by client. |token|
897
+ * specifies Retry Token, and |tokenlen| specifies its length.
898
+ *
899
+ * This function wraps around `ngtcp2_pkt_write_retry` for easier use.
900
+ *
901
+ * This function returns 0 if it succeeds, or -1.
902
+ */
903
+ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_write_retry(
904
+ uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid,
905
+ const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token,
906
+ size_t tokenlen);
907
+
908
+ /**
909
+ * @function
910
+ *
911
+ * `ngtcp2_crypto_aead_ctx_encrypt_init` initializes |aead_ctx| with
912
+ * new AEAD cipher context object for encryption which is constructed
913
+ * to use |key| as encryption key. |aead| specifies AEAD cipher to
914
+ * use. |noncelen| is the length of nonce.
915
+ *
916
+ * This function returns 0 if it succeeds, or -1.
917
+ */
918
+ NGTCP2_EXTERN int
919
+ ngtcp2_crypto_aead_ctx_encrypt_init(ngtcp2_crypto_aead_ctx *aead_ctx,
920
+ const ngtcp2_crypto_aead *aead,
921
+ const uint8_t *key, size_t noncelen);
922
+
923
+ /**
924
+ * @function
925
+ *
926
+ * `ngtcp2_crypto_aead_ctx_decrypt_init` initializes |aead_ctx| with
927
+ * new AEAD cipher context object for decryption which is constructed
928
+ * to use |key| as decryption key. |aead| specifies AEAD cipher to
929
+ * use. |noncelen| is the length of nonce.
930
+ *
931
+ * This function returns 0 if it succeeds, or -1.
932
+ */
933
+ NGTCP2_EXTERN int
934
+ ngtcp2_crypto_aead_ctx_decrypt_init(ngtcp2_crypto_aead_ctx *aead_ctx,
935
+ const ngtcp2_crypto_aead *aead,
936
+ const uint8_t *key, size_t noncelen);
937
+
938
+ /**
939
+ * @function
940
+ *
941
+ * `ngtcp2_crypto_aead_ctx_free` frees up resources used by
942
+ * |aead_ctx|. This function does not free the memory pointed by
943
+ * |aead_ctx| itself.
944
+ */
945
+ NGTCP2_EXTERN void
946
+ ngtcp2_crypto_aead_ctx_free(ngtcp2_crypto_aead_ctx *aead_ctx);
947
+
948
+ /**
949
+ * @function
950
+ *
951
+ * `ngtcp2_crypto_delete_crypto_aead_ctx_cb` deletes the given
952
+ * |aead_ctx|.
953
+ *
954
+ * This function can be directly passed to
955
+ * :member:`ngtcp2_callbacks.delete_crypto_aead_ctx` field.
956
+ */
957
+ NGTCP2_EXTERN void ngtcp2_crypto_delete_crypto_aead_ctx_cb(
958
+ ngtcp2_conn *conn, ngtcp2_crypto_aead_ctx *aead_ctx, void *user_data);
959
+
960
+ /**
961
+ * @function
962
+ *
963
+ * `ngtcp2_crypto_delete_crypto_cipher_ctx_cb` deletes the given
964
+ * |cipher_ctx|.
965
+ *
966
+ * This function can be directly passed to
967
+ * :member:`ngtcp2_callbacks.delete_crypto_cipher_ctx` field.
968
+ */
969
+ NGTCP2_EXTERN void ngtcp2_crypto_delete_crypto_cipher_ctx_cb(
970
+ ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data);
971
+
972
+ /**
973
+ * @function
974
+ *
975
+ * `ngtcp2_crypto_get_path_challenge_data_cb` writes unpredictable
976
+ * sequence of :macro:`NGTCP2_PATH_CHALLENGE_DATALEN` bytes to |data|
977
+ * which is sent with PATH_CHALLENGE frame.
978
+ *
979
+ * This function can be directly passed to
980
+ * :member:`ngtcp2_callbacks.get_path_challenge_data` field.
981
+ */
982
+ NGTCP2_EXTERN int ngtcp2_crypto_get_path_challenge_data_cb(ngtcp2_conn *conn,
983
+ uint8_t *data,
984
+ void *user_data);
985
+
986
+ /**
987
+ * @function
988
+ *
989
+ * `ngtcp2_crypto_version_negotiation_cb` installs Initial keys for
990
+ * |version| which is negotiated or being negotiated. |client_dcid|
991
+ * is the destination connection ID in first Initial packet from
992
+ * client.
993
+ *
994
+ * This function can be directly passed to
995
+ * :member:`ngtcp2_callbacks.version_negotiation` field.
996
+ */
997
+ NGTCP2_EXTERN int
998
+ ngtcp2_crypto_version_negotiation_cb(ngtcp2_conn *conn, uint32_t version,
999
+ const ngtcp2_cid *client_dcid,
1000
+ void *user_data);
1001
+
1002
+ typedef struct ngtcp2_crypto_conn_ref ngtcp2_crypto_conn_ref;
1003
+
1004
+ /**
1005
+ * @functypedef
1006
+ *
1007
+ * :type:`ngtcp2_crypto_get_conn` is a callback function to get a
1008
+ * pointer to :type:`ngtcp2_conn` from |conn_ref|. The implementation
1009
+ * must return non-NULL :type:`ngtcp2_conn` object.
1010
+ */
1011
+ typedef ngtcp2_conn *(*ngtcp2_crypto_get_conn)(
1012
+ ngtcp2_crypto_conn_ref *conn_ref);
1013
+
1014
+ /**
1015
+ * @struct
1016
+ *
1017
+ * :type:`ngtcp2_crypto_conn_ref` is a structure to get a pointer to
1018
+ * :type:`ngtcp2_conn`. It is meant to be set to TLS native handle as
1019
+ * an application specific data (e.g. SSL_set_app_data in quictls).
1020
+ */
1021
+ typedef struct ngtcp2_crypto_conn_ref {
1022
+ /**
1023
+ * :member:`get_conn` is a callback function to get a pointer to
1024
+ * :type:`ngtcp2_conn` object.
1025
+ */
1026
+ ngtcp2_crypto_get_conn get_conn;
1027
+ /**
1028
+ * :member:`user_data` is a pointer to arbitrary user data.
1029
+ */
1030
+ void *user_data;
1031
+ } ngtcp2_crypto_conn_ref;
1032
+
1033
+ #ifdef __cplusplus
1034
+ }
1035
+ #endif /* defined(__cplusplus) */
1036
+
1037
+ #endif /* !defined(NGTCP2_CRYPTO_H) */