summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2021-06-29 19:20:39 +0000
committerjsing <>2021-06-29 19:20:39 +0000
commitd8bbfb5c853f1528593599b4cad373dd3f4ac17b (patch)
treeacb82022939a1d3f1bd7dda9dca7bc6324d50b45
parent2084659c33f3dd4553097139197351f79d9931da (diff)
downloadopenbsd-d8bbfb5c853f1528593599b4cad373dd3f4ac17b.tar.gz
openbsd-d8bbfb5c853f1528593599b4cad373dd3f4ac17b.tar.bz2
openbsd-d8bbfb5c853f1528593599b4cad373dd3f4ac17b.zip
Provide a ssl_sigalg_for_peer() function and use in the TLSv1.3 code.
Provide an ssl_sigalg_for_peer() function that knows how to figure out which signature algorithm should be used for a peer provided signature, performing appropriate validation to ensure that the peer provided value is suitable for the protocol version and key in use. In the TLSv1.3 code, this replaces the need for separate calls to lookup the sigalg from the peer provided value, then perform validation. ok inoguchi@ tb@
-rw-r--r--src/lib/libssl/ssl_sigalgs.c26
-rw-r--r--src/lib/libssl/ssl_sigalgs.h4
-rw-r--r--src/lib/libssl/tls13_client.c9
-rw-r--r--src/lib/libssl/tls13_server.c9
4 files changed, 33 insertions, 15 deletions
diff --git a/src/lib/libssl/ssl_sigalgs.c b/src/lib/libssl/ssl_sigalgs.c
index bd896c829b..28d1d36b85 100644
--- a/src/lib/libssl/ssl_sigalgs.c
+++ b/src/lib/libssl/ssl_sigalgs.c
@@ -1,6 +1,7 @@
1/* $OpenBSD: ssl_sigalgs.c,v 1.32 2021/06/29 19:10:08 jsing Exp $ */ 1/* $OpenBSD: ssl_sigalgs.c,v 1.33 2021/06/29 19:20:39 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 * Copyright (c) 2021 Joel Sing <jsing@openbsd.org>
4 * 5 *
5 * Permission to use, copy, modify, and/or distribute this software for any 6 * 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 7 * purpose with or without fee is hereby granted, provided that the above
@@ -14,6 +15,7 @@
14 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 15 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
15 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */ 17 */
18
17#include <string.h> 19#include <string.h>
18#include <stdlib.h> 20#include <stdlib.h>
19 21
@@ -326,7 +328,6 @@ ssl_sigalg_select(SSL *s, EVP_PKEY *pkey)
326 if ((sigalg = ssl_sigalg_from_value( 328 if ((sigalg = ssl_sigalg_from_value(
327 S3I(s)->hs.negotiated_tls_version, sigalg_value)) == NULL) 329 S3I(s)->hs.negotiated_tls_version, sigalg_value)) == NULL)
328 continue; 330 continue;
329
330 if (ssl_sigalg_pkey_ok(s, sigalg, pkey)) 331 if (ssl_sigalg_pkey_ok(s, sigalg, pkey))
331 return sigalg; 332 return sigalg;
332 } 333 }
@@ -334,3 +335,24 @@ ssl_sigalg_select(SSL *s, EVP_PKEY *pkey)
334 SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE); 335 SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE);
335 return NULL; 336 return NULL;
336} 337}
338
339const struct ssl_sigalg *
340ssl_sigalg_for_peer(SSL *s, EVP_PKEY *pkey, uint16_t sigalg_value)
341{
342 const struct ssl_sigalg *sigalg;
343
344 if (!SSL_USE_SIGALGS(s))
345 return ssl_sigalg_for_legacy(s, pkey);
346
347 if ((sigalg = ssl_sigalg_from_value(S3I(s)->hs.negotiated_tls_version,
348 sigalg_value)) == NULL) {
349 SSLerror(s, SSL_R_UNKNOWN_DIGEST);
350 return (NULL);
351 }
352 if (!ssl_sigalg_pkey_ok(s, sigalg, pkey)) {
353 SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE);
354 return (NULL);
355 }
356
357 return sigalg;
358}
diff --git a/src/lib/libssl/ssl_sigalgs.h b/src/lib/libssl/ssl_sigalgs.h
index 6905bba060..dffa0e0158 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.21 2021/06/29 19:10:08 jsing Exp $ */ 1/* $OpenBSD: ssl_sigalgs.h,v 1.22 2021/06/29 19:20:39 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 *
@@ -75,6 +75,8 @@ int ssl_sigalgs_build(uint16_t tls_version, CBB *cbb);
75int ssl_sigalg_pkey_ok(SSL *s, const struct ssl_sigalg *sigalg, 75int ssl_sigalg_pkey_ok(SSL *s, const struct ssl_sigalg *sigalg,
76 EVP_PKEY *pkey); 76 EVP_PKEY *pkey);
77const struct ssl_sigalg *ssl_sigalg_select(SSL *s, EVP_PKEY *pkey); 77const struct ssl_sigalg *ssl_sigalg_select(SSL *s, EVP_PKEY *pkey);
78const struct ssl_sigalg *ssl_sigalg_for_peer(SSL *s, EVP_PKEY *pkey,
79 uint16_t sigalg_value);
78 80
79__END_HIDDEN_DECLS 81__END_HIDDEN_DECLS
80 82
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c
index dd9a5b1606..62c5174490 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.85 2021/06/29 19:10:08 jsing Exp $ */ 1/* $OpenBSD: tls13_client.c,v 1.86 2021/06/29 19:20:39 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 *
@@ -680,10 +680,6 @@ tls13_server_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs)
680 if (!CBS_get_u16_length_prefixed(cbs, &signature)) 680 if (!CBS_get_u16_length_prefixed(cbs, &signature))
681 goto err; 681 goto err;
682 682
683 if ((sigalg = ssl_sigalg_from_value(ctx->hs->negotiated_tls_version,
684 signature_scheme)) == NULL)
685 goto err;
686
687 if (!CBB_init(&cbb, 0)) 683 if (!CBB_init(&cbb, 0))
688 goto err; 684 goto err;
689 if (!CBB_add_bytes(&cbb, tls13_cert_verify_pad, 685 if (!CBB_add_bytes(&cbb, tls13_cert_verify_pad,
@@ -704,7 +700,8 @@ tls13_server_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs)
704 goto err; 700 goto err;
705 if ((pkey = X509_get0_pubkey(cert)) == NULL) 701 if ((pkey = X509_get0_pubkey(cert)) == NULL)
706 goto err; 702 goto err;
707 if (!ssl_sigalg_pkey_ok(ctx->ssl, sigalg, pkey)) 703 if ((sigalg = ssl_sigalg_for_peer(ctx->ssl, pkey,
704 signature_scheme)) == NULL)
708 goto err; 705 goto err;
709 ctx->hs->peer_sigalg = sigalg; 706 ctx->hs->peer_sigalg = sigalg;
710 707
diff --git a/src/lib/libssl/tls13_server.c b/src/lib/libssl/tls13_server.c
index c3d4ca9bd8..ff410fbb34 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.82 2021/06/29 19:10:08 jsing Exp $ */ 1/* $OpenBSD: tls13_server.c,v 1.83 2021/06/29 19:20:39 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,10 +970,6 @@ 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(ctx->hs->negotiated_tls_version,
974 signature_scheme)) == NULL)
975 goto err;
976
977 if (!CBB_init(&cbb, 0)) 973 if (!CBB_init(&cbb, 0))
978 goto err; 974 goto err;
979 if (!CBB_add_bytes(&cbb, tls13_cert_verify_pad, 975 if (!CBB_add_bytes(&cbb, tls13_cert_verify_pad,
@@ -994,7 +990,8 @@ tls13_client_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs)
994 goto err; 990 goto err;
995 if ((pkey = X509_get0_pubkey(cert)) == NULL) 991 if ((pkey = X509_get0_pubkey(cert)) == NULL)
996 goto err; 992 goto err;
997 if (!ssl_sigalg_pkey_ok(ctx->ssl, sigalg, pkey)) 993 if ((sigalg = ssl_sigalg_for_peer(ctx->ssl, pkey,
994 signature_scheme)) == NULL)
998 goto err; 995 goto err;
999 ctx->hs->peer_sigalg = sigalg; 996 ctx->hs->peer_sigalg = sigalg;
1000 997