@encharm/cws 4.5.1 → 4.5.2

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 (237) hide show
  1. package/binding.gyp +1 -1
  2. package/dist/bindings/cws_darwin_arm64_node137.node +0 -0
  3. package/dist/bindings/cws_linux_x64_node137.node +0 -0
  4. package/package.json +1 -1
  5. package/src/Addon.h +6 -1
  6. package/src/headers/24/acorn_version.h +6 -0
  7. package/src/headers/24/addon_permission.h +31 -0
  8. package/src/headers/24/agent.h +195 -0
  9. package/src/headers/24/aliased_buffer-inl.h +244 -0
  10. package/src/headers/24/aliased_buffer.h +206 -0
  11. package/src/headers/24/aliased_struct-inl.h +54 -0
  12. package/src/headers/24/aliased_struct.h +63 -0
  13. package/src/headers/24/amaro_version.h +6 -0
  14. package/src/headers/24/application.h +165 -0
  15. package/src/headers/24/async_context_frame.h +33 -0
  16. package/src/headers/24/async_wrap-inl.h +96 -0
  17. package/src/headers/24/async_wrap.h +244 -0
  18. package/src/headers/24/base_object-inl.h +330 -0
  19. package/src/headers/24/base_object.h +338 -0
  20. package/src/headers/24/base_object_types.h +74 -0
  21. package/src/headers/24/bindingdata.h +272 -0
  22. package/src/headers/24/blob_serializer_deserializer-inl.h +385 -0
  23. package/src/headers/24/blob_serializer_deserializer.h +132 -0
  24. package/src/headers/24/callback_queue-inl.h +97 -0
  25. package/src/headers/24/callback_queue.h +79 -0
  26. package/src/headers/24/cares_wrap.h +447 -0
  27. package/src/headers/24/child_process_permission.h +31 -0
  28. package/src/headers/24/cid.h +127 -0
  29. package/src/headers/24/cjs_module_lexer_version.h +6 -0
  30. package/src/headers/24/cleanup_queue-inl.h +36 -0
  31. package/src/headers/24/cleanup_queue.h +79 -0
  32. package/src/headers/24/compile_cache.h +113 -0
  33. package/src/headers/24/connect_wrap.h +26 -0
  34. package/src/headers/24/connection_wrap.h +30 -0
  35. package/src/headers/24/cppgc_helpers-inl.h +65 -0
  36. package/src/headers/24/cppgc_helpers.h +162 -0
  37. package/src/headers/24/crypto/crypto_aes.h +97 -0
  38. package/src/headers/24/crypto/crypto_argon2.h +86 -0
  39. package/src/headers/24/crypto/crypto_bio.h +193 -0
  40. package/src/headers/24/crypto/crypto_chacha20_poly1305.h +64 -0
  41. package/src/headers/24/crypto/crypto_cipher.h +281 -0
  42. package/src/headers/24/crypto/crypto_clienthello-inl.h +90 -0
  43. package/src/headers/24/crypto/crypto_clienthello.h +131 -0
  44. package/src/headers/24/crypto/crypto_common.h +48 -0
  45. package/src/headers/24/crypto/crypto_context.h +171 -0
  46. package/src/headers/24/crypto/crypto_dh.h +126 -0
  47. package/src/headers/24/crypto/crypto_dsa.h +50 -0
  48. package/src/headers/24/crypto/crypto_ec.h +163 -0
  49. package/src/headers/24/crypto/crypto_hash.h +89 -0
  50. package/src/headers/24/crypto/crypto_hkdf.h +61 -0
  51. package/src/headers/24/crypto/crypto_hmac.h +92 -0
  52. package/src/headers/24/crypto/crypto_kem.h +113 -0
  53. package/src/headers/24/crypto/crypto_keygen.h +290 -0
  54. package/src/headers/24/crypto/crypto_keys.h +392 -0
  55. package/src/headers/24/crypto/crypto_ml_dsa.h +21 -0
  56. package/src/headers/24/crypto/crypto_pbkdf2.h +74 -0
  57. package/src/headers/24/crypto/crypto_random.h +124 -0
  58. package/src/headers/24/crypto/crypto_rsa.h +136 -0
  59. package/src/headers/24/crypto/crypto_scrypt.h +85 -0
  60. package/src/headers/24/crypto/crypto_sig.h +156 -0
  61. package/src/headers/24/crypto/crypto_spkac.h +21 -0
  62. package/src/headers/24/crypto/crypto_timing.h +20 -0
  63. package/src/headers/24/crypto/crypto_tls.h +309 -0
  64. package/src/headers/24/crypto/crypto_util.h +598 -0
  65. package/src/headers/24/crypto/crypto_x509.h +140 -0
  66. package/src/headers/24/data.h +148 -0
  67. package/src/headers/24/debug_utils-inl.h +232 -0
  68. package/src/headers/24/debug_utils.h +193 -0
  69. package/src/headers/24/defs.h +254 -0
  70. package/src/headers/24/diagnosticfilename-inl.h +33 -0
  71. package/src/headers/24/embedded_data.h +17 -0
  72. package/src/headers/24/encoding_binding.h +60 -0
  73. package/src/headers/24/endpoint.h +421 -0
  74. package/src/headers/24/env-inl.h +935 -0
  75. package/src/headers/24/env.h +1257 -0
  76. package/src/headers/24/env_properties.h +561 -0
  77. package/src/headers/24/fs_permission.h +167 -0
  78. package/src/headers/24/handle_wrap.h +123 -0
  79. package/src/headers/24/histogram-inl.h +107 -0
  80. package/src/headers/24/histogram.h +279 -0
  81. package/src/headers/24/http3.h +44 -0
  82. package/src/headers/24/inspector_agent.h +165 -0
  83. package/src/headers/24/inspector_io.h +78 -0
  84. package/src/headers/24/inspector_permission.h +31 -0
  85. package/src/headers/24/inspector_profiler.h +149 -0
  86. package/src/headers/24/inspector_socket.h +60 -0
  87. package/src/headers/24/inspector_socket_server.h +110 -0
  88. package/src/headers/24/io_agent.h +30 -0
  89. package/src/headers/24/js_native_api.h +615 -0
  90. package/src/headers/24/js_native_api_types.h +211 -0
  91. package/src/headers/24/js_native_api_v8.h +485 -0
  92. package/src/headers/24/js_native_api_v8_internals.h +45 -0
  93. package/src/headers/24/js_stream.h +52 -0
  94. package/src/headers/24/json_parser.h +40 -0
  95. package/src/headers/24/json_utils.h +172 -0
  96. package/src/headers/24/logstream.h +81 -0
  97. package/src/headers/24/main_thread_interface.h +116 -0
  98. package/src/headers/24/memory_tracker-inl.h +454 -0
  99. package/src/headers/24/memory_tracker.h +333 -0
  100. package/src/headers/24/module_wrap.h +229 -0
  101. package/src/headers/24/ncrypto.h +1625 -0
  102. package/src/headers/24/network_agent.h +118 -0
  103. package/src/headers/24/network_inspector.h +45 -0
  104. package/src/headers/24/network_resource_manager.h +29 -0
  105. package/src/headers/24/node.h +1620 -0
  106. package/src/headers/24/node_api.h +269 -0
  107. package/src/headers/24/node_api_internals.h +46 -0
  108. package/src/headers/24/node_api_types.h +52 -0
  109. package/src/headers/24/node_binding.h +163 -0
  110. package/src/headers/24/node_blob.h +159 -0
  111. package/src/headers/24/node_bob-inl.h +36 -0
  112. package/src/headers/24/node_bob.h +107 -0
  113. package/src/headers/24/node_buffer.h +92 -0
  114. package/src/headers/24/node_builtins.h +223 -0
  115. package/src/headers/24/node_config_file.h +65 -0
  116. package/src/headers/24/node_constants.h +82 -0
  117. package/src/headers/24/node_context_data.h +168 -0
  118. package/src/headers/24/node_contextify.h +261 -0
  119. package/src/headers/24/node_crypto.h +62 -0
  120. package/src/headers/24/node_debug.h +25 -0
  121. package/src/headers/24/node_dir.h +52 -0
  122. package/src/headers/24/node_dotenv.h +45 -0
  123. package/src/headers/24/node_errors.h +391 -0
  124. package/src/headers/24/node_exit_code.h +54 -0
  125. package/src/headers/24/node_external_reference.h +167 -0
  126. package/src/headers/24/node_file-inl.h +412 -0
  127. package/src/headers/24/node_file.h +540 -0
  128. package/src/headers/24/node_http2.h +1175 -0
  129. package/src/headers/24/node_http2_state.h +159 -0
  130. package/src/headers/24/node_http_common-inl.h +198 -0
  131. package/src/headers/24/node_http_common.h +535 -0
  132. package/src/headers/24/node_i18n.h +132 -0
  133. package/src/headers/24/node_internals.h +476 -0
  134. package/src/headers/24/node_json.h +24 -0
  135. package/src/headers/24/node_large_page.h +34 -0
  136. package/src/headers/24/node_locks.h +180 -0
  137. package/src/headers/24/node_main_instance.h +67 -0
  138. package/src/headers/24/node_mem-inl.h +112 -0
  139. package/src/headers/24/node_mem.h +45 -0
  140. package/src/headers/24/node_messaging.h +389 -0
  141. package/src/headers/24/node_metadata.h +164 -0
  142. package/src/headers/24/node_modules.h +93 -0
  143. package/src/headers/24/node_mutex.h +323 -0
  144. package/src/headers/24/node_object_wrap.h +132 -0
  145. package/src/headers/24/node_options-inl.h +524 -0
  146. package/src/headers/24/node_options.h +682 -0
  147. package/src/headers/24/node_perf.h +166 -0
  148. package/src/headers/24/node_perf_common.h +102 -0
  149. package/src/headers/24/node_platform.h +286 -0
  150. package/src/headers/24/node_process-inl.h +26 -0
  151. package/src/headers/24/node_process.h +111 -0
  152. package/src/headers/24/node_realm-inl.h +153 -0
  153. package/src/headers/24/node_realm.h +236 -0
  154. package/src/headers/24/node_report.h +43 -0
  155. package/src/headers/24/node_revert.h +82 -0
  156. package/src/headers/24/node_root_certs.h +3546 -0
  157. package/src/headers/24/node_sea.h +74 -0
  158. package/src/headers/24/node_shadow_realm.h +46 -0
  159. package/src/headers/24/node_snapshot_builder.h +57 -0
  160. package/src/headers/24/node_snapshotable.h +174 -0
  161. package/src/headers/24/node_sockaddr-inl.h +257 -0
  162. package/src/headers/24/node_sockaddr.h +394 -0
  163. package/src/headers/24/node_sqlite.h +270 -0
  164. package/src/headers/24/node_stat_watcher.h +73 -0
  165. package/src/headers/24/node_string.h +101 -0
  166. package/src/headers/24/node_task_runner.h +92 -0
  167. package/src/headers/24/node_threadsafe_cow-inl.h +54 -0
  168. package/src/headers/24/node_threadsafe_cow.h +105 -0
  169. package/src/headers/24/node_trace_buffer.h +83 -0
  170. package/src/headers/24/node_trace_writer.h +75 -0
  171. package/src/headers/24/node_union_bytes.h +81 -0
  172. package/src/headers/24/node_url.h +101 -0
  173. package/src/headers/24/node_url_pattern.h +118 -0
  174. package/src/headers/24/node_v8.h +77 -0
  175. package/src/headers/24/node_v8_platform-inl.h +185 -0
  176. package/src/headers/24/node_version.h +110 -0
  177. package/src/headers/24/node_wasi.h +185 -0
  178. package/src/headers/24/node_wasm_web_api.h +55 -0
  179. package/src/headers/24/node_watchdog.h +154 -0
  180. package/src/headers/24/node_webstorage.h +60 -0
  181. package/src/headers/24/node_worker.h +159 -0
  182. package/src/headers/24/packet.h +155 -0
  183. package/src/headers/24/path.h +33 -0
  184. package/src/headers/24/permission/addon_permission.h +31 -0
  185. package/src/headers/24/permission/child_process_permission.h +31 -0
  186. package/src/headers/24/permission/fs_permission.h +167 -0
  187. package/src/headers/24/permission/inspector_permission.h +31 -0
  188. package/src/headers/24/permission/permission.h +100 -0
  189. package/src/headers/24/permission/permission_base.h +65 -0
  190. package/src/headers/24/permission/wasi_permission.h +31 -0
  191. package/src/headers/24/permission/worker_permission.h +31 -0
  192. package/src/headers/24/permission.h +100 -0
  193. package/src/headers/24/permission_base.h +65 -0
  194. package/src/headers/24/pipe_wrap.h +80 -0
  195. package/src/headers/24/preferredaddress.h +72 -0
  196. package/src/headers/24/protocol_helper.h +27 -0
  197. package/src/headers/24/queue.h +306 -0
  198. package/src/headers/24/req_wrap-inl.h +176 -0
  199. package/src/headers/24/req_wrap.h +79 -0
  200. package/src/headers/24/runtime_agent.h +41 -0
  201. package/src/headers/24/session.h +528 -0
  202. package/src/headers/24/sessionticket.h +108 -0
  203. package/src/headers/24/spawn_sync.h +243 -0
  204. package/src/headers/24/stream_base-inl.h +173 -0
  205. package/src/headers/24/stream_base.h +478 -0
  206. package/src/headers/24/stream_pipe.h +76 -0
  207. package/src/headers/24/stream_wrap.h +132 -0
  208. package/src/headers/24/streams.h +370 -0
  209. package/src/headers/24/string_bytes.h +109 -0
  210. package/src/headers/24/string_decoder-inl.h +31 -0
  211. package/src/headers/24/string_decoder.h +49 -0
  212. package/src/headers/24/target_agent.h +75 -0
  213. package/src/headers/24/tcp_wrap.h +105 -0
  214. package/src/headers/24/threadpoolwork-inl.h +70 -0
  215. package/src/headers/24/timer_wrap-inl.h +32 -0
  216. package/src/headers/24/timer_wrap.h +87 -0
  217. package/src/headers/24/timers.h +75 -0
  218. package/src/headers/24/tlscontext.h +228 -0
  219. package/src/headers/24/tokens.h +256 -0
  220. package/src/headers/24/trace_event.h +722 -0
  221. package/src/headers/24/trace_event_common.h +1109 -0
  222. package/src/headers/24/traced_value.h +129 -0
  223. package/src/headers/24/tracing_agent.h +43 -0
  224. package/src/headers/24/transportparams.h +166 -0
  225. package/src/headers/24/tty_wrap.h +65 -0
  226. package/src/headers/24/udp_wrap.h +230 -0
  227. package/src/headers/24/undici_version.h +6 -0
  228. package/src/headers/24/util-inl.h +711 -0
  229. package/src/headers/24/util.h +1016 -0
  230. package/src/headers/24/v8-external-memory-accounter.h +60 -0
  231. package/src/headers/24/v8-fast-api-calls.h +819 -0
  232. package/src/headers/24/v8-inspector.h +426 -0
  233. package/src/headers/24/wasi_permission.h +31 -0
  234. package/src/headers/24/worker_agent.h +40 -0
  235. package/src/headers/24/worker_inspector.h +124 -0
  236. package/src/headers/24/worker_permission.h +31 -0
  237. package/src/headers/24/zlib_version.h +6 -0
@@ -0,0 +1,256 @@
1
+ #pragma once
2
+
3
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
4
+ #if HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC
5
+
6
+ #include <memory_tracker.h>
7
+ #include <ngtcp2/ngtcp2_crypto.h>
8
+ #include <node_internals.h>
9
+ #include <node_sockaddr.h>
10
+ #include "cid.h"
11
+ #include "defs.h"
12
+
13
+ namespace node::quic {
14
+
15
+ // TokenSecrets are used to generate things like stateless reset tokens,
16
+ // retry tokens, and token packets. They are always QUIC_TOKENSECRET_LEN
17
+ // bytes in length.
18
+ //
19
+ // In the default case, token secrets will always be generated randomly.
20
+ // User code will be given the option to provide a secret directly
21
+ // however.
22
+ class TokenSecret final : public MemoryRetainer {
23
+ public:
24
+ static constexpr int QUIC_TOKENSECRET_LEN = 16;
25
+
26
+ // Generate a random secret.
27
+ TokenSecret();
28
+
29
+ // Copy the given secret. The uint8_t* is assumed
30
+ // to be QUIC_TOKENSECRET_LEN in length. Note that
31
+ // the length is not verified so care must be taken
32
+ // when this constructor is used.
33
+ explicit TokenSecret(const uint8_t* secret);
34
+ ~TokenSecret();
35
+
36
+ TokenSecret(const TokenSecret&) = default;
37
+ TokenSecret& operator=(const TokenSecret&) = default;
38
+ DISALLOW_MOVE(TokenSecret)
39
+
40
+ operator const uint8_t*() const;
41
+ uint8_t operator[](int pos) const;
42
+
43
+ std::string ToString() const;
44
+
45
+ SET_NO_MEMORY_INFO()
46
+ SET_MEMORY_INFO_NAME(TokenSecret)
47
+ SET_SELF_SIZE(TokenSecret)
48
+
49
+ private:
50
+ operator const char*() const;
51
+ uint8_t buf_[QUIC_TOKENSECRET_LEN];
52
+ };
53
+
54
+ // A stateless reset token is used when a QUIC endpoint receives a QUIC packet
55
+ // with a short header but the associated connection ID cannot be matched to any
56
+ // known Session. In such cases, the receiver may choose to send a subtle opaque
57
+ // indication to the sending peer that state for the Session has apparently been
58
+ // lost. For any on- or off- path attacker, a stateless reset packet resembles
59
+ // any other QUIC packet with a short header. In order to be successfully
60
+ // handled as a stateless reset, the peer must have already seen a reset token
61
+ // issued to it associated with the given CID. The token itself is opaque to the
62
+ // peer that receives is but must be possible to statelessly recreate by the
63
+ // peer that originally created it. The actual implementation is Node.js
64
+ // specific but we currently defer to a utility function provided by ngtcp2.
65
+ //
66
+ // QUIC leaves the generation of stateless session tokens up to the
67
+ // implementation to figure out. The idea, however, is that it ought to be
68
+ // possible to generate a stateless reset token reliably even when all state
69
+ // for a connection has been lost. We use the cid as it is the only reliably
70
+ // consistent bit of data we have when a session is destroyed.
71
+ //
72
+ // StatlessResetTokens are always kStatelessTokenLen bytes,
73
+ // as are the secrets used to generate the token.
74
+ class StatelessResetToken final : public MemoryRetainer {
75
+ public:
76
+ static constexpr int kStatelessTokenLen = NGTCP2_STATELESS_RESET_TOKENLEN;
77
+
78
+ StatelessResetToken();
79
+
80
+ // Generates a stateless reset token using HKDF with the cid and token secret
81
+ // as input. The token secret is either provided by user code when an Endpoint
82
+ // is created or is generated randomly.
83
+ StatelessResetToken(const TokenSecret& secret, const CID& cid);
84
+
85
+ // Generates a stateless reset token using the given token storage.
86
+ // The StatelessResetToken wraps the token and does not take ownership.
87
+ // The token storage must be at least kStatelessTokenLen bytes in length.
88
+ // The length is not verified so care must be taken when using this
89
+ // constructor.
90
+ StatelessResetToken(uint8_t* token,
91
+ const TokenSecret& secret,
92
+ const CID& cid);
93
+
94
+ // Wraps the given token. Does not take over ownership of the token storage.
95
+ // The token must be at least kStatelessTokenLen bytes in length.
96
+ // The length is not verified so care must be taken when using this
97
+ // constructor.
98
+ explicit StatelessResetToken(const uint8_t* token);
99
+
100
+ StatelessResetToken(const StatelessResetToken& other);
101
+ DISALLOW_MOVE(StatelessResetToken)
102
+
103
+ std::string ToString() const;
104
+
105
+ operator const uint8_t*() const;
106
+ operator bool() const;
107
+
108
+ bool operator==(const StatelessResetToken& other) const;
109
+ bool operator!=(const StatelessResetToken& other) const;
110
+
111
+ struct Hash {
112
+ size_t operator()(const StatelessResetToken& token) const;
113
+ };
114
+
115
+ SET_NO_MEMORY_INFO()
116
+ SET_MEMORY_INFO_NAME(StatelessResetToken)
117
+ SET_SELF_SIZE(StatelessResetToken)
118
+
119
+ template <typename T>
120
+ using Map =
121
+ std::unordered_map<StatelessResetToken, T, StatelessResetToken::Hash>;
122
+
123
+ static StatelessResetToken kInvalid;
124
+
125
+ private:
126
+ operator const char*() const;
127
+
128
+ const uint8_t* ptr_;
129
+ uint8_t buf_[NGTCP2_STATELESS_RESET_TOKENLEN];
130
+ };
131
+
132
+ // A RETRY packet communicates a retry token to the client. Retry tokens are
133
+ // generated only by QUIC servers for the purpose of validating the network path
134
+ // between a client and server. The content payload of the RETRY packet is
135
+ // opaque to the clientand must not be guessable by on- or off-path attackers.
136
+ //
137
+ // A QUIC server sends a RETRY token as a way of initiating explicit path
138
+ // validation in response to an initial QUIC packet. The client, upon receiving
139
+ // a RETRY, must abandon the initial connection attempt and try again with the
140
+ // received retry token included with the new initial packet sent to the server.
141
+ // If the server is performing explicit validation, it will look for the
142
+ // presence of the retry token and attempt to validate it if found. The internal
143
+ // structure of the retry token must be meaningful to the server, and the server
144
+ // must be able to validate that the token is correct without relying on any
145
+ // state left over from the previous connection attempt. We use an
146
+ // implementation that is provided by ngtcp2.
147
+ //
148
+ // The token secret must be kept private on the QUIC server that generated the
149
+ // retry. When multiple QUIC servers are used in a cluster, it cannot be
150
+ // guaranteed that the same QUIC server instance will receive the subsequent new
151
+ // Initial packet. Therefore, all QUIC servers in the cluster should either
152
+ // share or be aware of the same token secret or a mechanism needs to be
153
+ // implemented to ensure that subsequent packets are routed to the same QUIC
154
+ // server instance.
155
+ class RetryToken final : public MemoryRetainer {
156
+ public:
157
+ // The token prefix that is used to differentiate between a retry token
158
+ // and a regular token.
159
+ static constexpr uint8_t kTokenMagic = NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY;
160
+ static constexpr int kRetryTokenLen = NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN;
161
+
162
+ static constexpr uint64_t QUIC_DEFAULT_RETRYTOKEN_EXPIRATION =
163
+ 10 * NGTCP2_SECONDS;
164
+ static constexpr uint64_t QUIC_MIN_RETRYTOKEN_EXPIRATION = 1 * NGTCP2_SECONDS;
165
+
166
+ // Generates a new retry token.
167
+ RetryToken(uint32_t version,
168
+ const SocketAddress& address,
169
+ const CID& retry_cid,
170
+ const CID& odcid,
171
+ const TokenSecret& token_secret);
172
+
173
+ // Wraps the given retry token
174
+ RetryToken(const uint8_t* token, size_t length);
175
+
176
+ // Validates the retry token given the input. If the token is valid,
177
+ // the embedded original CID will be extracted from the token an
178
+ // returned. If the token is invalid, std::nullopt will be returned.
179
+ std::optional<CID> Validate(
180
+ uint32_t version,
181
+ const SocketAddress& address,
182
+ const CID& cid,
183
+ const TokenSecret& token_secret,
184
+ uint64_t verification_expiration = QUIC_DEFAULT_RETRYTOKEN_EXPIRATION);
185
+
186
+ operator const ngtcp2_vec&() const;
187
+ operator const ngtcp2_vec*() const;
188
+ operator bool() const;
189
+
190
+ std::string ToString() const;
191
+
192
+ SET_NO_MEMORY_INFO()
193
+ SET_MEMORY_INFO_NAME(RetryToken)
194
+ SET_SELF_SIZE(RetryToken)
195
+
196
+ private:
197
+ operator const char*() const;
198
+ uint8_t buf_[kRetryTokenLen];
199
+ const ngtcp2_vec ptr_;
200
+ };
201
+
202
+ // A NEW_TOKEN packet communicates a regular token to a client that the server
203
+ // would like the client to send in the header of an initial packet for a
204
+ // future connection. It is similar to RETRY and used for the same purpose,
205
+ // except a NEW_TOKEN is used in advance of the client establishing a new
206
+ // connection and a RETRY is sent in response to the client trying to open
207
+ // a new connection.
208
+ class RegularToken final : public MemoryRetainer {
209
+ public:
210
+ // The token prefix that is used to differentiate between a retry token
211
+ // and a regular token.
212
+ static constexpr uint8_t kTokenMagic = NGTCP2_CRYPTO_TOKEN_MAGIC_REGULAR;
213
+ static constexpr int kRegularTokenLen = NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN;
214
+ static constexpr uint64_t QUIC_DEFAULT_REGULARTOKEN_EXPIRATION =
215
+ 10 * NGTCP2_SECONDS;
216
+ static constexpr uint64_t QUIC_MIN_REGULARTOKEN_EXPIRATION =
217
+ 1 * NGTCP2_SECONDS;
218
+
219
+ RegularToken();
220
+
221
+ // Generates a new retry token.
222
+ RegularToken(uint32_t version,
223
+ const SocketAddress& address,
224
+ const TokenSecret& token_secret);
225
+
226
+ // Wraps the given retry token
227
+ RegularToken(const uint8_t* token, size_t length);
228
+
229
+ // Validates the retry token given the input.
230
+ bool Validate(
231
+ uint32_t version,
232
+ const SocketAddress& address,
233
+ const TokenSecret& token_secret,
234
+ uint64_t verification_expiration = QUIC_DEFAULT_REGULARTOKEN_EXPIRATION);
235
+
236
+ operator const ngtcp2_vec&() const;
237
+ operator const ngtcp2_vec*() const;
238
+
239
+ operator bool() const;
240
+
241
+ std::string ToString() const;
242
+
243
+ SET_NO_MEMORY_INFO()
244
+ SET_MEMORY_INFO_NAME(RetryToken)
245
+ SET_SELF_SIZE(RetryToken)
246
+
247
+ private:
248
+ operator const char*() const;
249
+ uint8_t buf_[kRegularTokenLen];
250
+ const ngtcp2_vec ptr_;
251
+ };
252
+
253
+ } // namespace node::quic
254
+
255
+ #endif // HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC
256
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS