diff options
author | jsing <> | 2014-10-31 15:25:55 +0000 |
---|---|---|
committer | jsing <> | 2014-10-31 15:25:55 +0000 |
commit | cd2b36b32fa0f08a47812cf4bc77f005cbba8fc4 (patch) | |
tree | 10ac57418996f21ce78687efb7443c1a142dd4a1 /src/lib/libssl/ssl_lib.c | |
parent | 911a534951a7133a0e7f2314d3a57682c584c2f7 (diff) | |
download | openbsd-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.c | 53 |
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 | ||
2180 | DH * | ||
2181 | ssl_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 | |||
2179 | void | 2228 | void |
2180 | ssl_update_cache(SSL *s, int mode) | 2229 | ssl_update_cache(SSL *s, int mode) |
2181 | { | 2230 | { |