summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_lib.c
diff options
context:
space:
mode:
authorjsing <>2014-10-31 15:25:55 +0000
committerjsing <>2014-10-31 15:25:55 +0000
commitcd2b36b32fa0f08a47812cf4bc77f005cbba8fc4 (patch)
tree10ac57418996f21ce78687efb7443c1a142dd4a1 /src/lib/libssl/ssl_lib.c
parent911a534951a7133a0e7f2314d3a57682c584c2f7 (diff)
downloadopenbsd-cd2b36b32fa0f08a47812cf4bc77f005cbba8fc4.tar.gz
openbsd-cd2b36b32fa0f08a47812cf4bc77f005cbba8fc4.tar.bz2
openbsd-cd2b36b32fa0f08a47812cf4bc77f005cbba8fc4.zip
Add support for automatic DH ephemeral keys.
This allows an SSL server to enable DHE ciphers with a single setting, which results in an DH key being generated based on the server key length. Partly based on OpenSSL.
Diffstat (limited to 'src/lib/libssl/ssl_lib.c')
-rw-r--r--src/lib/libssl/ssl_lib.c53
1 files changed, 51 insertions, 2 deletions
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c
index 579c005cc3..078a710c33 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.88 2014/10/31 14:51:01 jsing Exp $ */ 1/* $OpenBSD: ssl_lib.c,v 1.89 2014/10/31 15:25:55 jsing 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 *
@@ -1942,7 +1942,8 @@ ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher)
1942 if (c == NULL) 1942 if (c == NULL)
1943 return; 1943 return;
1944 1944
1945 dh_tmp = (c->dh_tmp != NULL || c->dh_tmp_cb != NULL); 1945 dh_tmp = (c->dh_tmp != NULL || c->dh_tmp_cb != NULL ||
1946 c->dh_tmp_auto != 0);
1946 1947
1947 have_ecdh_tmp = (c->ecdh_tmp != NULL || c->ecdh_tmp_cb != NULL || 1948 have_ecdh_tmp = (c->ecdh_tmp != NULL || c->ecdh_tmp_cb != NULL ||
1948 c->ecdh_tmp_auto != 0); 1949 c->ecdh_tmp_auto != 0);
@@ -2176,6 +2177,54 @@ ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd)
2176 return (c->pkeys[idx].privatekey); 2177 return (c->pkeys[idx].privatekey);
2177} 2178}
2178 2179
2180DH *
2181ssl_get_auto_dh(SSL *s)
2182{
2183 CERT_PKEY *cpk;
2184 int keylen;
2185 DH *dhp;
2186
2187 if (s->cert->dh_tmp_auto == 2) {
2188 keylen = 1024;
2189 } else if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) {
2190 keylen = 1024;
2191 if (s->s3->tmp.new_cipher->strength_bits == 256)
2192 keylen = 3072;
2193 } else {
2194 if ((cpk = ssl_get_server_send_pkey(s)) == NULL)
2195 return (NULL);
2196 if (cpk->privatekey == NULL || cpk->privatekey->pkey.dh == NULL)
2197 return (NULL);
2198 keylen = EVP_PKEY_bits(cpk->privatekey);
2199 }
2200
2201 if ((dhp = DH_new()) == NULL)
2202 return (NULL);
2203
2204 dhp->g = BN_new();
2205 if (dhp->g != NULL)
2206 BN_set_word(dhp->g, 2);
2207
2208 if (keylen >= 8192)
2209 dhp->p = get_rfc3526_prime_8192(NULL);
2210 else if (keylen >= 4096)
2211 dhp->p = get_rfc3526_prime_4096(NULL);
2212 else if (keylen >= 3072)
2213 dhp->p = get_rfc3526_prime_3072(NULL);
2214 else if (keylen >= 2048)
2215 dhp->p = get_rfc3526_prime_2048(NULL);
2216 else if (keylen >= 1536)
2217 dhp->p = get_rfc3526_prime_1536(NULL);
2218 else
2219 dhp->p = get_rfc2409_prime_1024(NULL);
2220
2221 if (dhp->p == NULL || dhp->g == NULL) {
2222 DH_free(dhp);
2223 return (NULL);
2224 }
2225 return (dhp);
2226}
2227
2179void 2228void
2180ssl_update_cache(SSL *s, int mode) 2229ssl_update_cache(SSL *s, int mode)
2181{ 2230{