lsquic_enc_sess.h revision 7a8b2ece
15392f7a3SLiteSpeed Tech/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc.  See LICENSE. */
25392f7a3SLiteSpeed Tech#ifndef LSQUIC_ENC_SESS_H
35392f7a3SLiteSpeed Tech#define LSQUIC_ENC_SESS_H 1
45392f7a3SLiteSpeed Tech
565728dc5SDmitri Tikhonovstruct lsquic_alarmset;
65392f7a3SLiteSpeed Techstruct lsquic_engine_public;
75392f7a3SLiteSpeed Techstruct lsquic_packet_out;
85392f7a3SLiteSpeed Techstruct lsquic_packet_in;
95392f7a3SLiteSpeed Techstruct stream_wrapper;
105392f7a3SLiteSpeed Techstruct ver_neg;
115392f7a3SLiteSpeed Techstruct lsquic_conn;
125392f7a3SLiteSpeed Techstruct transport_params;
135392f7a3SLiteSpeed Techstruct lsquic_cid;
145392f7a3SLiteSpeed Techstruct ssl_stream_method_st;
155392f7a3SLiteSpeed Techstruct ssl_st;
165392f7a3SLiteSpeed Techstruct sockaddr;
175392f7a3SLiteSpeed Techstruct conn_cid_elem;
185392f7a3SLiteSpeed Tech
195392f7a3SLiteSpeed Tech#define DNONC_LENGTH 32
205392f7a3SLiteSpeed Tech#define SRST_LENGTH 16
215392f7a3SLiteSpeed Tech
225392f7a3SLiteSpeed Tech/* From [draft-ietf-quic-tls-14]:
235392f7a3SLiteSpeed Tech *
245392f7a3SLiteSpeed Tech * Data is protected using a number of encryption levels:
255392f7a3SLiteSpeed Tech *
265392f7a3SLiteSpeed Tech * o  Plaintext
275392f7a3SLiteSpeed Tech *
285392f7a3SLiteSpeed Tech * o  Early Data (0-RTT) Keys
295392f7a3SLiteSpeed Tech *
305392f7a3SLiteSpeed Tech * o  Handshake Keys
315392f7a3SLiteSpeed Tech *
325392f7a3SLiteSpeed Tech * o  Application Data (1-RTT) Keys
335392f7a3SLiteSpeed Tech */
345392f7a3SLiteSpeed Tech
355392f7a3SLiteSpeed Tech/* This enum maps to the list above */
365392f7a3SLiteSpeed Techenum enc_level
375392f7a3SLiteSpeed Tech{
385392f7a3SLiteSpeed Tech    ENC_LEV_CLEAR,
395392f7a3SLiteSpeed Tech    ENC_LEV_EARLY,
405392f7a3SLiteSpeed Tech    ENC_LEV_INIT,
415392f7a3SLiteSpeed Tech    ENC_LEV_FORW,
425392f7a3SLiteSpeed Tech    N_ENC_LEVS
435392f7a3SLiteSpeed Tech};
445392f7a3SLiteSpeed Tech
455392f7a3SLiteSpeed Techenum handshake_error            /* TODO: rename this enum */
465392f7a3SLiteSpeed Tech{
475392f7a3SLiteSpeed Tech    DATA_NOT_ENOUGH = -2,
485392f7a3SLiteSpeed Tech    DATA_FORMAT_ERROR = -1,
495392f7a3SLiteSpeed Tech    HS_ERROR = -1,
505392f7a3SLiteSpeed Tech    DATA_NO_ERROR = 0,
515392f7a3SLiteSpeed Tech    HS_SHLO = 0,
525392f7a3SLiteSpeed Tech    HS_1RTT = 1,
535392f7a3SLiteSpeed Tech    HS_SREJ = 2,
545392f7a3SLiteSpeed Tech    HS_DELAYED = 3,
555392f7a3SLiteSpeed Tech    HS_PK_OFFLOAD = 4,
565392f7a3SLiteSpeed Tech};
575392f7a3SLiteSpeed Tech
585392f7a3SLiteSpeed Tech#ifndef LSQUIC_KEEP_ENC_SESS_HISTORY
595392f7a3SLiteSpeed Tech#   ifndef NDEBUG
605392f7a3SLiteSpeed Tech#       define LSQUIC_KEEP_ENC_SESS_HISTORY 1
615392f7a3SLiteSpeed Tech#   else
625392f7a3SLiteSpeed Tech#       define LSQUIC_KEEP_ENC_SESS_HISTORY 0
635392f7a3SLiteSpeed Tech#   endif
645392f7a3SLiteSpeed Tech#endif
655392f7a3SLiteSpeed Tech
665392f7a3SLiteSpeed Tech#if LSQUIC_KEEP_ENC_SESS_HISTORY
675392f7a3SLiteSpeed Tech#define ESHIST_BITS 7
685392f7a3SLiteSpeed Tech#define ESHIST_MASK ((1 << ESHIST_BITS) - 1)
695392f7a3SLiteSpeed Tech#define ESHIST_STR_SIZE ((1 << ESHIST_BITS) + 1)
705392f7a3SLiteSpeed Tech#endif
715392f7a3SLiteSpeed Tech
725392f7a3SLiteSpeed Techenum enc_packout { ENCPA_OK, ENCPA_NOMEM, ENCPA_BADCRYPT, };
735392f7a3SLiteSpeed Tech
745392f7a3SLiteSpeed Techenum dec_packin {
755392f7a3SLiteSpeed Tech    DECPI_OK,
765392f7a3SLiteSpeed Tech    DECPI_NOMEM,
775392f7a3SLiteSpeed Tech    DECPI_TOO_SHORT,
785392f7a3SLiteSpeed Tech    DECPI_NOT_YET,
795392f7a3SLiteSpeed Tech    DECPI_BADCRYPT,
805392f7a3SLiteSpeed Tech    DECPI_VIOLATION,
815392f7a3SLiteSpeed Tech};
825392f7a3SLiteSpeed Tech
835392f7a3SLiteSpeed Techtypedef void enc_session_t;
845392f7a3SLiteSpeed Tech
855392f7a3SLiteSpeed Techstruct enc_session_funcs_common
865392f7a3SLiteSpeed Tech{
875392f7a3SLiteSpeed Tech    /* Global initialization: call once per implementation */
885392f7a3SLiteSpeed Tech    int (*esf_global_init)(int flags);
895392f7a3SLiteSpeed Tech
905392f7a3SLiteSpeed Tech    /* Global cleanup: call once per implementation */
915392f7a3SLiteSpeed Tech    void (*esf_global_cleanup) (void);
925392f7a3SLiteSpeed Tech
935392f7a3SLiteSpeed Tech    const char *
945392f7a3SLiteSpeed Tech    (*esf_cipher) (enc_session_t *);
955392f7a3SLiteSpeed Tech
965392f7a3SLiteSpeed Tech    int
975392f7a3SLiteSpeed Tech    (*esf_keysize) (enc_session_t *);
985392f7a3SLiteSpeed Tech
995392f7a3SLiteSpeed Tech    int
1005392f7a3SLiteSpeed Tech    (*esf_alg_keysize) (enc_session_t *);
1015392f7a3SLiteSpeed Tech
102a137764bSDmitri Tikhonov    /* Need to pass lconn in encrypt and decrypt methods because enc_session
103a137764bSDmitri Tikhonov     * is allowed to be NULL for gQUIC.
104a137764bSDmitri Tikhonov     */
1055392f7a3SLiteSpeed Tech    enum enc_packout
1065392f7a3SLiteSpeed Tech    (*esf_encrypt_packet) (enc_session_t *, const struct lsquic_engine_public *,
1075392f7a3SLiteSpeed Tech        struct lsquic_conn *, struct lsquic_packet_out *);
1085392f7a3SLiteSpeed Tech
1095392f7a3SLiteSpeed Tech    enum dec_packin
1105392f7a3SLiteSpeed Tech    (*esf_decrypt_packet)(enc_session_t *, struct lsquic_engine_public *,
1115392f7a3SLiteSpeed Tech        const struct lsquic_conn *, struct lsquic_packet_in *);
1125392f7a3SLiteSpeed Tech
1135392f7a3SLiteSpeed Tech    struct stack_st_X509 *
1145392f7a3SLiteSpeed Tech    (*esf_get_server_cert_chain) (enc_session_t *);
1155392f7a3SLiteSpeed Tech
1165392f7a3SLiteSpeed Tech    int
1175392f7a3SLiteSpeed Tech    (*esf_verify_reset_token) (enc_session_t *, const unsigned char *, size_t);
1185392f7a3SLiteSpeed Tech
1195392f7a3SLiteSpeed Tech    int
1205392f7a3SLiteSpeed Tech    (*esf_did_zero_rtt_succeed) (enc_session_t *);
1215392f7a3SLiteSpeed Tech
1225392f7a3SLiteSpeed Tech    int
1235392f7a3SLiteSpeed Tech    (*esf_is_zero_rtt_enabled) (enc_session_t *);
1245392f7a3SLiteSpeed Tech
125a137764bSDmitri Tikhonov    void
126a137764bSDmitri Tikhonov    (*esf_set_conn) (enc_session_t *, struct lsquic_conn *);
127a137764bSDmitri Tikhonov
1285392f7a3SLiteSpeed Tech    unsigned
1295392f7a3SLiteSpeed Tech    esf_tag_len;
1305392f7a3SLiteSpeed Tech};
1315392f7a3SLiteSpeed Tech
1325392f7a3SLiteSpeed Techstruct enc_session_funcs_gquic
1335392f7a3SLiteSpeed Tech{
1345392f7a3SLiteSpeed Tech#if LSQUIC_KEEP_ENC_SESS_HISTORY
1355392f7a3SLiteSpeed Tech    /* Grab encryption session history */
1365392f7a3SLiteSpeed Tech    void (*esf_get_hist) (enc_session_t *,
1375392f7a3SLiteSpeed Tech                                            char buf[ESHIST_STR_SIZE]);
1385392f7a3SLiteSpeed Tech#endif
1395392f7a3SLiteSpeed Tech
1405392f7a3SLiteSpeed Tech    /* Destroy enc session */
1415392f7a3SLiteSpeed Tech    void (*esf_destroy)(enc_session_t *enc_session);
1425392f7a3SLiteSpeed Tech
1435392f7a3SLiteSpeed Tech    /* Return true if handshake has been completed */
1445392f7a3SLiteSpeed Tech    int (*esf_is_hsk_done)(enc_session_t *enc_session);
1455392f7a3SLiteSpeed Tech
1465392f7a3SLiteSpeed Tech    /* Get value of setting specified by `tag' */
1475392f7a3SLiteSpeed Tech    int (*esf_get_peer_setting) (enc_session_t *, uint32_t tag,
1485392f7a3SLiteSpeed Tech                                                                uint32_t *val);
1495392f7a3SLiteSpeed Tech
1505392f7a3SLiteSpeed Tech    /* Get value of peer option (that from COPT array) */
1515392f7a3SLiteSpeed Tech    int (*esf_get_peer_option) (enc_session_t *enc_session,
1525392f7a3SLiteSpeed Tech                                                                uint32_t tag);
1535392f7a3SLiteSpeed Tech
1545392f7a3SLiteSpeed Tech    /* Create server session */
1555392f7a3SLiteSpeed Tech    enc_session_t *
156a137764bSDmitri Tikhonov    (*esf_create_server) (struct lsquic_conn *,
157a137764bSDmitri Tikhonov                        lsquic_cid_t cid, const struct lsquic_engine_public *);
1585392f7a3SLiteSpeed Tech
1595392f7a3SLiteSpeed Tech    /* out_len should have init value as the max length of out */
1605392f7a3SLiteSpeed Tech    enum handshake_error
1615392f7a3SLiteSpeed Tech    (*esf_handle_chlo) (enc_session_t *enc_session, enum lsquic_version,
1625392f7a3SLiteSpeed Tech                const uint8_t *in, int in_len, time_t t,
1635392f7a3SLiteSpeed Tech                const struct sockaddr *ip_addr, const struct sockaddr *local,
1645392f7a3SLiteSpeed Tech                uint8_t *out, size_t *out_len,
1655392f7a3SLiteSpeed Tech                uint8_t nonce[DNONC_LENGTH], int *nonce_set);
1665392f7a3SLiteSpeed Tech
1675392f7a3SLiteSpeed Tech    void (*esf_hsk_destroy)(void *hsk_ctx);
1685392f7a3SLiteSpeed Tech
1695392f7a3SLiteSpeed Tech#ifndef NDEBUG
1705392f7a3SLiteSpeed Tech    /* Need to expose this function for testing */
1715392f7a3SLiteSpeed Tech    int (*esf_determine_diversification_key) (enc_session_t *,
1727a8b2eceSDmitri Tikhonov                              uint8_t *diversification_nonce);
1735392f7a3SLiteSpeed Tech#endif
1745392f7a3SLiteSpeed Tech
1755392f7a3SLiteSpeed Tech    const char *
1765392f7a3SLiteSpeed Tech    (*esf_get_ua) (enc_session_t *);
1775392f7a3SLiteSpeed Tech
1785392f7a3SLiteSpeed Tech    int
1795392f7a3SLiteSpeed Tech    (*esf_have_key_gt_one) (enc_session_t *enc_session);
1805392f7a3SLiteSpeed Tech
1815392f7a3SLiteSpeed Tech#ifndef NDEBUG
1825392f7a3SLiteSpeed Tech    /* Functions that are only relevant in maintest.  We may want to get rid
1835392f7a3SLiteSpeed Tech     * of them somehow and only use the public API to test.
1845392f7a3SLiteSpeed Tech     */
1855392f7a3SLiteSpeed Tech
1865392f7a3SLiteSpeed Tech    uint8_t
1875392f7a3SLiteSpeed Tech    (*esf_have_key) (enc_session_t *);
1885392f7a3SLiteSpeed Tech
1895392f7a3SLiteSpeed Tech    void
1905392f7a3SLiteSpeed Tech    (*esf_set_have_key) (enc_session_t *, uint8_t);
1915392f7a3SLiteSpeed Tech
1925392f7a3SLiteSpeed Tech    const unsigned char *
1935392f7a3SLiteSpeed Tech    (*esf_get_enc_key_i) (enc_session_t *);
1945392f7a3SLiteSpeed Tech
1955392f7a3SLiteSpeed Tech    const unsigned char *
1965392f7a3SLiteSpeed Tech    (*esf_get_dec_key_i) (enc_session_t *);
1975392f7a3SLiteSpeed Tech
1985392f7a3SLiteSpeed Tech    const unsigned char *
1995392f7a3SLiteSpeed Tech    (*esf_get_enc_key_nonce_i) (enc_session_t *);
2005392f7a3SLiteSpeed Tech
2015392f7a3SLiteSpeed Tech    const unsigned char *
2025392f7a3SLiteSpeed Tech    (*esf_get_dec_key_nonce_i) (enc_session_t *);
2035392f7a3SLiteSpeed Tech
2045392f7a3SLiteSpeed Tech    const unsigned char *
2055392f7a3SLiteSpeed Tech    (*esf_get_enc_key_nonce_f) (enc_session_t *);
2065392f7a3SLiteSpeed Tech
2075392f7a3SLiteSpeed Tech    const unsigned char *
2085392f7a3SLiteSpeed Tech    (*esf_get_dec_key_nonce_f) (enc_session_t *);
2095392f7a3SLiteSpeed Tech#endif /* !defined(NDEBUG) */
2105392f7a3SLiteSpeed Tech
2115392f7a3SLiteSpeed Tech#if LSQUIC_ENABLE_HANDSHAKE_DISABLE
2125392f7a3SLiteSpeed Tech    void
2135392f7a3SLiteSpeed Tech    (*esf_set_handshake_completed) (enc_session_t *);
2145392f7a3SLiteSpeed Tech#endif
2155392f7a3SLiteSpeed Tech
2165392f7a3SLiteSpeed Tech    /* Create client session */
2175392f7a3SLiteSpeed Tech    enc_session_t *
218a137764bSDmitri Tikhonov    (*esf_create_client) (struct lsquic_conn *, const char *domain,
219a137764bSDmitri Tikhonov                            lsquic_cid_t cid,
2205392f7a3SLiteSpeed Tech                                    const struct lsquic_engine_public *,
2215392f7a3SLiteSpeed Tech                                    const unsigned char *, size_t);
2225392f7a3SLiteSpeed Tech
2235392f7a3SLiteSpeed Tech    /* -1 error, 0, OK, response in `buf' */
2245392f7a3SLiteSpeed Tech    int
2255392f7a3SLiteSpeed Tech    (*esf_gen_chlo) (enc_session_t *, enum lsquic_version,
2265392f7a3SLiteSpeed Tech                                                uint8_t *buf, size_t *len);
2275392f7a3SLiteSpeed Tech
2285392f7a3SLiteSpeed Tech    int
2295392f7a3SLiteSpeed Tech    (*esf_handle_chlo_reply) (enc_session_t *,
2305392f7a3SLiteSpeed Tech                                                const uint8_t *data, int len);
2315392f7a3SLiteSpeed Tech
2325392f7a3SLiteSpeed Tech    size_t
2335392f7a3SLiteSpeed Tech    (*esf_mem_used)(enc_session_t *);
2345392f7a3SLiteSpeed Tech
2355392f7a3SLiteSpeed Tech    /* Zero-rtt serialization needs the knowledge of the QUIC version, that's
2365392f7a3SLiteSpeed Tech     * why there is a separate method for thus.  Plus, we want to be able to
2375392f7a3SLiteSpeed Tech     * call it after the "handshake is done" callback is called.
2385392f7a3SLiteSpeed Tech     */
2395392f7a3SLiteSpeed Tech    void (*esf_maybe_dispatch_zero_rtt) (enc_session_t *,
2405392f7a3SLiteSpeed Tech            void (*cb)(struct lsquic_conn *, const unsigned char *, size_t));
2415392f7a3SLiteSpeed Tech
2425392f7a3SLiteSpeed Tech    void (*esf_reset_cid) (enc_session_t *, const lsquic_cid_t *);
2435392f7a3SLiteSpeed Tech};
2445392f7a3SLiteSpeed Tech
2455392f7a3SLiteSpeed Techenum iquic_handshake_status {
2465392f7a3SLiteSpeed Tech    IHS_WANT_READ,
2475392f7a3SLiteSpeed Tech    IHS_WANT_WRITE,
2485392f7a3SLiteSpeed Tech    IHS_STOP,
2495392f7a3SLiteSpeed Tech};
2505392f7a3SLiteSpeed Tech
2515392f7a3SLiteSpeed Techstruct crypto_stream_if
2525392f7a3SLiteSpeed Tech{
2535392f7a3SLiteSpeed Tech    ssize_t     (*csi_write) (void *stream, const void *buf, size_t len);
2545392f7a3SLiteSpeed Tech    int         (*csi_flush) (void *stream);
2555392f7a3SLiteSpeed Tech    ssize_t     (*csi_readf) (void *stream,
2565392f7a3SLiteSpeed Tech        size_t (*readf)(void *, const unsigned char *, size_t, int), void *ctx);
2575392f7a3SLiteSpeed Tech    int         (*csi_wantwrite) (void *stream, int is_want);
2585392f7a3SLiteSpeed Tech    int         (*csi_wantread) (void *stream, int is_want);
2595392f7a3SLiteSpeed Tech    enum enc_level
2605392f7a3SLiteSpeed Tech                (*csi_enc_level) (void *stream);
2615392f7a3SLiteSpeed Tech};
2625392f7a3SLiteSpeed Tech
2635392f7a3SLiteSpeed Techstruct enc_session_funcs_iquic
2645392f7a3SLiteSpeed Tech{
2655392f7a3SLiteSpeed Tech    enc_session_t *
2665392f7a3SLiteSpeed Tech    (*esfi_create_client) (const char *domain, struct lsquic_engine_public *,
2675392f7a3SLiteSpeed Tech                           struct lsquic_conn *, const struct lsquic_cid *,
2685392f7a3SLiteSpeed Tech                           const struct ver_neg *, void *(crypto_streams)[4],
2695392f7a3SLiteSpeed Tech                           const struct crypto_stream_if *,
27065728dc5SDmitri Tikhonov                           const unsigned char *, size_t,
2711245d2e0SDmitri Tikhonov                           struct lsquic_alarmset *, unsigned);
2725392f7a3SLiteSpeed Tech
2735392f7a3SLiteSpeed Tech    void
2745392f7a3SLiteSpeed Tech    (*esfi_destroy) (enc_session_t *);
2755392f7a3SLiteSpeed Tech
2765392f7a3SLiteSpeed Tech    struct ssl_st *
2775392f7a3SLiteSpeed Tech    (*esfi_get_ssl) (enc_session_t *);
2785392f7a3SLiteSpeed Tech
2795392f7a3SLiteSpeed Tech    struct transport_params *
2805392f7a3SLiteSpeed Tech    (*esfi_get_peer_transport_params) (enc_session_t *);
2815392f7a3SLiteSpeed Tech
2825392f7a3SLiteSpeed Tech    int
2835392f7a3SLiteSpeed Tech    (*esfi_reset_dcid) (enc_session_t *, const struct lsquic_cid *,
2845392f7a3SLiteSpeed Tech                                                const struct lsquic_cid *);
2855392f7a3SLiteSpeed Tech
2865392f7a3SLiteSpeed Tech    int
2875392f7a3SLiteSpeed Tech    (*esfi_init_server) (enc_session_t *);
2885392f7a3SLiteSpeed Tech
2895392f7a3SLiteSpeed Tech    void
2905392f7a3SLiteSpeed Tech    (*esfi_set_streams) (enc_session_t *, void *(crypto_streams)[4],
2915392f7a3SLiteSpeed Tech                           const struct crypto_stream_if *);
2925392f7a3SLiteSpeed Tech
2935392f7a3SLiteSpeed Tech    enc_session_t *
2945392f7a3SLiteSpeed Tech    (*esfi_create_server) (struct lsquic_engine_public *, struct lsquic_conn *,
2955392f7a3SLiteSpeed Tech                                                    const struct lsquic_cid *,
2965392f7a3SLiteSpeed Tech                           void *(crypto_streams)[4],
2975392f7a3SLiteSpeed Tech                           const struct crypto_stream_if *,
2985392f7a3SLiteSpeed Tech                           const struct lsquic_cid *odcid);
2995392f7a3SLiteSpeed Tech
3005392f7a3SLiteSpeed Tech    void
3015392f7a3SLiteSpeed Tech    (*esfi_shake_stream)(enc_session_t *, struct lsquic_stream *,
3025392f7a3SLiteSpeed Tech                         const char *);
3035392f7a3SLiteSpeed Tech
3045392f7a3SLiteSpeed Tech    void
3055392f7a3SLiteSpeed Tech    (*esfi_1rtt_acked)(enc_session_t *);
3065392f7a3SLiteSpeed Tech};
3075392f7a3SLiteSpeed Tech
3085392f7a3SLiteSpeed Techextern
3095392f7a3SLiteSpeed Tech#ifdef NDEBUG
3105392f7a3SLiteSpeed Techconst
3115392f7a3SLiteSpeed Tech#endif
3125392f7a3SLiteSpeed Techstruct enc_session_funcs_common lsquic_enc_session_common_gquic_1;
3137a8b2eceSDmitri Tikhonov
3147a8b2eceSDmitri Tikhonovextern
3157a8b2eceSDmitri Tikhonov#ifdef NDEBUG
3167a8b2eceSDmitri Tikhonovconst
3177a8b2eceSDmitri Tikhonov#endif
3187a8b2eceSDmitri Tikhonovstruct enc_session_funcs_common lsquic_enc_session_common_gquic_2;
3197a8b2eceSDmitri Tikhonov
3205392f7a3SLiteSpeed Techextern const struct enc_session_funcs_common lsquic_enc_session_common_ietf_v1;
3215392f7a3SLiteSpeed Tech
3225392f7a3SLiteSpeed Techextern
3235392f7a3SLiteSpeed Tech#ifdef NDEBUG
3245392f7a3SLiteSpeed Techconst
3255392f7a3SLiteSpeed Tech#endif
3265392f7a3SLiteSpeed Techstruct enc_session_funcs_gquic lsquic_enc_session_gquic_gquic_1;
3275392f7a3SLiteSpeed Tech
3285392f7a3SLiteSpeed Techextern const struct enc_session_funcs_iquic lsquic_enc_session_iquic_ietf_v1;
3295392f7a3SLiteSpeed Tech
3305392f7a3SLiteSpeed Tech#define select_esf_common_by_ver(ver) ( \
33192f6e17bSDmitri Tikhonov    ver == LSQVER_ID23 ? &lsquic_enc_session_common_ietf_v1 : \
33203e6b668SDmitri Tikhonov    ver == LSQVER_ID24 ? &lsquic_enc_session_common_ietf_v1 : \
3335392f7a3SLiteSpeed Tech    ver == LSQVER_VERNEG ? &lsquic_enc_session_common_ietf_v1 : \
3347a8b2eceSDmitri Tikhonov    ver == LSQVER_050 ? &lsquic_enc_session_common_gquic_2 : \
3355392f7a3SLiteSpeed Tech    &lsquic_enc_session_common_gquic_1 )
3365392f7a3SLiteSpeed Tech
3375392f7a3SLiteSpeed Tech#define select_esf_gquic_by_ver(ver) ( \
3385392f7a3SLiteSpeed Tech    ver ? &lsquic_enc_session_gquic_gquic_1 : &lsquic_enc_session_gquic_gquic_1)
3395392f7a3SLiteSpeed Tech
3405392f7a3SLiteSpeed Tech#define select_esf_iquic_by_ver(ver) ( \
3415392f7a3SLiteSpeed Tech    ver ? &lsquic_enc_session_iquic_ietf_v1 : &lsquic_enc_session_iquic_ietf_v1)
3425392f7a3SLiteSpeed Tech
3435392f7a3SLiteSpeed Techextern const char *const lsquic_enclev2str[];
3445392f7a3SLiteSpeed Tech
3455392f7a3SLiteSpeed Techextern const struct lsquic_stream_if lsquic_cry_sm_if;
3465392f7a3SLiteSpeed Tech
3475392f7a3SLiteSpeed Techextern const struct lsquic_stream_if lsquic_mini_cry_sm_if;
3485392f7a3SLiteSpeed Tech
3495392f7a3SLiteSpeed Tech/* RFC 7301, Section 3.2 */
3505392f7a3SLiteSpeed Tech#define ALERT_NO_APPLICATION_PROTOCOL 120
3515392f7a3SLiteSpeed Tech
3525392f7a3SLiteSpeed Techenum lsquic_version
3535392f7a3SLiteSpeed Techlsquic_zero_rtt_version (const unsigned char *, size_t);
3545392f7a3SLiteSpeed Tech
3555392f7a3SLiteSpeed Tech/* This is seems to be true for all of the ciphers used by IETF QUIC.
3565392f7a3SLiteSpeed Tech * XXX: Perhaps add a check?
3575392f7a3SLiteSpeed Tech */
3585392f7a3SLiteSpeed Tech#define IQUIC_TAG_LEN 16
3595392f7a3SLiteSpeed Tech
3605392f7a3SLiteSpeed Tech#endif
361