@@ -17604,7 +17604,9 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1760417604 if (ssl->msgsReceived.got_certificate_status ||
1760517605 ssl->msgsReceived.got_server_key_exchange ||
1760617606 ssl->msgsReceived.got_certificate_request ||
17607- ssl->msgsReceived.got_server_hello_done) {
17607+ ssl->msgsReceived.got_server_hello_done ||
17608+ ssl->msgsReceived.got_change_cipher ||
17609+ ssl->msgsReceived.got_finished) {
1760817610 WOLFSSL_MSG("Cert received in wrong order");
1760917611 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1761017612 return OUT_OF_ORDER_E;
@@ -17645,19 +17647,21 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1764517647 return DUPLICATE_MSG_E;
1764617648 }
1764717649
17648- if (ssl->msgsReceived.got_certificate == 0 ) {
17650+ if (! ssl->msgsReceived.got_certificate) {
1764917651 WOLFSSL_MSG("No Certificate before CertificateStatus");
1765017652 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1765117653 return OUT_OF_ORDER_E;
1765217654 }
17653- if (ssl->msgsReceived.got_server_key_exchange != 0 ) {
17655+ if (ssl->msgsReceived.got_server_key_exchange) {
1765417656 WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
1765517657 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1765617658 return OUT_OF_ORDER_E;
1765717659 }
1765817660 if (ssl->msgsReceived.got_server_key_exchange ||
1765917661 ssl->msgsReceived.got_certificate_request ||
17660- ssl->msgsReceived.got_server_hello_done) {
17662+ ssl->msgsReceived.got_server_hello_done ||
17663+ ssl->msgsReceived.got_change_cipher ||
17664+ ssl->msgsReceived.got_finished) {
1766117665 WOLFSSL_MSG("CertificateStatus received in wrong order");
1766217666 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1766317667 return OUT_OF_ORDER_E;
@@ -17681,13 +17685,25 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1768117685 WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
1768217686 return DUPLICATE_MSG_E;
1768317687 }
17684- if (ssl->msgsReceived.got_server_hello == 0 ) {
17688+ if (! ssl->msgsReceived.got_server_hello) {
1768517689 WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
1768617690 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1768717691 return OUT_OF_ORDER_E;
1768817692 }
17693+ if (!ssl->msgsReceived.got_certificate) {
17694+ if (ssl->specs.kea != psk_kea &&
17695+ ssl->specs.kea != dhe_psk_kea &&
17696+ ssl->specs.kea != ecdhe_psk_kea &&
17697+ !ssl->options.usingAnon_cipher) {
17698+ WOLFSSL_MSG("No Certificate before ServerKeyExchange");
17699+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17700+ return OUT_OF_ORDER_E;
17701+ }
17702+ }
1768917703 if (ssl->msgsReceived.got_certificate_request ||
17690- ssl->msgsReceived.got_server_hello_done) {
17704+ ssl->msgsReceived.got_server_hello_done ||
17705+ ssl->msgsReceived.got_change_cipher ||
17706+ ssl->msgsReceived.got_finished) {
1769117707 WOLFSSL_MSG("ServerKeyExchange received in wrong order");
1769217708 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1769317709 return OUT_OF_ORDER_E;
@@ -17711,11 +17727,16 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1771117727 WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
1771217728 return DUPLICATE_MSG_E;
1771317729 }
17714- if (ssl->msgsReceived.got_server_hello == 0 ) {
17730+ if (! ssl->msgsReceived.got_server_hello) {
1771517731 WOLFSSL_MSG("No ServerHello before CertificateRequest");
1771617732 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1771717733 return OUT_OF_ORDER_E;
1771817734 }
17735+ if (!ssl->msgsReceived.got_certificate) {
17736+ WOLFSSL_MSG("No Certificate before CertificateRequest");
17737+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17738+ return OUT_OF_ORDER_E;
17739+ }
1771917740 if (!ssl->options.resuming && ssl->specs.kea != rsa_kea &&
1772017741 (ssl->specs.kea != ecc_diffie_hellman_kea ||
1772117742 !ssl->specs.static_ecdh) &&
@@ -17725,12 +17746,9 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1772517746 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1772617747 return OUT_OF_ORDER_E;
1772717748 }
17728- if (!ssl->msgsReceived.got_certificate) {
17729- WOLFSSL_MSG("No Certificate before CertificateRequest");
17730- WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17731- return OUT_OF_ORDER_E;
17732- }
17733- if (ssl->msgsReceived.got_server_hello_done) {
17749+ if (ssl->msgsReceived.got_server_hello_done ||
17750+ ssl->msgsReceived.got_change_cipher ||
17751+ ssl->msgsReceived.got_finished) {
1773417752 WOLFSSL_MSG("CertificateRequest received in wrong order");
1773517753 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1773617754 return OUT_OF_ORDER_E;
@@ -17756,7 +17774,7 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1775617774 }
1775717775 ssl->msgsReceived.got_server_hello_done = 1;
1775817776
17759- if (ssl->msgsReceived.got_certificate == 0 ) {
17777+ if (! ssl->msgsReceived.got_certificate) {
1776017778 if (ssl->specs.kea == psk_kea ||
1776117779 ssl->specs.kea == dhe_psk_kea ||
1776217780 ssl->specs.kea == ecdhe_psk_kea ||
@@ -17769,7 +17787,7 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1776917787 return OUT_OF_ORDER_E;
1777017788 }
1777117789 }
17772- if (ssl->msgsReceived.got_server_key_exchange == 0 ) {
17790+ if (! ssl->msgsReceived.got_server_key_exchange) {
1777317791 int pskNoServerHint = 0; /* not required in this case */
1777417792
1777517793 #ifndef NO_PSK
@@ -17791,7 +17809,7 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1779117809 }
1779217810#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
1779317811 defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
17794- if (ssl->msgsReceived.got_certificate_status == 0 ) {
17812+ if (! ssl->msgsReceived.got_certificate_status) {
1779517813 int csrRet = 0;
1779617814#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
1779717815 if (csrRet == 0 && ssl->status_request) {
@@ -17837,6 +17855,12 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1783717855 }
1783817856 }
1783917857#endif
17858+ if (ssl->msgsReceived.got_change_cipher ||
17859+ ssl->msgsReceived.got_finished) {
17860+ WOLFSSL_MSG("ServerHelloDone received in wrong order");
17861+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17862+ return OUT_OF_ORDER_E;
17863+ }
1784017864 break;
1784117865#endif
1784217866
@@ -17854,7 +17878,12 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1785417878 WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
1785517879 return DUPLICATE_MSG_E;
1785617880 }
17857- if ( ssl->msgsReceived.got_certificate == 0) {
17881+ if (!ssl->msgsReceived.got_client_key_exchange) {
17882+ WOLFSSL_MSG("No ClientKeyExchange before CertVerify");
17883+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17884+ return OUT_OF_ORDER_E;
17885+ }
17886+ if (!ssl->msgsReceived.got_certificate) {
1785817887 WOLFSSL_MSG("No Cert before CertVerify");
1785917888 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1786017889 return OUT_OF_ORDER_E;
@@ -17883,7 +17912,7 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1788317912 WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
1788417913 return DUPLICATE_MSG_E;
1788517914 }
17886- if (ssl->msgsReceived.got_client_hello == 0 ) {
17915+ if (! ssl->msgsReceived.got_client_hello) {
1788717916 WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
1788817917 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1788917918 return OUT_OF_ORDER_E;
@@ -17914,7 +17943,7 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1791417943 }
1791517944 }
1791617945#endif
17917- if (ssl->msgsReceived.got_change_cipher == 0 ) {
17946+ if (! ssl->msgsReceived.got_change_cipher) {
1791817947 WOLFSSL_MSG("Finished received before ChangeCipher");
1791917948 WOLFSSL_ERROR_VERBOSE(NO_CHANGE_CIPHER_E);
1792017949 return NO_CHANGE_CIPHER_E;
@@ -17935,62 +17964,63 @@ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
1793517964
1793617965#ifndef NO_WOLFSSL_CLIENT
1793717966 if (ssl->options.side == WOLFSSL_CLIENT_END) {
17967+ if (!ssl->msgsReceived.got_server_hello) {
17968+ WOLFSSL_MSG("ChangeCipherSpec received in wrong order");
17969+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17970+ return OUT_OF_ORDER_E;
17971+ }
1793817972 if (!ssl->options.resuming) {
17939- if (ssl->msgsReceived.got_server_hello_done == 0 ) {
17973+ if (! ssl->msgsReceived.got_server_hello_done) {
1794017974 WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
1794117975 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1794217976 return OUT_OF_ORDER_E;
1794317977 }
1794417978 }
17945- else {
17946- if (ssl->msgsReceived.got_server_hello == 0) {
17947- WOLFSSL_MSG("No ServerHello before ChangeCipher on "
17948- "Resume");
17949- WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17950- return OUT_OF_ORDER_E;
17951- }
17979+ #ifdef HAVE_SESSION_TICKET
17980+ if (ssl->expect_session_ticket) {
17981+ WOLFSSL_MSG("Expected session ticket missing");
17982+ #ifdef WOLFSSL_DTLS
17983+ if (ssl->options.dtls) {
17984+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17985+ return OUT_OF_ORDER_E;
17986+ }
17987+ #endif
17988+ WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
17989+ return SESSION_TICKET_EXPECT_E;
1795217990 }
17953- #ifdef HAVE_SESSION_TICKET
17954- if (ssl->expect_session_ticket) {
17955- WOLFSSL_MSG("Expected session ticket missing");
17956- #ifdef WOLFSSL_DTLS
17957- if (ssl->options.dtls) {
17958- WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17959- return OUT_OF_ORDER_E;
17960- }
17961- #endif
17962- WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
17963- return SESSION_TICKET_EXPECT_E;
17964- }
17965- #endif
17991+ #endif
1796617992 }
1796717993#endif
1796817994#ifndef NO_WOLFSSL_SERVER
1796917995 if (ssl->options.side == WOLFSSL_SERVER_END) {
17996+ if (!ssl->msgsReceived.got_client_hello) {
17997+ WOLFSSL_MSG("ChangeCipherSpec received in wrong order");
17998+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17999+ return OUT_OF_ORDER_E;
18000+ }
1797018001 if (!ssl->options.resuming &&
17971- ssl->msgsReceived.got_client_key_exchange == 0 ) {
18002+ ! ssl->msgsReceived.got_client_key_exchange) {
1797218003 WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
1797318004 WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
1797418005 return OUT_OF_ORDER_E;
1797518006 }
17976- #ifndef NO_CERTS
17977- if (ssl->options.verifyPeer &&
18007+ #ifndef NO_CERTS
18008+ if (ssl->options.verifyPeer &&
1797818009 ssl->options.havePeerCert) {
17979-
17980- if (!ssl->options.havePeerVerify ||
17981- !ssl->msgsReceived.got_certificate_verify) {
17982- WOLFSSL_MSG("client didn't send cert verify");
17983- #ifdef WOLFSSL_DTLS
17984- if (ssl->options.dtls) {
17985- WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
17986- return OUT_OF_ORDER_E;
17987- }
17988- #endif
17989- WOLFSSL_ERROR_VERBOSE(NO_PEER_VERIFY);
17990- return NO_PEER_VERIFY;
17991- }
18010+ if (!ssl->options.havePeerVerify ||
18011+ !ssl->msgsReceived.got_certificate_verify) {
18012+ WOLFSSL_MSG("client didn't send cert verify");
18013+ #ifdef WOLFSSL_DTLS
18014+ if (ssl->options.dtls) {
18015+ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
18016+ return OUT_OF_ORDER_E;
18017+ }
18018+ #endif
18019+ WOLFSSL_ERROR_VERBOSE(NO_PEER_VERIFY);
18020+ return NO_PEER_VERIFY;
1799218021 }
17993- #endif
18022+ }
18023+ #endif
1799418024 }
1799518025#endif /* !NO_WOLFSSL_SERVER */
1799618026 if (ssl->options.dtls)
0 commit comments