summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordoug <>2015-07-14 05:16:47 +0000
committerdoug <>2015-07-14 05:16:47 +0000
commit2ebaf4821a79597e95b3e494a8fb15aa4ca1cc12 (patch)
tree5a55cb8fb49eaaf943d8d20e7459cc8399905038
parentab8fee4a197bd05ef0521b71e04c32e20f8d271f (diff)
downloadopenbsd-2ebaf4821a79597e95b3e494a8fb15aa4ca1cc12.tar.gz
openbsd-2ebaf4821a79597e95b3e494a8fb15aa4ca1cc12.tar.bz2
openbsd-2ebaf4821a79597e95b3e494a8fb15aa4ca1cc12.zip
Convert ssl3_get_client_certificate to CBS.
ok miod@ jsing@
-rw-r--r--src/lib/libssl/s3_srvr.c34
-rw-r--r--src/lib/libssl/src/ssl/s3_srvr.c34
2 files changed, 38 insertions, 30 deletions
diff --git a/src/lib/libssl/s3_srvr.c b/src/lib/libssl/s3_srvr.c
index ab8e74e63a..e70f8af440 100644
--- a/src/lib/libssl/s3_srvr.c
+++ b/src/lib/libssl/s3_srvr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_srvr.c,v 1.109 2015/06/20 17:04:07 doug Exp $ */ 1/* $OpenBSD: s3_srvr.c,v 1.110 2015/07/14 05:16:47 doug 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 *
@@ -2335,10 +2335,11 @@ end:
2335int 2335int
2336ssl3_get_client_certificate(SSL *s) 2336ssl3_get_client_certificate(SSL *s)
2337{ 2337{
2338 CBS cbs, client_certs;
2338 int i, ok, al, ret = -1; 2339 int i, ok, al, ret = -1;
2339 X509 *x = NULL; 2340 X509 *x = NULL;
2340 unsigned long l, nc, llen, n; 2341 long n;
2341 const unsigned char *p, *q; 2342 const unsigned char *q;
2342 STACK_OF(X509) *sk = NULL; 2343 STACK_OF(X509) *sk = NULL;
2343 2344
2344 n = s->method->ssl_get_message(s, SSL3_ST_SR_CERT_A, SSL3_ST_SR_CERT_B, 2345 n = s->method->ssl_get_message(s, SSL3_ST_SR_CERT_A, SSL3_ST_SR_CERT_B,
@@ -2376,7 +2377,11 @@ ssl3_get_client_certificate(SSL *s)
2376 SSL_R_WRONG_MESSAGE_TYPE); 2377 SSL_R_WRONG_MESSAGE_TYPE);
2377 goto f_err; 2378 goto f_err;
2378 } 2379 }
2379 p = (const unsigned char *)s->init_msg; 2380
2381 if (n < 0)
2382 goto truncated;
2383
2384 CBS_init(&cbs, s->init_msg, n);
2380 2385
2381 if ((sk = sk_X509_new_null()) == NULL) { 2386 if ((sk = sk_X509_new_null()) == NULL) {
2382 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, 2387 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,
@@ -2384,28 +2389,28 @@ ssl3_get_client_certificate(SSL *s)
2384 goto err; 2389 goto err;
2385 } 2390 }
2386 2391
2387 if (3 > n) 2392 if (!CBS_get_u24_length_prefixed(&cbs, &client_certs) ||
2388 goto truncated; 2393 CBS_len(&cbs) != 0)
2389 n2l3(p, llen);
2390 if (llen + 3 != n)
2391 goto truncated; 2394 goto truncated;
2392 for (nc = 0; nc < llen;) { 2395
2393 n2l3(p, l); 2396 while (CBS_len(&client_certs) > 0) {
2394 if (l + nc + 3 > llen) { 2397 CBS cert;
2398
2399 if (!CBS_get_u24_length_prefixed(&client_certs, &cert)) {
2395 al = SSL_AD_DECODE_ERROR; 2400 al = SSL_AD_DECODE_ERROR;
2396 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, 2401 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,
2397 SSL_R_CERT_LENGTH_MISMATCH); 2402 SSL_R_CERT_LENGTH_MISMATCH);
2398 goto f_err; 2403 goto f_err;
2399 } 2404 }
2400 2405
2401 q = p; 2406 q = CBS_data(&cert);
2402 x = d2i_X509(NULL, &p, l); 2407 x = d2i_X509(NULL, &q, CBS_len(&cert));
2403 if (x == NULL) { 2408 if (x == NULL) {
2404 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, 2409 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,
2405 ERR_R_ASN1_LIB); 2410 ERR_R_ASN1_LIB);
2406 goto err; 2411 goto err;
2407 } 2412 }
2408 if (p != (q + l)) { 2413 if (q != CBS_data(&cert) + CBS_len(&cert)) {
2409 al = SSL_AD_DECODE_ERROR; 2414 al = SSL_AD_DECODE_ERROR;
2410 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, 2415 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,
2411 SSL_R_CERT_LENGTH_MISMATCH); 2416 SSL_R_CERT_LENGTH_MISMATCH);
@@ -2417,7 +2422,6 @@ ssl3_get_client_certificate(SSL *s)
2417 goto err; 2422 goto err;
2418 } 2423 }
2419 x = NULL; 2424 x = NULL;
2420 nc += l + 3;
2421 } 2425 }
2422 2426
2423 if (sk_X509_num(sk) <= 0) { 2427 if (sk_X509_num(sk) <= 0) {
diff --git a/src/lib/libssl/src/ssl/s3_srvr.c b/src/lib/libssl/src/ssl/s3_srvr.c
index ab8e74e63a..e70f8af440 100644
--- a/src/lib/libssl/src/ssl/s3_srvr.c
+++ b/src/lib/libssl/src/ssl/s3_srvr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_srvr.c,v 1.109 2015/06/20 17:04:07 doug Exp $ */ 1/* $OpenBSD: s3_srvr.c,v 1.110 2015/07/14 05:16:47 doug 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 *
@@ -2335,10 +2335,11 @@ end:
2335int 2335int
2336ssl3_get_client_certificate(SSL *s) 2336ssl3_get_client_certificate(SSL *s)
2337{ 2337{
2338 CBS cbs, client_certs;
2338 int i, ok, al, ret = -1; 2339 int i, ok, al, ret = -1;
2339 X509 *x = NULL; 2340 X509 *x = NULL;
2340 unsigned long l, nc, llen, n; 2341 long n;
2341 const unsigned char *p, *q; 2342 const unsigned char *q;
2342 STACK_OF(X509) *sk = NULL; 2343 STACK_OF(X509) *sk = NULL;
2343 2344
2344 n = s->method->ssl_get_message(s, SSL3_ST_SR_CERT_A, SSL3_ST_SR_CERT_B, 2345 n = s->method->ssl_get_message(s, SSL3_ST_SR_CERT_A, SSL3_ST_SR_CERT_B,
@@ -2376,7 +2377,11 @@ ssl3_get_client_certificate(SSL *s)
2376 SSL_R_WRONG_MESSAGE_TYPE); 2377 SSL_R_WRONG_MESSAGE_TYPE);
2377 goto f_err; 2378 goto f_err;
2378 } 2379 }
2379 p = (const unsigned char *)s->init_msg; 2380
2381 if (n < 0)
2382 goto truncated;
2383
2384 CBS_init(&cbs, s->init_msg, n);
2380 2385
2381 if ((sk = sk_X509_new_null()) == NULL) { 2386 if ((sk = sk_X509_new_null()) == NULL) {
2382 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, 2387 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,
@@ -2384,28 +2389,28 @@ ssl3_get_client_certificate(SSL *s)
2384 goto err; 2389 goto err;
2385 } 2390 }
2386 2391
2387 if (3 > n) 2392 if (!CBS_get_u24_length_prefixed(&cbs, &client_certs) ||
2388 goto truncated; 2393 CBS_len(&cbs) != 0)
2389 n2l3(p, llen);
2390 if (llen + 3 != n)
2391 goto truncated; 2394 goto truncated;
2392 for (nc = 0; nc < llen;) { 2395
2393 n2l3(p, l); 2396 while (CBS_len(&client_certs) > 0) {
2394 if (l + nc + 3 > llen) { 2397 CBS cert;
2398
2399 if (!CBS_get_u24_length_prefixed(&client_certs, &cert)) {
2395 al = SSL_AD_DECODE_ERROR; 2400 al = SSL_AD_DECODE_ERROR;
2396 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, 2401 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,
2397 SSL_R_CERT_LENGTH_MISMATCH); 2402 SSL_R_CERT_LENGTH_MISMATCH);
2398 goto f_err; 2403 goto f_err;
2399 } 2404 }
2400 2405
2401 q = p; 2406 q = CBS_data(&cert);
2402 x = d2i_X509(NULL, &p, l); 2407 x = d2i_X509(NULL, &q, CBS_len(&cert));
2403 if (x == NULL) { 2408 if (x == NULL) {
2404 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, 2409 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,
2405 ERR_R_ASN1_LIB); 2410 ERR_R_ASN1_LIB);
2406 goto err; 2411 goto err;
2407 } 2412 }
2408 if (p != (q + l)) { 2413 if (q != CBS_data(&cert) + CBS_len(&cert)) {
2409 al = SSL_AD_DECODE_ERROR; 2414 al = SSL_AD_DECODE_ERROR;
2410 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE, 2415 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,
2411 SSL_R_CERT_LENGTH_MISMATCH); 2416 SSL_R_CERT_LENGTH_MISMATCH);
@@ -2417,7 +2422,6 @@ ssl3_get_client_certificate(SSL *s)
2417 goto err; 2422 goto err;
2418 } 2423 }
2419 x = NULL; 2424 x = NULL;
2420 nc += l + 3;
2421 } 2425 }
2422 2426
2423 if (sk_X509_num(sk) <= 0) { 2427 if (sk_X509_num(sk) <= 0) {