summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbeck <>2018-11-09 05:02:53 +0000
committerbeck <>2018-11-09 05:02:53 +0000
commit85848fddf8c87379828aad8b378f86e0d5966a60 (patch)
treea10a843f3ef55dc5fa5b4e06a3ab7054c9e50d81
parente67eb8087c3d0d0e7689c7c0cb6b55a14b7b1c46 (diff)
downloadopenbsd-85848fddf8c87379828aad8b378f86e0d5966a60.tar.gz
openbsd-85848fddf8c87379828aad8b378f86e0d5966a60.tar.bz2
openbsd-85848fddf8c87379828aad8b378f86e0d5966a60.zip
Add the ability to have a separate priority list for sigalgs.
Add a priority list for tls 1.2 ok jsing@
-rw-r--r--src/lib/libssl/ssl_sigalgs.c40
-rw-r--r--src/lib/libssl/ssl_sigalgs.h7
-rw-r--r--src/lib/libssl/ssl_srvr.c4
-rw-r--r--src/lib/libssl/ssl_tlsext.c4
4 files changed, 43 insertions, 12 deletions
diff --git a/src/lib/libssl/ssl_sigalgs.c b/src/lib/libssl/ssl_sigalgs.c
index d214b0dbbf..fe10965feb 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.1 2018/11/09 00:34:55 beck Exp $ */ 1/* $OpenBSD: ssl_sigalgs.c,v 1.2 2018/11/09 05:02:53 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2018, Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018, Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -24,7 +24,6 @@
24#include "ssl_sigalgs.h" 24#include "ssl_sigalgs.h"
25#include "tls13_internal.h" 25#include "tls13_internal.h"
26 26
27/* This table must be kept in preference order for now */
28const struct ssl_sigalg sigalgs[] = { 27const struct ssl_sigalg sigalgs[] = {
29 { 28 {
30 .value = SIGALG_RSA_PKCS1_SHA512, 29 .value = SIGALG_RSA_PKCS1_SHA512,
@@ -157,6 +156,24 @@ const struct ssl_sigalg sigalgs[] = {
157 }, 156 },
158}; 157};
159 158
159/* Sigalgs for tls 1.2, in preference order, */
160uint16_t tls12_sigalgs[] = {
161 SIGALG_RSA_PKCS1_SHA512,
162 SIGALG_ECDSA_SECP512R1_SHA512,
163 SIGALG_GOSTR12_512_STREEBOG_512,
164 SIGALG_RSA_PKCS1_SHA384,
165 SIGALG_ECDSA_SECP384R1_SHA384,
166 SIGALG_RSA_PKCS1_SHA256,
167 SIGALG_ECDSA_SECP256R1_SHA256,
168 SIGALG_GOSTR12_256_STREEBOG_256,
169 SIGALG_GOSTR01_GOST94,
170 SIGALG_RSA_PKCS1_SHA224,
171 SIGALG_ECDSA_SECP224R1_SHA224,
172 SIGALG_RSA_PKCS1_SHA1, /* XXX */
173 SIGALG_ECDSA_SHA1, /* XXX */
174};
175size_t tls12_sigalgs_len = (sizeof(tls12_sigalgs) / sizeof(tls12_sigalgs[0]));
176
160const struct ssl_sigalg * 177const struct ssl_sigalg *
161ssl_sigalg_lookup(uint16_t sigalg) 178ssl_sigalg_lookup(uint16_t sigalg)
162{ 179{
@@ -206,12 +223,23 @@ ssl_sigalg_value(const EVP_PKEY *pk, const EVP_MD *md)
206} 223}
207 224
208int 225int
209ssl_sigalgs_build(CBB *cbb) 226ssl_sigalgs_build(CBB *cbb, uint16_t *values, size_t len)
210{ 227{
211 int i; 228 const struct ssl_sigalg *sap;
229 size_t i;
212 230
213 for (i = 0; sigalgs[i].value != SIGALG_NONE; i++) { 231 for (i = 0; sigalgs[i].value != SIGALG_NONE; i++);
214 if (!CBB_add_u16(cbb, sigalgs[i].value)) 232 if (len > i)
233 return 0;
234
235 /* XXX check for duplicates and other sanity BS? */
236
237 /* Add values in order as long as they are supported. */
238 for (i = 0; i < len; i++) {
239 if ((sap = ssl_sigalg_lookup(values[i])) != NULL) {
240 if (!CBB_add_u16(cbb, values[i]))
241 return 0;
242 } else
215 return 0; 243 return 0;
216 } 244 }
217 return 1; 245 return 1;
diff --git a/src/lib/libssl/ssl_sigalgs.h b/src/lib/libssl/ssl_sigalgs.h
index a73c398e58..629213e761 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.2 2018/11/09 03:17:04 jsing Exp $ */ 1/* $OpenBSD: ssl_sigalgs.h,v 1.3 2018/11/09 05:02:53 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2018, Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018, Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -66,10 +66,13 @@ struct ssl_sigalg{
66 int flags; 66 int flags;
67}; 67};
68 68
69extern uint16_t tls12_sigalgs[];
70extern size_t tls12_sigalgs_len;
71
69const struct ssl_sigalg *ssl_sigalg_lookup(uint16_t sigalg); 72const struct ssl_sigalg *ssl_sigalg_lookup(uint16_t sigalg);
70const EVP_MD * ssl_sigalg_md(uint16_t sigalg); 73const EVP_MD * ssl_sigalg_md(uint16_t sigalg);
71uint16_t ssl_sigalg_value(const EVP_PKEY *pk, const EVP_MD *md); 74uint16_t ssl_sigalg_value(const EVP_PKEY *pk, const EVP_MD *md);
72int ssl_sigalgs_build(CBB *cbb); 75int ssl_sigalgs_build(CBB *cbb, uint16_t *values, size_t len);
73int ssl_sigalg_pkey_check(uint16_t sigalg, EVP_PKEY *pk); 76int ssl_sigalg_pkey_check(uint16_t sigalg, EVP_PKEY *pk);
74 77
75__END_HIDDEN_DECLS 78__END_HIDDEN_DECLS
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index 0d82271325..59d560d06d 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.52 2018/11/09 00:34:55 beck Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.53 2018/11/09 05:02:53 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 *
@@ -1635,7 +1635,7 @@ ssl3_send_certificate_request(SSL *s)
1635 if (SSL_USE_SIGALGS(s)) { 1635 if (SSL_USE_SIGALGS(s)) {
1636 if (!CBB_add_u16_length_prefixed(&cert_request, &sigalgs)) 1636 if (!CBB_add_u16_length_prefixed(&cert_request, &sigalgs))
1637 goto err; 1637 goto err;
1638 if (!ssl_sigalgs_build(&sigalgs)) 1638 if (!ssl_sigalgs_build(&sigalgs, tls12_sigalgs, tls12_sigalgs_len))
1639 goto err; 1639 goto err;
1640 } 1640 }
1641 1641
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c
index dc844998a3..755bbff795 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.25 2018/11/09 00:34:55 beck Exp $ */ 1/* $OpenBSD: ssl_tlsext.c,v 1.26 2018/11/09 05:02:53 beck 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>
@@ -534,7 +534,7 @@ tlsext_sigalgs_clienthello_build(SSL *s, CBB *cbb)
534 if (!CBB_add_u16_length_prefixed(cbb, &sigalgs)) 534 if (!CBB_add_u16_length_prefixed(cbb, &sigalgs))
535 return 0; 535 return 0;
536 536
537 if (!ssl_sigalgs_build(&sigalgs)) 537 if (!ssl_sigalgs_build(&sigalgs, tls12_sigalgs, tls12_sigalgs_len))
538 return 0; 538 return 0;
539 539
540 if (!CBB_flush(cbb)) 540 if (!CBB_flush(cbb))