diff options
| author | jsing <> | 2014-10-31 15:25:55 +0000 |
|---|---|---|
| committer | jsing <> | 2014-10-31 15:25:55 +0000 |
| commit | 0da99f89c646309c2093dbe094b8dc7d568cdfd7 (patch) | |
| tree | 10ac57418996f21ce78687efb7443c1a142dd4a1 /src/lib/libssl/ssl_lib.c | |
| parent | 7abf5bb08462c2b7ad3caf4e4fd4601fa2098700 (diff) | |
| download | openbsd-0da99f89c646309c2093dbe094b8dc7d568cdfd7.tar.gz openbsd-0da99f89c646309c2093dbe094b8dc7d568cdfd7.tar.bz2 openbsd-0da99f89c646309c2093dbe094b8dc7d568cdfd7.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 '')
| -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 | { |
