diff options
| author | jsing <> | 2021-06-27 18:15:35 +0000 |
|---|---|---|
| committer | jsing <> | 2021-06-27 18:15:35 +0000 |
| commit | ba443ed94103428d62d60c3e504f6d1d607efe41 (patch) | |
| tree | 42013562216a12affa5986c4c490d1a5738f1bee /src | |
| parent | c31f471e1447cb85ce143ca6d405fb7e37341198 (diff) | |
| download | openbsd-ba443ed94103428d62d60c3e504f6d1d607efe41.tar.gz openbsd-ba443ed94103428d62d60c3e504f6d1d607efe41.tar.bz2 openbsd-ba443ed94103428d62d60c3e504f6d1d607efe41.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@
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/ssl_clnt.c | 7 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_sigalgs.c | 24 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_sigalgs.h | 14 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_srvr.c | 6 | ||||
| -rw-r--r-- | src/lib/libssl/tls13_client.c | 6 | ||||
| -rw-r--r-- | src/lib/libssl/tls13_server.c | 6 |
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 | ||
| 190 | const struct ssl_sigalg * | 190 | const struct ssl_sigalg * |
| 191 | ssl_sigalg_lookup(uint16_t sigalg) | 191 | ssl_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 | ||
| 203 | const struct ssl_sigalg * | 203 | const struct ssl_sigalg * |
| 204 | ssl_sigalg_from_value(uint16_t sigalg, const uint16_t *values, size_t len) | 204 | ssl_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 | ||
| 71 | extern const uint16_t tls12_sigalgs[]; | ||
| 72 | extern const size_t tls12_sigalgs_len; | ||
| 73 | extern const uint16_t tls13_sigalgs[]; | ||
| 74 | extern const size_t tls13_sigalgs_len; | ||
| 75 | |||
| 76 | const struct ssl_sigalg *ssl_sigalg_lookup(uint16_t sigalg); | 71 | const struct ssl_sigalg *ssl_sigalg_lookup(uint16_t sigalg); |
| 77 | const struct ssl_sigalg *ssl_sigalg_from_value(uint16_t sigalg, | 72 | const struct ssl_sigalg *ssl_sigalg_from_value(uint16_t tls_version, |
| 78 | const uint16_t *values, size_t len); | 73 | uint16_t value); |
| 79 | int ssl_sigalgs_build(uint16_t tls_version, CBB *cbb); | 74 | int ssl_sigalgs_build(uint16_t tls_version, CBB *cbb); |
| 80 | int ssl_sigalg_pkey_check(uint16_t sigalg, EVP_PKEY *pk); | ||
| 81 | int ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey, | 75 | int ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey, |
| 82 | int check_curve); | 76 | int check_curve); |
| 83 | const struct ssl_sigalg *ssl_sigalg_select(SSL *s, EVP_PKEY *pkey); | 77 | const 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)) |
