diff options
author | beck <> | 2019-01-23 18:39:28 +0000 |
---|---|---|
committer | beck <> | 2019-01-23 18:39:28 +0000 |
commit | 934b3985a409d7e0a88557dd4313222194a110bd (patch) | |
tree | e5f32c31b20068e7d8674ff7ddb1ea2fe2ca16fa /src/lib | |
parent | 03a77eef903481d4308502d32fca33a961c4bb3a (diff) | |
download | openbsd-934b3985a409d7e0a88557dd4313222194a110bd.tar.gz openbsd-934b3985a409d7e0a88557dd4313222194a110bd.tar.bz2 openbsd-934b3985a409d7e0a88557dd4313222194a110bd.zip |
Modify sigalgs extension processing to accomodate TLS 1.3.
- Make a separate sigalgs list for TLS 1.3 including only modern
algorithm choices which we use when the handshake will not negotiate
TLS 1.2.
- Modify the legacy sigalgs for TLS 1.2 to include the RSA PSS algorithms as
mandated by RFC8446 when the handshake will permit negotiation of TLS 1.2
from a 1.3 handshake.
ok jsing@ tb@
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libssl/ssl_clnt.c | 5 | ||||
-rw-r--r-- | src/lib/libssl/ssl_locl.h | 4 | ||||
-rw-r--r-- | src/lib/libssl/ssl_sigalgs.c | 21 | ||||
-rw-r--r-- | src/lib/libssl/ssl_sigalgs.h | 4 | ||||
-rw-r--r-- | src/lib/libssl/ssl_tlsext.c | 36 | ||||
-rw-r--r-- | src/lib/libssl/t1_lib.c | 10 |
6 files changed, 65 insertions, 15 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c index 26755d7c03..e9e900b643 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.54 2019/01/23 18:24:40 beck Exp $ */ | 1 | /* $OpenBSD: ssl_clnt.c,v 1.55 2019/01/23 18:39:28 beck 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 | * |
@@ -1680,7 +1680,8 @@ ssl3_get_certificate_request(SSL *s) | |||
1680 | SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG); | 1680 | SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG); |
1681 | goto err; | 1681 | goto err; |
1682 | } | 1682 | } |
1683 | if (!tls1_process_sigalgs(s, &sigalgs)) { | 1683 | if (!tls1_process_sigalgs(s, &sigalgs, tls12_sigalgs, |
1684 | tls12_sigalgs_len)) { | ||
1684 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | 1685 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
1685 | SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR); | 1686 | SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR); |
1686 | goto err; | 1687 | goto err; |
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 7fd155648c..8447484ec7 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.230 2019/01/23 18:24:40 beck Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.231 2019/01/23 18:39:28 beck 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 | * |
@@ -1313,7 +1313,7 @@ int tls1_process_ticket(SSL *s, const unsigned char *session_id, | |||
1313 | int session_id_len, CBS *ext_block, SSL_SESSION **ret); | 1313 | int session_id_len, CBS *ext_block, SSL_SESSION **ret); |
1314 | 1314 | ||
1315 | long ssl_get_algorithm2(SSL *s); | 1315 | long ssl_get_algorithm2(SSL *s); |
1316 | int tls1_process_sigalgs(SSL *s, CBS *cbs); | 1316 | int tls1_process_sigalgs(SSL *s, CBS *cbs, uint16_t *, size_t); |
1317 | 1317 | ||
1318 | int tls1_check_ec_server_key(SSL *s); | 1318 | int tls1_check_ec_server_key(SSL *s); |
1319 | 1319 | ||
diff --git a/src/lib/libssl/ssl_sigalgs.c b/src/lib/libssl/ssl_sigalgs.c index 182ea1edaa..041e940d8e 100644 --- a/src/lib/libssl/ssl_sigalgs.c +++ b/src/lib/libssl/ssl_sigalgs.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* $OpenBSD: ssl_sigalgs.c,v 1.13 2019/01/23 18:24:40 beck Exp $ */ | 1 | /* $OpenBSD: ssl_sigalgs.c,v 1.14 2019/01/23 18:39:28 beck Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018, Bob Beck <beck@openbsd.org> | 3 | * Copyright (c) 2018-2019 Bob Beck <beck@openbsd.org> |
4 | * | 4 | * |
5 | * Permission to use, copy, modify, and/or distribute this software for any | 5 | * Permission to use, copy, modify, and/or distribute this software for any |
6 | * purpose with or without fee is hereby granted, provided that the above | 6 | * purpose with or without fee is hereby granted, provided that the above |
@@ -163,13 +163,30 @@ const struct ssl_sigalg sigalgs[] = { | |||
163 | }, | 163 | }, |
164 | }; | 164 | }; |
165 | 165 | ||
166 | /* Sigalgs for tls 1.3, in preference order, */ | ||
167 | uint16_t tls13_sigalgs[] = { | ||
168 | SIGALG_RSA_PSS_RSAE_SHA512, | ||
169 | SIGALG_RSA_PKCS1_SHA512, | ||
170 | SIGALG_ECDSA_SECP512R1_SHA512, | ||
171 | SIGALG_RSA_PSS_RSAE_SHA384, | ||
172 | SIGALG_RSA_PKCS1_SHA384, | ||
173 | SIGALG_ECDSA_SECP384R1_SHA384, | ||
174 | SIGALG_RSA_PSS_RSAE_SHA256, | ||
175 | SIGALG_RSA_PKCS1_SHA256, | ||
176 | SIGALG_ECDSA_SECP256R1_SHA256, | ||
177 | }; | ||
178 | size_t tls13_sigalgs_len = (sizeof(tls13_sigalgs) / sizeof(tls13_sigalgs[0])); | ||
179 | |||
166 | /* Sigalgs for tls 1.2, in preference order, */ | 180 | /* Sigalgs for tls 1.2, in preference order, */ |
167 | uint16_t tls12_sigalgs[] = { | 181 | uint16_t tls12_sigalgs[] = { |
182 | SIGALG_RSA_PSS_RSAE_SHA512, | ||
168 | SIGALG_RSA_PKCS1_SHA512, | 183 | SIGALG_RSA_PKCS1_SHA512, |
169 | SIGALG_ECDSA_SECP512R1_SHA512, | 184 | SIGALG_ECDSA_SECP512R1_SHA512, |
170 | SIGALG_GOSTR12_512_STREEBOG_512, | 185 | SIGALG_GOSTR12_512_STREEBOG_512, |
186 | SIGALG_RSA_PSS_RSAE_SHA384, | ||
171 | SIGALG_RSA_PKCS1_SHA384, | 187 | SIGALG_RSA_PKCS1_SHA384, |
172 | SIGALG_ECDSA_SECP384R1_SHA384, | 188 | SIGALG_ECDSA_SECP384R1_SHA384, |
189 | SIGALG_RSA_PSS_RSAE_SHA256, | ||
173 | SIGALG_RSA_PKCS1_SHA256, | 190 | SIGALG_RSA_PKCS1_SHA256, |
174 | SIGALG_ECDSA_SECP256R1_SHA256, | 191 | SIGALG_ECDSA_SECP256R1_SHA256, |
175 | SIGALG_GOSTR12_256_STREEBOG_256, | 192 | SIGALG_GOSTR12_256_STREEBOG_256, |
diff --git a/src/lib/libssl/ssl_sigalgs.h b/src/lib/libssl/ssl_sigalgs.h index a45700389b..0bc7322e17 100644 --- a/src/lib/libssl/ssl_sigalgs.h +++ b/src/lib/libssl/ssl_sigalgs.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_sigalgs.h,v 1.10 2019/01/23 18:24:40 beck Exp $ */ | 1 | /* $OpenBSD: ssl_sigalgs.h,v 1.11 2019/01/23 18:39:28 beck Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018, Bob Beck <beck@openbsd.org> | 3 | * Copyright (c) 2018, Bob Beck <beck@openbsd.org> |
4 | * | 4 | * |
@@ -71,6 +71,8 @@ struct ssl_sigalg{ | |||
71 | 71 | ||
72 | extern uint16_t tls12_sigalgs[]; | 72 | extern uint16_t tls12_sigalgs[]; |
73 | extern size_t tls12_sigalgs_len; | 73 | extern size_t tls12_sigalgs_len; |
74 | extern uint16_t tls13_sigalgs[]; | ||
75 | extern size_t tls13_sigalgs_len; | ||
74 | 76 | ||
75 | const struct ssl_sigalg *ssl_sigalg_lookup(uint16_t sigalg); | 77 | const struct ssl_sigalg *ssl_sigalg_lookup(uint16_t sigalg); |
76 | const struct ssl_sigalg *ssl_sigalg(uint16_t sigalg, uint16_t *values, size_t len); | 78 | const struct ssl_sigalg *ssl_sigalg(uint16_t sigalg, uint16_t *values, size_t len); |
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c index d5c30c4e73..2214a61ed3 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.33 2019/01/23 18:24:40 beck Exp $ */ | 1 | /* $OpenBSD: ssl_tlsext.c,v 1.34 2019/01/23 18:39:28 beck Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> | 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> |
@@ -536,8 +536,27 @@ tlsext_sigalgs_client_build(SSL *s, CBB *cbb) | |||
536 | if (!CBB_add_u16_length_prefixed(cbb, &sigalgs)) | 536 | if (!CBB_add_u16_length_prefixed(cbb, &sigalgs)) |
537 | return 0; | 537 | return 0; |
538 | 538 | ||
539 | if (!ssl_sigalgs_build(&sigalgs, tls12_sigalgs, tls12_sigalgs_len)) | 539 | switch (TLS1_get_client_version(s)) { |
540 | case TLS1_2_VERSION: | ||
541 | if (!ssl_sigalgs_build(&sigalgs, tls12_sigalgs, tls12_sigalgs_len)) | ||
542 | return 0; | ||
543 | break; | ||
544 | case TLS1_3_VERSION: | ||
545 | if (S3I(s)->hs_tls13.min_version < TLS1_3_VERSION) { | ||
546 | if (!ssl_sigalgs_build(&sigalgs, tls12_sigalgs, | ||
547 | tls12_sigalgs_len)) | ||
548 | return 0; | ||
549 | } | ||
550 | else { | ||
551 | if (!ssl_sigalgs_build(&sigalgs, tls13_sigalgs, | ||
552 | tls13_sigalgs_len)) | ||
553 | return 0; | ||
554 | } | ||
555 | break; | ||
556 | default: | ||
557 | /* Should not happen */ | ||
540 | return 0; | 558 | return 0; |
559 | } | ||
541 | 560 | ||
542 | if (!CBB_flush(cbb)) | 561 | if (!CBB_flush(cbb)) |
543 | return 0; | 562 | return 0; |
@@ -553,7 +572,18 @@ tlsext_sigalgs_server_parse(SSL *s, CBS *cbs, int *alert) | |||
553 | if (!CBS_get_u16_length_prefixed(cbs, &sigalgs)) | 572 | if (!CBS_get_u16_length_prefixed(cbs, &sigalgs)) |
554 | return 0; | 573 | return 0; |
555 | 574 | ||
556 | return tls1_process_sigalgs(s, &sigalgs); | 575 | switch (s->version) { |
576 | case TLS1_3_VERSION: | ||
577 | return tls1_process_sigalgs(s, &sigalgs, tls13_sigalgs, | ||
578 | tls13_sigalgs_len); | ||
579 | case TLS1_2_VERSION: | ||
580 | return tls1_process_sigalgs(s, &sigalgs, tls12_sigalgs, | ||
581 | tls12_sigalgs_len); | ||
582 | default: | ||
583 | break; | ||
584 | } | ||
585 | |||
586 | return 0; | ||
557 | } | 587 | } |
558 | 588 | ||
559 | int | 589 | int |
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c index cde022939d..8986a0e755 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.152 2019/01/23 18:24:40 beck Exp $ */ | 1 | /* $OpenBSD: t1_lib.c,v 1.153 2019/01/23 18:39:28 beck 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 | * |
@@ -1002,11 +1002,12 @@ tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen, | |||
1002 | 1002 | ||
1003 | /* Set preferred digest for each key type */ | 1003 | /* Set preferred digest for each key type */ |
1004 | int | 1004 | int |
1005 | tls1_process_sigalgs(SSL *s, CBS *cbs) | 1005 | tls1_process_sigalgs(SSL *s, CBS *cbs, uint16_t *sigalgs, size_t sigalgs_len) |
1006 | { | 1006 | { |
1007 | CERT *c = s->cert; | 1007 | CERT *c = s->cert; |
1008 | 1008 | ||
1009 | /* Extension ignored for inappropriate versions */ | 1009 | /* Extension ignored for inappropriate versions */ |
1010 | /* XXX get rid of this? */ | ||
1010 | if (!SSL_USE_SIGALGS(s)) | 1011 | if (!SSL_USE_SIGALGS(s)) |
1011 | return 1; | 1012 | return 1; |
1012 | 1013 | ||
@@ -1023,9 +1024,8 @@ tls1_process_sigalgs(SSL *s, CBS *cbs) | |||
1023 | if (!CBS_get_u16(cbs, &sig_alg)) | 1024 | if (!CBS_get_u16(cbs, &sig_alg)) |
1024 | return 0; | 1025 | return 0; |
1025 | 1026 | ||
1026 | if ((sigalg = ssl_sigalg(sig_alg, tls12_sigalgs, | 1027 | if ((sigalg = ssl_sigalg(sig_alg, sigalgs, sigalgs_len)) != |
1027 | tls12_sigalgs_len)) != NULL && | 1028 | NULL && c->pkeys[sigalg->pkey_idx].sigalg == NULL) { |
1028 | c->pkeys[sigalg->pkey_idx].sigalg == NULL) { | ||
1029 | c->pkeys[sigalg->pkey_idx].sigalg = sigalg; | 1029 | c->pkeys[sigalg->pkey_idx].sigalg = sigalg; |
1030 | if (sigalg->pkey_idx == SSL_PKEY_RSA_SIGN) | 1030 | if (sigalg->pkey_idx == SSL_PKEY_RSA_SIGN) |
1031 | c->pkeys[SSL_PKEY_RSA_ENC].sigalg = sigalg; | 1031 | c->pkeys[SSL_PKEY_RSA_ENC].sigalg = sigalg; |