From df758a8569efe9e124baaa16aba4ac3fc35bbd9d Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Tue, 4 Aug 2015 20:10:06 +0100 Subject: [PATCH] PACKETise Server Certificate processing MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Use the PACKET API to process an incoming server Certificate message. Reviewed-by: Emilia Käsper --- ssl/s3_clnt.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/ssl/s3_clnt.c b/ssl/s3_clnt.c index 01a0a8c43c..4ebd7aa9c5 100644 --- a/ssl/s3_clnt.c +++ b/ssl/s3_clnt.c @@ -1232,12 +1232,12 @@ int ssl3_get_server_hello(SSL *s) int ssl3_get_server_certificate(SSL *s) { int al, i, ok, ret = -1, exp_idx; - unsigned long n, nc, llen, l; + unsigned long n, cert_list_len, cert_len; X509 *x = NULL; - const unsigned char *q, *p; - unsigned char *d; + unsigned char *certstart, *certbytes; STACK_OF(X509) *sk = NULL; EVP_PKEY *pkey = NULL; + PACKET pkt; n = s->method->ssl_get_message(s, SSL3_ST_CR_CERT_A, @@ -1257,36 +1257,41 @@ int ssl3_get_server_certificate(SSL *s) SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_BAD_MESSAGE_TYPE); goto f_err; } - p = d = (unsigned char *)s->init_msg; + + if (!PACKET_buf_init(&pkt, s->init_msg, n)) { + al = SSL_AD_INTERNAL_ERROR; + SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, ERR_R_INTERNAL_ERROR); + goto f_err; + } if ((sk = sk_X509_new_null()) == NULL) { SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, ERR_R_MALLOC_FAILURE); goto err; } - n2l3(p, llen); - if (llen + 3 != n) { + if (!PACKET_get_net_3(&pkt, &cert_list_len) + || PACKET_remaining(&pkt) != cert_list_len) { al = SSL_AD_DECODE_ERROR; SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_LENGTH_MISMATCH); goto f_err; } - for (nc = 0; nc < llen;) { - n2l3(p, l); - if ((l + nc + 3) > llen) { + while (PACKET_remaining(&pkt)) { + if (!PACKET_get_net_3(&pkt, &cert_len) + || !PACKET_get_bytes(&pkt, &certbytes, cert_len)) { al = SSL_AD_DECODE_ERROR; SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_CERT_LENGTH_MISMATCH); goto f_err; } - q = p; - x = d2i_X509(NULL, &q, l); + certstart = certbytes; + x = d2i_X509(NULL, (const unsigned char **)&certbytes, cert_len); if (x == NULL) { al = SSL_AD_BAD_CERTIFICATE; SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, ERR_R_ASN1_LIB); goto f_err; } - if (q != (p + l)) { + if (certbytes != (certstart + cert_len)) { al = SSL_AD_DECODE_ERROR; SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, SSL_R_CERT_LENGTH_MISMATCH); @@ -1297,8 +1302,6 @@ int ssl3_get_server_certificate(SSL *s) goto err; } x = NULL; - nc += l + 3; - p = q; } i = ssl_verify_cert_chain(s, sk); -- 2.34.1