summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_srvr.c
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/libssl/ssl_srvr.c
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/libssl/ssl_srvr.c')
-rw-r--r--src/lib/libssl/ssl_srvr.c91
1 files changed, 46 insertions, 45 deletions
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