The TLS EndOfEarlyData message is not applicable in some scenarios (e.g., QUIC).
This adds a macro to handle this message.
Reviewed-by: Neil Horman <nhorman@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/26552)
int ossl_statem_get_in_handshake(SSL_CONNECTION *s);
void ossl_statem_set_in_handshake(SSL_CONNECTION *s, int inhand);
__owur int ossl_statem_skip_early_data(SSL_CONNECTION *s);
-void ossl_statem_check_finish_init(SSL_CONNECTION *s, int send);
+int ossl_statem_check_finish_init(SSL_CONNECTION *s, int send);
void ossl_statem_set_hello_verify_done(SSL_CONNECTION *s);
__owur int ossl_statem_app_data_allowed(SSL_CONNECTION *s);
__owur int ossl_statem_export_allowed(SSL_CONNECTION *s);
* If we are a client and haven't received the ServerHello etc then we
* better do that
*/
- ossl_statem_check_finish_init(sc, 0);
+ if (!ossl_statem_check_finish_init(sc, 0))
+ return -1;
if ((sc->mode & SSL_MODE_ASYNC) && ASYNC_get_current_job() == NULL) {
struct ssl_async_args args;
return 0;
}
/* If we are a client and haven't sent the Finished we better do that */
- ossl_statem_check_finish_init(sc, 1);
+ if (!ossl_statem_check_finish_init(sc, 1))
+ return -1;
if ((sc->mode & SSL_MODE_ASYNC) && ASYNC_get_current_job() == NULL) {
int ret;
return -1;
}
- ossl_statem_check_finish_init(sc, -1);
+ if (!ossl_statem_check_finish_init(sc, -1))
+ return -1;
s->method->ssl_renegotiate_check(s, 0);
# define SSL_IS_QUIC_HANDSHAKE(s) (((s)->s3.flags & TLS1_FLAGS_QUIC) != 0)
+/* no end of early data */
+# define SSL_NO_EOED(s) SSL_IS_QUIC_HANDSHAKE(s)
+
/* alert_dispatch values */
/* No alert pending */
* attempting to read data (SSL_read*()), or -1 if we are in SSL_do_handshake()
* or similar.
*/
-void ossl_statem_check_finish_init(SSL_CONNECTION *s, int sending)
+int ossl_statem_check_finish_init(SSL_CONNECTION *s, int sending)
{
+ int i = SSL3_CC_HANDSHAKE | SSL3_CHANGE_CIPHER_SERVER_READ;
+
+ if (s->server && SSL_NO_EOED(s) && s->ext.early_data == SSL_EARLY_DATA_ACCEPTED
+ && s->early_data_state != SSL_EARLY_DATA_FINISHED_READING
+ && s->statem.hand_state == TLS_ST_EARLY_DATA) {
+ s->early_data_state = SSL_EARLY_DATA_FINISHED_READING;
+ if (!SSL_CONNECTION_GET_SSL(s)->method->ssl3_enc->change_cipher_state(s, i))
+ return 0;
+ }
if (sending == -1) {
if (s->statem.hand_state == TLS_ST_PENDING_EARLY_DATA_END
|| s->statem.hand_state == TLS_ST_EARLY_DATA) {
&& s->statem.hand_state == TLS_ST_EARLY_DATA)
ossl_statem_set_in_init(s, 1);
}
+ return 1;
}
void ossl_statem_set_hello_verify_done(SSL_CONNECTION *s)
return WRITE_TRAN_CONTINUE;
case TLS_ST_PENDING_EARLY_DATA_END:
- if (s->ext.early_data == SSL_EARLY_DATA_ACCEPTED) {
+ if (s->ext.early_data == SSL_EARLY_DATA_ACCEPTED && !SSL_NO_EOED(s)) {
st->hand_state = TLS_ST_CW_END_OF_EARLY_DATA;
return WRITE_TRAN_CONTINUE;
}
return 1;
}
break;
- } else if (s->ext.early_data == SSL_EARLY_DATA_ACCEPTED) {
+ } else if (s->ext.early_data == SSL_EARLY_DATA_ACCEPTED
+ && !SSL_NO_EOED(s)) {
if (mt == SSL3_MT_END_OF_EARLY_DATA) {
st->hand_state = TLS_ST_SR_END_OF_EARLY_DATA;
return 1;