]> git.ipfire.org Git - thirdparty/openssl.git/blob - include/internal/quic_record_rx.h
Copyright year updates
[thirdparty/openssl.git] / include / internal / quic_record_rx.h
1 /*
2 * Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 #ifndef OSSL_QUIC_RECORD_RX_H
11 # define OSSL_QUIC_RECORD_RX_H
12
13 # include <openssl/ssl.h>
14 # include "internal/quic_wire_pkt.h"
15 # include "internal/quic_types.h"
16 # include "internal/quic_record_util.h"
17 # include "internal/quic_demux.h"
18
19 # ifndef OPENSSL_NO_QUIC
20
21 /*
22 * QUIC Record Layer - RX
23 * ======================
24 */
25 typedef struct ossl_qrx_st OSSL_QRX;
26
27 typedef struct ossl_qrx_args_st {
28 OSSL_LIB_CTX *libctx;
29 const char *propq;
30
31 /* Demux to receive datagrams from. */
32 QUIC_DEMUX *demux;
33
34 /* Length of connection IDs used in short-header packets in bytes. */
35 size_t short_conn_id_len;
36
37 /*
38 * Maximum number of deferred datagrams buffered at any one time.
39 * Suggested value: 32.
40 */
41 size_t max_deferred;
42
43 /* Initial reference PN used for RX. */
44 QUIC_PN init_largest_pn[QUIC_PN_SPACE_NUM];
45
46 /* Initial key phase. For debugging use only; always 0 in real use. */
47 unsigned char init_key_phase_bit;
48 } OSSL_QRX_ARGS;
49
50 /* Instantiates a new QRX. */
51 OSSL_QRX *ossl_qrx_new(const OSSL_QRX_ARGS *args);
52
53 /*
54 * Frees the QRX. All packets obtained using ossl_qrx_read_pkt must already
55 * have been released by calling ossl_qrx_release_pkt.
56 *
57 * You do not need to call ossl_qrx_remove_dst_conn_id first; this function will
58 * unregister the QRX from the demuxer for all registered destination connection
59 * IDs (DCIDs) automatically.
60 */
61 void ossl_qrx_free(OSSL_QRX *qrx);
62
63 /* Setters for the msg_callback and msg_callback_arg */
64 void ossl_qrx_set_msg_callback(OSSL_QRX *qrx, ossl_msg_cb msg_callback,
65 SSL *msg_callback_ssl);
66 void ossl_qrx_set_msg_callback_arg(OSSL_QRX *qrx,
67 void *msg_callback_arg);
68
69 /*
70 * DCID Management
71 * ===============
72 */
73
74 /*
75 * Adds a given DCID to the QRX. The QRX will register the DCID with the demuxer
76 * so that incoming packets with that DCID are passed to the given QRX. Multiple
77 * DCIDs may be associated with a QRX at any one time. You will need to add at
78 * least one DCID after instantiating the QRX. A zero-length DCID is a valid
79 * input to this function. This function fails if the DCID is already
80 * registered.
81 *
82 * Returns 1 on success or 0 on error.
83 */
84 int ossl_qrx_add_dst_conn_id(OSSL_QRX *qrx,
85 const QUIC_CONN_ID *dst_conn_id);
86
87 /*
88 * Remove a DCID previously registered with ossl_qrx_add_dst_conn_id. The DCID
89 * is unregistered from the demuxer. Fails if the DCID is not registered with
90 * the demuxer.
91 *
92 * Returns 1 on success or 0 on error.
93 */
94 int ossl_qrx_remove_dst_conn_id(OSSL_QRX *qrx,
95 const QUIC_CONN_ID *dst_conn_id);
96
97 /*
98 * Secret Management
99 * =================
100 *
101 * A QRX has several encryption levels (Initial, Handshake, 0-RTT, 1-RTT) and
102 * two directions (RX, TX). At any given time, key material is managed for each
103 * (EL, RX/TX) combination.
104 *
105 * Broadly, for a given (EL, RX/TX), the following state machine is applicable:
106 *
107 * WAITING_FOR_KEYS --[Provide]--> HAVE_KEYS --[Discard]--> | DISCARDED |
108 * \-------------------------------------[Discard]--> | |
109 *
110 * To transition the RX side of an EL from WAITING_FOR_KEYS to HAVE_KEYS, call
111 * ossl_qrx_provide_secret (for the INITIAL EL, use of
112 * ossl_quic_provide_initial_secret is recommended).
113 *
114 * Once keys have been provisioned for an EL, you call
115 * ossl_qrx_discard_enc_level to transition the EL to the DISCARDED state. You
116 * can also call this function to transition directly to the DISCARDED state
117 * even before any keys have been provisioned for that EL.
118 *
119 * The DISCARDED state is terminal for a given EL; you cannot provide a secret
120 * again for that EL after reaching it.
121 *
122 * Incoming packets cannot be processed and decrypted if they target an EL
123 * not in the HAVE_KEYS state. However, there is a distinction between
124 * the WAITING_FOR_KEYS and DISCARDED states:
125 *
126 * - In the WAITING_FOR_KEYS state, the QRX assumes keys for the given
127 * EL will eventually arrive. Therefore, if it receives any packet
128 * for an EL in this state, it buffers it and tries to process it
129 * again once the EL reaches HAVE_KEYS.
130 *
131 * - In the DISCARDED state, the QRX assumes no keys for the given
132 * EL will ever arrive again. If it receives any packet for an EL
133 * in this state, it is simply discarded.
134 *
135 * If the user wishes to instantiate a new QRX to replace an old one for
136 * whatever reason, for example to take over for an already established QUIC
137 * connection, it is important that all ELs no longer being used (i.e., INITIAL,
138 * 0-RTT, 1-RTT) are transitioned to the DISCARDED state. Otherwise, the QRX
139 * will assume that keys for these ELs will arrive in future, and will buffer
140 * any received packets for those ELs perpetually. This can be done by calling
141 * ossl_qrx_discard_enc_level for all non-1-RTT ELs immediately after
142 * instantiating the QRX.
143 *
144 * The INITIAL EL is not setup automatically when the QRX is instantiated. This
145 * allows the caller to instead discard it immediately after instantiation of
146 * the QRX if it is not needed, for example if the QRX is being instantiated to
147 * take over handling of an existing connection which has already passed the
148 * INITIAL phase. This avoids the unnecessary derivation of INITIAL keys where
149 * they are not needed. In the ordinary case, ossl_quic_provide_initial_secret
150 * should be called immediately after instantiation.
151 */
152
153 /*
154 * Provides a secret to the QRX, which arises due to an encryption level change.
155 * enc_level is a QUIC_ENC_LEVEL_* value. To initialise the INITIAL encryption
156 * level, it is recommended to use ossl_quic_provide_initial_secret instead.
157 *
158 * You should seek to call this function for a given EL before packets of that
159 * EL arrive and are processed by the QRX. However, if packets have already
160 * arrived for a given EL, the QRX will defer processing of them and perform
161 * processing of them when this function is eventually called for the EL in
162 * question.
163 *
164 * suite_id is a QRL_SUITE_* value which determines the AEAD function used for
165 * the QRX.
166 *
167 * The secret passed is used directly to derive the "quic key", "quic iv" and
168 * "quic hp" values.
169 *
170 * secret_len is the length of the secret buffer in bytes. The buffer must be
171 * sized correctly to the chosen suite, else the function fails.
172 *
173 * This function can only be called once for a given EL, except for the INITIAL
174 * EL, which can need rekeying when a connection retry occurs. Subsequent calls
175 * for non-INITIAL ELs fail, as do calls made after a corresponding call to
176 * ossl_qrx_discard_enc_level for that EL. The secret for a non-INITIAL EL
177 * cannot be changed after it is set because QUIC has no facility for
178 * introducing additional key material after an EL is setup. QUIC key updates
179 * are managed semi-automatically by the QRX but do require some caller handling
180 * (see below).
181 *
182 * md is for internal use and should be NULL.
183 *
184 * Returns 1 on success or 0 on failure.
185 */
186 int ossl_qrx_provide_secret(OSSL_QRX *qrx,
187 uint32_t enc_level,
188 uint32_t suite_id,
189 EVP_MD *md,
190 const unsigned char *secret,
191 size_t secret_len);
192
193 /*
194 * Informs the QRX that it can now discard key material for a given EL. The QRX
195 * will no longer be able to process incoming packets received at that
196 * encryption level. This function is idempotent and succeeds if the EL has
197 * already been discarded.
198 *
199 * Returns 1 on success and 0 on failure.
200 */
201 int ossl_qrx_discard_enc_level(OSSL_QRX *qrx, uint32_t enc_level);
202
203 /*
204 * Packet Reception
205 * ================
206 */
207
208 /* Information about a received packet. */
209 typedef struct ossl_qrx_pkt_st {
210 /*
211 * Points to a logical representation of the decoded QUIC packet header. The
212 * data and len fields point to the decrypted QUIC payload (i.e., to a
213 * sequence of zero or more (potentially malformed) frames to be decoded).
214 */
215 QUIC_PKT_HDR *hdr;
216
217 /*
218 * Address the packet was received from. If this is not available for this
219 * packet, this field is NULL (but this can only occur for manually injected
220 * packets).
221 */
222 const BIO_ADDR *peer;
223
224 /*
225 * Local address the packet was sent to. If this is not available for this
226 * packet, this field is NULL.
227 */
228 const BIO_ADDR *local;
229
230 /*
231 * This is the length of the datagram which contained this packet. Note that
232 * the datagram may have contained other packets than this. The intended use
233 * for this is so that the user can enforce minimum datagram sizes (e.g. for
234 * datagrams containing INITIAL packets), as required by RFC 9000.
235 */
236 size_t datagram_len;
237
238 /* The PN which was decoded for the packet, if the packet has a PN field. */
239 QUIC_PN pn;
240
241 /*
242 * Time the packet was received, or ossl_time_zero() if the demuxer is not
243 * using a now() function.
244 */
245 OSSL_TIME time;
246
247 /* The QRX which was used to receive the packet. */
248 OSSL_QRX *qrx;
249
250 /*
251 * The key epoch the packet was received with. Always 0 for non-1-RTT
252 * packets.
253 */
254 uint64_t key_epoch;
255 } OSSL_QRX_PKT;
256
257 /*
258 * Tries to read a new decrypted packet from the QRX.
259 *
260 * On success, *pkt points to a OSSL_QRX_PKT structure. The structure should be
261 * freed when no longer needed by calling ossl_qrx_pkt_release(). The structure
262 * is refcounted; to gain extra references, call ossl_qrx_pkt_up_ref(). This
263 * will cause a corresponding number of calls to ossl_qrx_pkt_release() to be
264 * ignored.
265 *
266 * The resources referenced by (*pkt)->hdr, (*pkt)->hdr->data and (*pkt)->peer
267 * have the same lifetime as *pkt.
268 *
269 * Returns 1 on success and 0 on failure.
270 */
271 int ossl_qrx_read_pkt(OSSL_QRX *qrx, OSSL_QRX_PKT **pkt);
272
273 /*
274 * Decrement the reference count for the given packet and frees it if the
275 * reference count drops to zero. No-op if pkt is NULL.
276 */
277 void ossl_qrx_pkt_release(OSSL_QRX_PKT *pkt);
278
279 /* Increments the reference count for the given packet. */
280 void ossl_qrx_pkt_up_ref(OSSL_QRX_PKT *pkt);
281
282 /*
283 * Returns 1 if there are any already processed (i.e. decrypted) packets waiting
284 * to be read from the QRX.
285 */
286 int ossl_qrx_processed_read_pending(OSSL_QRX *qrx);
287
288 /*
289 * Returns 1 if there are any unprocessed (i.e. not yet decrypted) packets
290 * waiting to be processed by the QRX. These may or may not result in
291 * successfully decrypted packets once processed. This indicates whether
292 * unprocessed data is buffered by the QRX, not whether any data is available in
293 * a kernel socket buffer.
294 */
295 int ossl_qrx_unprocessed_read_pending(OSSL_QRX *qrx);
296
297 /*
298 * Returns the number of UDP payload bytes received from the network so far
299 * since the last time this counter was cleared. If clear is 1, clears the
300 * counter and returns the old value.
301 *
302 * The intended use of this is to allow callers to determine how much credit to
303 * add to their anti-amplification budgets. This is reported separately instead
304 * of in the OSSL_QRX_PKT structure so that a caller can apply
305 * anti-amplification credit as soon as a datagram is received, before it has
306 * necessarily read all processed packets contained within that datagram from
307 * the QRX.
308 */
309 uint64_t ossl_qrx_get_bytes_received(OSSL_QRX *qrx, int clear);
310
311 /*
312 * Sets a callback which is called when a packet is received and being validated
313 * before being queued in the read queue. This is called after packet body
314 * decryption and authentication to prevent exposing side channels. pn_space is
315 * a QUIC_PN_SPACE_* value denoting which PN space the PN belongs to.
316 *
317 * If this callback returns 1, processing continues normally.
318 * If this callback returns 0, the packet is discarded.
319 *
320 * Other packets in the same datagram will still be processed where possible.
321 *
322 * The callback is optional and can be unset by passing NULL for cb.
323 * cb_arg is an opaque value passed to cb.
324 */
325 typedef int (ossl_qrx_late_validation_cb)(QUIC_PN pn, int pn_space,
326 void *arg);
327
328 int ossl_qrx_set_late_validation_cb(OSSL_QRX *qrx,
329 ossl_qrx_late_validation_cb *cb,
330 void *cb_arg);
331
332 /*
333 * Forcibly injects a URXE which has been issued by the DEMUX into the QRX for
334 * processing. This can be used to pass a received datagram to the QRX if it
335 * would not be correctly routed to the QRX via standard DCID-based routing; for
336 * example, when handling an incoming Initial packet which is attempting to
337 * establish a new connection.
338 */
339 void ossl_qrx_inject_urxe(OSSL_QRX *qrx, QUIC_URXE *e);
340
341 /*
342 * Decryption of 1-RTT packets must be explicitly enabled by calling this
343 * function. This is to comply with the requirement that we not process 1-RTT
344 * packets until the handshake is complete, even if we already have 1-RTT
345 * secrets. Even if a 1-RTT secret is provisioned for the QRX, incoming 1-RTT
346 * packets will be handled as though no key is available until this function is
347 * called. Calling this function will then requeue any such deferred packets for
348 * processing.
349 */
350 void ossl_qrx_allow_1rtt_processing(OSSL_QRX *qrx);
351
352 /*
353 * Key Update (RX)
354 * ===============
355 *
356 * Key update on the RX side is a largely but not entirely automatic process.
357 *
358 * Key update is initially triggered by receiving a 1-RTT packet with a
359 * different Key Phase value. This could be caused by an attacker in the network
360 * flipping random bits, therefore such a key update is tentative until the
361 * packet payload is successfully decrypted and authenticated by the AEAD with
362 * the 'next' keys. These 'next' keys then become the 'current' keys and the
363 * 'current' keys then become the 'previous' keys. The 'previous' keys must be
364 * kept around temporarily as some packets may still be in flight in the network
365 * encrypted with the old keys. If the old Key Phase value is X and the new Key
366 * Phase Value is Y (where obviously X != Y), this creates an ambiguity as any
367 * new packet received with a KP of X could either be an attempt to initiate yet
368 * another key update right after the last one, or an old packet encrypted
369 * before the key update.
370 *
371 * RFC 9001 provides some guidance on handling this issue:
372 *
373 * Strategy 1:
374 * Three keys, disambiguation using packet numbers
375 *
376 * "A recovered PN that is lower than any PN from the current KP uses the
377 * previous packet protection keys; a recovered PN that is higher than any
378 * PN from the current KP requires use of the next packet protection
379 * keys."
380 *
381 * Strategy 2:
382 * Two keys and a timer
383 *
384 * "Alternatively, endpoints can retain only two sets of packet protection
385 * keys, swapping previous keys for next after enough time has passed to
386 * allow for reordering in the network. In this case, the KP bit alone can
387 * be used to select keys."
388 *
389 * Strategy 2 is more efficient (we can keep fewer cipher contexts around) and
390 * should cover all actually possible network conditions. It also allows a delay
391 * after we make the 'next' keys our 'current' keys before we generate new
392 * 'next' keys, which allows us to mitigate against malicious peers who try to
393 * initiate an excessive number of key updates.
394 *
395 * We therefore model the following state machine:
396 *
397 *
398 * PROVISIONED
399 * _______________________________
400 * | |
401 * UNPROVISIONED --|----> NORMAL <----------\ |------> DISCARDED
402 * | | | |
403 * | | | |
404 * | v | |
405 * | UPDATING | |
406 * | | | |
407 * | | | |
408 * | v | |
409 * | COOLDOWN | |
410 * | | | |
411 * | | | |
412 * | \---------------| |
413 * |_______________________________|
414 *
415 *
416 * The RX starts (once a secret has been provisioned) in the NORMAL state. In
417 * the NORMAL state, the current expected value of the Key Phase bit is
418 * recorded. When a flipped Key Phase bit is detected, the RX attempts to
419 * decrypt and authenticate the received packet with the 'next' keys rather than
420 * the 'current' keys. If (and only if) this authentication is successful, we
421 * move to the UPDATING state. (An attacker in the network could flip
422 * the Key Phase bit randomly, so it is essential we do nothing until AEAD
423 * authentication is complete.)
424 *
425 * In the UPDATING state, we know a key update is occurring and record
426 * the new Key Phase bit value as the newly current value, but we still keep the
427 * old keys around so that we can still process any packets which were still in
428 * flight when the key update was initiated. In the UPDATING state, a
429 * Key Phase bit value different to the current expected value is treated not as
430 * the initiation of another key update, but a reference to our old keys.
431 *
432 * Eventually we will be reasonably sure we are not going to receive any more
433 * packets with the old keys. At this point, we can transition to the COOLDOWN
434 * state. This transition occurs automatically after a certain amount of time;
435 * RFC 9001 recommends it be the PTO interval, which relates to our RTT to the
436 * peer. The duration also SHOULD NOT exceed three times the PTO to assist with
437 * maintaining PFS.
438 *
439 * In the COOLDOWN phase, the old keys have been securely erased and only one
440 * set of keys can be used: the current keys. If a packet is received with a Key
441 * Phase bit value different to the current Key Phase Bit value, this is treated
442 * as a request for a Key Update, but this request is ignored and the packet is
443 * treated as malformed. We do this to allow mitigation against malicious peers
444 * trying to initiate an excessive number of Key Updates. The timeout for the
445 * transition from UPDATING to COOLDOWN is recommended as adequate for
446 * this purpose in itself by the RFC, so the normal additional timeout value for
447 * the transition from COOLDOWN to normal is zero (immediate transition).
448 *
449 * A summary of each state:
450 *
451 * Epoch Exp KP Uses Keys KS0 KS1 If Non-Expected KP Bit
452 * ----- ------ --------- ------ ----- ----------------------
453 * NORMAL 0 0 Keyset 0 Gen 0 Gen 1 → UPDATING
454 * UPDATING 1 1 Keyset 1 Gen 0 Gen 1 Use Keyset 0
455 * COOLDOWN 1 1 Keyset 1 Erased Gen 1 Ignore Packet (*)
456 *
457 * NORMAL 1 1 Keyset 1 Gen 2 Gen 1 → UPDATING
458 * UPDATING 2 0 Keyset 0 Gen 2 Gen 1 Use Keyset 1
459 * COOLDOWN 2 0 Keyset 0 Gen 2 Erased Ignore Packet (*)
460 *
461 * (*) Actually implemented by attempting to decrypt the packet with the
462 * wrong keys (which ultimately has the same outcome), as recommended
463 * by RFC 9001 to avoid creating timing channels.
464 *
465 * Note that the key material for the next key generation ("key epoch") is
466 * always kept in the NORMAL state (necessary to avoid side-channel attacks).
467 * This material is derived during the transition from COOLDOWN to NORMAL.
468 *
469 * Note that when a peer initiates a Key Update, we MUST also initiate a Key
470 * Update as per the RFC. The caller is responsible for detecting this condition
471 * and making the necessary calls to the TX side by detecting changes to the
472 * return value of ossl_qrx_get_key_epoch().
473 *
474 * The above states (NORMAL, UPDATING, COOLDOWN) can themselves be
475 * considered substates of the PROVISIONED state. Providing a secret to the QRX
476 * for an EL transitions from UNPROVISIONED, the initial state, to PROVISIONED
477 * (NORMAL). Dropping key material for an EL transitions from whatever the
478 * current substate of the PROVISIONED state is to the DISCARDED state, which is
479 * the terminal state.
480 *
481 * Note that non-1RTT ELs cannot undergo key update, therefore a non-1RTT EL is
482 * always in the NORMAL substate if it is in the PROVISIONED state.
483 */
484
485 /*
486 * Return the current RX key epoch for the 1-RTT encryption level. This is
487 * initially zero and is incremented by one for every Key Update successfully
488 * signalled by the peer. If the 1-RTT EL has not yet been provisioned or has
489 * been discarded, returns UINT64_MAX.
490 *
491 * A necessary implication of this API is that the least significant bit of the
492 * returned value corresponds to the currently expected Key Phase bit, though
493 * callers are not anticipated to have any need of this information.
494 *
495 * It is not possible for the returned value to overflow, as a QUIC connection
496 * cannot support more than 2**62 packet numbers, and a connection must be
497 * terminated if this limit is reached.
498 *
499 * The caller should use this function to detect when the key epoch has changed
500 * and use it to initiate a key update on the TX side.
501 *
502 * The value returned by this function increments specifically at the transition
503 * from the NORMAL to the UPDATING state discussed above.
504 */
505 uint64_t ossl_qrx_get_key_epoch(OSSL_QRX *qrx);
506
507 /*
508 * Sets an optional callback which will be called when the key epoch changes.
509 *
510 * The callback is optional and can be unset by passing NULL for cb.
511 * cb_arg is an opaque value passed to cb. pn is the PN of the packet.
512 * Since key update is only supported for 1-RTT packets, the PN is always
513 * in the Application Data PN space.
514 */
515 typedef void (ossl_qrx_key_update_cb)(QUIC_PN pn, void *arg);
516
517 int ossl_qrx_set_key_update_cb(OSSL_QRX *qrx,
518 ossl_qrx_key_update_cb *cb, void *cb_arg);
519
520 /*
521 * Relates to the 1-RTT encryption level. The caller should call this after the
522 * UPDATING state is reached, after a timeout to be determined by the caller.
523 *
524 * This transitions from the UPDATING state to the COOLDOWN state (if
525 * still in the UPDATING state). If normal is 1, then transitions from
526 * the COOLDOWN state to the NORMAL state. Both transitions can be performed at
527 * once if desired.
528 *
529 * If in the normal state, or if in the COOLDOWN state and normal is 0, this is
530 * a no-op and returns 1. Returns 0 if the 1-RTT EL has not been provisioned or
531 * has been dropped.
532 *
533 * It is essential that the caller call this within a few PTO intervals of a key
534 * update occurring (as detected by the caller in a call to
535 * ossl_qrx_key_get_key_epoch()), as otherwise the peer will not be able to
536 * perform a Key Update ever again.
537 */
538 int ossl_qrx_key_update_timeout(OSSL_QRX *qrx, int normal);
539
540
541 /*
542 * Key Expiration
543 * ==============
544 */
545
546 /*
547 * Returns the number of seemingly forged packets which have been received by
548 * the QRX. If this value reaches the value returned by
549 * ossl_qrx_get_max_epoch_forged_pkt_count() for a given EL, all further
550 * received encrypted packets for that EL will be discarded without processing.
551 *
552 * Note that the forged packet limit is for the connection lifetime, thus it is
553 * not reset by a key update. It is suggested that the caller terminate the
554 * connection a reasonable margin before the limit is reached. However, the
555 * exact limit imposed does vary by EL due to the possibility that different ELs
556 * use different AEADs.
557 */
558 uint64_t ossl_qrx_get_cur_forged_pkt_count(OSSL_QRX *qrx);
559
560 /*
561 * Returns the maximum number of forged packets which the record layer will
562 * permit to be verified using this QRX instance.
563 */
564 uint64_t ossl_qrx_get_max_forged_pkt_count(OSSL_QRX *qrx,
565 uint32_t enc_level);
566
567 # endif
568
569 #endif