diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libssl/ssl_clnt.c | 10 | ||||
-rw-r--r-- | src/lib/libssl/ssl_kex.c | 16 | ||||
-rw-r--r-- | src/lib/libssl/ssl_locl.h | 4 |
3 files changed, 22 insertions, 8 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c index b349f24cb0..04b3132d35 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.120 2021/11/29 16:00:32 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_clnt.c,v 1.121 2021/12/04 13:15:10 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,6 +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 | SESS_CERT *sc = NULL; | 1227 | SESS_CERT *sc = NULL; |
1227 | DH *dh = NULL; | 1228 | DH *dh = NULL; |
1228 | long alg_a; | 1229 | long alg_a; |
@@ -1235,7 +1236,7 @@ ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, CBS *cbs) | |||
1235 | 1236 | ||
1236 | if (!ssl_kex_peer_params_dhe(dh, cbs)) | 1237 | if (!ssl_kex_peer_params_dhe(dh, cbs)) |
1237 | goto decode_err; | 1238 | goto decode_err; |
1238 | if (!ssl_kex_peer_public_dhe(dh, cbs)) | 1239 | if (!ssl_kex_peer_public_dhe(dh, cbs, &invalid_key)) |
1239 | goto decode_err; | 1240 | goto decode_err; |
1240 | 1241 | ||
1241 | /* | 1242 | /* |
@@ -1246,6 +1247,11 @@ ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, CBS *cbs) | |||
1246 | SSLerror(s, SSL_R_BAD_DH_P_LENGTH); | 1247 | SSLerror(s, SSL_R_BAD_DH_P_LENGTH); |
1247 | goto err; | 1248 | goto err; |
1248 | } | 1249 | } |
1250 | if (invalid_key) { | ||
1251 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER); | ||
1252 | SSLerror(s, SSL_R_BAD_DH_PUB_KEY_LENGTH); | ||
1253 | goto err; | ||
1254 | } | ||
1249 | 1255 | ||
1250 | if (alg_a & SSL_aRSA) | 1256 | if (alg_a & SSL_aRSA) |
1251 | *pkey = X509_get_pubkey(sc->peer_pkeys[SSL_PKEY_RSA].x509); | 1257 | *pkey = X509_get_pubkey(sc->peer_pkeys[SSL_PKEY_RSA].x509); |
diff --git a/src/lib/libssl/ssl_kex.c b/src/lib/libssl/ssl_kex.c index 9af440d827..68d83cedbe 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.5 2021/11/30 18:17:03 tb Exp $ */ | 1 | /* $OpenBSD: ssl_kex.c,v 1.6 2021/12/04 13:15:10 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -142,23 +142,31 @@ ssl_kex_peer_params_dhe(DH *dh, CBS *cbs) | |||
142 | } | 142 | } |
143 | 143 | ||
144 | int | 144 | int |
145 | ssl_kex_peer_public_dhe(DH *dh, CBS *cbs) | 145 | ssl_kex_peer_public_dhe(DH *dh, CBS *cbs, int *invalid_key) |
146 | { | 146 | { |
147 | CBS dh_y; | ||
148 | BIGNUM *pub_key = NULL; | 147 | BIGNUM *pub_key = NULL; |
148 | int check_flags; | ||
149 | CBS dh_y; | ||
149 | int ret = 0; | 150 | int ret = 0; |
150 | 151 | ||
152 | *invalid_key = 0; | ||
153 | |||
151 | if (!CBS_get_u16_length_prefixed(cbs, &dh_y)) | 154 | if (!CBS_get_u16_length_prefixed(cbs, &dh_y)) |
152 | goto err; | 155 | goto err; |
156 | |||
153 | if ((pub_key = BN_bin2bn(CBS_data(&dh_y), CBS_len(&dh_y), | 157 | if ((pub_key = BN_bin2bn(CBS_data(&dh_y), CBS_len(&dh_y), |
154 | NULL)) == NULL) | 158 | NULL)) == NULL) |
155 | goto err; | 159 | goto err; |
156 | 160 | ||
157 | if (!DH_set0_key(dh, pub_key, NULL)) | 161 | if (!DH_set0_key(dh, pub_key, NULL)) |
158 | goto err; | 162 | goto err; |
159 | |||
160 | pub_key = NULL; | 163 | pub_key = NULL; |
161 | 164 | ||
165 | if (!DH_check_pub_key(dh, dh->pub_key, &check_flags)) | ||
166 | goto err; | ||
167 | if (check_flags != 0) | ||
168 | *invalid_key = 1; | ||
169 | |||
162 | ret = 1; | 170 | ret = 1; |
163 | 171 | ||
164 | err: | 172 | err: |
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 7810bcd05e..93bdd2a4fc 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.369 2021/11/29 16:00:32 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.370 2021/12/04 13:15:10 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 | * |
@@ -1451,7 +1451,7 @@ 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); |
1454 | int ssl_kex_peer_public_dhe(DH *dh, CBS *cbs); | 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); |
1457 | 1457 | ||