1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
25392f7a3SLiteSpeed Tech#ifndef LSQUIC_ENC_SESS_H
35392f7a3SLiteSpeed Tech#define LSQUIC_ENC_SESS_H 1
45392f7a3SLiteSpeed Tech
5f07b3eaeSTyler Young#include "lsquic_shared_support.h"
6f07b3eaeSTyler Young
765728dc5SDmitri Tikhonovstruct lsquic_alarmset;
85392f7a3SLiteSpeed Techstruct lsquic_engine_public;
95392f7a3SLiteSpeed Techstruct lsquic_packet_out;
105392f7a3SLiteSpeed Techstruct lsquic_packet_in;
115392f7a3SLiteSpeed Techstruct stream_wrapper;
125392f7a3SLiteSpeed Techstruct ver_neg;
135392f7a3SLiteSpeed Techstruct lsquic_conn;
145392f7a3SLiteSpeed Techstruct transport_params;
155392f7a3SLiteSpeed Techstruct lsquic_cid;
165392f7a3SLiteSpeed Techstruct ssl_stream_method_st;
175392f7a3SLiteSpeed Techstruct ssl_st;
185392f7a3SLiteSpeed Techstruct sockaddr;
195392f7a3SLiteSpeed Techstruct conn_cid_elem;
2004f8f447SDmitri Tikhonovstruct lsquic_engine_settings;
2104f8f447SDmitri Tikhonovenum lsquic_version;
225392f7a3SLiteSpeed Tech
235392f7a3SLiteSpeed Tech#define DNONC_LENGTH 32
245392f7a3SLiteSpeed Tech#define SRST_LENGTH 16
255392f7a3SLiteSpeed Tech
265392f7a3SLiteSpeed Tech/* From [draft-ietf-quic-tls-14]:
275392f7a3SLiteSpeed Tech *
285392f7a3SLiteSpeed Tech * Data is protected using a number of encryption levels:
295392f7a3SLiteSpeed Tech *
305392f7a3SLiteSpeed Tech * o  Plaintext
315392f7a3SLiteSpeed Tech *
325392f7a3SLiteSpeed Tech * o  Early Data (0-RTT) Keys
335392f7a3SLiteSpeed Tech *
345392f7a3SLiteSpeed Tech * o  Handshake Keys
355392f7a3SLiteSpeed Tech *
365392f7a3SLiteSpeed Tech * o  Application Data (1-RTT) Keys
375392f7a3SLiteSpeed Tech */
385392f7a3SLiteSpeed Tech
395392f7a3SLiteSpeed Tech/* This enum maps to the list above */
405392f7a3SLiteSpeed Techenum enc_level
415392f7a3SLiteSpeed Tech{
425392f7a3SLiteSpeed Tech    ENC_LEV_CLEAR,
435392f7a3SLiteSpeed Tech    ENC_LEV_EARLY,
445392f7a3SLiteSpeed Tech    ENC_LEV_INIT,
455392f7a3SLiteSpeed Tech    ENC_LEV_FORW,
465392f7a3SLiteSpeed Tech    N_ENC_LEVS
475392f7a3SLiteSpeed Tech};
485392f7a3SLiteSpeed Tech
495392f7a3SLiteSpeed Techenum handshake_error            /* TODO: rename this enum */
505392f7a3SLiteSpeed Tech{
515392f7a3SLiteSpeed Tech    DATA_NOT_ENOUGH = -2,
525392f7a3SLiteSpeed Tech    DATA_FORMAT_ERROR = -1,
535392f7a3SLiteSpeed Tech    HS_ERROR = -1,
545392f7a3SLiteSpeed Tech    DATA_NO_ERROR = 0,
555392f7a3SLiteSpeed Tech    HS_SHLO = 0,
565392f7a3SLiteSpeed Tech    HS_1RTT = 1,
575392f7a3SLiteSpeed Tech    HS_SREJ = 2,
585392f7a3SLiteSpeed Tech};
595392f7a3SLiteSpeed Tech
605392f7a3SLiteSpeed Tech#ifndef LSQUIC_KEEP_ENC_SESS_HISTORY
615392f7a3SLiteSpeed Tech#   ifndef NDEBUG
625392f7a3SLiteSpeed Tech#       define LSQUIC_KEEP_ENC_SESS_HISTORY 1
635392f7a3SLiteSpeed Tech#   else
645392f7a3SLiteSpeed Tech#       define LSQUIC_KEEP_ENC_SESS_HISTORY 0
655392f7a3SLiteSpeed Tech#   endif
665392f7a3SLiteSpeed Tech#endif
675392f7a3SLiteSpeed Tech
685392f7a3SLiteSpeed Tech#if LSQUIC_KEEP_ENC_SESS_HISTORY
695392f7a3SLiteSpeed Tech#define ESHIST_BITS 7
705392f7a3SLiteSpeed Tech#define ESHIST_MASK ((1 << ESHIST_BITS) - 1)
715392f7a3SLiteSpeed Tech#define ESHIST_STR_SIZE ((1 << ESHIST_BITS) + 1)
725392f7a3SLiteSpeed Tech#endif
735392f7a3SLiteSpeed Tech
745392f7a3SLiteSpeed Techenum enc_packout { ENCPA_OK, ENCPA_NOMEM, ENCPA_BADCRYPT, };
755392f7a3SLiteSpeed Tech
765392f7a3SLiteSpeed Techenum dec_packin {
775392f7a3SLiteSpeed Tech    DECPI_OK,
785392f7a3SLiteSpeed Tech    DECPI_NOMEM,
795392f7a3SLiteSpeed Tech    DECPI_TOO_SHORT,
805392f7a3SLiteSpeed Tech    DECPI_NOT_YET,
815392f7a3SLiteSpeed Tech    DECPI_BADCRYPT,
825392f7a3SLiteSpeed Tech    DECPI_VIOLATION,
835392f7a3SLiteSpeed Tech};
845392f7a3SLiteSpeed Tech
855392f7a3SLiteSpeed Techtypedef void enc_session_t;
865392f7a3SLiteSpeed Tech
875392f7a3SLiteSpeed Techstruct enc_session_funcs_common
885392f7a3SLiteSpeed Tech{
895392f7a3SLiteSpeed Tech    /* Global initialization: call once per implementation */
905392f7a3SLiteSpeed Tech    int (*esf_global_init)(int flags);
915392f7a3SLiteSpeed Tech
925392f7a3SLiteSpeed Tech    /* Global cleanup: call once per implementation */
935392f7a3SLiteSpeed Tech    void (*esf_global_cleanup) (void);
945392f7a3SLiteSpeed Tech
955392f7a3SLiteSpeed Tech    const char *
965392f7a3SLiteSpeed Tech    (*esf_cipher) (enc_session_t *);
975392f7a3SLiteSpeed Tech
985392f7a3SLiteSpeed Tech    int
995392f7a3SLiteSpeed Tech    (*esf_keysize) (enc_session_t *);
1005392f7a3SLiteSpeed Tech
1015392f7a3SLiteSpeed Tech    int
1025392f7a3SLiteSpeed Tech    (*esf_alg_keysize) (enc_session_t *);
1035392f7a3SLiteSpeed Tech
10438e83598SDmitri Tikhonov    const char *
10538e83598SDmitri Tikhonov    (*esf_get_sni) (enc_session_t *);
10638e83598SDmitri Tikhonov
107a137764bSDmitri Tikhonov    /* Need to pass lconn in encrypt and decrypt methods because enc_session
108a137764bSDmitri Tikhonov     * is allowed to be NULL for gQUIC.
109a137764bSDmitri Tikhonov     */
1105392f7a3SLiteSpeed Tech    enum enc_packout
1115392f7a3SLiteSpeed Tech    (*esf_encrypt_packet) (enc_session_t *, const struct lsquic_engine_public *,
1125392f7a3SLiteSpeed Tech        struct lsquic_conn *, struct lsquic_packet_out *);
1135392f7a3SLiteSpeed Tech
1145392f7a3SLiteSpeed Tech    enum dec_packin
1155392f7a3SLiteSpeed Tech    (*esf_decrypt_packet)(enc_session_t *, struct lsquic_engine_public *,
1165392f7a3SLiteSpeed Tech        const struct lsquic_conn *, struct lsquic_packet_in *);
1175392f7a3SLiteSpeed Tech
1185392f7a3SLiteSpeed Tech    struct stack_st_X509 *
1195392f7a3SLiteSpeed Tech    (*esf_get_server_cert_chain) (enc_session_t *);
1205392f7a3SLiteSpeed Tech
1215392f7a3SLiteSpeed Tech    int
1225392f7a3SLiteSpeed Tech    (*esf_verify_reset_token) (enc_session_t *, const unsigned char *, size_t);
1235392f7a3SLiteSpeed Tech
1245392f7a3SLiteSpeed Tech    int
1257483dee0SDmitri Tikhonov    (*esf_did_sess_resume_succeed) (enc_session_t *);
1265392f7a3SLiteSpeed Tech
1275392f7a3SLiteSpeed Tech    int
1287483dee0SDmitri Tikhonov    (*esf_is_sess_resume_enabled) (enc_session_t *);
1295392f7a3SLiteSpeed Tech
130a137764bSDmitri Tikhonov    void
131a137764bSDmitri Tikhonov    (*esf_set_conn) (enc_session_t *, struct lsquic_conn *);
132a137764bSDmitri Tikhonov
133da99665bSDmitri Tikhonov    /* Optional.  This function gets called after packets are encrypted,
134da99665bSDmitri Tikhonov     * batched, and are about to be sent.
135da99665bSDmitri Tikhonov     */
136da99665bSDmitri Tikhonov    void
137da99665bSDmitri Tikhonov    (*esf_flush_encryption) (enc_session_t *);
138da99665bSDmitri Tikhonov
1395392f7a3SLiteSpeed Tech    unsigned
1405392f7a3SLiteSpeed Tech    esf_tag_len;
1415392f7a3SLiteSpeed Tech};
1425392f7a3SLiteSpeed Tech
1435392f7a3SLiteSpeed Techstruct enc_session_funcs_gquic
1445392f7a3SLiteSpeed Tech{
1455392f7a3SLiteSpeed Tech#if LSQUIC_KEEP_ENC_SESS_HISTORY
1465392f7a3SLiteSpeed Tech    /* Grab encryption session history */
1475392f7a3SLiteSpeed Tech    void (*esf_get_hist) (enc_session_t *,
1485392f7a3SLiteSpeed Tech                                            char buf[ESHIST_STR_SIZE]);
1495392f7a3SLiteSpeed Tech#endif
1505392f7a3SLiteSpeed Tech
1515392f7a3SLiteSpeed Tech    /* Destroy enc session */
1525392f7a3SLiteSpeed Tech    void (*esf_destroy)(enc_session_t *enc_session);
1535392f7a3SLiteSpeed Tech
1545392f7a3SLiteSpeed Tech    /* Return true if handshake has been completed */
1555392f7a3SLiteSpeed Tech    int (*esf_is_hsk_done)(enc_session_t *enc_session);
1565392f7a3SLiteSpeed Tech
1575392f7a3SLiteSpeed Tech    /* Get value of setting specified by `tag' */
1585392f7a3SLiteSpeed Tech    int (*esf_get_peer_setting) (enc_session_t *, uint32_t tag,
1595392f7a3SLiteSpeed Tech                                                                uint32_t *val);
1605392f7a3SLiteSpeed Tech
1615392f7a3SLiteSpeed Tech    /* Get value of peer option (that from COPT array) */
1625392f7a3SLiteSpeed Tech    int (*esf_get_peer_option) (enc_session_t *enc_session,
1635392f7a3SLiteSpeed Tech                                                                uint32_t tag);
1645392f7a3SLiteSpeed Tech
1655392f7a3SLiteSpeed Tech    /* Create server session */
1665392f7a3SLiteSpeed Tech    enc_session_t *
167a137764bSDmitri Tikhonov    (*esf_create_server) (struct lsquic_conn *,
1682f4629f2SDmitri Tikhonov                        lsquic_cid_t cid, struct lsquic_engine_public *);
1695392f7a3SLiteSpeed Tech
1705392f7a3SLiteSpeed Tech    /* out_len should have init value as the max length of out */
1715392f7a3SLiteSpeed Tech    enum handshake_error
1725392f7a3SLiteSpeed Tech    (*esf_handle_chlo) (enc_session_t *enc_session, enum lsquic_version,
1735392f7a3SLiteSpeed Tech                const uint8_t *in, int in_len, time_t t,
1745392f7a3SLiteSpeed Tech                const struct sockaddr *ip_addr, const struct sockaddr *local,
1755392f7a3SLiteSpeed Tech                uint8_t *out, size_t *out_len,
1765392f7a3SLiteSpeed Tech                uint8_t nonce[DNONC_LENGTH], int *nonce_set);
1775392f7a3SLiteSpeed Tech
1785392f7a3SLiteSpeed Tech    void (*esf_hsk_destroy)(void *hsk_ctx);
1795392f7a3SLiteSpeed Tech
1805392f7a3SLiteSpeed Tech#ifndef NDEBUG
1815392f7a3SLiteSpeed Tech    /* Need to expose this function for testing */
1825392f7a3SLiteSpeed Tech    int (*esf_determine_diversification_key) (enc_session_t *,
1837a8b2eceSDmitri Tikhonov                              uint8_t *diversification_nonce);
1845392f7a3SLiteSpeed Tech#endif
1855392f7a3SLiteSpeed Tech
1865392f7a3SLiteSpeed Tech    const char *
1875392f7a3SLiteSpeed Tech    (*esf_get_ua) (enc_session_t *);
1885392f7a3SLiteSpeed Tech
1895392f7a3SLiteSpeed Tech    int
1905392f7a3SLiteSpeed Tech    (*esf_have_key_gt_one) (enc_session_t *enc_session);
1915392f7a3SLiteSpeed Tech
1925392f7a3SLiteSpeed Tech#ifndef NDEBUG
1935392f7a3SLiteSpeed Tech    /* Functions that are only relevant in maintest.  We may want to get rid
1945392f7a3SLiteSpeed Tech     * of them somehow and only use the public API to test.
1955392f7a3SLiteSpeed Tech     */
1965392f7a3SLiteSpeed Tech
1975392f7a3SLiteSpeed Tech    uint8_t
1985392f7a3SLiteSpeed Tech    (*esf_have_key) (enc_session_t *);
1995392f7a3SLiteSpeed Tech
2005392f7a3SLiteSpeed Tech    void
2015392f7a3SLiteSpeed Tech    (*esf_set_have_key) (enc_session_t *, uint8_t);
2025392f7a3SLiteSpeed Tech
2035392f7a3SLiteSpeed Tech    const unsigned char *
2045392f7a3SLiteSpeed Tech    (*esf_get_enc_key_i) (enc_session_t *);
2055392f7a3SLiteSpeed Tech
2065392f7a3SLiteSpeed Tech    const unsigned char *
2075392f7a3SLiteSpeed Tech    (*esf_get_dec_key_i) (enc_session_t *);
2085392f7a3SLiteSpeed Tech
2095392f7a3SLiteSpeed Tech    const unsigned char *
2105392f7a3SLiteSpeed Tech    (*esf_get_enc_key_nonce_i) (enc_session_t *);
2115392f7a3SLiteSpeed Tech
2125392f7a3SLiteSpeed Tech    const unsigned char *
2135392f7a3SLiteSpeed Tech    (*esf_get_dec_key_nonce_i) (enc_session_t *);
2145392f7a3SLiteSpeed Tech
2155392f7a3SLiteSpeed Tech    const unsigned char *
2165392f7a3SLiteSpeed Tech    (*esf_get_enc_key_nonce_f) (enc_session_t *);
2175392f7a3SLiteSpeed Tech
2185392f7a3SLiteSpeed Tech    const unsigned char *
2195392f7a3SLiteSpeed Tech    (*esf_get_dec_key_nonce_f) (enc_session_t *);
2205392f7a3SLiteSpeed Tech#endif /* !defined(NDEBUG) */
2215392f7a3SLiteSpeed Tech
2225392f7a3SLiteSpeed Tech    /* Create client session */
2235392f7a3SLiteSpeed Tech    enc_session_t *
224a137764bSDmitri Tikhonov    (*esf_create_client) (struct lsquic_conn *, const char *domain,
225a137764bSDmitri Tikhonov                            lsquic_cid_t cid,
2262f4629f2SDmitri Tikhonov                                    struct lsquic_engine_public *,
2275392f7a3SLiteSpeed Tech                                    const unsigned char *, size_t);
2285392f7a3SLiteSpeed Tech
2295392f7a3SLiteSpeed Tech    /* -1 error, 0, OK, response in `buf' */
2305392f7a3SLiteSpeed Tech    int
2315392f7a3SLiteSpeed Tech    (*esf_gen_chlo) (enc_session_t *, enum lsquic_version,
2325392f7a3SLiteSpeed Tech                                                uint8_t *buf, size_t *len);
2335392f7a3SLiteSpeed Tech
2345392f7a3SLiteSpeed Tech    int
2355392f7a3SLiteSpeed Tech    (*esf_handle_chlo_reply) (enc_session_t *,
2365392f7a3SLiteSpeed Tech                                                const uint8_t *data, int len);
2375392f7a3SLiteSpeed Tech
2385392f7a3SLiteSpeed Tech    size_t
2395392f7a3SLiteSpeed Tech    (*esf_mem_used)(enc_session_t *);
2405392f7a3SLiteSpeed Tech
2417483dee0SDmitri Tikhonov    /* Session resumption serialization needs the knowledge of the QUIC
2427483dee0SDmitri Tikhonov     * version, that's why there is a separate method for thus.  Plus, we
2437483dee0SDmitri Tikhonov     * want to be able to call it after the "handshake is done" callback
2447483dee0SDmitri Tikhonov     * is called.
2455392f7a3SLiteSpeed Tech     */
2467483dee0SDmitri Tikhonov    void (*esf_maybe_dispatch_sess_resume) (enc_session_t *,
2475392f7a3SLiteSpeed Tech            void (*cb)(struct lsquic_conn *, const unsigned char *, size_t));
2485392f7a3SLiteSpeed Tech
2495392f7a3SLiteSpeed Tech    void (*esf_reset_cid) (enc_session_t *, const lsquic_cid_t *);
2505392f7a3SLiteSpeed Tech};
2515392f7a3SLiteSpeed Tech
2525392f7a3SLiteSpeed Techstruct crypto_stream_if
2535392f7a3SLiteSpeed Tech{
2545392f7a3SLiteSpeed Tech    ssize_t     (*csi_write) (void *stream, const void *buf, size_t len);
2555392f7a3SLiteSpeed Tech    int         (*csi_flush) (void *stream);
2565392f7a3SLiteSpeed Tech    ssize_t     (*csi_readf) (void *stream,
2575392f7a3SLiteSpeed Tech        size_t (*readf)(void *, const unsigned char *, size_t, int), void *ctx);
2585392f7a3SLiteSpeed Tech    int         (*csi_wantwrite) (void *stream, int is_want);
2595392f7a3SLiteSpeed Tech    int         (*csi_wantread) (void *stream, int is_want);
2605392f7a3SLiteSpeed Tech    enum enc_level
2615392f7a3SLiteSpeed Tech                (*csi_enc_level) (void *stream);
2625392f7a3SLiteSpeed Tech};
2635392f7a3SLiteSpeed Tech
2645392f7a3SLiteSpeed Techstruct enc_session_funcs_iquic
2655392f7a3SLiteSpeed Tech{
2665392f7a3SLiteSpeed Tech    enc_session_t *
2675392f7a3SLiteSpeed Tech    (*esfi_create_client) (const char *domain, struct lsquic_engine_public *,
2685392f7a3SLiteSpeed Tech                           struct lsquic_conn *, const struct lsquic_cid *,
2695392f7a3SLiteSpeed Tech                           const struct ver_neg *, void *(crypto_streams)[4],
2705392f7a3SLiteSpeed Tech                           const struct crypto_stream_if *,
27165728dc5SDmitri Tikhonov                           const unsigned char *, size_t,
27221bcad87Ssumasrao                           struct lsquic_alarmset *, unsigned, void*);
2735392f7a3SLiteSpeed Tech
2745392f7a3SLiteSpeed Tech    void
2755392f7a3SLiteSpeed Tech    (*esfi_destroy) (enc_session_t *);
2765392f7a3SLiteSpeed Tech
2775392f7a3SLiteSpeed Tech    struct ssl_st *
2785392f7a3SLiteSpeed Tech    (*esfi_get_ssl) (enc_session_t *);
2795392f7a3SLiteSpeed Tech
2805392f7a3SLiteSpeed Tech    struct transport_params *
2815392f7a3SLiteSpeed Tech    (*esfi_get_peer_transport_params) (enc_session_t *);
2825392f7a3SLiteSpeed Tech
2835392f7a3SLiteSpeed Tech    int
2845392f7a3SLiteSpeed Tech    (*esfi_reset_dcid) (enc_session_t *, const struct lsquic_cid *,
2855392f7a3SLiteSpeed Tech                                                const struct lsquic_cid *);
2865392f7a3SLiteSpeed Tech
287fb73393fSDmitri Tikhonov    void
288fb73393fSDmitri Tikhonov    (*esfi_set_iscid) (enc_session_t *, const struct lsquic_packet_in *);
289fb73393fSDmitri Tikhonov
2905392f7a3SLiteSpeed Tech    int
2915392f7a3SLiteSpeed Tech    (*esfi_init_server) (enc_session_t *);
2925392f7a3SLiteSpeed Tech
2935392f7a3SLiteSpeed Tech    void
2945392f7a3SLiteSpeed Tech    (*esfi_set_streams) (enc_session_t *, void *(crypto_streams)[4],
2955392f7a3SLiteSpeed Tech                           const struct crypto_stream_if *);
2965392f7a3SLiteSpeed Tech
2975392f7a3SLiteSpeed Tech    enc_session_t *
2985392f7a3SLiteSpeed Tech    (*esfi_create_server) (struct lsquic_engine_public *, struct lsquic_conn *,
2995392f7a3SLiteSpeed Tech                                                    const struct lsquic_cid *,
3005392f7a3SLiteSpeed Tech                           void *(crypto_streams)[4],
3015392f7a3SLiteSpeed Tech                           const struct crypto_stream_if *,
302fb73393fSDmitri Tikhonov                           const struct lsquic_cid *odcid,
30306b2a236SDmitri Tikhonov                           const struct lsquic_cid *iscid);
3045392f7a3SLiteSpeed Tech
3055392f7a3SLiteSpeed Tech    void
3065392f7a3SLiteSpeed Tech    (*esfi_shake_stream)(enc_session_t *, struct lsquic_stream *,
3075392f7a3SLiteSpeed Tech                         const char *);
3085392f7a3SLiteSpeed Tech
3095392f7a3SLiteSpeed Tech    void
3109fc12041SDmitri Tikhonov    (*esfi_handshake_confirmed)(enc_session_t *);
311e68b0452SDmitri Tikhonov
312e68b0452SDmitri Tikhonov    int
313e68b0452SDmitri Tikhonov    (*esfi_in_init)(enc_session_t *);
314e68b0452SDmitri Tikhonov
315e68b0452SDmitri Tikhonov    int
316e68b0452SDmitri Tikhonov    (*esfi_data_in)(enc_session_t *, enum enc_level,
317e68b0452SDmitri Tikhonov                                            const unsigned char *, size_t);
3185392f7a3SLiteSpeed Tech};
3195392f7a3SLiteSpeed Tech
320f07b3eaeSTyler YoungLSQUIC_EXTERN
3215392f7a3SLiteSpeed Tech#ifdef NDEBUG
3225392f7a3SLiteSpeed Techconst
3235392f7a3SLiteSpeed Tech#endif
3245392f7a3SLiteSpeed Techstruct enc_session_funcs_common lsquic_enc_session_common_gquic_1;
3257a8b2eceSDmitri Tikhonov
326f07b3eaeSTyler YoungLSQUIC_EXTERN
3277a8b2eceSDmitri Tikhonov#ifdef NDEBUG
3287a8b2eceSDmitri Tikhonovconst
3297a8b2eceSDmitri Tikhonov#endif
3307a8b2eceSDmitri Tikhonovstruct enc_session_funcs_common lsquic_enc_session_common_gquic_2;
3317a8b2eceSDmitri Tikhonov
332f07b3eaeSTyler YoungLSQUIC_EXTERN const struct enc_session_funcs_common lsquic_enc_session_common_ietf_v1;
3335392f7a3SLiteSpeed Tech
334f07b3eaeSTyler YoungLSQUIC_EXTERN
3355392f7a3SLiteSpeed Tech#ifdef NDEBUG
3365392f7a3SLiteSpeed Techconst
3375392f7a3SLiteSpeed Tech#endif
3385392f7a3SLiteSpeed Techstruct enc_session_funcs_gquic lsquic_enc_session_gquic_gquic_1;
3395392f7a3SLiteSpeed Tech
340f07b3eaeSTyler YoungLSQUIC_EXTERN const struct enc_session_funcs_iquic lsquic_enc_session_iquic_ietf_v1;
3415392f7a3SLiteSpeed Tech
3425392f7a3SLiteSpeed Tech#define select_esf_common_by_ver(ver) ( \
343bc520ef7SDmitri Tikhonov    ver == LSQVER_ID27 ? &lsquic_enc_session_common_ietf_v1 : \
3444051ae3aSDmitri Tikhonov    ver == LSQVER_ID29 ? &lsquic_enc_session_common_ietf_v1 : \
34526e8f082SDmitri Tikhonov    ver == LSQVER_I001 ? &lsquic_enc_session_common_ietf_v1 : \
3465392f7a3SLiteSpeed Tech    ver == LSQVER_VERNEG ? &lsquic_enc_session_common_ietf_v1 : \
3477a8b2eceSDmitri Tikhonov    ver == LSQVER_050 ? &lsquic_enc_session_common_gquic_2 : \
3485392f7a3SLiteSpeed Tech    &lsquic_enc_session_common_gquic_1 )
3495392f7a3SLiteSpeed Tech
3505392f7a3SLiteSpeed Tech#define select_esf_gquic_by_ver(ver) ( \
3515392f7a3SLiteSpeed Tech    ver ? &lsquic_enc_session_gquic_gquic_1 : &lsquic_enc_session_gquic_gquic_1)
3525392f7a3SLiteSpeed Tech
3535392f7a3SLiteSpeed Tech#define select_esf_iquic_by_ver(ver) ( \
3545392f7a3SLiteSpeed Tech    ver ? &lsquic_enc_session_iquic_ietf_v1 : &lsquic_enc_session_iquic_ietf_v1)
3555392f7a3SLiteSpeed Tech
3565392f7a3SLiteSpeed Techextern const char *const lsquic_enclev2str[];
3575392f7a3SLiteSpeed Tech
358f07b3eaeSTyler YoungLSQUIC_EXTERN const struct lsquic_stream_if lsquic_cry_sm_if;
3595392f7a3SLiteSpeed Tech
360f07b3eaeSTyler YoungLSQUIC_EXTERN const struct lsquic_stream_if lsquic_mini_cry_sm_if;
3615392f7a3SLiteSpeed Tech
3625392f7a3SLiteSpeed Tech/* RFC 7301, Section 3.2 */
3635392f7a3SLiteSpeed Tech#define ALERT_NO_APPLICATION_PROTOCOL 120
3645392f7a3SLiteSpeed Tech
3655392f7a3SLiteSpeed Techenum lsquic_version
3667483dee0SDmitri Tikhonovlsquic_sess_resume_version (const unsigned char *, size_t);
3675392f7a3SLiteSpeed Tech
3685392f7a3SLiteSpeed Tech/* This is seems to be true for all of the ciphers used by IETF QUIC.
3695392f7a3SLiteSpeed Tech * XXX: Perhaps add a check?
3705392f7a3SLiteSpeed Tech */
3715392f7a3SLiteSpeed Tech#define IQUIC_TAG_LEN 16
3725392f7a3SLiteSpeed Tech
37304f8f447SDmitri Tikhonov/* Return number of bytes written to `buf' or -1 on error */
37404f8f447SDmitri Tikhonovint
37504f8f447SDmitri Tikhonovlsquic_enc_sess_ietf_gen_quic_ctx (
37604f8f447SDmitri Tikhonov                const struct lsquic_engine_settings *settings,
37704f8f447SDmitri Tikhonov                enum lsquic_version version, unsigned char *buf, size_t bufsz);
37804f8f447SDmitri Tikhonov
3795392f7a3SLiteSpeed Tech#endif
380