@@ -493,20 +493,76 @@ static int quic_change_cipher_state(SSL *s, int which)
493493 int is_server_write = ((which & SSL3_CHANGE_CIPHER_SERVER_WRITE ) == SSL3_CHANGE_CIPHER_SERVER_WRITE );
494494 int is_early = (which & SSL3_CC_EARLY );
495495
496- md = ssl_handshake_md (s );
497- if (!ssl3_digest_cached_records (s , 1 )
498- || !ssl_handshake_hash (s , hash , sizeof (hash ), & hashlen )) {
499- /* SSLfatal() already called */ ;
500- goto err ;
501- }
496+ if (is_early ) {
497+ EVP_MD_CTX * mdctx = NULL ;
498+ long handlen ;
499+ void * hdata ;
500+ unsigned int hashlenui ;
501+ const SSL_CIPHER * sslcipher = SSL_SESSION_get0_cipher (s -> session );
502+
503+ handlen = BIO_get_mem_data (s -> s3 .handshake_buffer , & hdata );
504+ if (handlen <= 0 ) {
505+ SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_R_BAD_HANDSHAKE_LENGTH );
506+ goto err ;
507+ }
502508
503- /* Ensure cast to size_t is safe */
504- hashleni = EVP_MD_size (md );
505- if (!ossl_assert (hashleni >= 0 )) {
506- SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_EVP_LIB );
507- goto err ;
509+ if (s -> early_data_state == SSL_EARLY_DATA_CONNECTING
510+ && s -> max_early_data > 0
511+ && s -> session -> ext .max_early_data == 0 ) {
512+ /*
513+ * If we are attempting to send early data, and we've decided to
514+ * actually do it but max_early_data in s->session is 0 then we
515+ * must be using an external PSK.
516+ */
517+ if (!ossl_assert (s -> psksession != NULL
518+ && s -> max_early_data ==
519+ s -> psksession -> ext .max_early_data )) {
520+ SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_INTERNAL_ERROR );
521+ goto err ;
522+ }
523+ sslcipher = SSL_SESSION_get0_cipher (s -> psksession );
524+ }
525+ if (sslcipher == NULL ) {
526+ SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_R_BAD_PSK );
527+ goto err ;
528+ }
529+
530+ /*
531+ * We need to calculate the handshake digest using the digest from
532+ * the session. We haven't yet selected our ciphersuite so we can't
533+ * use ssl_handshake_md().
534+ */
535+ mdctx = EVP_MD_CTX_new ();
536+ if (mdctx == NULL ) {
537+ SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_MALLOC_FAILURE );
538+ goto err ;
539+ }
540+ md = ssl_md (s -> ctx , sslcipher -> algorithm2 );
541+ if (md == NULL || !EVP_DigestInit_ex (mdctx , md , NULL )
542+ || !EVP_DigestUpdate (mdctx , hdata , handlen )
543+ || !EVP_DigestFinal_ex (mdctx , hash , & hashlenui )) {
544+ SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_INTERNAL_ERROR );
545+ EVP_MD_CTX_free (mdctx );
546+ goto err ;
547+ }
548+ hashlen = hashlenui ;
549+ EVP_MD_CTX_free (mdctx );
550+ } else {
551+ md = ssl_handshake_md (s );
552+ if (!ssl3_digest_cached_records (s , 1 )
553+ || !ssl_handshake_hash (s , hash , sizeof (hash ), & hashlen )) {
554+ /* SSLfatal() already called */ ;
555+ goto err ;
556+ }
557+
558+ /* Ensure cast to size_t is safe */
559+ hashleni = EVP_MD_size (md );
560+ if (!ossl_assert (hashleni >= 0 )) {
561+ SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_EVP_LIB );
562+ goto err ;
563+ }
564+ hashlen = (size_t )hashleni ;
508565 }
509- hashlen = (size_t )hashleni ;
510566
511567 if (is_client_read || is_server_write ) {
512568 if (is_handshake ) {
@@ -612,10 +668,12 @@ static int quic_change_cipher_state(SSL *s, int which)
612668 }
613669 }
614670
615- if (s -> server )
616- s -> quic_read_level = level ;
617- else
618- s -> quic_write_level = level ;
671+ if (level != ssl_encryption_early_data ) {
672+ if (s -> server )
673+ s -> quic_read_level = level ;
674+ else
675+ s -> quic_write_level = level ;
676+ }
619677 }
620678
621679 ret = 1 ;
0 commit comments