summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2021-12-04 13:15:10 +0000
committerjsing <>2021-12-04 13:15:10 +0000
commit8f4c834e03d9c77686f81fede7b078f868e1c6af (patch)
treed834bc34e0b51572c243f906b3c3e92c5b05757d
parent2cc0fc288373b6ab8c6026c278c2dae4e7c7b4f2 (diff)
downloadopenbsd-8f4c834e03d9c77686f81fede7b078f868e1c6af.tar.gz
openbsd-8f4c834e03d9c77686f81fede7b078f868e1c6af.tar.bz2
openbsd-8f4c834e03d9c77686f81fede7b078f868e1c6af.zip
Check DH public key in ssl_kex_peer_public_dhe().
Call DH_check_pub_key() after decoding the peer public key - this will be needed for the server DHE key exchange, but also benefits the client. ok inoguchi@ tb@
-rw-r--r--src/lib/libssl/ssl_clnt.c10
-rw-r--r--src/lib/libssl/ssl_kex.c16
-rw-r--r--src/lib/libssl/ssl_locl.h4
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)
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 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
144int 144int
145ssl_kex_peer_public_dhe(DH *dh, CBS *cbs) 145ssl_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);
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);
1454int ssl_kex_peer_public_dhe(DH *dh, CBS *cbs); 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);
1457 1457