mirror of
https://gitea.invidious.io/iv-org/litespeed-quic.git
synced 2024-08-15 00:53:43 +00:00
API: add ea_alpn that is used when not in HTTP mode
This commit is contained in:
parent
abc972dafe
commit
fa4561dcea
4 changed files with 69 additions and 24 deletions
|
@ -1019,6 +1019,12 @@ struct lsquic_engine_api
|
||||||
*/
|
*/
|
||||||
const struct lsquic_keylog_if *ea_keylog_if;
|
const struct lsquic_keylog_if *ea_keylog_if;
|
||||||
void *ea_keylog_ctx;
|
void *ea_keylog_ctx;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The optional ALPN string is used by the client @ref LSENG_HTTP
|
||||||
|
* is not set.
|
||||||
|
*/
|
||||||
|
const char *ea_alpn;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -70,7 +70,7 @@
|
||||||
static const struct alpn_map {
|
static const struct alpn_map {
|
||||||
enum lsquic_version version;
|
enum lsquic_version version;
|
||||||
const unsigned char *alpn;
|
const unsigned char *alpn;
|
||||||
} s_alpns[] = {
|
} s_h3_alpns[] = {
|
||||||
{ LSQVER_ID25, (unsigned char *) "\x05h3-25", },
|
{ LSQVER_ID25, (unsigned char *) "\x05h3-25", },
|
||||||
{ LSQVER_ID27, (unsigned char *) "\x05h3-27", },
|
{ LSQVER_ID27, (unsigned char *) "\x05h3-27", },
|
||||||
{ LSQVER_VERNEG, (unsigned char *) "\x05h3-27", },
|
{ LSQVER_VERNEG, (unsigned char *) "\x05h3-27", },
|
||||||
|
@ -1097,17 +1097,19 @@ iquic_esfi_init_server (enc_session_t *enc_session_p)
|
||||||
unsigned char trans_params[sizeof(struct transport_params)];
|
unsigned char trans_params[sizeof(struct transport_params)];
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
for (am = s_alpns; am < s_alpns + sizeof(s_alpns)
|
if (enc_sess->esi_enpub->enp_alpn)
|
||||||
/ sizeof(s_alpns[0]); ++am)
|
enc_sess->esi_alpn = enc_sess->esi_enpub->enp_alpn;
|
||||||
if (am->version == enc_sess->esi_conn->cn_version)
|
else if (enc_sess->esi_enpub->enp_flags & ENPUB_HTTP)
|
||||||
goto ok;
|
{
|
||||||
|
for (am = s_h3_alpns; am < s_h3_alpns + sizeof(s_h3_alpns)
|
||||||
LSQ_ERROR("version %s has no matching ALPN",
|
/ sizeof(s_h3_alpns[0]); ++am)
|
||||||
lsquic_ver2str[enc_sess->esi_conn->cn_version]);
|
if (am->version == enc_sess->esi_conn->cn_version)
|
||||||
return -1;
|
goto ok;
|
||||||
|
LSQ_ERROR("version %s has no matching ALPN",
|
||||||
ok:
|
lsquic_ver2str[enc_sess->esi_conn->cn_version]);
|
||||||
enc_sess->esi_alpn = am->alpn;
|
return -1;
|
||||||
|
ok: enc_sess->esi_alpn = am->alpn;
|
||||||
|
}
|
||||||
|
|
||||||
ssl_ctx = enc_sess->esi_enpub->enp_get_ssl_ctx(
|
ssl_ctx = enc_sess->esi_enpub->enp_get_ssl_ctx(
|
||||||
lsquic_conn_get_peer_ctx(enc_sess->esi_conn, NULL));
|
lsquic_conn_get_peer_ctx(enc_sess->esi_conn, NULL));
|
||||||
|
@ -1261,17 +1263,20 @@ init_client (struct enc_sess_iquic *const enc_sess)
|
||||||
#endif
|
#endif
|
||||||
];
|
];
|
||||||
|
|
||||||
for (am = s_alpns; am < s_alpns + sizeof(s_alpns)
|
if (enc_sess->esi_enpub->enp_alpn)
|
||||||
/ sizeof(s_alpns[0]); ++am)
|
enc_sess->esi_alpn = enc_sess->esi_enpub->enp_alpn;
|
||||||
if (am->version == enc_sess->esi_ver_neg->vn_ver)
|
else if (enc_sess->esi_enpub->enp_flags & ENPUB_HTTP)
|
||||||
goto ok;
|
{
|
||||||
|
for (am = s_h3_alpns; am < s_h3_alpns + sizeof(s_h3_alpns)
|
||||||
|
/ sizeof(s_h3_alpns[0]); ++am)
|
||||||
|
if (am->version == enc_sess->esi_ver_neg->vn_ver)
|
||||||
|
goto ok;
|
||||||
|
LSQ_ERROR("version %s has no matching ALPN",
|
||||||
|
lsquic_ver2str[enc_sess->esi_ver_neg->vn_ver]);
|
||||||
|
return -1;
|
||||||
|
ok: enc_sess->esi_alpn = am->alpn;
|
||||||
|
}
|
||||||
|
|
||||||
LSQ_ERROR("version %s has no matching ALPN",
|
|
||||||
lsquic_ver2str[enc_sess->esi_ver_neg->vn_ver]);
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
ok:
|
|
||||||
enc_sess->esi_alpn = am->alpn;
|
|
||||||
LSQ_DEBUG("Create new SSL_CTX");
|
LSQ_DEBUG("Create new SSL_CTX");
|
||||||
ssl_ctx = SSL_CTX_new(TLS_method());
|
ssl_ctx = SSL_CTX_new(TLS_method());
|
||||||
if (!ssl_ctx)
|
if (!ssl_ctx)
|
||||||
|
@ -1320,7 +1325,9 @@ init_client (struct enc_sess_iquic *const enc_sess)
|
||||||
ERR_error_string(ERR_get_error(), errbuf));
|
ERR_error_string(ERR_get_error(), errbuf));
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (0 != SSL_set_alpn_protos(enc_sess->esi_ssl, am->alpn, am->alpn[0] + 1))
|
if (enc_sess->esi_alpn &&
|
||||||
|
0 != SSL_set_alpn_protos(enc_sess->esi_ssl, enc_sess->esi_alpn,
|
||||||
|
enc_sess->esi_alpn[0] + 1))
|
||||||
{
|
{
|
||||||
LSQ_ERROR("cannot set ALPN: %s",
|
LSQ_ERROR("cannot set ALPN: %s",
|
||||||
ERR_error_string(ERR_get_error(), errbuf));
|
ERR_error_string(ERR_get_error(), errbuf));
|
||||||
|
@ -2437,7 +2444,8 @@ cry_sm_set_encryption_secret (SSL *ssl, enum ssl_encryption_level_t level,
|
||||||
if (!enc_sess)
|
if (!enc_sess)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((enc_sess->esi_flags & (ESI_ALPN_CHECKED|ESI_SERVER)) == ESI_SERVER)
|
if ((enc_sess->esi_flags & (ESI_ALPN_CHECKED|ESI_SERVER)) == ESI_SERVER
|
||||||
|
&& enc_sess->esi_alpn)
|
||||||
{
|
{
|
||||||
enc_sess->esi_flags |= ESI_ALPN_CHECKED;
|
enc_sess->esi_flags |= ESI_ALPN_CHECKED;
|
||||||
SSL_get0_alpn_selected(enc_sess->esi_ssl, &alpn, &alpn_len);
|
SSL_get0_alpn_selected(enc_sess->esi_ssl, &alpn, &alpn_len);
|
||||||
|
|
|
@ -463,6 +463,7 @@ lsquic_engine_new (unsigned flags,
|
||||||
const struct lsquic_engine_api *api)
|
const struct lsquic_engine_api *api)
|
||||||
{
|
{
|
||||||
lsquic_engine_t *engine;
|
lsquic_engine_t *engine;
|
||||||
|
size_t alpn_len;
|
||||||
char err_buf[100];
|
char err_buf[100];
|
||||||
|
|
||||||
if (!api->ea_packets_out)
|
if (!api->ea_packets_out)
|
||||||
|
@ -477,6 +478,18 @@ lsquic_engine_new (unsigned flags,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(flags & LSENG_HTTP) && api->ea_alpn)
|
||||||
|
{
|
||||||
|
alpn_len = strlen(api->ea_alpn);
|
||||||
|
if (alpn_len < 1 || alpn_len > 255)
|
||||||
|
{
|
||||||
|
LSQ_ERROR("ALPN string length invalid: %zd bytes", alpn_len);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
alpn_len = 0;
|
||||||
|
|
||||||
if (api->ea_settings &&
|
if (api->ea_settings &&
|
||||||
0 != lsquic_engine_check_settings(api->ea_settings, flags,
|
0 != lsquic_engine_check_settings(api->ea_settings, flags,
|
||||||
err_buf, sizeof(err_buf)))
|
err_buf, sizeof(err_buf)))
|
||||||
|
@ -605,6 +618,21 @@ lsquic_engine_new (unsigned flags,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (alpn_len)
|
||||||
|
{
|
||||||
|
engine->pub.enp_alpn = malloc(alpn_len + 1);
|
||||||
|
if (!engine->pub.enp_alpn)
|
||||||
|
{
|
||||||
|
lsquic_engine_destroy(engine);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
engine->pub.enp_alpn[0] = alpn_len;
|
||||||
|
memcpy(engine->pub.enp_alpn + 1, api->ea_alpn, alpn_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & LSENG_HTTP)
|
||||||
|
engine->pub.enp_flags |= ENPUB_HTTP;
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
{
|
{
|
||||||
const char *env;
|
const char *env;
|
||||||
|
@ -1458,6 +1486,7 @@ lsquic_engine_destroy (lsquic_engine_t *engine)
|
||||||
#endif
|
#endif
|
||||||
if (engine->pub.enp_retry_aead_ctx)
|
if (engine->pub.enp_retry_aead_ctx)
|
||||||
EVP_AEAD_CTX_cleanup(engine->pub.enp_retry_aead_ctx);
|
EVP_AEAD_CTX_cleanup(engine->pub.enp_retry_aead_ctx);
|
||||||
|
free(engine->pub.enp_alpn);
|
||||||
free(engine);
|
free(engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,11 +59,13 @@ struct lsquic_engine_public {
|
||||||
* functions.
|
* functions.
|
||||||
*/
|
*/
|
||||||
ENPUB_CAN_SEND = (1 << 1),
|
ENPUB_CAN_SEND = (1 << 1),
|
||||||
|
ENPUB_HTTP = (1 << 2), /* Engine in HTTP mode */
|
||||||
} enp_flags;
|
} enp_flags;
|
||||||
unsigned char enp_ver_tags_buf[ sizeof(lsquic_ver_tag_t) * N_LSQVER ];
|
unsigned char enp_ver_tags_buf[ sizeof(lsquic_ver_tag_t) * N_LSQVER ];
|
||||||
unsigned enp_ver_tags_len;
|
unsigned enp_ver_tags_len;
|
||||||
struct crand *enp_crand;
|
struct crand *enp_crand;
|
||||||
struct evp_aead_ctx_st *enp_retry_aead_ctx;
|
struct evp_aead_ctx_st *enp_retry_aead_ctx;
|
||||||
|
unsigned char *enp_alpn; /* May be set if not HTTP */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Put connection onto the Tickable Queue if it is not already on it. If
|
/* Put connection onto the Tickable Queue if it is not already on it. If
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue