summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjsing <>2017-08-11 17:54:41 +0000
committerjsing <>2017-08-11 17:54:41 +0000
commitca0f57365762ec3e5a661aa179a61d0a6632fc19 (patch)
tree2c2648ba9c07f01384b0dc564ffd3f43c5a4c0aa /src/lib
parentae7814ca657a2fcd6d4b43b18786885a8f03ff26 (diff)
downloadopenbsd-ca0f57365762ec3e5a661aa179a61d0a6632fc19.tar.gz
openbsd-ca0f57365762ec3e5a661aa179a61d0a6632fc19.tar.bz2
openbsd-ca0f57365762ec3e5a661aa179a61d0a6632fc19.zip
Convert ssl3_send_certificate_request() to CBB.
ok beck@ doug@
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libssl/s3_lib.c41
-rw-r--r--src/lib/libssl/ssl_locl.h4
-rw-r--r--src/lib/libssl/ssl_srvr.c91
3 files changed, 73 insertions, 63 deletions
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c
index abebaa0fc4..ad627d10d8 100644
--- a/src/lib/libssl/s3_lib.c
+++ b/src/lib/libssl/s3_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_lib.c,v 1.155 2017/08/10 17:18:38 jsing Exp $ */ 1/* $OpenBSD: s3_lib.c,v 1.156 2017/08/11 17:54:41 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 *
@@ -2438,36 +2438,45 @@ ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
2438} 2438}
2439 2439
2440int 2440int
2441ssl3_get_req_cert_type(SSL *s, unsigned char *p) 2441ssl3_get_req_cert_types(SSL *s, CBB *cbb)
2442{ 2442{
2443 int ret = 0; 2443 unsigned long alg_k;
2444 unsigned long alg_k;
2445 2444
2446 alg_k = S3I(s)->hs.new_cipher->algorithm_mkey; 2445 alg_k = S3I(s)->hs.new_cipher->algorithm_mkey;
2447 2446
2448#ifndef OPENSSL_NO_GOST 2447#ifndef OPENSSL_NO_GOST
2449 if ((alg_k & SSL_kGOST)) { 2448 if ((alg_k & SSL_kGOST) != 0) {
2450 p[ret++] = TLS_CT_GOST94_SIGN; 2449 if (!CBB_add_u8(cbb, TLS_CT_GOST94_SIGN))
2451 p[ret++] = TLS_CT_GOST01_SIGN; 2450 return 0;
2452 p[ret++] = TLS_CT_GOST12_256_SIGN; 2451 if (!CBB_add_u8(cbb, TLS_CT_GOST01_SIGN))
2453 p[ret++] = TLS_CT_GOST12_512_SIGN; 2452 return 0;
2453 if (!CBB_add_u8(cbb, TLS_CT_GOST12_256_SIGN))
2454 return 0;
2455 if (!CBB_add_u8(cbb, TLS_CT_GOST12_512_SIGN))
2456 return 0;
2454 } 2457 }
2455#endif 2458#endif
2456 2459
2457 if (alg_k & SSL_kDHE) { 2460 if ((alg_k & SSL_kDHE) != 0) {
2458 p[ret++] = SSL3_CT_RSA_FIXED_DH; 2461 if (!CBB_add_u8(cbb, SSL3_CT_RSA_FIXED_DH))
2459 p[ret++] = SSL3_CT_DSS_FIXED_DH; 2462 return 0;
2463 if (!CBB_add_u8(cbb, SSL3_CT_DSS_FIXED_DH))
2464 return 0;
2460 } 2465 }
2461 p[ret++] = SSL3_CT_RSA_SIGN; 2466
2462 p[ret++] = SSL3_CT_DSS_SIGN; 2467 if (!CBB_add_u8(cbb, SSL3_CT_RSA_SIGN))
2468 return 0;
2469 if (!CBB_add_u8(cbb, SSL3_CT_DSS_SIGN))
2470 return 0;
2463 2471
2464 /* 2472 /*
2465 * ECDSA certs can be used with RSA cipher suites as well 2473 * ECDSA certs can be used with RSA cipher suites as well
2466 * so we don't need to check for SSL_kECDH or SSL_kECDHE. 2474 * so we don't need to check for SSL_kECDH or SSL_kECDHE.
2467 */ 2475 */
2468 p[ret++] = TLS_CT_ECDSA_SIGN; 2476 if (!CBB_add_u8(cbb, TLS_CT_ECDSA_SIGN))
2477 return 0;
2469 2478
2470 return (ret); 2479 return 1;
2471} 2480}
2472 2481
2473int 2482int
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index c11c5899e3..84bb6879b0 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_locl.h,v 1.185 2017/08/11 05:06:34 doug Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.186 2017/08/11 17:54:41 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 *
@@ -1138,7 +1138,7 @@ int ssl3_get_finished(SSL *s, int state_a, int state_b);
1138int ssl3_send_change_cipher_spec(SSL *s, int state_a, int state_b); 1138int ssl3_send_change_cipher_spec(SSL *s, int state_a, int state_b);
1139int ssl3_do_write(SSL *s, int type); 1139int ssl3_do_write(SSL *s, int type);
1140int ssl3_send_alert(SSL *s, int level, int desc); 1140int ssl3_send_alert(SSL *s, int level, int desc);
1141int ssl3_get_req_cert_type(SSL *s, unsigned char *p); 1141int ssl3_get_req_cert_types(SSL *s, CBB *cbb);
1142long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok); 1142long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok);
1143int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen); 1143int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen);
1144int ssl3_num_ciphers(void); 1144int ssl3_num_ciphers(void);
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index 575621a0ce..e370b7571c 100644
--- a/src/lib/libssl/ssl_srvr.c
+++ b/src/lib/libssl/ssl_srvr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_srvr.c,v 1.18 2017/08/10 17:18:38 jsing Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.19 2017/08/11 17:54:41 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 *
@@ -1573,69 +1573,70 @@ ssl3_send_server_key_exchange(SSL *s)
1573int 1573int
1574ssl3_send_certificate_request(SSL *s) 1574ssl3_send_certificate_request(SSL *s)
1575{ 1575{
1576 unsigned char *p, *d; 1576 CBB cbb, cert_request, cert_types, sigalgs, cert_auth, dn;
1577 int i, j, nl, off, n;
1578 STACK_OF(X509_NAME) *sk = NULL; 1577 STACK_OF(X509_NAME) *sk = NULL;
1579 X509_NAME *name; 1578 X509_NAME *name;
1580 BUF_MEM *buf; 1579 int i;
1581 1580
1582 if (S3I(s)->hs.state == SSL3_ST_SW_CERT_REQ_A) { 1581 /*
1583 buf = s->internal->init_buf; 1582 * Certificate Request - RFC 5246 section 7.4.4.
1583 */
1584 1584
1585 d = p = ssl3_handshake_msg_start(s, 1585 memset(&cbb, 0, sizeof(cbb));
1586 SSL3_MT_CERTIFICATE_REQUEST);
1587 1586
1588 /* get the list of acceptable cert types */ 1587 if (S3I(s)->hs.state == SSL3_ST_SW_CERT_REQ_A) {
1589 p++; 1588 if (!ssl3_handshake_msg_start_cbb(s, &cbb, &cert_request,
1590 n = ssl3_get_req_cert_type(s, p); 1589 SSL3_MT_CERTIFICATE_REQUEST))
1591 d[0] = n; 1590 goto err;
1592 p += n; 1591
1593 n++; 1592 if (!CBB_add_u8_length_prefixed(&cert_request, &cert_types))
1593 goto err;
1594 if (!ssl3_get_req_cert_types(s, &cert_types))
1595 goto err;
1594 1596
1595 if (SSL_USE_SIGALGS(s)) { 1597 if (SSL_USE_SIGALGS(s)) {
1596 nl = tls12_get_req_sig_algs(s, p + 2); 1598 unsigned char *sigalgs_data;
1597 s2n(nl, p); 1599 size_t sigalgs_len;
1598 p += nl + 2; 1600
1599 n += nl + 2; 1601 sigalgs_len = tls12_get_req_sig_algs(s, NULL);
1602 if (!CBB_add_u16_length_prefixed(&cert_request, &sigalgs))
1603 goto err;
1604 if (!CBB_add_space(&sigalgs, &sigalgs_data, sigalgs_len))
1605 goto err;
1606 tls12_get_req_sig_algs(s, sigalgs_data);
1600 } 1607 }
1601 1608
1602 off = n; 1609 if (!CBB_add_u16_length_prefixed(&cert_request, &cert_auth))
1603 p += 2; 1610 goto err;
1604 n += 2;
1605 1611
1606 sk = SSL_get_client_CA_list(s); 1612 sk = SSL_get_client_CA_list(s);
1607 nl = 0; 1613 for (i = 0; i < sk_X509_NAME_num(sk); i++) {
1608 if (sk != NULL) { 1614 unsigned char *name_data;
1609 for (i = 0; i < sk_X509_NAME_num(sk); i++) { 1615 size_t name_len;
1610 name = sk_X509_NAME_value(sk, i); 1616
1611 j = i2d_X509_NAME(name, NULL); 1617 name = sk_X509_NAME_value(sk, i);
1612 if (!BUF_MEM_grow_clean(buf, 1618 name_len = i2d_X509_NAME(name, NULL);
1613 ssl3_handshake_msg_hdr_len(s) + n + j 1619
1614 + 2)) { 1620 if (!CBB_add_u16_length_prefixed(&cert_auth, &dn))
1615 SSLerror(s, ERR_R_BUF_LIB); 1621 goto err;
1616 goto err; 1622 if (!CBB_add_space(&dn, &name_data, name_len))
1617 } 1623 goto err;
1618 p = ssl3_handshake_msg_start(s, 1624 if (i2d_X509_NAME(name, &name_data) != name_len)
1619 SSL3_MT_CERTIFICATE_REQUEST) + n; 1625 goto err;
1620 s2n(j, p);
1621 i2d_X509_NAME(name, &p);
1622 n += 2 + j;
1623 nl += 2 + j;
1624 }
1625 } 1626 }
1626 /* else no CA names */
1627 p = ssl3_handshake_msg_start(s,
1628 SSL3_MT_CERTIFICATE_REQUEST) + off;
1629 s2n(nl, p);
1630 1627
1631 ssl3_handshake_msg_finish(s, n); 1628 if (!ssl3_handshake_msg_finish_cbb(s, &cbb))
1629 goto err;
1632 1630
1633 S3I(s)->hs.state = SSL3_ST_SW_CERT_REQ_B; 1631 S3I(s)->hs.state = SSL3_ST_SW_CERT_REQ_B;
1634 } 1632 }
1635 1633
1636 /* SSL3_ST_SW_CERT_REQ_B */ 1634 /* SSL3_ST_SW_CERT_REQ_B */
1637 return (ssl3_handshake_write(s)); 1635 return (ssl3_handshake_write(s));
1638err: 1636
1637 err:
1638 CBB_cleanup(&cbb);
1639
1639 return (-1); 1640 return (-1);
1640} 1641}
1641 1642