@@ -419,20 +419,76 @@ static int quic_change_cipher_state(SSL *s, int which)
419419    int  is_server_write  =  ((which  &  SSL3_CHANGE_CIPHER_SERVER_WRITE ) ==  SSL3_CHANGE_CIPHER_SERVER_WRITE );
420420    int  is_early  =  (which  &  SSL3_CC_EARLY );
421421
422-     md  =  ssl_handshake_md (s );
423-     if  (!ssl3_digest_cached_records (s , 1 )
424-         ||  !ssl_handshake_hash (s , hash , sizeof (hash ), & hashlen )) {
425-         /* SSLfatal() already called */ ;
426-         goto err ;
427-     }
422+     if  (is_early ) {
423+         EVP_MD_CTX  * mdctx  =  NULL ;
424+         long  handlen ;
425+         void  * hdata ;
426+         unsigned int   hashlenui ;
427+         const  SSL_CIPHER  * sslcipher  =  SSL_SESSION_get0_cipher (s -> session );
428+ 
429+         handlen  =  BIO_get_mem_data (s -> s3 .handshake_buffer , & hdata );
430+         if  (handlen  <= 0 ) {
431+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_R_BAD_HANDSHAKE_LENGTH );
432+             goto err ;
433+         }
428434
429-     /* Ensure cast to size_t is safe */ 
430-     hashleni  =  EVP_MD_size (md );
431-     if  (!ossl_assert (hashleni  >= 0 )) {
432-         SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_EVP_LIB );
433-         goto err ;
435+         if  (s -> early_data_state  ==  SSL_EARLY_DATA_CONNECTING 
436+                 &&  s -> max_early_data  >  0 
437+                 &&  s -> session -> ext .max_early_data  ==  0 ) {
438+             /* 
439+              * If we are attempting to send early data, and we've decided to 
440+              * actually do it but max_early_data in s->session is 0 then we 
441+              * must be using an external PSK. 
442+              */ 
443+             if  (!ossl_assert (s -> psksession  !=  NULL 
444+                     &&  s -> max_early_data  == 
445+                        s -> psksession -> ext .max_early_data )) {
446+                 SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_INTERNAL_ERROR );
447+                 goto err ;
448+             }
449+             sslcipher  =  SSL_SESSION_get0_cipher (s -> psksession );
450+         }
451+         if  (sslcipher  ==  NULL ) {
452+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_R_BAD_PSK );
453+             goto err ;
454+         }
455+ 
456+         /* 
457+          * We need to calculate the handshake digest using the digest from 
458+          * the session. We haven't yet selected our ciphersuite so we can't 
459+          * use ssl_handshake_md(). 
460+          */ 
461+         mdctx  =  EVP_MD_CTX_new ();
462+         if  (mdctx  ==  NULL ) {
463+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_MALLOC_FAILURE );
464+             goto err ;
465+         }
466+         md  =  ssl_md (s -> ctx , sslcipher -> algorithm2 );
467+         if  (md  ==  NULL  ||  !EVP_DigestInit_ex (mdctx , md , NULL )
468+                 ||  !EVP_DigestUpdate (mdctx , hdata , handlen )
469+                 ||  !EVP_DigestFinal_ex (mdctx , hash , & hashlenui )) {
470+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_INTERNAL_ERROR );
471+             EVP_MD_CTX_free (mdctx );
472+             goto err ;
473+         }
474+         hashlen  =  hashlenui ;
475+         EVP_MD_CTX_free (mdctx );
476+     } else  {
477+         md  =  ssl_handshake_md (s );
478+         if  (!ssl3_digest_cached_records (s , 1 )
479+                 ||  !ssl_handshake_hash (s , hash , sizeof (hash ), & hashlen )) {
480+             /* SSLfatal() already called */ ;
481+             goto err ;
482+         }
483+ 
484+         /* Ensure cast to size_t is safe */ 
485+         hashleni  =  EVP_MD_size (md );
486+         if  (!ossl_assert (hashleni  >= 0 )) {
487+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , ERR_R_EVP_LIB );
488+             goto err ;
489+         }
490+         hashlen  =  (size_t )hashleni ;
434491    }
435-     hashlen  =  (size_t )hashleni ;
436492
437493    if  (is_client_read  ||  is_server_write ) {
438494        if  (is_handshake ) {
@@ -538,10 +594,12 @@ static int quic_change_cipher_state(SSL *s, int which)
538594            }
539595        }
540596
541-         if  (s -> server )
542-             s -> quic_read_level  =  level ;
543-         else 
544-             s -> quic_write_level  =  level ;
597+         if  (level  !=  ssl_encryption_early_data ) {
598+             if  (s -> server )
599+                 s -> quic_read_level  =  level ;
600+             else 
601+                 s -> quic_write_level  =  level ;
602+         }
545603    }
546604
547605    ret  =  1 ;
0 commit comments