summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2021-06-27 18:15:35 +0000
committerjsing <>2021-06-27 18:15:35 +0000
commitb109677d03c0eb1062f19ab300b485b90c0c2ad7 (patch)
tree42013562216a12affa5986c4c490d1a5738f1bee
parentca8c2e09b0f4c1b2fe04fdd1a80b941378a2290f (diff)
downloadopenbsd-b109677d03c0eb1062f19ab300b485b90c0c2ad7.tar.gz
openbsd-b109677d03c0eb1062f19ab300b485b90c0c2ad7.tar.bz2
openbsd-b109677d03c0eb1062f19ab300b485b90c0c2ad7.zip
Change ssl_sigalgs_from_value() to perform sigalg list selection.
Rather that passing in a sigalg list at every call site, pass in the appropriate TLS version and have ssl_sigalgs_from_value() perform the sigalg list selection itself. This allows the sigalg lists to be made internal to the sigalgs code. ok tb@
-rw-r--r--src/lib/libssl/ssl_clnt.c7
-rw-r--r--src/lib/libssl/ssl_sigalgs.c24
-rw-r--r--src/lib/libssl/ssl_sigalgs.h14
-rw-r--r--src/lib/libssl/ssl_srvr.c6
-rw-r--r--src/lib/libssl/tls13_client.c6
-rw-r--r--src/lib/libssl/tls13_server.c6
6 files changed, 31 insertions, 32 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c
index c092fe4c89..fac30b26aa 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.100 2021/06/27 18:09:07 jsing Exp $ */ 1/* $OpenBSD: ssl_clnt.c,v 1.101 2021/06/27 18:15:35 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 *
@@ -1550,8 +1550,9 @@ ssl3_get_server_key_exchange(SSL *s)
1550 1550
1551 if (!CBS_get_u16(&cbs, &sigalg_value)) 1551 if (!CBS_get_u16(&cbs, &sigalg_value))
1552 goto decode_err; 1552 goto decode_err;
1553 if ((sigalg = ssl_sigalg_from_value(sigalg_value, 1553 if ((sigalg = ssl_sigalg_from_value(
1554 tls12_sigalgs, tls12_sigalgs_len)) == NULL) { 1554 S3I(s)->hs.negotiated_tls_version,
1555 sigalg_value)) == NULL) {
1555 SSLerror(s, SSL_R_UNKNOWN_DIGEST); 1556 SSLerror(s, SSL_R_UNKNOWN_DIGEST);
1556 al = SSL_AD_DECODE_ERROR; 1557 al = SSL_AD_DECODE_ERROR;
1557 goto fatal_err; 1558 goto fatal_err;
diff --git a/src/lib/libssl/ssl_sigalgs.c b/src/lib/libssl/ssl_sigalgs.c
index 8c7f6d673a..f2238b4fda 100644
--- a/src/lib/libssl/ssl_sigalgs.c
+++ b/src/lib/libssl/ssl_sigalgs.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_sigalgs.c,v 1.28 2021/06/27 18:09:07 jsing Exp $ */ 1/* $OpenBSD: ssl_sigalgs.c,v 1.29 2021/06/27 18:15:35 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018-2020 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018-2020 Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -188,12 +188,12 @@ ssl_sigalgs_for_version(uint16_t tls_version, const uint16_t **out_values,
188} 188}
189 189
190const struct ssl_sigalg * 190const struct ssl_sigalg *
191ssl_sigalg_lookup(uint16_t sigalg) 191ssl_sigalg_lookup(uint16_t value)
192{ 192{
193 int i; 193 int i;
194 194
195 for (i = 0; sigalgs[i].value != SIGALG_NONE; i++) { 195 for (i = 0; sigalgs[i].value != SIGALG_NONE; i++) {
196 if (sigalgs[i].value == sigalg) 196 if (sigalgs[i].value == value)
197 return &sigalgs[i]; 197 return &sigalgs[i];
198 } 198 }
199 199
@@ -201,13 +201,17 @@ ssl_sigalg_lookup(uint16_t sigalg)
201} 201}
202 202
203const struct ssl_sigalg * 203const struct ssl_sigalg *
204ssl_sigalg_from_value(uint16_t sigalg, const uint16_t *values, size_t len) 204ssl_sigalg_from_value(uint16_t tls_version, uint16_t value)
205{ 205{
206 const uint16_t *values;
207 size_t len;
206 int i; 208 int i;
207 209
210 ssl_sigalgs_for_version(tls_version, &values, &len);
211
208 for (i = 0; i < len; i++) { 212 for (i = 0; i < len; i++) {
209 if (values[i] == sigalg) 213 if (values[i] == value)
210 return ssl_sigalg_lookup(sigalg); 214 return ssl_sigalg_lookup(value);
211 } 215 }
212 216
213 return NULL; 217 return NULL;
@@ -322,14 +326,14 @@ ssl_sigalg_select(SSL *s, EVP_PKEY *pkey)
322 */ 326 */
323 CBS_init(&cbs, S3I(s)->hs.sigalgs, S3I(s)->hs.sigalgs_len); 327 CBS_init(&cbs, S3I(s)->hs.sigalgs, S3I(s)->hs.sigalgs_len);
324 while (CBS_len(&cbs) > 0) { 328 while (CBS_len(&cbs) > 0) {
325 uint16_t sig_alg;
326 const struct ssl_sigalg *sigalg; 329 const struct ssl_sigalg *sigalg;
330 uint16_t sigalg_value;
327 331
328 if (!CBS_get_u16(&cbs, &sig_alg)) 332 if (!CBS_get_u16(&cbs, &sigalg_value))
329 return 0; 333 return 0;
330 334
331 if ((sigalg = ssl_sigalg_from_value(sig_alg, tls_sigalgs, 335 if ((sigalg = ssl_sigalg_from_value(
332 tls_sigalgs_len)) == NULL) 336 S3I(s)->hs.negotiated_tls_version, sigalg_value)) == NULL)
333 continue; 337 continue;
334 338
335 /* RSA cannot be used without PSS in TLSv1.3. */ 339 /* RSA cannot be used without PSS in TLSv1.3. */
diff --git a/src/lib/libssl/ssl_sigalgs.h b/src/lib/libssl/ssl_sigalgs.h
index 64cf0bb73b..c91e66a5a9 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.19 2021/06/27 18:09:07 jsing Exp $ */ 1/* $OpenBSD: ssl_sigalgs.h,v 1.20 2021/06/27 18:15:35 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018-2019 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018-2019 Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -55,7 +55,7 @@ __BEGIN_HIDDEN_DECLS
55#define SIGALG_GOSTR12_256_STREEBOG_256 0xEEEE 55#define SIGALG_GOSTR12_256_STREEBOG_256 0xEEEE
56#define SIGALG_GOSTR01_GOST94 0xEDED 56#define SIGALG_GOSTR01_GOST94 0xEDED
57 57
58/* Legacy sigalg for < 1.2 same value as boring uses*/ 58/* Legacy sigalg for < TLSv1.2 same value as BoringSSL uses. */
59#define SIGALG_RSA_PKCS1_MD5_SHA1 0xFF01 59#define SIGALG_RSA_PKCS1_MD5_SHA1 0xFF01
60 60
61#define SIGALG_FLAG_RSA_PSS 0x00000001 61#define SIGALG_FLAG_RSA_PSS 0x00000001
@@ -68,16 +68,10 @@ struct ssl_sigalg {
68 int flags; 68 int flags;
69}; 69};
70 70
71extern const uint16_t tls12_sigalgs[];
72extern const size_t tls12_sigalgs_len;
73extern const uint16_t tls13_sigalgs[];
74extern const size_t tls13_sigalgs_len;
75
76const struct ssl_sigalg *ssl_sigalg_lookup(uint16_t sigalg); 71const struct ssl_sigalg *ssl_sigalg_lookup(uint16_t sigalg);
77const struct ssl_sigalg *ssl_sigalg_from_value(uint16_t sigalg, 72const struct ssl_sigalg *ssl_sigalg_from_value(uint16_t tls_version,
78 const uint16_t *values, size_t len); 73 uint16_t value);
79int ssl_sigalgs_build(uint16_t tls_version, CBB *cbb); 74int ssl_sigalgs_build(uint16_t tls_version, CBB *cbb);
80int ssl_sigalg_pkey_check(uint16_t sigalg, EVP_PKEY *pk);
81int ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey, 75int ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey,
82 int check_curve); 76 int check_curve);
83const struct ssl_sigalg *ssl_sigalg_select(SSL *s, EVP_PKEY *pkey); 77const struct ssl_sigalg *ssl_sigalg_select(SSL *s, EVP_PKEY *pkey);
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index 201f600a3e..259c6679f2 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.113 2021/06/27 18:09:07 jsing Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.114 2021/06/27 18:15:35 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 *
@@ -2192,8 +2192,8 @@ ssl3_get_cert_verify(SSL *s)
2192 2192
2193 if (!CBS_get_u16(&cbs, &sigalg_value)) 2193 if (!CBS_get_u16(&cbs, &sigalg_value))
2194 goto decode_err; 2194 goto decode_err;
2195 if ((sigalg = ssl_sigalg_from_value(sigalg_value, 2195 if ((sigalg = ssl_sigalg_from_value(
2196 tls12_sigalgs, tls12_sigalgs_len)) == NULL || 2196 S3I(s)->hs.negotiated_tls_version, sigalg_value)) == NULL ||
2197 (md = sigalg->md()) == NULL) { 2197 (md = sigalg->md()) == NULL) {
2198 SSLerror(s, SSL_R_UNKNOWN_DIGEST); 2198 SSLerror(s, SSL_R_UNKNOWN_DIGEST);
2199 al = SSL_AD_DECODE_ERROR; 2199 al = SSL_AD_DECODE_ERROR;
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c
index de9316e8d7..644b16e26c 100644
--- a/src/lib/libssl/tls13_client.c
+++ b/src/lib/libssl/tls13_client.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_client.c,v 1.81 2021/06/27 18:09:07 jsing Exp $ */ 1/* $OpenBSD: tls13_client.c,v 1.82 2021/06/27 18:15:35 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -671,8 +671,8 @@ tls13_server_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs)
671 if (!CBS_get_u16_length_prefixed(cbs, &signature)) 671 if (!CBS_get_u16_length_prefixed(cbs, &signature))
672 goto err; 672 goto err;
673 673
674 if ((sigalg = ssl_sigalg_from_value(signature_scheme, 674 if ((sigalg = ssl_sigalg_from_value(ctx->hs->negotiated_tls_version,
675 tls13_sigalgs, tls13_sigalgs_len)) == NULL) 675 signature_scheme)) == NULL)
676 goto err; 676 goto err;
677 677
678 if (!CBB_init(&cbb, 0)) 678 if (!CBB_init(&cbb, 0))
diff --git a/src/lib/libssl/tls13_server.c b/src/lib/libssl/tls13_server.c
index 8f47bdfa88..b68a2f9294 100644
--- a/src/lib/libssl/tls13_server.c
+++ b/src/lib/libssl/tls13_server.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_server.c,v 1.79 2021/06/27 18:09:07 jsing Exp $ */ 1/* $OpenBSD: tls13_server.c,v 1.80 2021/06/27 18:15:35 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2020 Bob Beck <beck@openbsd.org> 4 * Copyright (c) 2020 Bob Beck <beck@openbsd.org>
@@ -970,8 +970,8 @@ tls13_client_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs)
970 if (!CBS_get_u16_length_prefixed(cbs, &signature)) 970 if (!CBS_get_u16_length_prefixed(cbs, &signature))
971 goto err; 971 goto err;
972 972
973 if ((sigalg = ssl_sigalg_from_value(signature_scheme, 973 if ((sigalg = ssl_sigalg_from_value(ctx->hs->negotiated_tls_version,
974 tls13_sigalgs, tls13_sigalgs_len)) == NULL) 974 signature_scheme)) == NULL)
975 goto err; 975 goto err;
976 976
977 if (!CBB_init(&cbb, 0)) 977 if (!CBB_init(&cbb, 0))