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