Skip to content

Commit b37f665

Browse files
committed
QUIC: Handle EndOfEarlyData and MaxEarlyData
1 parent 3f8eda3 commit b37f665

File tree

4 files changed

+34
-2
lines changed

4 files changed

+34
-2
lines changed

ssl/statem/extensions_clnt.c

+12
Original file line numberDiff line numberDiff line change
@@ -1933,6 +1933,18 @@ int tls_parse_stoc_early_data(SSL *s, PACKET *pkt, unsigned int context,
19331933
return 0;
19341934
}
19351935

1936+
#ifndef OPENSSL_NO_QUIC
1937+
/*
1938+
* QUIC server must send 0xFFFFFFFF or it's a PROTOCOL_VIOLATION
1939+
* per draft-ietf-quic-tls-24 S4.5
1940+
*/
1941+
if (s->quic_method != NULL && max_early_data != 0xFFFFFFFF) {
1942+
SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_EARLY_DATA,
1943+
SSL_R_INVALID_MAX_EARLY_DATA);
1944+
return 0;
1945+
}
1946+
#endif
1947+
19361948
s->session->ext.max_early_data = max_early_data;
19371949

19381950
return 1;

ssl/statem/extensions_srvr.c

+10-2
Original file line numberDiff line numberDiff line change
@@ -1946,12 +1946,20 @@ EXT_RETURN tls_construct_stoc_early_data(SSL *s, WPACKET *pkt,
19461946
size_t chainidx)
19471947
{
19481948
if (context == SSL_EXT_TLS1_3_NEW_SESSION_TICKET) {
1949-
if (s->max_early_data == 0)
1949+
uint32_t max_early_data = s->max_early_data;
1950+
1951+
if (max_early_data == 0)
19501952
return EXT_RETURN_NOT_SENT;
19511953

1954+
#ifndef OPENSSL_NO_QUIC
1955+
/* QUIC server must always send 0xFFFFFFFF, per draft-ietf-quic-tls-24 S4.5 */
1956+
if (s->quic_method != NULL)
1957+
max_early_data = 0xFFFFFFFF;
1958+
#endif
1959+
19521960
if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_early_data)
19531961
|| !WPACKET_start_sub_packet_u16(pkt)
1954-
|| !WPACKET_put_bytes_u32(pkt, s->max_early_data)
1962+
|| !WPACKET_put_bytes_u32(pkt, max_early_data)
19551963
|| !WPACKET_close(pkt)) {
19561964
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
19571965
SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA, ERR_R_INTERNAL_ERROR);

ssl/statem/statem_clnt.c

+8
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,14 @@ int ossl_statem_client_construct_message(SSL *s, WPACKET *pkt,
909909
break;
910910

911911
case TLS_ST_CW_END_OF_EARLY_DATA:
912+
#ifndef OPENSSL_NO_QUIC
913+
/* QUIC does not send EndOfEarlyData, draft-ietf-quic-tls-24 S8.3 */
914+
if (s->quic_method != NULL) {
915+
*confunc = NULL;
916+
*mt = SSL3_MT_DUMMY;
917+
break;
918+
}
919+
#endif
912920
*confunc = tls_construct_end_of_early_data;
913921
*mt = SSL3_MT_END_OF_EARLY_DATA;
914922
break;

ssl/statem/statem_srvr.c

+4
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ static int ossl_statem_server13_read_transition(SSL *s, int mt)
7474
break;
7575
} else if (s->ext.early_data == SSL_EARLY_DATA_ACCEPTED) {
7676
if (mt == SSL3_MT_END_OF_EARLY_DATA) {
77+
#ifndef OPENSSL_NO_QUIC
78+
if (s->quic_method != NULL)
79+
return 0;
80+
#endif
7781
st->hand_state = TLS_ST_SR_END_OF_EARLY_DATA;
7882
return 1;
7983
}

0 commit comments

Comments
 (0)