1 /* 2 * Copyright 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_INTERNAL_QUIC_SRT_GEN_H 11 # define OSSL_INTERNAL_QUIC_SRT_GEN_H 12 # pragma once 13 14 # include "internal/e_os.h" 15 # include "internal/time.h" 16 # include "internal/quic_types.h" 17 # include "internal/quic_wire.h" 18 19 # ifndef OPENSSL_NO_QUIC 20 21 /* 22 * QUIC Stateless Reset Token Generator 23 * ==================================== 24 * 25 * This generates 16-byte QUIC Stateless Reset Tokens given a secret symmetric 26 * key and a DCID. Because the output is deterministic with regards to these 27 * inputs, assuming the same key is used between invocations of a process, we 28 * are able to generate the same stateless reset token in a subsequent process, 29 * thereby allowing us to achieve stateless reset of a peer which still thinks 30 * it is connected to a past process at the same UDP address. 31 */ 32 typedef struct quic_srt_gen_st QUIC_SRT_GEN; 33 34 /* 35 * Create a new stateless reset token generator using the given key as input. 36 * The key may be of arbitrary length. 37 * 38 * The caller is responsible for performing domain separation with regards to 39 * the key; i.e., the caller is responsible for ensuring the key is never used 40 * in any other context. 41 */ 42 QUIC_SRT_GEN *ossl_quic_srt_gen_new(OSSL_LIB_CTX *libctx, const char *propq, 43 const unsigned char *key, size_t key_len); 44 45 /* Free the stateless reset token generator. No-op if srt_gen is NULL. */ 46 void ossl_quic_srt_gen_free(QUIC_SRT_GEN *srt_gen); 47 48 /* 49 * Calculates a token using the given DCID and writes it to *token. Returns 0 on 50 * failure. 51 */ 52 int ossl_quic_srt_gen_calculate_token(QUIC_SRT_GEN *srt_gen, 53 const QUIC_CONN_ID *dcid, 54 QUIC_STATELESS_RESET_TOKEN *token); 55 56 # endif 57 #endif 58