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