diff options
| author | jsing <> | 2021-12-04 14:03:22 +0000 |
|---|---|---|
| committer | jsing <> | 2021-12-04 14:03:22 +0000 |
| commit | bf25270f211959971f21e6ed6de4e9e6fb8203df (patch) | |
| tree | eaa42a538f5b252c276e4477b5f4bd6b0fd7a981 /src/lib/libssl/ssl_lib.c | |
| parent | a7be05548462713cbeb4cf681b6418ae0f41516f (diff) | |
| download | openbsd-bf25270f211959971f21e6ed6de4e9e6fb8203df.tar.gz openbsd-bf25270f211959971f21e6ed6de4e9e6fb8203df.tar.bz2 openbsd-bf25270f211959971f21e6ed6de4e9e6fb8203df.zip | |
Clean up and refactor server side DHE key exchange.
Provide ssl_kex_generate_dhe_params_auto() which handles DHE key generation
based on parameters determined by the specified key bits. Convert the
existing DHE auto parameter selection code into a function that just tells
us how many key bits to use.
Untangle and rework the server side DHE key exchange to use the ssl_kex_*
functions.
ok inoguchi@ tb@
Diffstat (limited to 'src/lib/libssl/ssl_lib.c')
| -rw-r--r-- | src/lib/libssl/ssl_lib.c | 50 |
1 files changed, 12 insertions, 38 deletions
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index 662013378e..a0d3d05775 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.279 2021/11/14 22:31:29 tb Exp $ */ | 1 | /* $OpenBSD: ssl_lib.c,v 1.280 2021/12/04 14:03:22 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 | * |
| @@ -147,7 +147,6 @@ | |||
| 147 | #include <limits.h> | 147 | #include <limits.h> |
| 148 | #include <stdio.h> | 148 | #include <stdio.h> |
| 149 | 149 | ||
| 150 | #include <openssl/bn.h> | ||
| 151 | #include <openssl/dh.h> | 150 | #include <openssl/dh.h> |
| 152 | #include <openssl/lhash.h> | 151 | #include <openssl/lhash.h> |
| 153 | #include <openssl/objects.h> | 152 | #include <openssl/objects.h> |
| @@ -2319,54 +2318,29 @@ ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd, | |||
| 2319 | return (pkey); | 2318 | return (pkey); |
| 2320 | } | 2319 | } |
| 2321 | 2320 | ||
| 2322 | DH * | 2321 | size_t |
| 2323 | ssl_get_auto_dh(SSL *s) | 2322 | ssl_dhe_params_auto_key_bits(SSL *s) |
| 2324 | { | 2323 | { |
| 2325 | CERT_PKEY *cpk; | 2324 | CERT_PKEY *cpk; |
| 2326 | int keylen; | 2325 | int key_bits; |
| 2327 | DH *dhp; | ||
| 2328 | 2326 | ||
| 2329 | if (s->cert->dh_tmp_auto == 2) { | 2327 | if (s->cert->dh_tmp_auto == 2) { |
| 2330 | keylen = 1024; | 2328 | key_bits = 1024; |
| 2331 | } else if (S3I(s)->hs.cipher->algorithm_auth & SSL_aNULL) { | 2329 | } else if (S3I(s)->hs.cipher->algorithm_auth & SSL_aNULL) { |
| 2332 | keylen = 1024; | 2330 | key_bits = 1024; |
| 2333 | if (S3I(s)->hs.cipher->strength_bits == 256) | 2331 | if (S3I(s)->hs.cipher->strength_bits == 256) |
| 2334 | keylen = 3072; | 2332 | key_bits = 3072; |
| 2335 | } else { | 2333 | } else { |
| 2336 | if ((cpk = ssl_get_server_send_pkey(s)) == NULL) | 2334 | if ((cpk = ssl_get_server_send_pkey(s)) == NULL) |
| 2337 | return (NULL); | 2335 | return 0; |
| 2338 | if (cpk->privatekey == NULL || | 2336 | if (cpk->privatekey == NULL || |
| 2339 | EVP_PKEY_get0_RSA(cpk->privatekey) == NULL) | 2337 | EVP_PKEY_get0_RSA(cpk->privatekey) == NULL) |
| 2340 | return (NULL); | 2338 | return 0; |
| 2341 | if ((keylen = EVP_PKEY_bits(cpk->privatekey)) <= 0) | 2339 | if ((key_bits = EVP_PKEY_bits(cpk->privatekey)) <= 0) |
| 2342 | return (NULL); | 2340 | return 0; |
| 2343 | } | 2341 | } |
| 2344 | 2342 | ||
| 2345 | if ((dhp = DH_new()) == NULL) | 2343 | return key_bits; |
| 2346 | return (NULL); | ||
| 2347 | |||
| 2348 | dhp->g = BN_new(); | ||
| 2349 | if (dhp->g != NULL) | ||
| 2350 | BN_set_word(dhp->g, 2); | ||
| 2351 | |||
| 2352 | if (keylen >= 8192) | ||
| 2353 | dhp->p = get_rfc3526_prime_8192(NULL); | ||
| 2354 | else if (keylen >= 4096) | ||
| 2355 | dhp->p = get_rfc3526_prime_4096(NULL); | ||
| 2356 | else if (keylen >= 3072) | ||
| 2357 | dhp->p = get_rfc3526_prime_3072(NULL); | ||
| 2358 | else if (keylen >= 2048) | ||
| 2359 | dhp->p = get_rfc3526_prime_2048(NULL); | ||
| 2360 | else if (keylen >= 1536) | ||
| 2361 | dhp->p = get_rfc3526_prime_1536(NULL); | ||
| 2362 | else | ||
| 2363 | dhp->p = get_rfc2409_prime_1024(NULL); | ||
| 2364 | |||
| 2365 | if (dhp->p == NULL || dhp->g == NULL) { | ||
| 2366 | DH_free(dhp); | ||
| 2367 | return (NULL); | ||
| 2368 | } | ||
| 2369 | return (dhp); | ||
| 2370 | } | 2344 | } |
| 2371 | 2345 | ||
| 2372 | static int | 2346 | static int |
