@@ -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