summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_clnt.c
diff options
context:
space:
mode:
authorjsing <>2021-10-23 08:34:36 +0000
committerjsing <>2021-10-23 08:34:36 +0000
commit3781592d1cd8ce107960abb543e4eccf20288a82 (patch)
tree84ea9950c0cb3d3c14ebfccb65a931db3ba71bfd /src/lib/libssl/ssl_clnt.c
parent5ee33af93b944cb8cf535f155eb2a489305b5ccc (diff)
downloadopenbsd-3781592d1cd8ce107960abb543e4eccf20288a82.tar.gz
openbsd-3781592d1cd8ce107960abb543e4eccf20288a82.tar.bz2
openbsd-3781592d1cd8ce107960abb543e4eccf20288a82.zip
Untangle ssl3_get_message() return values.
This function currently has a long return type that may be <= 0 on error/retry (which is then cast to an int in order to return it up the stack), or it returns the length of the handshake message (on success). This obviously means that 0 can be returned for both success and failure, which is the reason why a separate 'ok' argument has to exist. Untangle this mess by changing the return value to an int that indicates success (1) or error/retry (<= 0). The length never needs to actually be returned as it is already stored in s->internal->init_num (which is where the return value is read from anyway). ok tb@
Diffstat (limited to 'src/lib/libssl/ssl_clnt.c')
-rw-r--r--src/lib/libssl/ssl_clnt.c175
1 files changed, 81 insertions, 94 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c
index bcf5108975..8a4c54e7b7 100644
--- a/src/lib/libssl/ssl_clnt.c
+++ b/src/lib/libssl/ssl_clnt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_clnt.c,v 1.112 2021/10/23 08:13:02 jsing Exp $ */ 1/* $OpenBSD: ssl_clnt.c,v 1.113 2021/10/23 08:34:36 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -779,16 +779,14 @@ ssl3_send_client_hello(SSL *s)
779int 779int
780ssl3_get_dtls_hello_verify(SSL *s) 780ssl3_get_dtls_hello_verify(SSL *s)
781{ 781{
782 long n; 782 CBS hello_verify_request, cookie;
783 int al, ok = 0;
784 size_t cookie_len; 783 size_t cookie_len;
785 uint16_t ssl_version; 784 uint16_t ssl_version;
786 CBS hello_verify_request, cookie; 785 int al, ret;
787 786
788 n = ssl3_get_message(s, DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A, 787 if ((ret = ssl3_get_message(s, DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A,
789 DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B, -1, s->internal->max_cert_list, &ok); 788 DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B, -1, s->internal->max_cert_list)) <= 0)
790 if (!ok) 789 return ret;
791 return ((int)n);
792 790
793 if (S3I(s)->hs.tls12.message_type != DTLS1_MT_HELLO_VERIFY_REQUEST) { 791 if (S3I(s)->hs.tls12.message_type != DTLS1_MT_HELLO_VERIFY_REQUEST) {
794 D1I(s)->send_cookie = 0; 792 D1I(s)->send_cookie = 0;
@@ -796,10 +794,11 @@ ssl3_get_dtls_hello_verify(SSL *s)
796 return (1); 794 return (1);
797 } 795 }
798 796
799 if (n < 0) 797 if (s->internal->init_num < 0)
800 goto decode_err; 798 goto decode_err;
801 799
802 CBS_init(&hello_verify_request, s->internal->init_msg, n); 800 CBS_init(&hello_verify_request, s->internal->init_msg,
801 s->internal->init_num);
803 802
804 if (!CBS_get_u16(&hello_verify_request, &ssl_version)) 803 if (!CBS_get_u16(&hello_verify_request, &ssl_version))
805 goto decode_err; 804 goto decode_err;
@@ -848,20 +847,18 @@ ssl3_get_server_hello(SSL *s)
848 const SSL_METHOD *method; 847 const SSL_METHOD *method;
849 unsigned long alg_k; 848 unsigned long alg_k;
850 size_t outlen; 849 size_t outlen;
851 int al, ok; 850 int al, ret;
852 long n;
853 851
854 s->internal->first_packet = 1; 852 s->internal->first_packet = 1;
855 n = ssl3_get_message(s, SSL3_ST_CR_SRVR_HELLO_A, 853 if ((ret = ssl3_get_message(s, SSL3_ST_CR_SRVR_HELLO_A,
856 SSL3_ST_CR_SRVR_HELLO_B, -1, 20000, /* ?? */ &ok); 854 SSL3_ST_CR_SRVR_HELLO_B, -1, 20000 /* ?? */)) <= 0)
857 if (!ok) 855 return ret;
858 return ((int)n);
859 s->internal->first_packet = 0; 856 s->internal->first_packet = 0;
860 857
861 if (n < 0) 858 if (s->internal->init_num < 0)
862 goto decode_err; 859 goto decode_err;
863 860
864 CBS_init(&cbs, s->internal->init_msg, n); 861 CBS_init(&cbs, s->internal->init_msg, s->internal->init_num);
865 862
866 if (SSL_is_dtls(s)) { 863 if (SSL_is_dtls(s)) {
867 if (S3I(s)->hs.tls12.message_type == DTLS1_MT_HELLO_VERIFY_REQUEST) { 864 if (S3I(s)->hs.tls12.message_type == DTLS1_MT_HELLO_VERIFY_REQUEST) {
@@ -1103,19 +1100,19 @@ ssl3_get_server_hello(SSL *s)
1103int 1100int
1104ssl3_get_server_certificate(SSL *s) 1101ssl3_get_server_certificate(SSL *s)
1105{ 1102{
1106 int al, i, ok, ret = -1; 1103 int al, i, ret;
1107 long n; 1104 CBS cbs, cert_list;
1108 CBS cbs, cert_list; 1105 X509 *x = NULL;
1109 X509 *x = NULL; 1106 const unsigned char *q;
1110 const unsigned char *q; 1107 STACK_OF(X509) *sk = NULL;
1111 STACK_OF(X509) *sk = NULL; 1108 SESS_CERT *sc;
1112 SESS_CERT *sc; 1109 EVP_PKEY *pkey = NULL;
1113 EVP_PKEY *pkey = NULL; 1110
1114 1111 if ((ret = ssl3_get_message(s, SSL3_ST_CR_CERT_A,
1115 n = ssl3_get_message(s, SSL3_ST_CR_CERT_A, 1112 SSL3_ST_CR_CERT_B, -1, s->internal->max_cert_list)) <= 0)
1116 SSL3_ST_CR_CERT_B, -1, s->internal->max_cert_list, &ok); 1113 return ret;
1117 if (!ok) 1114
1118 return ((int)n); 1115 ret = -1;
1119 1116
1120 if (S3I(s)->hs.tls12.message_type == SSL3_MT_SERVER_KEY_EXCHANGE) { 1117 if (S3I(s)->hs.tls12.message_type == SSL3_MT_SERVER_KEY_EXCHANGE) {
1121 S3I(s)->hs.tls12.reuse_message = 1; 1118 S3I(s)->hs.tls12.reuse_message = 1;
@@ -1128,16 +1125,15 @@ ssl3_get_server_certificate(SSL *s)
1128 goto fatal_err; 1125 goto fatal_err;
1129 } 1126 }
1130 1127
1131
1132 if ((sk = sk_X509_new_null()) == NULL) { 1128 if ((sk = sk_X509_new_null()) == NULL) {
1133 SSLerror(s, ERR_R_MALLOC_FAILURE); 1129 SSLerror(s, ERR_R_MALLOC_FAILURE);
1134 goto err; 1130 goto err;
1135 } 1131 }
1136 1132
1137 if (n < 0) 1133 if (s->internal->init_num < 0)
1138 goto decode_err; 1134 goto decode_err;
1139 1135
1140 CBS_init(&cbs, s->internal->init_msg, n); 1136 CBS_init(&cbs, s->internal->init_msg, s->internal->init_num);
1141 if (CBS_len(&cbs) < 3) 1137 if (CBS_len(&cbs) < 3)
1142 goto decode_err; 1138 goto decode_err;
1143 1139
@@ -1463,9 +1459,9 @@ ssl3_get_server_key_exchange(SSL *s)
1463 EVP_PKEY *pkey = NULL; 1459 EVP_PKEY *pkey = NULL;
1464 EVP_MD_CTX md_ctx; 1460 EVP_MD_CTX md_ctx;
1465 const unsigned char *param; 1461 const unsigned char *param;
1466 long n, alg_k, alg_a;
1467 int al, ok;
1468 size_t param_len; 1462 size_t param_len;
1463 long alg_k, alg_a;
1464 int al, ret;
1469 1465
1470 EVP_MD_CTX_init(&md_ctx); 1466 EVP_MD_CTX_init(&md_ctx);
1471 1467
@@ -1476,15 +1472,14 @@ ssl3_get_server_key_exchange(SSL *s)
1476 * Use same message size as in ssl3_get_certificate_request() 1472 * Use same message size as in ssl3_get_certificate_request()
1477 * as ServerKeyExchange message may be skipped. 1473 * as ServerKeyExchange message may be skipped.
1478 */ 1474 */
1479 n = ssl3_get_message(s, SSL3_ST_CR_KEY_EXCH_A, 1475 if ((ret = ssl3_get_message(s, SSL3_ST_CR_KEY_EXCH_A,
1480 SSL3_ST_CR_KEY_EXCH_B, -1, s->internal->max_cert_list, &ok); 1476 SSL3_ST_CR_KEY_EXCH_B, -1, s->internal->max_cert_list)) <= 0)
1481 if (!ok) 1477 return ret;
1482 return ((int)n);
1483 1478
1484 if (n < 0) 1479 if (s->internal->init_num < 0)
1485 goto err; 1480 goto err;
1486 1481
1487 CBS_init(&cbs, s->internal->init_msg, n); 1482 CBS_init(&cbs, s->internal->init_msg, s->internal->init_num);
1488 1483
1489 if (S3I(s)->hs.tls12.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) { 1484 if (S3I(s)->hs.tls12.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) {
1490 /* 1485 /*
@@ -1617,17 +1612,17 @@ ssl3_get_server_key_exchange(SSL *s)
1617int 1612int
1618ssl3_get_certificate_request(SSL *s) 1613ssl3_get_certificate_request(SSL *s)
1619{ 1614{
1620 int ok, ret = 0; 1615 CBS cert_request, cert_types, rdn_list;
1621 long n; 1616 X509_NAME *xn = NULL;
1622 CBS cert_request, cert_types, rdn_list; 1617 const unsigned char *q;
1623 X509_NAME *xn = NULL; 1618 STACK_OF(X509_NAME) *ca_sk = NULL;
1624 const unsigned char *q; 1619 int ret;
1625 STACK_OF(X509_NAME) *ca_sk = NULL; 1620
1626 1621 if ((ret = ssl3_get_message(s, SSL3_ST_CR_CERT_REQ_A,
1627 n = ssl3_get_message(s, SSL3_ST_CR_CERT_REQ_A, 1622 SSL3_ST_CR_CERT_REQ_B, -1, s->internal->max_cert_list)) <= 0)
1628 SSL3_ST_CR_CERT_REQ_B, -1, s->internal->max_cert_list, &ok); 1623 return ret;
1629 if (!ok) 1624
1630 return ((int)n); 1625 ret = 0;
1631 1626
1632 S3I(s)->hs.tls12.cert_request = 0; 1627 S3I(s)->hs.tls12.cert_request = 0;
1633 1628
@@ -1654,9 +1649,9 @@ ssl3_get_certificate_request(SSL *s)
1654 goto err; 1649 goto err;
1655 } 1650 }
1656 1651
1657 if (n < 0) 1652 if (s->internal->init_num < 0)
1658 goto decode_err; 1653 goto decode_err;
1659 CBS_init(&cert_request, s->internal->init_msg, n); 1654 CBS_init(&cert_request, s->internal->init_msg, s->internal->init_num);
1660 1655
1661 if ((ca_sk = sk_X509_NAME_new(ca_dn_cmp)) == NULL) { 1656 if ((ca_sk = sk_X509_NAME_new(ca_dn_cmp)) == NULL) {
1662 SSLerror(s, ERR_R_MALLOC_FAILURE); 1657 SSLerror(s, ERR_R_MALLOC_FAILURE);
@@ -1761,15 +1756,15 @@ ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b)
1761int 1756int
1762ssl3_get_new_session_ticket(SSL *s) 1757ssl3_get_new_session_ticket(SSL *s)
1763{ 1758{
1764 int ok, al, ret = 0; 1759 uint32_t lifetime_hint;
1765 uint32_t lifetime_hint; 1760 CBS cbs, session_ticket;
1766 long n; 1761 int al, ret;
1767 CBS cbs, session_ticket; 1762
1763 if ((ret = ssl3_get_message(s, SSL3_ST_CR_SESSION_TICKET_A,
1764 SSL3_ST_CR_SESSION_TICKET_B, -1, 16384)) <= 0)
1765 return ret;
1768 1766
1769 n = ssl3_get_message(s, SSL3_ST_CR_SESSION_TICKET_A, 1767 ret = 0;
1770 SSL3_ST_CR_SESSION_TICKET_B, -1, 16384, &ok);
1771 if (!ok)
1772 return ((int)n);
1773 1768
1774 if (S3I(s)->hs.tls12.message_type == SSL3_MT_FINISHED) { 1769 if (S3I(s)->hs.tls12.message_type == SSL3_MT_FINISHED) {
1775 S3I(s)->hs.tls12.reuse_message = 1; 1770 S3I(s)->hs.tls12.reuse_message = 1;
@@ -1781,13 +1776,13 @@ ssl3_get_new_session_ticket(SSL *s)
1781 goto fatal_err; 1776 goto fatal_err;
1782 } 1777 }
1783 1778
1784 if (n < 0) { 1779 if (s->internal->init_num < 0) {
1785 al = SSL_AD_DECODE_ERROR; 1780 al = SSL_AD_DECODE_ERROR;
1786 SSLerror(s, SSL_R_LENGTH_MISMATCH); 1781 SSLerror(s, SSL_R_LENGTH_MISMATCH);
1787 goto fatal_err; 1782 goto fatal_err;
1788 } 1783 }
1789 1784
1790 CBS_init(&cbs, s->internal->init_msg, n); 1785 CBS_init(&cbs, s->internal->init_msg, s->internal->init_num);
1791 if (!CBS_get_u32(&cbs, &lifetime_hint) || 1786 if (!CBS_get_u32(&cbs, &lifetime_hint) ||
1792 !CBS_get_u16_length_prefixed(&cbs, &session_ticket) || 1787 !CBS_get_u16_length_prefixed(&cbs, &session_ticket) ||
1793 CBS_len(&cbs) != 0) { 1788 CBS_len(&cbs) != 0) {
@@ -1833,15 +1828,13 @@ ssl3_get_new_session_ticket(SSL *s)
1833int 1828int
1834ssl3_get_cert_status(SSL *s) 1829ssl3_get_cert_status(SSL *s)
1835{ 1830{
1836 CBS cert_status, response; 1831 CBS cert_status, response;
1837 int ok, al; 1832 uint8_t status_type;
1838 long n; 1833 int al, ret;
1839 uint8_t status_type;
1840 1834
1841 n = ssl3_get_message(s, SSL3_ST_CR_CERT_STATUS_A, 1835 if ((ret = ssl3_get_message(s, SSL3_ST_CR_CERT_STATUS_A,
1842 SSL3_ST_CR_CERT_STATUS_B, -1, 16384, &ok); 1836 SSL3_ST_CR_CERT_STATUS_B, -1, 16384)) <= 0)
1843 if (!ok) 1837 return ret;
1844 return ((int)n);
1845 1838
1846 if (S3I(s)->hs.tls12.message_type == SSL3_MT_SERVER_KEY_EXCHANGE) { 1839 if (S3I(s)->hs.tls12.message_type == SSL3_MT_SERVER_KEY_EXCHANGE) {
1847 /* 1840 /*
@@ -1849,8 +1842,6 @@ ssl3_get_cert_status(SSL *s)
1849 * response, and has decided to head directly to key exchange. 1842 * response, and has decided to head directly to key exchange.
1850 */ 1843 */
1851 if (s->ctx->internal->tlsext_status_cb) { 1844 if (s->ctx->internal->tlsext_status_cb) {
1852 int ret;
1853
1854 free(s->internal->tlsext_ocsp_resp); 1845 free(s->internal->tlsext_ocsp_resp);
1855 s->internal->tlsext_ocsp_resp = NULL; 1846 s->internal->tlsext_ocsp_resp = NULL;
1856 s->internal->tlsext_ocsp_resp_len = 0; 1847 s->internal->tlsext_ocsp_resp_len = 0;
@@ -1879,14 +1870,14 @@ ssl3_get_cert_status(SSL *s)
1879 goto fatal_err; 1870 goto fatal_err;
1880 } 1871 }
1881 1872
1882 if (n < 0) { 1873 if (s->internal->init_num < 0) {
1883 /* need at least status type + length */ 1874 /* need at least status type + length */
1884 al = SSL_AD_DECODE_ERROR; 1875 al = SSL_AD_DECODE_ERROR;
1885 SSLerror(s, SSL_R_LENGTH_MISMATCH); 1876 SSLerror(s, SSL_R_LENGTH_MISMATCH);
1886 goto fatal_err; 1877 goto fatal_err;
1887 } 1878 }
1888 1879
1889 CBS_init(&cert_status, s->internal->init_msg, n); 1880 CBS_init(&cert_status, s->internal->init_msg, s->internal->init_num);
1890 if (!CBS_get_u8(&cert_status, &status_type) || 1881 if (!CBS_get_u8(&cert_status, &status_type) ||
1891 CBS_len(&cert_status) < 3) { 1882 CBS_len(&cert_status) < 3) {
1892 /* need at least status type + length */ 1883 /* need at least status type + length */
@@ -1939,23 +1930,21 @@ ssl3_get_cert_status(SSL *s)
1939int 1930int
1940ssl3_get_server_done(SSL *s) 1931ssl3_get_server_done(SSL *s)
1941{ 1932{
1942 int ok, ret = 0; 1933 int ret;
1943 long n;
1944 1934
1945 n = ssl3_get_message(s, SSL3_ST_CR_SRVR_DONE_A, 1935 if ((ret = ssl3_get_message(s, SSL3_ST_CR_SRVR_DONE_A,
1946 SSL3_ST_CR_SRVR_DONE_B, SSL3_MT_SERVER_DONE, 1936 SSL3_ST_CR_SRVR_DONE_B, SSL3_MT_SERVER_DONE,
1947 30, /* should be very small, like 0 :-) */ &ok); 1937 30 /* should be very small, like 0 :-) */)) <= 0)
1948 if (!ok) 1938 return ret;
1949 return ((int)n);
1950 1939
1951 if (n > 0) { 1940 if (s->internal->init_num != 0) {
1952 /* should contain no data */ 1941 /* should contain no data */
1953 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); 1942 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1954 SSLerror(s, SSL_R_LENGTH_MISMATCH); 1943 SSLerror(s, SSL_R_LENGTH_MISMATCH);
1955 return (-1); 1944 return -1;
1956 } 1945 }
1957 ret = 1; 1946
1958 return (ret); 1947 return 1;
1959} 1948}
1960 1949
1961static int 1950static int
@@ -2756,18 +2745,16 @@ ssl3_check_cert_and_algorithm(SSL *s)
2756int 2745int
2757ssl3_check_finished(SSL *s) 2746ssl3_check_finished(SSL *s)
2758{ 2747{
2759 int ok; 2748 int ret;
2760 long n;
2761 2749
2762 /* If we have no ticket it cannot be a resumed session. */ 2750 /* If we have no ticket it cannot be a resumed session. */
2763 if (!s->session->tlsext_tick) 2751 if (!s->session->tlsext_tick)
2764 return (1); 2752 return (1);
2765 /* this function is called when we really expect a Certificate 2753 /* this function is called when we really expect a Certificate
2766 * message, so permit appropriate message length */ 2754 * message, so permit appropriate message length */
2767 n = ssl3_get_message(s, SSL3_ST_CR_CERT_A, 2755 if ((ret = ssl3_get_message(s, SSL3_ST_CR_CERT_A,
2768 SSL3_ST_CR_CERT_B, -1, s->internal->max_cert_list, &ok); 2756 SSL3_ST_CR_CERT_B, -1, s->internal->max_cert_list)) <= 0)
2769 if (!ok) 2757 return ret;
2770 return ((int)n);
2771 2758
2772 S3I(s)->hs.tls12.reuse_message = 1; 2759 S3I(s)->hs.tls12.reuse_message = 1;
2773 if ((S3I(s)->hs.tls12.message_type == SSL3_MT_FINISHED) || 2760 if ((S3I(s)->hs.tls12.message_type == SSL3_MT_FINISHED) ||