@@ -468,21 +468,81 @@ static int quic_change_cipher_state(SSL *s, int which)
468468    int  is_server_write  =  ((which  &  SSL3_CHANGE_CIPHER_SERVER_WRITE ) ==  SSL3_CHANGE_CIPHER_SERVER_WRITE );
469469    int  is_early  =  (which  &  SSL3_CC_EARLY );
470470
471-     md  =  ssl_handshake_md (s );
472-     if  (!ssl3_digest_cached_records (s , 1 )
473-         ||  !ssl_handshake_hash (s , hash , sizeof (hash ), & hashlen )) {
474-         /* SSLfatal() already called */ ;
475-         goto err ;
476-     }
471+     if  (is_early ) {
472+         EVP_MD_CTX  * mdctx  =  NULL ;
473+         long  handlen ;
474+         void  * hdata ;
475+         unsigned int   hashlenui ;
476+         const  SSL_CIPHER  * sslcipher  =  SSL_SESSION_get0_cipher (s -> session );
477+ 
478+         handlen  =  BIO_get_mem_data (s -> s3 -> handshake_buffer , & hdata );
479+         if  (handlen  <= 0 ) {
480+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_F_QUIC_CHANGE_CIPHER_STATE ,
481+                      SSL_R_BAD_HANDSHAKE_LENGTH );
482+             goto err ;
483+         }
477484
478-     /* Ensure cast to size_t is safe */ 
479-     hashleni  =  EVP_MD_size (md );
480-     if  (!ossl_assert (hashleni  >= 0 )) {
481-         SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_F_QUIC_CHANGE_CIPHER_STATE ,
482-                  ERR_R_EVP_LIB );
483-         goto err ;
485+         if  (s -> early_data_state  ==  SSL_EARLY_DATA_CONNECTING 
486+                 &&  s -> max_early_data  >  0  &&  s -> session -> ext .max_early_data  ==  0 ) {
487+             /* 
488+              * If we are attempting to send early data, and we've decided to 
489+              * actually do it but max_early_data in s->session is 0 then we 
490+              * must be using an external PSK. 
491+              */ 
492+             if  (!ossl_assert (s -> psksession  !=  NULL 
493+                              &&  s -> max_early_data 
494+                                     ==  s -> psksession -> ext .max_early_data )) {
495+                 SSLfatal (s , SSL_AD_INTERNAL_ERROR ,
496+                          SSL_F_QUIC_CHANGE_CIPHER_STATE , ERR_R_INTERNAL_ERROR );
497+                 goto err ;
498+             }
499+             sslcipher  =  SSL_SESSION_get0_cipher (s -> psksession );
500+         }
501+         if  (sslcipher  ==  NULL ) {
502+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_F_QUIC_CHANGE_CIPHER_STATE ,
503+                      SSL_R_BAD_PSK );
504+             goto err ;
505+         }
506+ 
507+         /* 
508+          * We need to calculate the handshake digest using the digest from 
509+          * the session. We haven't yet selected our ciphersuite so we can't 
510+          * use ssl_handshake_md(). 
511+          */ 
512+         mdctx  =  EVP_MD_CTX_new ();
513+         if  (mdctx  ==  NULL ) {
514+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_F_QUIC_CHANGE_CIPHER_STATE ,
515+                      ERR_R_MALLOC_FAILURE );
516+             goto err ;
517+         }
518+         md  =  ssl_md (sslcipher -> algorithm2 );
519+         if  (md  ==  NULL  ||  !EVP_DigestInit_ex (mdctx , md , NULL )
520+                 ||  !EVP_DigestUpdate (mdctx , hdata , handlen )
521+                 ||  !EVP_DigestFinal_ex (mdctx , hash , & hashlenui )) {
522+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_F_QUIC_CHANGE_CIPHER_STATE ,
523+                      ERR_R_INTERNAL_ERROR );
524+             EVP_MD_CTX_free (mdctx );
525+             goto err ;
526+         }
527+         hashlen  =  hashlenui ;
528+         EVP_MD_CTX_free (mdctx );
529+     } else  {
530+         md  =  ssl_handshake_md (s );
531+         if  (!ssl3_digest_cached_records (s , 1 )
532+                 ||  !ssl_handshake_hash (s , hash , sizeof (hash ), & hashlen )) {
533+             /* SSLfatal() already called */ ;
534+             goto err ;
535+         }
536+ 
537+         /* Ensure cast to size_t is safe */ 
538+         hashleni  =  EVP_MD_size (md );
539+         if  (!ossl_assert (hashleni  >= 0 )) {
540+             SSLfatal (s , SSL_AD_INTERNAL_ERROR , SSL_F_QUIC_CHANGE_CIPHER_STATE ,
541+                      ERR_R_EVP_LIB );
542+             goto err ;
543+         }
544+         hashlen  =  (size_t )hashleni ;
484545    }
485-     hashlen  =  (size_t )hashleni ;
486546
487547    if  (is_client_read  ||  is_server_write ) {
488548        if  (is_handshake ) {
@@ -588,10 +648,12 @@ static int quic_change_cipher_state(SSL *s, int which)
588648            }
589649        }
590650
591-         if  (s -> server )
592-             s -> quic_read_level  =  level ;
593-         else 
594-             s -> quic_write_level  =  level ;
651+         if  (level  !=  ssl_encryption_early_data ) {
652+             if  (s -> server )
653+                 s -> quic_read_level  =  level ;
654+             else 
655+                 s -> quic_write_level  =  level ;
656+         }
595657    }
596658
597659    ret  =  1 ;
0 commit comments