diff options
Diffstat (limited to 'src/lib/libssl/ssl_lib.c')
| -rw-r--r-- | src/lib/libssl/ssl_lib.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index 6b4c7e72a1..31d411c429 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_lib.c,v 1.191 2018/11/08 20:55:18 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_lib.c,v 1.192 2018/11/10 01:19:09 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 | * |
| @@ -156,6 +156,7 @@ | |||
| 156 | #endif | 156 | #endif |
| 157 | 157 | ||
| 158 | #include "bytestring.h" | 158 | #include "bytestring.h" |
| 159 | #include "ssl_sigalgs.h" | ||
| 159 | 160 | ||
| 160 | const char *SSL_version_str = OPENSSL_VERSION_TEXT; | 161 | const char *SSL_version_str = OPENSSL_VERSION_TEXT; |
| 161 | 162 | ||
| @@ -2173,8 +2174,11 @@ ssl_get_server_send_cert(const SSL *s) | |||
| 2173 | } | 2174 | } |
| 2174 | 2175 | ||
| 2175 | EVP_PKEY * | 2176 | EVP_PKEY * |
| 2176 | ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd) | 2177 | ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd, |
| 2178 | const struct ssl_sigalg **sap) | ||
| 2177 | { | 2179 | { |
| 2180 | const struct ssl_sigalg *sigalg = NULL; | ||
| 2181 | EVP_PKEY *pkey = NULL; | ||
| 2178 | unsigned long alg_a; | 2182 | unsigned long alg_a; |
| 2179 | CERT *c; | 2183 | CERT *c; |
| 2180 | int idx = -1; | 2184 | int idx = -1; |
| @@ -2194,9 +2198,27 @@ ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd) | |||
| 2194 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 2198 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
| 2195 | return (NULL); | 2199 | return (NULL); |
| 2196 | } | 2200 | } |
| 2197 | if (pmd) | 2201 | |
| 2198 | *pmd = c->pkeys[idx].digest; | 2202 | pkey = c->pkeys[idx].privatekey; |
| 2199 | return (c->pkeys[idx].privatekey); | 2203 | sigalg = c->pkeys[idx].sigalg; |
| 2204 | if (!SSL_USE_SIGALGS(s)) { | ||
| 2205 | if (pkey->type == EVP_PKEY_RSA) { | ||
| 2206 | sigalg = ssl_sigalg_lookup(SIGALG_RSA_PKCS1_SHA1); | ||
| 2207 | } else if (pkey->type == EVP_PKEY_EC) { | ||
| 2208 | sigalg = ssl_sigalg_lookup(SIGALG_ECDSA_SHA1); | ||
| 2209 | } else { | ||
| 2210 | SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE); | ||
| 2211 | return (NULL); | ||
| 2212 | } | ||
| 2213 | } | ||
| 2214 | if (sigalg == NULL) { | ||
| 2215 | SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR); | ||
| 2216 | return (NULL); | ||
| 2217 | } | ||
| 2218 | *pmd = sigalg->md(); | ||
| 2219 | *sap = sigalg; | ||
| 2220 | |||
| 2221 | return (pkey); | ||
| 2200 | } | 2222 | } |
| 2201 | 2223 | ||
| 2202 | DH * | 2224 | DH * |
| @@ -2810,9 +2832,9 @@ SSL_set_SSL_CTX(SSL *ssl, SSL_CTX* ctx) | |||
| 2810 | ssl->cert = ssl_cert_dup(ctx->internal->cert); | 2832 | ssl->cert = ssl_cert_dup(ctx->internal->cert); |
| 2811 | if (ocert != NULL) { | 2833 | if (ocert != NULL) { |
| 2812 | int i; | 2834 | int i; |
| 2813 | /* Copy negotiated digests from original certificate. */ | 2835 | /* Copy negotiated sigalg from original certificate. */ |
| 2814 | for (i = 0; i < SSL_PKEY_NUM; i++) | 2836 | for (i = 0; i < SSL_PKEY_NUM; i++) |
| 2815 | ssl->cert->pkeys[i].digest = ocert->pkeys[i].digest; | 2837 | ssl->cert->pkeys[i].sigalg = ocert->pkeys[i].sigalg; |
| 2816 | ssl_cert_free(ocert); | 2838 | ssl_cert_free(ocert); |
| 2817 | } | 2839 | } |
| 2818 | CRYPTO_add(&ctx->references, 1, CRYPTO_LOCK_SSL_CTX); | 2840 | CRYPTO_add(&ctx->references, 1, CRYPTO_LOCK_SSL_CTX); |
