summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_lib.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libssl/ssl_lib.c36
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
160const char *SSL_version_str = OPENSSL_VERSION_TEXT; 161const 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
2175EVP_PKEY * 2176EVP_PKEY *
2176ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd) 2177ssl_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
2202DH * 2224DH *
@@ -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);