summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2021-12-04 13:50:35 +0000
committerjsing <>2021-12-04 13:50:35 +0000
commit7747938abe289fe6b8f9dd672e16cfcfcbdf8c95 (patch)
tree9582d14747bb622033ba4dc27bec767bf5525dd5
parent8f4c834e03d9c77686f81fede7b078f868e1c6af (diff)
downloadopenbsd-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.c13
-rw-r--r--src/lib/libssl/ssl_kex.c16
-rw-r--r--src/lib/libssl/ssl_locl.h4
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)
1223static int 1223static int
1224ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, CBS *cbs) 1224ssl3_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
28int 30int
29ssl_kex_generate_dhe(DH *dh, DH *dh_params) 31ssl_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
112int 114int
113ssl_kex_peer_params_dhe(DH *dh, CBS *cbs) 115ssl_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);
1450int ssl_kex_generate_dhe(DH *dh, DH *dh_params); 1450int ssl_kex_generate_dhe(DH *dh, DH *dh_params);
1451int ssl_kex_params_dhe(DH *dh, CBB *cbb); 1451int ssl_kex_params_dhe(DH *dh, CBB *cbb);
1452int ssl_kex_public_dhe(DH *dh, CBB *cbb); 1452int ssl_kex_public_dhe(DH *dh, CBB *cbb);
1453int ssl_kex_peer_params_dhe(DH *dh, CBS *cbs); 1453int ssl_kex_peer_params_dhe(DH *dh, CBS *cbs, int *invalid_params);
1454int ssl_kex_peer_public_dhe(DH *dh, CBS *cbs, int *invalid_key); 1454int ssl_kex_peer_public_dhe(DH *dh, CBS *cbs, int *invalid_key);
1455int ssl_kex_derive_dhe(DH *dh, DH *dh_peer, 1455int 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);