summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjsing <>2017-08-12 21:47:59 +0000
committerjsing <>2017-08-12 21:47:59 +0000
commitaab075e32e49adbf67c9518c715a237c8f3b0368 (patch)
tree7d3c1eee97fd0dbbff864f384df0b79fe8b31d0a /src/lib
parent98c6b02b79b10d4f166720db233fa8f71f842672 (diff)
downloadopenbsd-aab075e32e49adbf67c9518c715a237c8f3b0368.tar.gz
openbsd-aab075e32e49adbf67c9518c715a237c8f3b0368.tar.bz2
openbsd-aab075e32e49adbf67c9518c715a237c8f3b0368.zip
Convert TLS signature algorithms extension handling to the new framework.
ok beck@ doug@
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libssl/ssl_clnt.c6
-rw-r--r--src/lib/libssl/ssl_locl.h7
-rw-r--r--src/lib/libssl/ssl_srvr.c8
-rw-r--r--src/lib/libssl/ssl_tlsext.c69
-rw-r--r--src/lib/libssl/ssl_tlsext.h9
-rw-r--r--src/lib/libssl/t1_lib.c63
6 files changed, 99 insertions, 63 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c
index ec4a4104fc..2370ce06f7 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.16 2017/08/12 21:03:08 jsing Exp $ */ 1/* $OpenBSD: ssl_clnt.c,v 1.17 2017/08/12 21:47:59 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 *
@@ -1621,9 +1621,7 @@ ssl3_get_certificate_request(SSL *s)
1621 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG); 1621 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG);
1622 goto err; 1622 goto err;
1623 } 1623 }
1624 if ((CBS_len(&sigalgs) & 1) || 1624 if (!tls1_process_sigalgs(s, &sigalgs)) {
1625 !tls1_process_sigalgs(s, CBS_data(&sigalgs),
1626 CBS_len(&sigalgs))) {
1627 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); 1625 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1628 SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR); 1626 SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR);
1629 goto err; 1627 goto err;
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index 914501213c..ddb3b30327 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.189 2017/08/12 21:03:08 jsing Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.190 2017/08/12 21:47:59 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 *
@@ -1310,8 +1310,9 @@ const EVP_MD *tls12_get_hash(unsigned char hash_alg);
1310 1310
1311void ssl_clear_hash_ctx(EVP_MD_CTX **hash); 1311void ssl_clear_hash_ctx(EVP_MD_CTX **hash);
1312long ssl_get_algorithm2(SSL *s); 1312long ssl_get_algorithm2(SSL *s);
1313int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize); 1313int tls1_process_sigalgs(SSL *s, CBS *cbs);
1314int tls12_get_req_sig_algs(SSL *s, unsigned char *p); 1314void tls12_get_req_sig_algs(SSL *s, unsigned char **sigalgs,
1315 size_t *sigalgs_len);
1315 1316
1316int tls1_check_ec_server_key(SSL *s); 1317int tls1_check_ec_server_key(SSL *s);
1317int tls1_check_ec_tmp_key(SSL *s); 1318int tls1_check_ec_tmp_key(SSL *s);
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index 50ce91ddd8..c43d63d991 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.21 2017/08/12 21:03:08 jsing Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.22 2017/08/12 21:47:59 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 *
@@ -1577,12 +1577,12 @@ ssl3_send_certificate_request(SSL *s)
1577 unsigned char *sigalgs_data; 1577 unsigned char *sigalgs_data;
1578 size_t sigalgs_len; 1578 size_t sigalgs_len;
1579 1579
1580 sigalgs_len = tls12_get_req_sig_algs(s, NULL); 1580 tls12_get_req_sig_algs(s, &sigalgs_data, &sigalgs_len);
1581
1581 if (!CBB_add_u16_length_prefixed(&cert_request, &sigalgs)) 1582 if (!CBB_add_u16_length_prefixed(&cert_request, &sigalgs))
1582 goto err; 1583 goto err;
1583 if (!CBB_add_space(&sigalgs, &sigalgs_data, sigalgs_len)) 1584 if (!CBB_add_bytes(&sigalgs, sigalgs_data, sigalgs_len))
1584 goto err; 1585 goto err;
1585 tls12_get_req_sig_algs(s, sigalgs_data);
1586 } 1586 }
1587 1587
1588 if (!CBB_add_u16_length_prefixed(&cert_request, &cert_auth)) 1588 if (!CBB_add_u16_length_prefixed(&cert_request, &cert_auth))
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c
index 1813d46f41..9db2d1ab41 100644
--- a/src/lib/libssl/ssl_tlsext.c
+++ b/src/lib/libssl/ssl_tlsext.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_tlsext.c,v 1.7 2017/08/12 21:17:03 doug Exp $ */ 1/* $OpenBSD: ssl_tlsext.c,v 1.8 2017/08/12 21:47:59 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> 4 * Copyright (c) 2017 Doug Hogan <doug@openbsd.org>
@@ -361,6 +361,64 @@ tlsext_ri_serverhello_parse(SSL *s, CBS *cbs, int *alert)
361} 361}
362 362
363/* 363/*
364 * Signature Algorithms - RFC 5246 section 7.4.1.4.1.
365 */
366int
367tlsext_sigalgs_clienthello_needs(SSL *s)
368{
369 return (TLS1_get_client_version(s) >= TLS1_2_VERSION);
370}
371
372int
373tlsext_sigalgs_clienthello_build(SSL *s, CBB *cbb)
374{
375 unsigned char *sigalgs_data;
376 size_t sigalgs_len;
377 CBB sigalgs;
378
379 tls12_get_req_sig_algs(s, &sigalgs_data, &sigalgs_len);
380
381 if (!CBB_add_u16_length_prefixed(cbb, &sigalgs))
382 return 0;
383 if (!CBB_add_bytes(&sigalgs, sigalgs_data, sigalgs_len))
384 return 0;
385 if (!CBB_flush(cbb))
386 return 0;
387
388 return 1;
389}
390
391int
392tlsext_sigalgs_clienthello_parse(SSL *s, CBS *cbs, int *alert)
393{
394 CBS sigalgs;
395
396 if (!CBS_get_u16_length_prefixed(cbs, &sigalgs))
397 return 0;
398
399 return tls1_process_sigalgs(s, &sigalgs);
400}
401
402int
403tlsext_sigalgs_serverhello_needs(SSL *s)
404{
405 return 0;
406}
407
408int
409tlsext_sigalgs_serverhello_build(SSL *s, CBB *cbb)
410{
411 return 0;
412}
413
414int
415tlsext_sigalgs_serverhello_parse(SSL *s, CBS *cbs, int *alert)
416{
417 /* As per the RFC, servers must not send this extension. */
418 return 0;
419}
420
421/*
364 * Server Name Indication - RFC 6066, section 3. 422 * Server Name Indication - RFC 6066, section 3.
365 */ 423 */
366int 424int
@@ -673,6 +731,15 @@ static struct tls_extension tls_extensions[] = {
673 .serverhello_build = tlsext_sessionticket_serverhello_build, 731 .serverhello_build = tlsext_sessionticket_serverhello_build,
674 .serverhello_parse = tlsext_sessionticket_serverhello_parse, 732 .serverhello_parse = tlsext_sessionticket_serverhello_parse,
675 }, 733 },
734 {
735 .type = TLSEXT_TYPE_signature_algorithms,
736 .clienthello_needs = tlsext_sigalgs_clienthello_needs,
737 .clienthello_build = tlsext_sigalgs_clienthello_build,
738 .clienthello_parse = tlsext_sigalgs_clienthello_parse,
739 .serverhello_needs = tlsext_sigalgs_serverhello_needs,
740 .serverhello_build = tlsext_sigalgs_serverhello_build,
741 .serverhello_parse = tlsext_sigalgs_serverhello_parse,
742 },
676}; 743};
677 744
678#define N_TLS_EXTENSIONS (sizeof(tls_extensions) / sizeof(*tls_extensions)) 745#define N_TLS_EXTENSIONS (sizeof(tls_extensions) / sizeof(*tls_extensions))
diff --git a/src/lib/libssl/ssl_tlsext.h b/src/lib/libssl/ssl_tlsext.h
index 1e701e941a..4f8ae0cf35 100644
--- a/src/lib/libssl/ssl_tlsext.h
+++ b/src/lib/libssl/ssl_tlsext.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_tlsext.h,v 1.6 2017/08/12 21:17:03 doug Exp $ */ 1/* $OpenBSD: ssl_tlsext.h,v 1.7 2017/08/12 21:47:59 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> 4 * Copyright (c) 2017 Doug Hogan <doug@openbsd.org>
@@ -23,6 +23,13 @@ int tlsext_ri_serverhello_needs(SSL *s);
23int tlsext_ri_serverhello_build(SSL *s, CBB *cbb); 23int tlsext_ri_serverhello_build(SSL *s, CBB *cbb);
24int tlsext_ri_serverhello_parse(SSL *s, CBS *cbs, int *alert); 24int tlsext_ri_serverhello_parse(SSL *s, CBS *cbs, int *alert);
25 25
26int tlsext_sigalgs_clienthello_needs(SSL *s);
27int tlsext_sigalgs_clienthello_build(SSL *s, CBB *cbb);
28int tlsext_sigalgs_clienthello_parse(SSL *s, CBS *cbs, int *alert);
29int tlsext_sigalgs_serverhello_needs(SSL *s);
30int tlsext_sigalgs_serverhello_build(SSL *s, CBB *cbb);
31int tlsext_sigalgs_serverhello_parse(SSL *s, CBS *cbs, int *alert);
32
26int tlsext_sni_clienthello_needs(SSL *s); 33int tlsext_sni_clienthello_needs(SSL *s);
27int tlsext_sni_clienthello_build(SSL *s, CBB *cbb); 34int tlsext_sni_clienthello_build(SSL *s, CBB *cbb);
28int tlsext_sni_clienthello_parse(SSL *s, CBS *cbs, int *alert); 35int tlsext_sni_clienthello_parse(SSL *s, CBS *cbs, int *alert);
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c
index 63d401c337..e27a7d1a59 100644
--- a/src/lib/libssl/t1_lib.c
+++ b/src/lib/libssl/t1_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: t1_lib.c,v 1.129 2017/08/12 21:17:03 doug Exp $ */ 1/* $OpenBSD: t1_lib.c,v 1.130 2017/08/12 21:47:59 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 *
@@ -654,14 +654,11 @@ static unsigned char tls12_sigalgs[] = {
654 TLSEXT_hash_sha1, TLSEXT_signature_ecdsa, 654 TLSEXT_hash_sha1, TLSEXT_signature_ecdsa,
655}; 655};
656 656
657int 657void
658tls12_get_req_sig_algs(SSL *s, unsigned char *p) 658tls12_get_req_sig_algs(SSL *s, unsigned char **sigalgs, size_t *sigalgs_len)
659{ 659{
660 size_t slen = sizeof(tls12_sigalgs); 660 *sigalgs = tls12_sigalgs;
661 661 *sigalgs_len = sizeof(tls12_sigalgs);
662 if (p)
663 memcpy(p, tls12_sigalgs, slen);
664 return (int)slen;
665} 662}
666 663
667unsigned char * 664unsigned char *
@@ -690,17 +687,6 @@ ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit)
690 return NULL; 687 return NULL;
691 ret += len; 688 ret += len;
692 689
693 if (TLS1_get_client_version(s) >= TLS1_2_VERSION) {
694 if ((size_t)(limit - ret) < sizeof(tls12_sigalgs) + 6)
695 return NULL;
696
697 s2n(TLSEXT_TYPE_signature_algorithms, ret);
698 s2n(sizeof(tls12_sigalgs) + 2, ret);
699 s2n(sizeof(tls12_sigalgs), ret);
700 memcpy(ret, tls12_sigalgs, sizeof(tls12_sigalgs));
701 ret += sizeof(tls12_sigalgs);
702 }
703
704 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp && 690 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp &&
705 s->version != DTLS1_VERSION) { 691 s->version != DTLS1_VERSION) {
706 int i; 692 int i;
@@ -991,7 +977,6 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
991 unsigned short len; 977 unsigned short len;
992 unsigned char *data = *p; 978 unsigned char *data = *p;
993 unsigned char *end = d + n; 979 unsigned char *end = d + n;
994 int sigalg_seen = 0;
995 CBS cbs; 980 CBS cbs;
996 981
997 s->internal->servername_done = 0; 982 s->internal->servername_done = 0;
@@ -1026,24 +1011,7 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
1026 if (!tlsext_clienthello_parse_one(s, &cbs, type, al)) 1011 if (!tlsext_clienthello_parse_one(s, &cbs, type, al))
1027 return 0; 1012 return 0;
1028 1013
1029 if (type == TLSEXT_TYPE_signature_algorithms) { 1014 if (type == TLSEXT_TYPE_status_request &&
1030 int dsize;
1031 if (sigalg_seen || size < 2) {
1032 *al = SSL_AD_DECODE_ERROR;
1033 return 0;
1034 }
1035 sigalg_seen = 1;
1036 n2s(data, dsize);
1037 size -= 2;
1038 if (dsize != size || dsize & 1) {
1039 *al = SSL_AD_DECODE_ERROR;
1040 return 0;
1041 }
1042 if (!tls1_process_sigalgs(s, data, dsize)) {
1043 *al = SSL_AD_DECODE_ERROR;
1044 return 0;
1045 }
1046 } else if (type == TLSEXT_TYPE_status_request &&
1047 s->version != DTLS1_VERSION) { 1015 s->version != DTLS1_VERSION) {
1048 1016
1049 if (size < 5) { 1017 if (size < 5) {
@@ -1830,36 +1798,30 @@ tls12_get_hash(unsigned char hash_alg)
1830/* Set preferred digest for each key type */ 1798/* Set preferred digest for each key type */
1831 1799
1832int 1800int
1833tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize) 1801tls1_process_sigalgs(SSL *s, CBS *cbs)
1834{ 1802{
1835 int idx;
1836 const EVP_MD *md; 1803 const EVP_MD *md;
1837 CERT *c = s->cert; 1804 CERT *c = s->cert;
1838 CBS cbs; 1805 int idx;
1839 1806
1840 /* Extension ignored for inappropriate versions */ 1807 /* Extension ignored for inappropriate versions */
1841 if (!SSL_USE_SIGALGS(s)) 1808 if (!SSL_USE_SIGALGS(s))
1842 return 1; 1809 return 1;
1843 1810
1844 /* Should never happen */ 1811 /* Should never happen */
1845 if (!c || dsize < 0) 1812 if (c == NULL)
1846 return 0; 1813 return 0;
1847 1814
1848 CBS_init(&cbs, data, dsize);
1849
1850 c->pkeys[SSL_PKEY_RSA_SIGN].digest = NULL; 1815 c->pkeys[SSL_PKEY_RSA_SIGN].digest = NULL;
1851 c->pkeys[SSL_PKEY_RSA_ENC].digest = NULL; 1816 c->pkeys[SSL_PKEY_RSA_ENC].digest = NULL;
1852 c->pkeys[SSL_PKEY_ECC].digest = NULL; 1817 c->pkeys[SSL_PKEY_ECC].digest = NULL;
1853 c->pkeys[SSL_PKEY_GOST01].digest = NULL; 1818 c->pkeys[SSL_PKEY_GOST01].digest = NULL;
1854 1819
1855 while (CBS_len(&cbs) > 0) { 1820 while (CBS_len(cbs) > 0) {
1856 uint8_t hash_alg, sig_alg; 1821 uint8_t hash_alg, sig_alg;
1857 1822
1858 if (!CBS_get_u8(&cbs, &hash_alg) || 1823 if (!CBS_get_u8(cbs, &hash_alg) || !CBS_get_u8(cbs, &sig_alg))
1859 !CBS_get_u8(&cbs, &sig_alg)) {
1860 /* Should never happen */
1861 return 0; 1824 return 0;
1862 }
1863 1825
1864 switch (sig_alg) { 1826 switch (sig_alg) {
1865 case TLSEXT_signature_rsa: 1827 case TLSEXT_signature_rsa:
@@ -1888,7 +1850,8 @@ tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
1888 1850
1889 } 1851 }
1890 1852
1891 /* Set any remaining keys to default values. NOTE: if alg is not 1853 /*
1854 * Set any remaining keys to default values. NOTE: if alg is not
1892 * supported it stays as NULL. 1855 * supported it stays as NULL.
1893 */ 1856 */
1894 if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest) { 1857 if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest) {