@@ -434,20 +434,76 @@ static int quic_change_cipher_state(SSL *s, int which)
434434 int is_server_write = ((which & SSL3_CHANGE_CIPHER_SERVER_WRITE ) == SSL3_CHANGE_CIPHER_SERVER_WRITE );
435435 int is_early = (which & SSL3_CC_EARLY );
436436
437- md = ssl_handshake_md (s );
438- if (!ssl3_digest_cached_records (s , 1 )
439- || !ssl_handshake_hash (s , hash , sizeof (hash ), & hashlen )) {
440- /* SSLfatal() already called */ ;
441- goto err ;
442- }
437+ if (is_early ) {
438+ EVP_MD_CTX * mdctx = NULL ;
439+ long handlen ;
440+ void * hdata ;
441+ unsigned int hashlenui ;
442+ const SSL_CIPHER * sslcipher = SSL_SESSION_get0_cipher (s -> session );
443+
444+ handlen = BIO_get_mem_data (s -> s3 .handshake_buffer , & hdata );
445+ if (handlen <= 0 ) {
446+ SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_R_BAD_HANDSHAKE_LENGTH );
447+ goto err ;
448+ }
443449
444- /* Ensure cast to size_t is safe */
445- hashleni = EVP_MD_size (md );
446- if (!ossl_assert (hashleni >= 0 )) {
447- SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_EVP_LIB );
448- goto err ;
450+ if (s -> early_data_state == SSL_EARLY_DATA_CONNECTING
451+ && s -> max_early_data > 0
452+ && s -> session -> ext .max_early_data == 0 ) {
453+ /*
454+ * If we are attempting to send early data, and we've decided to
455+ * actually do it but max_early_data in s->session is 0 then we
456+ * must be using an external PSK.
457+ */
458+ if (!ossl_assert (s -> psksession != NULL
459+ && s -> max_early_data ==
460+ s -> psksession -> ext .max_early_data )) {
461+ SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_INTERNAL_ERROR );
462+ goto err ;
463+ }
464+ sslcipher = SSL_SESSION_get0_cipher (s -> psksession );
465+ }
466+ if (sslcipher == NULL ) {
467+ SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_R_BAD_PSK );
468+ goto err ;
469+ }
470+
471+ /*
472+ * We need to calculate the handshake digest using the digest from
473+ * the session. We haven't yet selected our ciphersuite so we can't
474+ * use ssl_handshake_md().
475+ */
476+ mdctx = EVP_MD_CTX_new ();
477+ if (mdctx == NULL ) {
478+ SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_MALLOC_FAILURE );
479+ goto err ;
480+ }
481+ md = ssl_md (s -> ctx , sslcipher -> algorithm2 );
482+ if (md == NULL || !EVP_DigestInit_ex (mdctx , md , NULL )
483+ || !EVP_DigestUpdate (mdctx , hdata , handlen )
484+ || !EVP_DigestFinal_ex (mdctx , hash , & hashlenui )) {
485+ SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_INTERNAL_ERROR );
486+ EVP_MD_CTX_free (mdctx );
487+ goto err ;
488+ }
489+ hashlen = hashlenui ;
490+ EVP_MD_CTX_free (mdctx );
491+ } else {
492+ md = ssl_handshake_md (s );
493+ if (!ssl3_digest_cached_records (s , 1 )
494+ || !ssl_handshake_hash (s , hash , sizeof (hash ), & hashlen )) {
495+ /* SSLfatal() already called */ ;
496+ goto err ;
497+ }
498+
499+ /* Ensure cast to size_t is safe */
500+ hashleni = EVP_MD_size (md );
501+ if (!ossl_assert (hashleni >= 0 )) {
502+ SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_EVP_LIB );
503+ goto err ;
504+ }
505+ hashlen = (size_t )hashleni ;
449506 }
450- hashlen = (size_t )hashleni ;
451507
452508 if (is_client_read || is_server_write ) {
453509 if (is_handshake ) {
@@ -553,10 +609,12 @@ static int quic_change_cipher_state(SSL *s, int which)
553609 }
554610 }
555611
556- if (s -> server )
557- s -> quic_read_level = level ;
558- else
559- s -> quic_write_level = level ;
612+ if (level != ssl_encryption_early_data ) {
613+ if (s -> server )
614+ s -> quic_read_level = level ;
615+ else
616+ s -> quic_write_level = level ;
617+ }
560618 }
561619
562620 ret = 1 ;
0 commit comments