diff options
| author | beck <> | 2018-11-13 01:19:48 +0000 |
|---|---|---|
| committer | beck <> | 2018-11-13 01:19:48 +0000 |
| commit | a73cc27c55ffb24a704eda88d2a980b706dcdecb (patch) | |
| tree | a3358d6b3fd76fb3aeeb957483f372165fd011af /src/lib/libssl/ssl_sigalgs.c | |
| parent | 7d635d52fecd4640ce8a3679055f747c8f7e42b9 (diff) | |
| download | openbsd-a73cc27c55ffb24a704eda88d2a980b706dcdecb.tar.gz openbsd-a73cc27c55ffb24a704eda88d2a980b706dcdecb.tar.bz2 openbsd-a73cc27c55ffb24a704eda88d2a980b706dcdecb.zip | |
Fix pkey_ok to be less strange, and add cuve checks required for the EC ones
ok tb@
Diffstat (limited to 'src/lib/libssl/ssl_sigalgs.c')
| -rw-r--r-- | src/lib/libssl/ssl_sigalgs.c | 35 |
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) | |||
| 229 | int | 232 | int |
| 230 | ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey) | 233 | ssl_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 | } |
