@@ -17470,6 +17470,15 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1747017470 WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
1747117471 return DUPLICATE_MSG_E;
1747217472 }
17473+ if (!ssl->msgsReceived.got_server_hello ||
17474+ ssl->msgsReceived.got_change_cipher ||
17475+ ssl->msgsReceived.got_finished ||
17476+ (!ssl->options.resuming &&
17477+ !ssl->msgsReceived.got_server_hello_done)) {
17478+ WOLFSSL_MSG("session_ticket received in wrong order");
17479+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17480+ return OUT_OF_ORDER_E;
17481+ }
1747317482 ssl->msgsReceived.got_session_ticket = 1;
1747417483
1747517484 break;
@@ -17485,20 +17494,36 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1748517494
1748617495#ifndef NO_WOLFSSL_CLIENT
1748717496 if (ssl->options.side == WOLFSSL_CLIENT_END) {
17488- if ( ssl->msgsReceived.got_server_hello == 0 ) {
17497+ if (! ssl->msgsReceived.got_server_hello) {
1748917498 WOLFSSL_MSG("No ServerHello before Cert");
1749017499 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1749117500 return OUT_OF_ORDER_E;
1749217501 }
17502+ if (ssl->msgsReceived.got_certificate_status ||
17503+ ssl->msgsReceived.got_server_key_exchange ||
17504+ ssl->msgsReceived.got_certificate_request ||
17505+ ssl->msgsReceived.got_server_hello_done) {
17506+ WOLFSSL_MSG("Cert received in wrong order");
17507+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17508+ return OUT_OF_ORDER_E;
17509+ }
1749317510 }
1749417511#endif
1749517512#ifndef NO_WOLFSSL_SERVER
1749617513 if (ssl->options.side == WOLFSSL_SERVER_END) {
17497- if ( ssl->msgsReceived.got_client_hello == 0 ) {
17514+ if (! ssl->msgsReceived.got_client_hello) {
1749817515 WOLFSSL_MSG("No ClientHello before Cert");
1749917516 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1750017517 return OUT_OF_ORDER_E;
1750117518 }
17519+ if (ssl->msgsReceived.got_client_key_exchange ||
17520+ ssl->msgsReceived.got_certificate_verify ||
17521+ ssl->msgsReceived.got_change_cipher ||
17522+ ssl->msgsReceived.got_finished) {
17523+ WOLFSSL_MSG("Cert received in wrong order");
17524+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17525+ return OUT_OF_ORDER_E;
17526+ }
1750217527 }
1750317528#endif
1750417529 break;
@@ -17517,7 +17542,6 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1751717542 WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
1751817543 return DUPLICATE_MSG_E;
1751917544 }
17520- ssl->msgsReceived.got_certificate_status = 1;
1752117545
1752217546 if (ssl->msgsReceived.got_certificate == 0) {
1752317547 WOLFSSL_MSG("No Certificate before CertificateStatus");
@@ -17529,7 +17553,15 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1752917553 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1753017554 return OUT_OF_ORDER_E;
1753117555 }
17556+ if (ssl->msgsReceived.got_server_key_exchange ||
17557+ ssl->msgsReceived.got_certificate_request ||
17558+ ssl->msgsReceived.got_server_hello_done) {
17559+ WOLFSSL_MSG("CertificateStatus received in wrong order");
17560+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17561+ return OUT_OF_ORDER_E;
17562+ }
1753217563
17564+ ssl->msgsReceived.got_certificate_status = 1;
1753317565 break;
1753417566#endif
1753517567
@@ -17547,14 +17579,19 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1754717579 WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
1754817580 return DUPLICATE_MSG_E;
1754917581 }
17550- ssl->msgsReceived.got_server_key_exchange = 1;
17551-
1755217582 if (ssl->msgsReceived.got_server_hello == 0) {
1755317583 WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
1755417584 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1755517585 return OUT_OF_ORDER_E;
1755617586 }
17587+ if (ssl->msgsReceived.got_certificate_request ||
17588+ ssl->msgsReceived.got_server_hello_done) {
17589+ WOLFSSL_MSG("ServerKeyExchange received in wrong order");
17590+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17591+ return OUT_OF_ORDER_E;
17592+ }
1755717593
17594+ ssl->msgsReceived.got_server_key_exchange = 1;
1755817595 break;
1755917596#endif
1756017597
@@ -17572,6 +17609,16 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1757217609 WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
1757317610 return DUPLICATE_MSG_E;
1757417611 }
17612+ if (ssl->msgsReceived.got_server_hello == 0) {
17613+ WOLFSSL_MSG("No ServerHello before CertificateRequest");
17614+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17615+ return OUT_OF_ORDER_E;
17616+ }
17617+ if (ssl->msgsReceived.got_server_hello_done) {
17618+ WOLFSSL_MSG("CertificateRequest received in wrong order");
17619+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17620+ return OUT_OF_ORDER_E;
17621+ }
1757517622 ssl->msgsReceived.got_certificate_request = 1;
1757617623
1757717624 break;
@@ -17691,13 +17738,18 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1769117738 WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
1769217739 return DUPLICATE_MSG_E;
1769317740 }
17694- ssl->msgsReceived.got_certificate_verify = 1;
17695-
1769617741 if ( ssl->msgsReceived.got_certificate == 0) {
1769717742 WOLFSSL_MSG("No Cert before CertVerify");
1769817743 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1769917744 return OUT_OF_ORDER_E;
1770017745 }
17746+ if (ssl->msgsReceived.got_change_cipher ||
17747+ ssl->msgsReceived.got_finished) {
17748+ WOLFSSL_MSG("CertVerify received in wrong order");
17749+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17750+ return OUT_OF_ORDER_E;
17751+ }
17752+ ssl->msgsReceived.got_certificate_verify = 1;
1770117753 break;
1770217754#endif
1770317755
@@ -17715,13 +17767,19 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1771517767 WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
1771617768 return DUPLICATE_MSG_E;
1771717769 }
17718- ssl->msgsReceived.got_client_key_exchange = 1;
17719-
1772017770 if (ssl->msgsReceived.got_client_hello == 0) {
1772117771 WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
1772217772 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1772317773 return OUT_OF_ORDER_E;
1772417774 }
17775+ if (ssl->msgsReceived.got_certificate_verify||
17776+ ssl->msgsReceived.got_change_cipher ||
17777+ ssl->msgsReceived.got_finished) {
17778+ WOLFSSL_MSG("ClientKeyExchange received in wrong order");
17779+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17780+ return OUT_OF_ORDER_E;
17781+ }
17782+ ssl->msgsReceived.got_client_key_exchange = 1;
1772517783 break;
1772617784#endif
1772717785
@@ -17740,13 +17798,12 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1774017798 }
1774117799 }
1774217800#endif
17743- ssl->msgsReceived.got_finished = 1;
17744-
1774517801 if (ssl->msgsReceived.got_change_cipher == 0) {
1774617802 WOLFSSL_MSG("Finished received before ChangeCipher");
1774717803 WOLFSSL_ERROR_VERBOSE(NO_CHANGE_CIPHER_E);
1774817804 return NO_CHANGE_CIPHER_E;
1774917805 }
17806+ ssl->msgsReceived.got_finished = 1;
1775017807 break;
1775117808
1775217809 case change_cipher_hs:
0 commit comments