| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 | 
							- /*
 
- * Copyright 2023 The OpenSSL Project Authors. All Rights Reserved.
 
- *
 
- * Licensed under the Apache License 2.0 (the "License").  You may not use
 
- * this file except in compliance with the License.  You can obtain a copy
 
- * in the file LICENSE in the source distribution or at
 
- * https://www.openssl.org/source/license.html
 
- */
 
- #ifndef OSSL_INTERNAL_QUIC_SRTM_H
 
- # define OSSL_INTERNAL_QUIC_SRTM_H
 
- # pragma once
 
- # include "internal/e_os.h"
 
- # include "internal/time.h"
 
- # include "internal/quic_types.h"
 
- # include "internal/quic_wire.h"
 
- # include "internal/quic_predef.h"
 
- # ifndef OPENSSL_NO_QUIC
 
- /*
 
-  * QUIC Stateless Reset Token Manager
 
-  * ==================================
 
-  *
 
-  * The stateless reset token manager is responsible for mapping stateless reset
 
-  * tokens to connections. It is used to identify stateless reset tokens in
 
-  * incoming packets. In this regard it can be considered an alternate "routing"
 
-  * mechanism for incoming packets, and is somewhat analogous with the LCIDM,
 
-  * except that it uses SRTs to route rather than DCIDs.
 
-  *
 
-  * The SRTM specifically stores a bidirectional mapping of the form
 
-  *
 
-  *   (opaque pointer, sequence number) [1] <-> [0..n] SRT
 
-  *
 
-  * The (opaque pointer, sequence number) tuple is used to refer to an entry (for
 
-  * example for the purposes of removing it later when it is no longer needed).
 
-  * Likewise, an entry can be looked up using SRT to get the opaque pointer and
 
-  * sequence number.
 
-  *
 
-  * It is important to note that the same SRT may exist multiple times and map to
 
-  * multiple (opaque pointer, sequence number) tuples, for example, if we
 
-  * initiate multiple connections to the same peer using the same local QUIC_PORT
 
-  * and the peer decides to behave bizarrely and issue the same SRT for both
 
-  * connections. It should not do this, but we have to be resilient against
 
-  * byzantine peer behaviour. Thus we are capable of storing multiple identical
 
-  * SRTs for different (opaque pointer, sequence number) keys.
 
-  *
 
-  * The SRTM supports arbitrary insertion, arbitrary deletion of specific keys
 
-  * identified by a (opaque pointer, sequence number) key, and mass deletion of
 
-  * all entries under a specific opaque pointer. It supports lookup by SRT to
 
-  * identify zero or more corresponding (opaque pointer, sequence number) tuples.
 
-  *
 
-  * The opaque pointer may be used for any purpose but is intended to represent a
 
-  * connection identity and must therefore be consistent (usefully comparable).
 
-  */
 
- /* Creates a new empty SRTM instance. */
 
- QUIC_SRTM *ossl_quic_srtm_new(OSSL_LIB_CTX *libctx, const char *propq);
 
- /* Frees a SRTM instance. No-op if srtm is NULL. */
 
- void ossl_quic_srtm_free(QUIC_SRTM *srtm);
 
- /*
 
-  * Add a (opaque, seq_num) -> SRT entry to the SRTM. This operation fails if a
 
-  * SRT entry already exists with the same (opaque, seq_num) tuple. The token is
 
-  * copied. Returns 1 on success or 0 on failure.
 
-  */
 
- int ossl_quic_srtm_add(QUIC_SRTM *srtm, void *opaque, uint64_t seq_num,
 
-                        const QUIC_STATELESS_RESET_TOKEN *token);
 
- /*
 
-  * Removes an entry by identifying it via its (opaque, seq_num) tuple.
 
-  * Returns 1 if the entry was found and removed, and 0 if it was not found.
 
-  */
 
- int ossl_quic_srtm_remove(QUIC_SRTM *srtm, void *opaque, uint64_t seq_num);
 
- /*
 
-  * Removes all entries (opaque, *) with the given opaque pointer.
 
-  *
 
-  * Returns 1 on success and 0 on failure. If no entries with the given opaque
 
-  * pointer were found, this is considered a success condition.
 
-  */
 
- int ossl_quic_srtm_cull(QUIC_SRTM *strm, void *opaque);
 
- /*
 
-  * Looks up a SRT to find the corresponding opaque pointer and sequence number.
 
-  * An output field pointer can be set to NULL if it is not required.
 
-  *
 
-  * This function is designed to avoid exposing timing channels on token values
 
-  * or the contents of the SRT mapping.
 
-  *
 
-  * If there are several identical SRTs, idx can be used to get the nth entry.
 
-  * Call this function with idx set to 0 first, and keep calling it after
 
-  * incrementing idx until it returns 0.
 
-  *
 
-  * Returns 1 if an entry was found and 0 otherwise.
 
-  */
 
- int ossl_quic_srtm_lookup(QUIC_SRTM *srtm,
 
-                           const QUIC_STATELESS_RESET_TOKEN *token,
 
-                           size_t idx,
 
-                           void **opaque, uint64_t *seq_num);
 
- /* Verify internal invariants and assert if they are not met. */
 
- void ossl_quic_srtm_check(const QUIC_SRTM *srtm);
 
- # endif
 
- #endif
 
 
  |