@@ -430,20 +430,76 @@ static int quic_change_cipher_state(SSL *s, int which)
430430    int  is_server_write  =  ((which  &  SSL3_CHANGE_CIPHER_SERVER_WRITE ) ==  SSL3_CHANGE_CIPHER_SERVER_WRITE );
431431    int  is_early  =  (which  &  SSL3_CC_EARLY );
432432
433-     md  =  ssl_handshake_md (s );
434-     if  (!ssl3_digest_cached_records (s , 1 )
435-         ||  !ssl_handshake_hash (s , hash , sizeof (hash ), & hashlen )) {
436-         /* SSLfatal() already called */ ;
437-         goto err ;
438-     }
433+     if  (is_early ) {
434+         EVP_MD_CTX  * mdctx  =  NULL ;
435+         long  handlen ;
436+         void  * hdata ;
437+         unsigned int   hashlenui ;
438+         const  SSL_CIPHER  * sslcipher  =  SSL_SESSION_get0_cipher (s -> session );
439+ 
440+         handlen  =  BIO_get_mem_data (s -> s3 .handshake_buffer , & hdata );
441+         if  (handlen  <= 0 ) {
442+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_R_BAD_HANDSHAKE_LENGTH );
443+             goto err ;
444+         }
439445
440-     /* Ensure cast to size_t is safe */ 
441-     hashleni  =  EVP_MD_size (md );
442-     if  (!ossl_assert (hashleni  >= 0 )) {
443-         SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_EVP_LIB );
444-         goto err ;
446+         if  (s -> early_data_state  ==  SSL_EARLY_DATA_CONNECTING 
447+                 &&  s -> max_early_data  >  0 
448+                 &&  s -> session -> ext .max_early_data  ==  0 ) {
449+             /* 
450+              * If we are attempting to send early data, and we've decided to 
451+              * actually do it but max_early_data in s->session is 0 then we 
452+              * must be using an external PSK. 
453+              */ 
454+             if  (!ossl_assert (s -> psksession  !=  NULL 
455+                     &&  s -> max_early_data  == 
456+                        s -> psksession -> ext .max_early_data )) {
457+                 SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_INTERNAL_ERROR );
458+                 goto err ;
459+             }
460+             sslcipher  =  SSL_SESSION_get0_cipher (s -> psksession );
461+         }
462+         if  (sslcipher  ==  NULL ) {
463+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_R_BAD_PSK );
464+             goto err ;
465+         }
466+ 
467+         /* 
468+          * We need to calculate the handshake digest using the digest from 
469+          * the session. We haven't yet selected our ciphersuite so we can't 
470+          * use ssl_handshake_md(). 
471+          */ 
472+         mdctx  =  EVP_MD_CTX_new ();
473+         if  (mdctx  ==  NULL ) {
474+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_MALLOC_FAILURE );
475+             goto err ;
476+         }
477+         md  =  ssl_md (s -> ctx , sslcipher -> algorithm2 );
478+         if  (md  ==  NULL  ||  !EVP_DigestInit_ex (mdctx , md , NULL )
479+                 ||  !EVP_DigestUpdate (mdctx , hdata , handlen )
480+                 ||  !EVP_DigestFinal_ex (mdctx , hash , & hashlenui )) {
481+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_INTERNAL_ERROR );
482+             EVP_MD_CTX_free (mdctx );
483+             goto err ;
484+         }
485+         hashlen  =  hashlenui ;
486+         EVP_MD_CTX_free (mdctx );
487+     } else  {
488+         md  =  ssl_handshake_md (s );
489+         if  (!ssl3_digest_cached_records (s , 1 )
490+                 ||  !ssl_handshake_hash (s , hash , sizeof (hash ), & hashlen )) {
491+             /* SSLfatal() already called */ ;
492+             goto err ;
493+         }
494+ 
495+         /* Ensure cast to size_t is safe */ 
496+         hashleni  =  EVP_MD_size (md );
497+         if  (!ossl_assert (hashleni  >= 0 )) {
498+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_EVP_LIB );
499+             goto err ;
500+         }
501+         hashlen  =  (size_t )hashleni ;
445502    }
446-     hashlen  =  (size_t )hashleni ;
447503
448504    if  (is_client_read  ||  is_server_write ) {
449505        if  (is_handshake ) {
@@ -549,10 +605,12 @@ static int quic_change_cipher_state(SSL *s, int which)
549605            }
550606        }
551607
552-         if  (s -> server )
553-             s -> quic_read_level  =  level ;
554-         else 
555-             s -> quic_write_level  =  level ;
608+         if  (level  !=  ssl_encryption_early_data ) {
609+             if  (s -> server )
610+                 s -> quic_read_level  =  level ;
611+             else 
612+                 s -> quic_write_level  =  level ;
613+         }
556614    }
557615
558616    ret  =  1 ;
0 commit comments