summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_sigalgs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/ssl_sigalgs.c')
-rw-r--r--src/lib/libssl/ssl_sigalgs.c40
1 files changed, 34 insertions, 6 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;