lsquic_enc_sess.h revision 2f4629f2
17d09751dSDmitri Tikhonov/* Copyright (c) 2017 - 2020 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};
555392f7a3SLiteSpeed Tech
565392f7a3SLiteSpeed Tech#ifndef LSQUIC_KEEP_ENC_SESS_HISTORY
575392f7a3SLiteSpeed Tech#   ifndef NDEBUG
585392f7a3SLiteSpeed Tech#       define LSQUIC_KEEP_ENC_SESS_HISTORY 1
595392f7a3SLiteSpeed Tech#   else
605392f7a3SLiteSpeed Tech#       define LSQUIC_KEEP_ENC_SESS_HISTORY 0
615392f7a3SLiteSpeed Tech#   endif
625392f7a3SLiteSpeed Tech#endif
635392f7a3SLiteSpeed Tech
645392f7a3SLiteSpeed Tech#if LSQUIC_KEEP_ENC_SESS_HISTORY
655392f7a3SLiteSpeed Tech#define ESHIST_BITS 7
665392f7a3SLiteSpeed Tech#define ESHIST_MASK ((1 << ESHIST_BITS) - 1)
675392f7a3SLiteSpeed Tech#define ESHIST_STR_SIZE ((1 << ESHIST_BITS) + 1)
685392f7a3SLiteSpeed Tech#endif
695392f7a3SLiteSpeed Tech
705392f7a3SLiteSpeed Techenum enc_packout { ENCPA_OK, ENCPA_NOMEM, ENCPA_BADCRYPT, };
715392f7a3SLiteSpeed Tech
725392f7a3SLiteSpeed Techenum dec_packin {
735392f7a3SLiteSpeed Tech    DECPI_OK,
745392f7a3SLiteSpeed Tech    DECPI_NOMEM,
755392f7a3SLiteSpeed Tech    DECPI_TOO_SHORT,
765392f7a3SLiteSpeed Tech    DECPI_NOT_YET,
775392f7a3SLiteSpeed Tech    DECPI_BADCRYPT,
785392f7a3SLiteSpeed Tech    DECPI_VIOLATION,
795392f7a3SLiteSpeed Tech};
805392f7a3SLiteSpeed Tech
815392f7a3SLiteSpeed Techtypedef void enc_session_t;
825392f7a3SLiteSpeed Tech
835392f7a3SLiteSpeed Techstruct enc_session_funcs_common
845392f7a3SLiteSpeed Tech{
855392f7a3SLiteSpeed Tech    /* Global initialization: call once per implementation */
865392f7a3SLiteSpeed Tech    int (*esf_global_init)(int flags);
875392f7a3SLiteSpeed Tech
885392f7a3SLiteSpeed Tech    /* Global cleanup: call once per implementation */
895392f7a3SLiteSpeed Tech    void (*esf_global_cleanup) (void);
905392f7a3SLiteSpeed Tech
915392f7a3SLiteSpeed Tech    const char *
925392f7a3SLiteSpeed Tech    (*esf_cipher) (enc_session_t *);
935392f7a3SLiteSpeed Tech
945392f7a3SLiteSpeed Tech    int
955392f7a3SLiteSpeed Tech    (*esf_keysize) (enc_session_t *);
965392f7a3SLiteSpeed Tech
975392f7a3SLiteSpeed Tech    int
985392f7a3SLiteSpeed Tech    (*esf_alg_keysize) (enc_session_t *);
995392f7a3SLiteSpeed Tech
100a137764bSDmitri Tikhonov    /* Need to pass lconn in encrypt and decrypt methods because enc_session
101a137764bSDmitri Tikhonov     * is allowed to be NULL for gQUIC.
102a137764bSDmitri Tikhonov     */
1035392f7a3SLiteSpeed Tech    enum enc_packout
1045392f7a3SLiteSpeed Tech    (*esf_encrypt_packet) (enc_session_t *, const struct lsquic_engine_public *,
1055392f7a3SLiteSpeed Tech        struct lsquic_conn *, struct lsquic_packet_out *);
1065392f7a3SLiteSpeed Tech
1075392f7a3SLiteSpeed Tech    enum dec_packin
1085392f7a3SLiteSpeed Tech    (*esf_decrypt_packet)(enc_session_t *, struct lsquic_engine_public *,
1095392f7a3SLiteSpeed Tech        const struct lsquic_conn *, struct lsquic_packet_in *);
1105392f7a3SLiteSpeed Tech
1115392f7a3SLiteSpeed Tech    struct stack_st_X509 *
1125392f7a3SLiteSpeed Tech    (*esf_get_server_cert_chain) (enc_session_t *);
1135392f7a3SLiteSpeed Tech
1145392f7a3SLiteSpeed Tech    int
1155392f7a3SLiteSpeed Tech    (*esf_verify_reset_token) (enc_session_t *, const unsigned char *, size_t);
1165392f7a3SLiteSpeed Tech
1175392f7a3SLiteSpeed Tech    int
1187483dee0SDmitri Tikhonov    (*esf_did_sess_resume_succeed) (enc_session_t *);
1195392f7a3SLiteSpeed Tech
1205392f7a3SLiteSpeed Tech    int
1217483dee0SDmitri Tikhonov    (*esf_is_sess_resume_enabled) (enc_session_t *);
1225392f7a3SLiteSpeed Tech
123a137764bSDmitri Tikhonov    void
124a137764bSDmitri Tikhonov    (*esf_set_conn) (enc_session_t *, struct lsquic_conn *);
125a137764bSDmitri Tikhonov
126da99665bSDmitri Tikhonov    /* Optional.  This function gets called after packets are encrypted,
127da99665bSDmitri Tikhonov     * batched, and are about to be sent.
128da99665bSDmitri Tikhonov     */
129da99665bSDmitri Tikhonov    void
130da99665bSDmitri Tikhonov    (*esf_flush_encryption) (enc_session_t *);
131da99665bSDmitri Tikhonov
1325392f7a3SLiteSpeed Tech    unsigned
1335392f7a3SLiteSpeed Tech    esf_tag_len;
1345392f7a3SLiteSpeed Tech};
1355392f7a3SLiteSpeed Tech
1365392f7a3SLiteSpeed Techstruct enc_session_funcs_gquic
1375392f7a3SLiteSpeed Tech{
1385392f7a3SLiteSpeed Tech#if LSQUIC_KEEP_ENC_SESS_HISTORY
1395392f7a3SLiteSpeed Tech    /* Grab encryption session history */
1405392f7a3SLiteSpeed Tech    void (*esf_get_hist) (enc_session_t *,
1415392f7a3SLiteSpeed Tech                                            char buf[ESHIST_STR_SIZE]);
1425392f7a3SLiteSpeed Tech#endif
1435392f7a3SLiteSpeed Tech
1445392f7a3SLiteSpeed Tech    /* Destroy enc session */
1455392f7a3SLiteSpeed Tech    void (*esf_destroy)(enc_session_t *enc_session);
1465392f7a3SLiteSpeed Tech
1475392f7a3SLiteSpeed Tech    /* Return true if handshake has been completed */
1485392f7a3SLiteSpeed Tech    int (*esf_is_hsk_done)(enc_session_t *enc_session);
1495392f7a3SLiteSpeed Tech
1505392f7a3SLiteSpeed Tech    /* Get value of setting specified by `tag' */
1515392f7a3SLiteSpeed Tech    int (*esf_get_peer_setting) (enc_session_t *, uint32_t tag,
1525392f7a3SLiteSpeed Tech                                                                uint32_t *val);
1535392f7a3SLiteSpeed Tech
1545392f7a3SLiteSpeed Tech    /* Get value of peer option (that from COPT array) */
1555392f7a3SLiteSpeed Tech    int (*esf_get_peer_option) (enc_session_t *enc_session,
1565392f7a3SLiteSpeed Tech                                                                uint32_t tag);
1575392f7a3SLiteSpeed Tech
1585392f7a3SLiteSpeed Tech    /* Create server session */
1595392f7a3SLiteSpeed Tech    enc_session_t *
160a137764bSDmitri Tikhonov    (*esf_create_server) (struct lsquic_conn *,
1612f4629f2SDmitri Tikhonov                        lsquic_cid_t cid, struct lsquic_engine_public *);
1625392f7a3SLiteSpeed Tech
1635392f7a3SLiteSpeed Tech    /* out_len should have init value as the max length of out */
1645392f7a3SLiteSpeed Tech    enum handshake_error
1655392f7a3SLiteSpeed Tech    (*esf_handle_chlo) (enc_session_t *enc_session, enum lsquic_version,
1665392f7a3SLiteSpeed Tech                const uint8_t *in, int in_len, time_t t,
1675392f7a3SLiteSpeed Tech                const struct sockaddr *ip_addr, const struct sockaddr *local,
1685392f7a3SLiteSpeed Tech                uint8_t *out, size_t *out_len,
1695392f7a3SLiteSpeed Tech                uint8_t nonce[DNONC_LENGTH], int *nonce_set);
1705392f7a3SLiteSpeed Tech
1715392f7a3SLiteSpeed Tech    void (*esf_hsk_destroy)(void *hsk_ctx);
1725392f7a3SLiteSpeed Tech
1735392f7a3SLiteSpeed Tech#ifndef NDEBUG
1745392f7a3SLiteSpeed Tech    /* Need to expose this function for testing */
1755392f7a3SLiteSpeed Tech    int (*esf_determine_diversification_key) (enc_session_t *,
1767a8b2eceSDmitri Tikhonov                              uint8_t *diversification_nonce);
1775392f7a3SLiteSpeed Tech#endif
1785392f7a3SLiteSpeed Tech
1795392f7a3SLiteSpeed Tech    const char *
1805392f7a3SLiteSpeed Tech    (*esf_get_ua) (enc_session_t *);
1815392f7a3SLiteSpeed Tech
1825392f7a3SLiteSpeed Tech    int
1835392f7a3SLiteSpeed Tech    (*esf_have_key_gt_one) (enc_session_t *enc_session);
1845392f7a3SLiteSpeed Tech
1855392f7a3SLiteSpeed Tech#ifndef NDEBUG
1865392f7a3SLiteSpeed Tech    /* Functions that are only relevant in maintest.  We may want to get rid
1875392f7a3SLiteSpeed Tech     * of them somehow and only use the public API to test.
1885392f7a3SLiteSpeed Tech     */
1895392f7a3SLiteSpeed Tech
1905392f7a3SLiteSpeed Tech    uint8_t
1915392f7a3SLiteSpeed Tech    (*esf_have_key) (enc_session_t *);
1925392f7a3SLiteSpeed Tech
1935392f7a3SLiteSpeed Tech    void
1945392f7a3SLiteSpeed Tech    (*esf_set_have_key) (enc_session_t *, uint8_t);
1955392f7a3SLiteSpeed Tech
1965392f7a3SLiteSpeed Tech    const unsigned char *
1975392f7a3SLiteSpeed Tech    (*esf_get_enc_key_i) (enc_session_t *);
1985392f7a3SLiteSpeed Tech
1995392f7a3SLiteSpeed Tech    const unsigned char *
2005392f7a3SLiteSpeed Tech    (*esf_get_dec_key_i) (enc_session_t *);
2015392f7a3SLiteSpeed Tech
2025392f7a3SLiteSpeed Tech    const unsigned char *
2035392f7a3SLiteSpeed Tech    (*esf_get_enc_key_nonce_i) (enc_session_t *);
2045392f7a3SLiteSpeed Tech
2055392f7a3SLiteSpeed Tech    const unsigned char *
2065392f7a3SLiteSpeed Tech    (*esf_get_dec_key_nonce_i) (enc_session_t *);
2075392f7a3SLiteSpeed Tech
2085392f7a3SLiteSpeed Tech    const unsigned char *
2095392f7a3SLiteSpeed Tech    (*esf_get_enc_key_nonce_f) (enc_session_t *);
2105392f7a3SLiteSpeed Tech
2115392f7a3SLiteSpeed Tech    const unsigned char *
2125392f7a3SLiteSpeed Tech    (*esf_get_dec_key_nonce_f) (enc_session_t *);
2135392f7a3SLiteSpeed Tech#endif /* !defined(NDEBUG) */
2145392f7a3SLiteSpeed Tech
2155392f7a3SLiteSpeed Tech    /* Create client session */
2165392f7a3SLiteSpeed Tech    enc_session_t *
217a137764bSDmitri Tikhonov    (*esf_create_client) (struct lsquic_conn *, const char *domain,
218a137764bSDmitri Tikhonov                            lsquic_cid_t cid,
2192f4629f2SDmitri Tikhonov                                    struct lsquic_engine_public *,
2205392f7a3SLiteSpeed Tech                                    const unsigned char *, size_t);
2215392f7a3SLiteSpeed Tech
2225392f7a3SLiteSpeed Tech    /* -1 error, 0, OK, response in `buf' */
2235392f7a3SLiteSpeed Tech    int
2245392f7a3SLiteSpeed Tech    (*esf_gen_chlo) (enc_session_t *, enum lsquic_version,
2255392f7a3SLiteSpeed Tech                                                uint8_t *buf, size_t *len);
2265392f7a3SLiteSpeed Tech
2275392f7a3SLiteSpeed Tech    int
2285392f7a3SLiteSpeed Tech    (*esf_handle_chlo_reply) (enc_session_t *,
2295392f7a3SLiteSpeed Tech                                                const uint8_t *data, int len);
2305392f7a3SLiteSpeed Tech
2315392f7a3SLiteSpeed Tech    size_t
2325392f7a3SLiteSpeed Tech    (*esf_mem_used)(enc_session_t *);
2335392f7a3SLiteSpeed Tech
2347483dee0SDmitri Tikhonov    /* Session resumption serialization needs the knowledge of the QUIC
2357483dee0SDmitri Tikhonov     * version, that's why there is a separate method for thus.  Plus, we
2367483dee0SDmitri Tikhonov     * want to be able to call it after the "handshake is done" callback
2377483dee0SDmitri Tikhonov     * is called.
2385392f7a3SLiteSpeed Tech     */
2397483dee0SDmitri Tikhonov    void (*esf_maybe_dispatch_sess_resume) (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
286fb73393fSDmitri Tikhonov    void
287fb73393fSDmitri Tikhonov    (*esfi_set_iscid) (enc_session_t *, const struct lsquic_packet_in *);
288fb73393fSDmitri Tikhonov
2895392f7a3SLiteSpeed Tech    int
2905392f7a3SLiteSpeed Tech    (*esfi_init_server) (enc_session_t *);
2915392f7a3SLiteSpeed Tech
2925392f7a3SLiteSpeed Tech    void
2935392f7a3SLiteSpeed Tech    (*esfi_set_streams) (enc_session_t *, void *(crypto_streams)[4],
2945392f7a3SLiteSpeed Tech                           const struct crypto_stream_if *);
2955392f7a3SLiteSpeed Tech
2965392f7a3SLiteSpeed Tech    enc_session_t *
2975392f7a3SLiteSpeed Tech    (*esfi_create_server) (struct lsquic_engine_public *, struct lsquic_conn *,
2985392f7a3SLiteSpeed Tech                                                    const struct lsquic_cid *,
2995392f7a3SLiteSpeed Tech                           void *(crypto_streams)[4],
3005392f7a3SLiteSpeed Tech                           const struct crypto_stream_if *,
301fb73393fSDmitri Tikhonov                           const struct lsquic_cid *odcid,
302fb73393fSDmitri Tikhonov                           const struct lsquic_cid *iscid );
3035392f7a3SLiteSpeed Tech
3045392f7a3SLiteSpeed Tech    void
3055392f7a3SLiteSpeed Tech    (*esfi_shake_stream)(enc_session_t *, struct lsquic_stream *,
3065392f7a3SLiteSpeed Tech                         const char *);
3075392f7a3SLiteSpeed Tech
3085392f7a3SLiteSpeed Tech    void
3099fc12041SDmitri Tikhonov    (*esfi_handshake_confirmed)(enc_session_t *);
310e68b0452SDmitri Tikhonov
311e68b0452SDmitri Tikhonov    int
312e68b0452SDmitri Tikhonov    (*esfi_in_init)(enc_session_t *);
313e68b0452SDmitri Tikhonov
314e68b0452SDmitri Tikhonov    int
315e68b0452SDmitri Tikhonov    (*esfi_data_in)(enc_session_t *, enum enc_level,
316e68b0452SDmitri Tikhonov                                            const unsigned char *, size_t);
3175392f7a3SLiteSpeed Tech};
3185392f7a3SLiteSpeed Tech
3195392f7a3SLiteSpeed Techextern
3205392f7a3SLiteSpeed Tech#ifdef NDEBUG
3215392f7a3SLiteSpeed Techconst
3225392f7a3SLiteSpeed Tech#endif
3235392f7a3SLiteSpeed Techstruct enc_session_funcs_common lsquic_enc_session_common_gquic_1;
3247a8b2eceSDmitri Tikhonov
3257a8b2eceSDmitri Tikhonovextern
3267a8b2eceSDmitri Tikhonov#ifdef NDEBUG
3277a8b2eceSDmitri Tikhonovconst
3287a8b2eceSDmitri Tikhonov#endif
3297a8b2eceSDmitri Tikhonovstruct enc_session_funcs_common lsquic_enc_session_common_gquic_2;
3307a8b2eceSDmitri Tikhonov
3315392f7a3SLiteSpeed Techextern const struct enc_session_funcs_common lsquic_enc_session_common_ietf_v1;
3325392f7a3SLiteSpeed Tech
3335392f7a3SLiteSpeed Techextern
3345392f7a3SLiteSpeed Tech#ifdef NDEBUG
3355392f7a3SLiteSpeed Techconst
3365392f7a3SLiteSpeed Tech#endif
3375392f7a3SLiteSpeed Techstruct enc_session_funcs_gquic lsquic_enc_session_gquic_gquic_1;
3385392f7a3SLiteSpeed Tech
3395392f7a3SLiteSpeed Techextern const struct enc_session_funcs_iquic lsquic_enc_session_iquic_ietf_v1;
3405392f7a3SLiteSpeed Tech
3415392f7a3SLiteSpeed Tech#define select_esf_common_by_ver(ver) ( \
342bc520ef7SDmitri Tikhonov    ver == LSQVER_ID27 ? &lsquic_enc_session_common_ietf_v1 : \
343fb73393fSDmitri Tikhonov    ver == LSQVER_ID28 ? &lsquic_enc_session_common_ietf_v1 : \
3444051ae3aSDmitri Tikhonov    ver == LSQVER_ID29 ? &lsquic_enc_session_common_ietf_v1 : \
345b1a7c3f9SDmitri Tikhonov    ver == LSQVER_ID30 ? &lsquic_enc_session_common_ietf_v1 : \
346b62ec17fSDmitri Tikhonov    ver == LSQVER_ID31 ? &lsquic_enc_session_common_ietf_v1 : \
3475392f7a3SLiteSpeed Tech    ver == LSQVER_VERNEG ? &lsquic_enc_session_common_ietf_v1 : \
3487a8b2eceSDmitri Tikhonov    ver == LSQVER_050 ? &lsquic_enc_session_common_gquic_2 : \
3495392f7a3SLiteSpeed Tech    &lsquic_enc_session_common_gquic_1 )
3505392f7a3SLiteSpeed Tech
3515392f7a3SLiteSpeed Tech#define select_esf_gquic_by_ver(ver) ( \
3525392f7a3SLiteSpeed Tech    ver ? &lsquic_enc_session_gquic_gquic_1 : &lsquic_enc_session_gquic_gquic_1)
3535392f7a3SLiteSpeed Tech
3545392f7a3SLiteSpeed Tech#define select_esf_iquic_by_ver(ver) ( \
3555392f7a3SLiteSpeed Tech    ver ? &lsquic_enc_session_iquic_ietf_v1 : &lsquic_enc_session_iquic_ietf_v1)
3565392f7a3SLiteSpeed Tech
3575392f7a3SLiteSpeed Techextern const char *const lsquic_enclev2str[];
3585392f7a3SLiteSpeed Tech
3595392f7a3SLiteSpeed Techextern const struct lsquic_stream_if lsquic_cry_sm_if;
3605392f7a3SLiteSpeed Tech
3615392f7a3SLiteSpeed Techextern const struct lsquic_stream_if lsquic_mini_cry_sm_if;
3625392f7a3SLiteSpeed Tech
3635392f7a3SLiteSpeed Tech/* RFC 7301, Section 3.2 */
3645392f7a3SLiteSpeed Tech#define ALERT_NO_APPLICATION_PROTOCOL 120
3655392f7a3SLiteSpeed Tech
3665392f7a3SLiteSpeed Techenum lsquic_version
3677483dee0SDmitri Tikhonovlsquic_sess_resume_version (const unsigned char *, size_t);
3685392f7a3SLiteSpeed Tech
3695392f7a3SLiteSpeed Tech/* This is seems to be true for all of the ciphers used by IETF QUIC.
3705392f7a3SLiteSpeed Tech * XXX: Perhaps add a check?
3715392f7a3SLiteSpeed Tech */
3725392f7a3SLiteSpeed Tech#define IQUIC_TAG_LEN 16
3735392f7a3SLiteSpeed Tech
3745392f7a3SLiteSpeed Tech#endif
375