summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbeck <>2018-11-13 01:19:48 +0000
committerbeck <>2018-11-13 01:19:48 +0000
commit8c2ba52c97511b3510d2c5e42e90782ddfcfd9a9 (patch)
treea3358d6b3fd76fb3aeeb957483f372165fd011af
parent9e5719eb897fb4c3a1c299e05e85609ab9fe5a9c (diff)
downloadopenbsd-8c2ba52c97511b3510d2c5e42e90782ddfcfd9a9.tar.gz
openbsd-8c2ba52c97511b3510d2c5e42e90782ddfcfd9a9.tar.bz2
openbsd-8c2ba52c97511b3510d2c5e42e90782ddfcfd9a9.zip
Fix pkey_ok to be less strange, and add cuve checks required for the EC ones
ok tb@
-rw-r--r--src/lib/libssl/ssl_sigalgs.c35
1 files changed, 26 insertions, 9 deletions
diff --git a/src/lib/libssl/ssl_sigalgs.c b/src/lib/libssl/ssl_sigalgs.c
index a6c5a4e9d8..8ea51b9c04 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.7 2018/11/11 21:54:47 beck Exp $ */ 1/* $OpenBSD: ssl_sigalgs.c,v 1.8 2018/11/13 01:19:48 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2018, Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018, Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -36,6 +36,7 @@ const struct ssl_sigalg sigalgs[] = {
36 .md = EVP_sha512, 36 .md = EVP_sha512,
37 .key_type = EVP_PKEY_EC, 37 .key_type = EVP_PKEY_EC,
38 .pkey_idx = SSL_PKEY_ECC, 38 .pkey_idx = SSL_PKEY_ECC,
39 .curve_nid = NID_secp521r1,
39 }, 40 },
40#ifndef OPENSSL_NO_GOST 41#ifndef OPENSSL_NO_GOST
41 { 42 {
@@ -56,6 +57,7 @@ const struct ssl_sigalg sigalgs[] = {
56 .md = EVP_sha384, 57 .md = EVP_sha384,
57 .key_type = EVP_PKEY_EC, 58 .key_type = EVP_PKEY_EC,
58 .pkey_idx = SSL_PKEY_ECC, 59 .pkey_idx = SSL_PKEY_ECC,
60 .curve_nid = NID_secp384r1,
59 }, 61 },
60 { 62 {
61 .value = SIGALG_RSA_PKCS1_SHA256, 63 .value = SIGALG_RSA_PKCS1_SHA256,
@@ -68,6 +70,7 @@ const struct ssl_sigalg sigalgs[] = {
68 .md = EVP_sha256, 70 .md = EVP_sha256,
69 .key_type = EVP_PKEY_EC, 71 .key_type = EVP_PKEY_EC,
70 .pkey_idx = SSL_PKEY_ECC, 72 .pkey_idx = SSL_PKEY_ECC,
73 .curve_nid = NID_X9_62_prime256v1,
71 }, 74 },
72#ifndef OPENSSL_NO_GOST 75#ifndef OPENSSL_NO_GOST
73 { 76 {
@@ -229,15 +232,29 @@ ssl_sigalgs_build(CBB *cbb, uint16_t *values, size_t len)
229int 232int
230ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey) 233ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey)
231{ 234{
232 if (sigalg->key_type == pkey->type) { 235 if (sigalg == NULL || pkey == NULL)
233 if (!(sigalg->flags & SIGALG_FLAG_RSA_PSS)) 236 return 0;
234 return 1; 237 if (sigalg->key_type != pkey->type)
238 return 0;
239
240 if ((sigalg->flags & SIGALG_FLAG_RSA_PSS)) {
235 /* 241 /*
236 * RSA keys for PSS need to be at least 242 * RSA PSS Must have an RSA key that needs to be at
237 * as big as twice the size of the hash + 2 243 * least as big as twice the size of the hash + 2
238 */ 244 */
239 if (EVP_PKEY_size(pkey) < (2 * EVP_MD_size(sigalg->md()) + 2)) 245 if (pkey->type != EVP_PKEY_RSA ||
240 return 1; 246 EVP_PKEY_size(pkey) < (2 * EVP_MD_size(sigalg->md()) + 2))
247 return 0;
248 }
249
250 if (pkey->type == EVP_PKEY_EC) {
251 if (sigalg->curve_nid == 0)
252 return 0;
253 /* Curve must match for EC keys */
254 if (EC_GROUP_get_curve_name(EC_KEY_get0_group
255 (EVP_PKEY_get0_EC_KEY(pkey))) != sigalg->curve_nid)
256 return 0;
241 } 257 }
242 return 0; 258
259 return 1;
243} 260}