Make the anti-replay feature optional
Fixes #6389 Reviewed-by: Viktor Dukhovni <viktor@openssl.org> Reviewed-by: Rich Salz <rsalz@openssl.org> (Merged from https://github.com/openssl/openssl/pull/6469)
This commit is contained in:
parent
b6ff436fcb
commit
5d263fb78b
5 changed files with 18 additions and 4 deletions
|
@ -368,6 +368,12 @@ typedef int (*SSL_verify_cb)(int preverify_ok, X509_STORE_CTX *x509_ctx);
|
||||||
*/
|
*/
|
||||||
# define SSL_OP_TLS_ROLLBACK_BUG 0x00800000U
|
# define SSL_OP_TLS_ROLLBACK_BUG 0x00800000U
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Switches off automatic TLSv1.3 anti-replay protection for early data. This
|
||||||
|
* is a server-side option only (no effect on the client).
|
||||||
|
*/
|
||||||
|
# define SSL_OP_NO_ANTI_REPLAY 0x01000000U
|
||||||
|
|
||||||
# define SSL_OP_NO_SSLv3 0x02000000U
|
# define SSL_OP_NO_SSLv3 0x02000000U
|
||||||
# define SSL_OP_NO_TLSv1 0x04000000U
|
# define SSL_OP_NO_TLSv1 0x04000000U
|
||||||
# define SSL_OP_NO_TLSv1_2 0x08000000U
|
# define SSL_OP_NO_TLSv1_2 0x08000000U
|
||||||
|
|
|
@ -3381,7 +3381,8 @@ void ssl_update_cache(SSL *s, int mode)
|
||||||
if ((i & SSL_SESS_CACHE_NO_INTERNAL_STORE) == 0
|
if ((i & SSL_SESS_CACHE_NO_INTERNAL_STORE) == 0
|
||||||
&& (!SSL_IS_TLS13(s)
|
&& (!SSL_IS_TLS13(s)
|
||||||
|| !s->server
|
|| !s->server
|
||||||
|| s->max_early_data > 0
|
|| (s->max_early_data > 0
|
||||||
|
&& (s->options & SSL_OP_NO_ANTI_REPLAY) == 0)
|
||||||
|| s->session_ctx->remove_session_cb != NULL
|
|| s->session_ctx->remove_session_cb != NULL
|
||||||
|| (s->options & SSL_OP_NO_TICKET) != 0))
|
|| (s->options & SSL_OP_NO_TICKET) != 0))
|
||||||
SSL_CTX_add_session(s->session_ctx, s->session);
|
SSL_CTX_add_session(s->session_ctx, s->session);
|
||||||
|
|
|
@ -1205,6 +1205,9 @@ struct ssl_st {
|
||||||
# endif
|
# endif
|
||||||
SSL_psk_find_session_cb_func psk_find_session_cb;
|
SSL_psk_find_session_cb_func psk_find_session_cb;
|
||||||
SSL_psk_use_session_cb_func psk_use_session_cb;
|
SSL_psk_use_session_cb_func psk_use_session_cb;
|
||||||
|
|
||||||
|
int (*allow_early_data_cb)(SSL *s, SSL_SESSION *sess);
|
||||||
|
|
||||||
SSL_CTX *ctx;
|
SSL_CTX *ctx;
|
||||||
/* Verified chain of peer */
|
/* Verified chain of peer */
|
||||||
STACK_OF(X509) *verified_chain;
|
STACK_OF(X509) *verified_chain;
|
||||||
|
|
|
@ -1165,7 +1165,8 @@ int tls_parse_ctos_psk(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
|
||||||
* is no point in using full stateless tickets.
|
* is no point in using full stateless tickets.
|
||||||
*/
|
*/
|
||||||
if ((s->options & SSL_OP_NO_TICKET) != 0
|
if ((s->options & SSL_OP_NO_TICKET) != 0
|
||||||
|| s->max_early_data > 0)
|
|| (s->max_early_data > 0
|
||||||
|
&& (s->options & SSL_OP_NO_ANTI_REPLAY) == 0))
|
||||||
ret = tls_get_stateful_ticket(s, &identity, &sess);
|
ret = tls_get_stateful_ticket(s, &identity, &sess);
|
||||||
else
|
else
|
||||||
ret = tls_decrypt_ticket(s, PACKET_data(&identity),
|
ret = tls_decrypt_ticket(s, PACKET_data(&identity),
|
||||||
|
@ -1189,6 +1190,7 @@ int tls_parse_ctos_psk(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
|
||||||
|
|
||||||
/* Check for replay */
|
/* Check for replay */
|
||||||
if (s->max_early_data > 0
|
if (s->max_early_data > 0
|
||||||
|
&& (s->options & SSL_OP_NO_ANTI_REPLAY) == 0
|
||||||
&& !SSL_CTX_remove_session(s->session_ctx, sess)) {
|
&& !SSL_CTX_remove_session(s->session_ctx, sess)) {
|
||||||
SSL_SESSION_free(sess);
|
SSL_SESSION_free(sess);
|
||||||
sess = NULL;
|
sess = NULL;
|
||||||
|
|
|
@ -4086,8 +4086,10 @@ int tls_construct_new_session_ticket(SSL *s, WPACKET *pkt)
|
||||||
* SSL_OP_NO_TICKET is set - we are caching tickets anyway so there
|
* SSL_OP_NO_TICKET is set - we are caching tickets anyway so there
|
||||||
* is no point in using full stateless tickets.
|
* is no point in using full stateless tickets.
|
||||||
*/
|
*/
|
||||||
if (((s->options & SSL_OP_NO_TICKET) != 0 || s->max_early_data > 0)
|
if (SSL_IS_TLS13(s)
|
||||||
&& SSL_IS_TLS13(s)) {
|
&& ((s->options & SSL_OP_NO_TICKET) != 0
|
||||||
|
|| (s->max_early_data > 0
|
||||||
|
&& (s->options & SSL_OP_NO_ANTI_REPLAY) == 0))) {
|
||||||
if (!construct_stateful_ticket(s, pkt, age_add_u.age_add, tick_nonce)) {
|
if (!construct_stateful_ticket(s, pkt, age_add_u.age_add, tick_nonce)) {
|
||||||
/* SSLfatal() already called */
|
/* SSLfatal() already called */
|
||||||
goto err;
|
goto err;
|
||||||
|
|
Loading…
Reference in a new issue