lsquic_enc_sess.h revision 21bcad87
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;
1804f8f447SDmitri Tikhonovstruct lsquic_engine_settings;
1904f8f447SDmitri Tikhonovenum lsquic_version;
205392f7a3SLiteSpeed Tech
215392f7a3SLiteSpeed Tech#define DNONC_LENGTH 32
225392f7a3SLiteSpeed Tech#define SRST_LENGTH 16
235392f7a3SLiteSpeed Tech
245392f7a3SLiteSpeed Tech/* From [draft-ietf-quic-tls-14]:
255392f7a3SLiteSpeed Tech *
265392f7a3SLiteSpeed Tech * Data is protected using a number of encryption levels:
275392f7a3SLiteSpeed Tech *
285392f7a3SLiteSpeed Tech * o  Plaintext
295392f7a3SLiteSpeed Tech *
305392f7a3SLiteSpeed Tech * o  Early Data (0-RTT) Keys
315392f7a3SLiteSpeed Tech *
325392f7a3SLiteSpeed Tech * o  Handshake Keys
335392f7a3SLiteSpeed Tech *
345392f7a3SLiteSpeed Tech * o  Application Data (1-RTT) Keys
355392f7a3SLiteSpeed Tech */
365392f7a3SLiteSpeed Tech
375392f7a3SLiteSpeed Tech/* This enum maps to the list above */
385392f7a3SLiteSpeed Techenum enc_level
395392f7a3SLiteSpeed Tech{
405392f7a3SLiteSpeed Tech    ENC_LEV_CLEAR,
415392f7a3SLiteSpeed Tech    ENC_LEV_EARLY,
425392f7a3SLiteSpeed Tech    ENC_LEV_INIT,
435392f7a3SLiteSpeed Tech    ENC_LEV_FORW,
445392f7a3SLiteSpeed Tech    N_ENC_LEVS
455392f7a3SLiteSpeed Tech};
465392f7a3SLiteSpeed Tech
475392f7a3SLiteSpeed Techenum handshake_error            /* TODO: rename this enum */
485392f7a3SLiteSpeed Tech{
495392f7a3SLiteSpeed Tech    DATA_NOT_ENOUGH = -2,
505392f7a3SLiteSpeed Tech    DATA_FORMAT_ERROR = -1,
515392f7a3SLiteSpeed Tech    HS_ERROR = -1,
525392f7a3SLiteSpeed Tech    DATA_NO_ERROR = 0,
535392f7a3SLiteSpeed Tech    HS_SHLO = 0,
545392f7a3SLiteSpeed Tech    HS_1RTT = 1,
555392f7a3SLiteSpeed Tech    HS_SREJ = 2,
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
1207483dee0SDmitri Tikhonov    (*esf_did_sess_resume_succeed) (enc_session_t *);
1215392f7a3SLiteSpeed Tech
1225392f7a3SLiteSpeed Tech    int
1237483dee0SDmitri Tikhonov    (*esf_is_sess_resume_enabled) (enc_session_t *);
1245392f7a3SLiteSpeed Tech
125a137764bSDmitri Tikhonov    void
126a137764bSDmitri Tikhonov    (*esf_set_conn) (enc_session_t *, struct lsquic_conn *);
127a137764bSDmitri Tikhonov
128da99665bSDmitri Tikhonov    /* Optional.  This function gets called after packets are encrypted,
129da99665bSDmitri Tikhonov     * batched, and are about to be sent.
130da99665bSDmitri Tikhonov     */
131da99665bSDmitri Tikhonov    void
132da99665bSDmitri Tikhonov    (*esf_flush_encryption) (enc_session_t *);
133da99665bSDmitri Tikhonov
1345392f7a3SLiteSpeed Tech    unsigned
1355392f7a3SLiteSpeed Tech    esf_tag_len;
1365392f7a3SLiteSpeed Tech};
1375392f7a3SLiteSpeed Tech
1385392f7a3SLiteSpeed Techstruct enc_session_funcs_gquic
1395392f7a3SLiteSpeed Tech{
1405392f7a3SLiteSpeed Tech#if LSQUIC_KEEP_ENC_SESS_HISTORY
1415392f7a3SLiteSpeed Tech    /* Grab encryption session history */
1425392f7a3SLiteSpeed Tech    void (*esf_get_hist) (enc_session_t *,
1435392f7a3SLiteSpeed Tech                                            char buf[ESHIST_STR_SIZE]);
1445392f7a3SLiteSpeed Tech#endif
1455392f7a3SLiteSpeed Tech
1465392f7a3SLiteSpeed Tech    /* Destroy enc session */
1475392f7a3SLiteSpeed Tech    void (*esf_destroy)(enc_session_t *enc_session);
1485392f7a3SLiteSpeed Tech
1495392f7a3SLiteSpeed Tech    /* Return true if handshake has been completed */
1505392f7a3SLiteSpeed Tech    int (*esf_is_hsk_done)(enc_session_t *enc_session);
1515392f7a3SLiteSpeed Tech
1525392f7a3SLiteSpeed Tech    /* Get value of setting specified by `tag' */
1535392f7a3SLiteSpeed Tech    int (*esf_get_peer_setting) (enc_session_t *, uint32_t tag,
1545392f7a3SLiteSpeed Tech                                                                uint32_t *val);
1555392f7a3SLiteSpeed Tech
1565392f7a3SLiteSpeed Tech    /* Get value of peer option (that from COPT array) */
1575392f7a3SLiteSpeed Tech    int (*esf_get_peer_option) (enc_session_t *enc_session,
1585392f7a3SLiteSpeed Tech                                                                uint32_t tag);
1595392f7a3SLiteSpeed Tech
1605392f7a3SLiteSpeed Tech    /* Create server session */
1615392f7a3SLiteSpeed Tech    enc_session_t *
162a137764bSDmitri Tikhonov    (*esf_create_server) (struct lsquic_conn *,
1632f4629f2SDmitri Tikhonov                        lsquic_cid_t cid, struct lsquic_engine_public *);
1645392f7a3SLiteSpeed Tech
1655392f7a3SLiteSpeed Tech    /* out_len should have init value as the max length of out */
1665392f7a3SLiteSpeed Tech    enum handshake_error
1675392f7a3SLiteSpeed Tech    (*esf_handle_chlo) (enc_session_t *enc_session, enum lsquic_version,
1685392f7a3SLiteSpeed Tech                const uint8_t *in, int in_len, time_t t,
1695392f7a3SLiteSpeed Tech                const struct sockaddr *ip_addr, const struct sockaddr *local,
1705392f7a3SLiteSpeed Tech                uint8_t *out, size_t *out_len,
1715392f7a3SLiteSpeed Tech                uint8_t nonce[DNONC_LENGTH], int *nonce_set);
1725392f7a3SLiteSpeed Tech
1735392f7a3SLiteSpeed Tech    void (*esf_hsk_destroy)(void *hsk_ctx);
1745392f7a3SLiteSpeed Tech
1755392f7a3SLiteSpeed Tech#ifndef NDEBUG
1765392f7a3SLiteSpeed Tech    /* Need to expose this function for testing */
1775392f7a3SLiteSpeed Tech    int (*esf_determine_diversification_key) (enc_session_t *,
1787a8b2eceSDmitri Tikhonov                              uint8_t *diversification_nonce);
1795392f7a3SLiteSpeed Tech#endif
1805392f7a3SLiteSpeed Tech
1815392f7a3SLiteSpeed Tech    const char *
1825392f7a3SLiteSpeed Tech    (*esf_get_ua) (enc_session_t *);
1835392f7a3SLiteSpeed Tech
1845392f7a3SLiteSpeed Tech    int
1855392f7a3SLiteSpeed Tech    (*esf_have_key_gt_one) (enc_session_t *enc_session);
1865392f7a3SLiteSpeed Tech
1875392f7a3SLiteSpeed Tech#ifndef NDEBUG
1885392f7a3SLiteSpeed Tech    /* Functions that are only relevant in maintest.  We may want to get rid
1895392f7a3SLiteSpeed Tech     * of them somehow and only use the public API to test.
1905392f7a3SLiteSpeed Tech     */
1915392f7a3SLiteSpeed Tech
1925392f7a3SLiteSpeed Tech    uint8_t
1935392f7a3SLiteSpeed Tech    (*esf_have_key) (enc_session_t *);
1945392f7a3SLiteSpeed Tech
1955392f7a3SLiteSpeed Tech    void
1965392f7a3SLiteSpeed Tech    (*esf_set_have_key) (enc_session_t *, uint8_t);
1975392f7a3SLiteSpeed Tech
1985392f7a3SLiteSpeed Tech    const unsigned char *
1995392f7a3SLiteSpeed Tech    (*esf_get_enc_key_i) (enc_session_t *);
2005392f7a3SLiteSpeed Tech
2015392f7a3SLiteSpeed Tech    const unsigned char *
2025392f7a3SLiteSpeed Tech    (*esf_get_dec_key_i) (enc_session_t *);
2035392f7a3SLiteSpeed Tech
2045392f7a3SLiteSpeed Tech    const unsigned char *
2055392f7a3SLiteSpeed Tech    (*esf_get_enc_key_nonce_i) (enc_session_t *);
2065392f7a3SLiteSpeed Tech
2075392f7a3SLiteSpeed Tech    const unsigned char *
2085392f7a3SLiteSpeed Tech    (*esf_get_dec_key_nonce_i) (enc_session_t *);
2095392f7a3SLiteSpeed Tech
2105392f7a3SLiteSpeed Tech    const unsigned char *
2115392f7a3SLiteSpeed Tech    (*esf_get_enc_key_nonce_f) (enc_session_t *);
2125392f7a3SLiteSpeed Tech
2135392f7a3SLiteSpeed Tech    const unsigned char *
2145392f7a3SLiteSpeed Tech    (*esf_get_dec_key_nonce_f) (enc_session_t *);
2155392f7a3SLiteSpeed Tech#endif /* !defined(NDEBUG) */
2165392f7a3SLiteSpeed Tech
2175392f7a3SLiteSpeed Tech    /* Create client session */
2185392f7a3SLiteSpeed Tech    enc_session_t *
219a137764bSDmitri Tikhonov    (*esf_create_client) (struct lsquic_conn *, const char *domain,
220a137764bSDmitri Tikhonov                            lsquic_cid_t cid,
2212f4629f2SDmitri Tikhonov                                    struct lsquic_engine_public *,
2225392f7a3SLiteSpeed Tech                                    const unsigned char *, size_t);
2235392f7a3SLiteSpeed Tech
2245392f7a3SLiteSpeed Tech    /* -1 error, 0, OK, response in `buf' */
2255392f7a3SLiteSpeed Tech    int
2265392f7a3SLiteSpeed Tech    (*esf_gen_chlo) (enc_session_t *, enum lsquic_version,
2275392f7a3SLiteSpeed Tech                                                uint8_t *buf, size_t *len);
2285392f7a3SLiteSpeed Tech
2295392f7a3SLiteSpeed Tech    int
2305392f7a3SLiteSpeed Tech    (*esf_handle_chlo_reply) (enc_session_t *,
2315392f7a3SLiteSpeed Tech                                                const uint8_t *data, int len);
2325392f7a3SLiteSpeed Tech
2335392f7a3SLiteSpeed Tech    size_t
2345392f7a3SLiteSpeed Tech    (*esf_mem_used)(enc_session_t *);
2355392f7a3SLiteSpeed Tech
2367483dee0SDmitri Tikhonov    /* Session resumption serialization needs the knowledge of the QUIC
2377483dee0SDmitri Tikhonov     * version, that's why there is a separate method for thus.  Plus, we
2387483dee0SDmitri Tikhonov     * want to be able to call it after the "handshake is done" callback
2397483dee0SDmitri Tikhonov     * is called.
2405392f7a3SLiteSpeed Tech     */
2417483dee0SDmitri Tikhonov    void (*esf_maybe_dispatch_sess_resume) (enc_session_t *,
2425392f7a3SLiteSpeed Tech            void (*cb)(struct lsquic_conn *, const unsigned char *, size_t));
2435392f7a3SLiteSpeed Tech
2445392f7a3SLiteSpeed Tech    void (*esf_reset_cid) (enc_session_t *, const lsquic_cid_t *);
2455392f7a3SLiteSpeed Tech};
2465392f7a3SLiteSpeed Tech
2475392f7a3SLiteSpeed Techstruct crypto_stream_if
2485392f7a3SLiteSpeed Tech{
2495392f7a3SLiteSpeed Tech    ssize_t     (*csi_write) (void *stream, const void *buf, size_t len);
2505392f7a3SLiteSpeed Tech    int         (*csi_flush) (void *stream);
2515392f7a3SLiteSpeed Tech    ssize_t     (*csi_readf) (void *stream,
2525392f7a3SLiteSpeed Tech        size_t (*readf)(void *, const unsigned char *, size_t, int), void *ctx);
2535392f7a3SLiteSpeed Tech    int         (*csi_wantwrite) (void *stream, int is_want);
2545392f7a3SLiteSpeed Tech    int         (*csi_wantread) (void *stream, int is_want);
2555392f7a3SLiteSpeed Tech    enum enc_level
2565392f7a3SLiteSpeed Tech                (*csi_enc_level) (void *stream);
2575392f7a3SLiteSpeed Tech};
2585392f7a3SLiteSpeed Tech
2595392f7a3SLiteSpeed Techstruct enc_session_funcs_iquic
2605392f7a3SLiteSpeed Tech{
2615392f7a3SLiteSpeed Tech    enc_session_t *
2625392f7a3SLiteSpeed Tech    (*esfi_create_client) (const char *domain, struct lsquic_engine_public *,
2635392f7a3SLiteSpeed Tech                           struct lsquic_conn *, const struct lsquic_cid *,
2645392f7a3SLiteSpeed Tech                           const struct ver_neg *, void *(crypto_streams)[4],
2655392f7a3SLiteSpeed Tech                           const struct crypto_stream_if *,
26665728dc5SDmitri Tikhonov                           const unsigned char *, size_t,
26721bcad87Ssumasrao                           struct lsquic_alarmset *, unsigned, void*);
2685392f7a3SLiteSpeed Tech
2695392f7a3SLiteSpeed Tech    void
2705392f7a3SLiteSpeed Tech    (*esfi_destroy) (enc_session_t *);
2715392f7a3SLiteSpeed Tech
2725392f7a3SLiteSpeed Tech    struct ssl_st *
2735392f7a3SLiteSpeed Tech    (*esfi_get_ssl) (enc_session_t *);
2745392f7a3SLiteSpeed Tech
2755392f7a3SLiteSpeed Tech    struct transport_params *
2765392f7a3SLiteSpeed Tech    (*esfi_get_peer_transport_params) (enc_session_t *);
2775392f7a3SLiteSpeed Tech
2785392f7a3SLiteSpeed Tech    int
2795392f7a3SLiteSpeed Tech    (*esfi_reset_dcid) (enc_session_t *, const struct lsquic_cid *,
2805392f7a3SLiteSpeed Tech                                                const struct lsquic_cid *);
2815392f7a3SLiteSpeed Tech
282fb73393fSDmitri Tikhonov    void
283fb73393fSDmitri Tikhonov    (*esfi_set_iscid) (enc_session_t *, const struct lsquic_packet_in *);
284fb73393fSDmitri Tikhonov
2855392f7a3SLiteSpeed Tech    int
2865392f7a3SLiteSpeed Tech    (*esfi_init_server) (enc_session_t *);
2875392f7a3SLiteSpeed Tech
2885392f7a3SLiteSpeed Tech    void
2895392f7a3SLiteSpeed Tech    (*esfi_set_streams) (enc_session_t *, void *(crypto_streams)[4],
2905392f7a3SLiteSpeed Tech                           const struct crypto_stream_if *);
2915392f7a3SLiteSpeed Tech
2925392f7a3SLiteSpeed Tech    enc_session_t *
2935392f7a3SLiteSpeed Tech    (*esfi_create_server) (struct lsquic_engine_public *, struct lsquic_conn *,
2945392f7a3SLiteSpeed Tech                                                    const struct lsquic_cid *,
2955392f7a3SLiteSpeed Tech                           void *(crypto_streams)[4],
2965392f7a3SLiteSpeed Tech                           const struct crypto_stream_if *,
297fb73393fSDmitri Tikhonov                           const struct lsquic_cid *odcid,
298fb73393fSDmitri Tikhonov                           const struct lsquic_cid *iscid );
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
3059fc12041SDmitri Tikhonov    (*esfi_handshake_confirmed)(enc_session_t *);
306e68b0452SDmitri Tikhonov
307e68b0452SDmitri Tikhonov    int
308e68b0452SDmitri Tikhonov    (*esfi_in_init)(enc_session_t *);
309e68b0452SDmitri Tikhonov
310e68b0452SDmitri Tikhonov    int
311e68b0452SDmitri Tikhonov    (*esfi_data_in)(enc_session_t *, enum enc_level,
312e68b0452SDmitri Tikhonov                                            const unsigned char *, size_t);
3135392f7a3SLiteSpeed Tech};
3145392f7a3SLiteSpeed Tech
3155392f7a3SLiteSpeed Techextern
3165392f7a3SLiteSpeed Tech#ifdef NDEBUG
3175392f7a3SLiteSpeed Techconst
3185392f7a3SLiteSpeed Tech#endif
3195392f7a3SLiteSpeed Techstruct enc_session_funcs_common lsquic_enc_session_common_gquic_1;
3207a8b2eceSDmitri Tikhonov
3217a8b2eceSDmitri Tikhonovextern
3227a8b2eceSDmitri Tikhonov#ifdef NDEBUG
3237a8b2eceSDmitri Tikhonovconst
3247a8b2eceSDmitri Tikhonov#endif
3257a8b2eceSDmitri Tikhonovstruct enc_session_funcs_common lsquic_enc_session_common_gquic_2;
3267a8b2eceSDmitri Tikhonov
3275392f7a3SLiteSpeed Techextern const struct enc_session_funcs_common lsquic_enc_session_common_ietf_v1;
3285392f7a3SLiteSpeed Tech
3295392f7a3SLiteSpeed Techextern
3305392f7a3SLiteSpeed Tech#ifdef NDEBUG
3315392f7a3SLiteSpeed Techconst
3325392f7a3SLiteSpeed Tech#endif
3335392f7a3SLiteSpeed Techstruct enc_session_funcs_gquic lsquic_enc_session_gquic_gquic_1;
3345392f7a3SLiteSpeed Tech
3355392f7a3SLiteSpeed Techextern const struct enc_session_funcs_iquic lsquic_enc_session_iquic_ietf_v1;
3365392f7a3SLiteSpeed Tech
3375392f7a3SLiteSpeed Tech#define select_esf_common_by_ver(ver) ( \
338bc520ef7SDmitri Tikhonov    ver == LSQVER_ID27 ? &lsquic_enc_session_common_ietf_v1 : \
339fb73393fSDmitri Tikhonov    ver == LSQVER_ID28 ? &lsquic_enc_session_common_ietf_v1 : \
3404051ae3aSDmitri Tikhonov    ver == LSQVER_ID29 ? &lsquic_enc_session_common_ietf_v1 : \
3414429f8eaSDmitri Tikhonov    ver == LSQVER_ID32 ? &lsquic_enc_session_common_ietf_v1 : \
3425392f7a3SLiteSpeed Tech    ver == LSQVER_VERNEG ? &lsquic_enc_session_common_ietf_v1 : \
3437a8b2eceSDmitri Tikhonov    ver == LSQVER_050 ? &lsquic_enc_session_common_gquic_2 : \
3445392f7a3SLiteSpeed Tech    &lsquic_enc_session_common_gquic_1 )
3455392f7a3SLiteSpeed Tech
3465392f7a3SLiteSpeed Tech#define select_esf_gquic_by_ver(ver) ( \
3475392f7a3SLiteSpeed Tech    ver ? &lsquic_enc_session_gquic_gquic_1 : &lsquic_enc_session_gquic_gquic_1)
3485392f7a3SLiteSpeed Tech
3495392f7a3SLiteSpeed Tech#define select_esf_iquic_by_ver(ver) ( \
3505392f7a3SLiteSpeed Tech    ver ? &lsquic_enc_session_iquic_ietf_v1 : &lsquic_enc_session_iquic_ietf_v1)
3515392f7a3SLiteSpeed Tech
3525392f7a3SLiteSpeed Techextern const char *const lsquic_enclev2str[];
3535392f7a3SLiteSpeed Tech
3545392f7a3SLiteSpeed Techextern const struct lsquic_stream_if lsquic_cry_sm_if;
3555392f7a3SLiteSpeed Tech
3565392f7a3SLiteSpeed Techextern const struct lsquic_stream_if lsquic_mini_cry_sm_if;
3575392f7a3SLiteSpeed Tech
3585392f7a3SLiteSpeed Tech/* RFC 7301, Section 3.2 */
3595392f7a3SLiteSpeed Tech#define ALERT_NO_APPLICATION_PROTOCOL 120
3605392f7a3SLiteSpeed Tech
3615392f7a3SLiteSpeed Techenum lsquic_version
3627483dee0SDmitri Tikhonovlsquic_sess_resume_version (const unsigned char *, size_t);
3635392f7a3SLiteSpeed Tech
3645392f7a3SLiteSpeed Tech/* This is seems to be true for all of the ciphers used by IETF QUIC.
3655392f7a3SLiteSpeed Tech * XXX: Perhaps add a check?
3665392f7a3SLiteSpeed Tech */
3675392f7a3SLiteSpeed Tech#define IQUIC_TAG_LEN 16
3685392f7a3SLiteSpeed Tech
36904f8f447SDmitri Tikhonov/* Return number of bytes written to `buf' or -1 on error */
37004f8f447SDmitri Tikhonovint
37104f8f447SDmitri Tikhonovlsquic_enc_sess_ietf_gen_quic_ctx (
37204f8f447SDmitri Tikhonov                const struct lsquic_engine_settings *settings,
37304f8f447SDmitri Tikhonov                enum lsquic_version version, unsigned char *buf, size_t bufsz);
37404f8f447SDmitri Tikhonov
3755392f7a3SLiteSpeed Tech#endif
376