diff options
author | jsing <> | 2021-12-04 13:50:35 +0000 |
---|---|---|
committer | jsing <> | 2021-12-04 13:50:35 +0000 |
commit | 7747938abe289fe6b8f9dd672e16cfcfcbdf8c95 (patch) | |
tree | 9582d14747bb622033ba4dc27bec767bf5525dd5 | |
parent | 8f4c834e03d9c77686f81fede7b078f868e1c6af (diff) | |
download | openbsd-7747938abe289fe6b8f9dd672e16cfcfcbdf8c95.tar.gz openbsd-7747938abe289fe6b8f9dd672e16cfcfcbdf8c95.tar.bz2 openbsd-7747938abe289fe6b8f9dd672e16cfcfcbdf8c95.zip |
Move the minimum DHE key size check into ssl_kex_peer_params_dhe()
ok inoguchi@ tb@
-rw-r--r-- | src/lib/libssl/ssl_clnt.c | 13 | ||||
-rw-r--r-- | src/lib/libssl/ssl_kex.c | 16 | ||||
-rw-r--r-- | src/lib/libssl/ssl_locl.h | 4 |
3 files changed, 19 insertions, 14 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c index 04b3132d35..a3c78096f7 100644 --- a/src/lib/libssl/ssl_clnt.c +++ b/src/lib/libssl/ssl_clnt.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_clnt.c,v 1.121 2021/12/04 13:15:10 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_clnt.c,v 1.122 2021/12/04 13:50:35 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 | * |
@@ -1223,7 +1223,7 @@ ssl3_get_server_certificate(SSL *s) | |||
1223 | static int | 1223 | static int |
1224 | ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, CBS *cbs) | 1224 | ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, CBS *cbs) |
1225 | { | 1225 | { |
1226 | int invalid_key; | 1226 | int invalid_params, invalid_key; |
1227 | SESS_CERT *sc = NULL; | 1227 | SESS_CERT *sc = NULL; |
1228 | DH *dh = NULL; | 1228 | DH *dh = NULL; |
1229 | long alg_a; | 1229 | long alg_a; |
@@ -1234,16 +1234,13 @@ ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, CBS *cbs) | |||
1234 | if ((dh = DH_new()) == NULL) | 1234 | if ((dh = DH_new()) == NULL) |
1235 | goto err; | 1235 | goto err; |
1236 | 1236 | ||
1237 | if (!ssl_kex_peer_params_dhe(dh, cbs)) | 1237 | if (!ssl_kex_peer_params_dhe(dh, cbs, &invalid_params)) |
1238 | goto decode_err; | 1238 | goto decode_err; |
1239 | if (!ssl_kex_peer_public_dhe(dh, cbs, &invalid_key)) | 1239 | if (!ssl_kex_peer_public_dhe(dh, cbs, &invalid_key)) |
1240 | goto decode_err; | 1240 | goto decode_err; |
1241 | 1241 | ||
1242 | /* | 1242 | if (invalid_params) { |
1243 | * Check the strength of the DH key just constructed. | 1243 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER); |
1244 | * Reject keys weaker than 1024 bits. | ||
1245 | */ | ||
1246 | if (DH_size(dh) < 1024 / 8) { | ||
1247 | SSLerror(s, SSL_R_BAD_DH_P_LENGTH); | 1244 | SSLerror(s, SSL_R_BAD_DH_P_LENGTH); |
1248 | goto err; | 1245 | goto err; |
1249 | } | 1246 | } |
diff --git a/src/lib/libssl/ssl_kex.c b/src/lib/libssl/ssl_kex.c index 68d83cedbe..639981bec9 100644 --- a/src/lib/libssl/ssl_kex.c +++ b/src/lib/libssl/ssl_kex.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_kex.c,v 1.6 2021/12/04 13:15:10 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_kex.c,v 1.7 2021/12/04 13:50:35 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -25,6 +25,8 @@ | |||
25 | 25 | ||
26 | #include "bytestring.h" | 26 | #include "bytestring.h" |
27 | 27 | ||
28 | #define DHE_MINIMUM_BITS 1024 | ||
29 | |||
28 | int | 30 | int |
29 | ssl_kex_generate_dhe(DH *dh, DH *dh_params) | 31 | ssl_kex_generate_dhe(DH *dh, DH *dh_params) |
30 | { | 32 | { |
@@ -110,12 +112,14 @@ ssl_kex_public_dhe(DH *dh, CBB *cbb) | |||
110 | } | 112 | } |
111 | 113 | ||
112 | int | 114 | int |
113 | ssl_kex_peer_params_dhe(DH *dh, CBS *cbs) | 115 | ssl_kex_peer_params_dhe(DH *dh, CBS *cbs, int *invalid_params) |
114 | { | 116 | { |
115 | CBS dh_p, dh_g; | ||
116 | BIGNUM *p = NULL, *g = NULL; | 117 | BIGNUM *p = NULL, *g = NULL; |
118 | CBS dh_p, dh_g; | ||
117 | int ret = 0; | 119 | int ret = 0; |
118 | 120 | ||
121 | *invalid_params = 0; | ||
122 | |||
119 | if (!CBS_get_u16_length_prefixed(cbs, &dh_p)) | 123 | if (!CBS_get_u16_length_prefixed(cbs, &dh_p)) |
120 | goto err; | 124 | goto err; |
121 | if (!CBS_get_u16_length_prefixed(cbs, &dh_g)) | 125 | if (!CBS_get_u16_length_prefixed(cbs, &dh_g)) |
@@ -128,10 +132,14 @@ ssl_kex_peer_params_dhe(DH *dh, CBS *cbs) | |||
128 | 132 | ||
129 | if (!DH_set0_pqg(dh, p, NULL, g)) | 133 | if (!DH_set0_pqg(dh, p, NULL, g)) |
130 | goto err; | 134 | goto err; |
131 | |||
132 | p = NULL; | 135 | p = NULL; |
133 | g = NULL; | 136 | g = NULL; |
134 | 137 | ||
138 | /* XXX - consider calling DH_check(). */ | ||
139 | |||
140 | if (DH_bits(dh) < DHE_MINIMUM_BITS) | ||
141 | *invalid_params = 1; | ||
142 | |||
135 | ret = 1; | 143 | ret = 1; |
136 | 144 | ||
137 | err: | 145 | err: |
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 93bdd2a4fc..0051989ea0 100644 --- a/src/lib/libssl/ssl_locl.h +++ b/src/lib/libssl/ssl_locl.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_locl.h,v 1.370 2021/12/04 13:15:10 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.371 2021/12/04 13:50:35 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 | * |
@@ -1450,7 +1450,7 @@ int ssl3_get_cert_verify(SSL *s); | |||
1450 | int ssl_kex_generate_dhe(DH *dh, DH *dh_params); | 1450 | int ssl_kex_generate_dhe(DH *dh, DH *dh_params); |
1451 | int ssl_kex_params_dhe(DH *dh, CBB *cbb); | 1451 | int ssl_kex_params_dhe(DH *dh, CBB *cbb); |
1452 | int ssl_kex_public_dhe(DH *dh, CBB *cbb); | 1452 | int ssl_kex_public_dhe(DH *dh, CBB *cbb); |
1453 | int ssl_kex_peer_params_dhe(DH *dh, CBS *cbs); | 1453 | int ssl_kex_peer_params_dhe(DH *dh, CBS *cbs, int *invalid_params); |
1454 | int ssl_kex_peer_public_dhe(DH *dh, CBS *cbs, int *invalid_key); | 1454 | int ssl_kex_peer_public_dhe(DH *dh, CBS *cbs, int *invalid_key); |
1455 | int ssl_kex_derive_dhe(DH *dh, DH *dh_peer, | 1455 | int ssl_kex_derive_dhe(DH *dh, DH *dh_peer, |
1456 | uint8_t **shared_key, size_t *shared_key_len); | 1456 | uint8_t **shared_key, size_t *shared_key_len); |