diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libssl/ssl_clnt.c | 84 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_kex.c | 145 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_locl.h | 10 |
3 files changed, 173 insertions, 66 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c index 6fe15dcf1d..b349f24cb0 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.119 2021/11/26 16:41:42 tb Exp $ */ | 1 | /* $OpenBSD: ssl_clnt.c,v 1.120 2021/11/29 16:00:32 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,46 +1223,24 @@ 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 | CBS dhp, dhg, dhpk; | ||
| 1227 | BN_CTX *bn_ctx = NULL; | ||
| 1228 | SESS_CERT *sc = NULL; | 1226 | SESS_CERT *sc = NULL; |
| 1229 | DH *dh = NULL; | 1227 | DH *dh = NULL; |
| 1230 | long alg_a; | 1228 | long alg_a; |
| 1231 | int al; | ||
| 1232 | 1229 | ||
| 1233 | alg_a = S3I(s)->hs.cipher->algorithm_auth; | 1230 | alg_a = S3I(s)->hs.cipher->algorithm_auth; |
| 1234 | sc = s->session->sess_cert; | 1231 | sc = s->session->sess_cert; |
| 1235 | 1232 | ||
| 1236 | if ((dh = DH_new()) == NULL) { | 1233 | if ((dh = DH_new()) == NULL) |
| 1237 | SSLerror(s, ERR_R_DH_LIB); | ||
| 1238 | goto err; | ||
| 1239 | } | ||
| 1240 | |||
| 1241 | if (!CBS_get_u16_length_prefixed(cbs, &dhp)) | ||
| 1242 | goto decode_err; | ||
| 1243 | if ((dh->p = BN_bin2bn(CBS_data(&dhp), CBS_len(&dhp), NULL)) == NULL) { | ||
| 1244 | SSLerror(s, ERR_R_BN_LIB); | ||
| 1245 | goto err; | 1234 | goto err; |
| 1246 | } | ||
| 1247 | 1235 | ||
| 1248 | if (!CBS_get_u16_length_prefixed(cbs, &dhg)) | 1236 | if (!ssl_kex_peer_params_dhe(dh, cbs)) |
| 1249 | goto decode_err; | 1237 | goto decode_err; |
| 1250 | if ((dh->g = BN_bin2bn(CBS_data(&dhg), CBS_len(&dhg), NULL)) == NULL) { | 1238 | if (!ssl_kex_peer_public_dhe(dh, cbs)) |
| 1251 | SSLerror(s, ERR_R_BN_LIB); | ||
| 1252 | goto err; | ||
| 1253 | } | ||
| 1254 | |||
| 1255 | if (!CBS_get_u16_length_prefixed(cbs, &dhpk)) | ||
| 1256 | goto decode_err; | 1239 | goto decode_err; |
| 1257 | if ((dh->pub_key = BN_bin2bn(CBS_data(&dhpk), CBS_len(&dhpk), | ||
| 1258 | NULL)) == NULL) { | ||
| 1259 | SSLerror(s, ERR_R_BN_LIB); | ||
| 1260 | goto err; | ||
| 1261 | } | ||
| 1262 | 1240 | ||
| 1263 | /* | 1241 | /* |
| 1264 | * Check the strength of the DH key just constructed. | 1242 | * Check the strength of the DH key just constructed. |
| 1265 | * Discard keys weaker than 1024 bits. | 1243 | * Reject keys weaker than 1024 bits. |
| 1266 | */ | 1244 | */ |
| 1267 | if (DH_size(dh) < 1024 / 8) { | 1245 | if (DH_size(dh) < 1024 / 8) { |
| 1268 | SSLerror(s, SSL_R_BAD_DH_P_LENGTH); | 1246 | SSLerror(s, SSL_R_BAD_DH_P_LENGTH); |
| @@ -1280,13 +1258,11 @@ ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, CBS *cbs) | |||
| 1280 | return (1); | 1258 | return (1); |
| 1281 | 1259 | ||
| 1282 | decode_err: | 1260 | decode_err: |
| 1283 | al = SSL_AD_DECODE_ERROR; | ||
| 1284 | SSLerror(s, SSL_R_BAD_PACKET_LENGTH); | 1261 | SSLerror(s, SSL_R_BAD_PACKET_LENGTH); |
| 1285 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1262 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); |
| 1286 | 1263 | ||
| 1287 | err: | 1264 | err: |
| 1288 | DH_free(dh); | 1265 | DH_free(dh); |
| 1289 | BN_CTX_free(bn_ctx); | ||
| 1290 | 1266 | ||
| 1291 | return (-1); | 1267 | return (-1); |
| 1292 | } | 1268 | } |
| @@ -1988,59 +1964,38 @@ ssl3_send_client_kex_rsa(SSL *s, SESS_CERT *sess_cert, CBB *cbb) | |||
| 1988 | static int | 1964 | static int |
| 1989 | ssl3_send_client_kex_dhe(SSL *s, SESS_CERT *sess_cert, CBB *cbb) | 1965 | ssl3_send_client_kex_dhe(SSL *s, SESS_CERT *sess_cert, CBB *cbb) |
| 1990 | { | 1966 | { |
| 1991 | DH *dh_srvr = NULL, *dh_clnt = NULL; | 1967 | DH *dh_clnt = NULL; |
| 1992 | unsigned char *key = NULL; | 1968 | DH *dh_srvr; |
| 1993 | int key_size = 0, key_len; | 1969 | uint8_t *key = NULL; |
| 1994 | unsigned char *data; | 1970 | size_t key_len = 0; |
| 1995 | int ret = -1; | 1971 | int ret = -1; |
| 1996 | CBB dh_Yc; | ||
| 1997 | 1972 | ||
| 1998 | /* Ensure that we have an ephemeral key for DHE. */ | 1973 | /* Ensure that we have an ephemeral key from the server for DHE. */ |
| 1999 | if (sess_cert->peer_dh_tmp == NULL) { | 1974 | if ((dh_srvr = sess_cert->peer_dh_tmp) == NULL) { |
| 2000 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | 1975 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); |
| 2001 | SSLerror(s, SSL_R_UNABLE_TO_FIND_DH_PARAMETERS); | 1976 | SSLerror(s, SSL_R_UNABLE_TO_FIND_DH_PARAMETERS); |
| 2002 | goto err; | 1977 | goto err; |
| 2003 | } | 1978 | } |
| 2004 | dh_srvr = sess_cert->peer_dh_tmp; | ||
| 2005 | 1979 | ||
| 2006 | /* Generate a new random key. */ | 1980 | if ((dh_clnt = DH_new()) == NULL) |
| 2007 | if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) { | ||
| 2008 | SSLerror(s, ERR_R_DH_LIB); | ||
| 2009 | goto err; | 1981 | goto err; |
| 2010 | } | 1982 | |
| 2011 | if (!DH_generate_key(dh_clnt)) { | 1983 | if (!ssl_kex_generate_dhe(dh_clnt, dh_srvr)) |
| 2012 | SSLerror(s, ERR_R_DH_LIB); | ||
| 2013 | goto err; | ||
| 2014 | } | ||
| 2015 | if ((key_size = DH_size(dh_clnt)) <= 0) { | ||
| 2016 | SSLerror(s, ERR_R_DH_LIB); | ||
| 2017 | goto err; | ||
| 2018 | } | ||
| 2019 | if ((key = malloc(key_size)) == NULL) { | ||
| 2020 | SSLerror(s, ERR_R_MALLOC_FAILURE); | ||
| 2021 | goto err; | 1984 | goto err; |
| 2022 | } | 1985 | if (!ssl_kex_public_dhe(dh_clnt, cbb)) |
| 2023 | if ((key_len = DH_compute_key(key, dh_srvr->pub_key, dh_clnt)) <= 0) { | ||
| 2024 | SSLerror(s, ERR_R_DH_LIB); | ||
| 2025 | goto err; | 1986 | goto err; |
| 2026 | } | ||
| 2027 | 1987 | ||
| 2028 | if (!tls12_derive_master_secret(s, key, key_len)) | 1988 | if (!ssl_kex_derive_dhe(dh_clnt, dh_srvr, &key, &key_len)) |
| 2029 | goto err; | 1989 | goto err; |
| 2030 | 1990 | ||
| 2031 | if (!CBB_add_u16_length_prefixed(cbb, &dh_Yc)) | 1991 | if (!tls12_derive_master_secret(s, key, key_len)) |
| 2032 | goto err; | ||
| 2033 | if (!CBB_add_space(&dh_Yc, &data, BN_num_bytes(dh_clnt->pub_key))) | ||
| 2034 | goto err; | ||
| 2035 | BN_bn2bin(dh_clnt->pub_key, data); | ||
| 2036 | if (!CBB_flush(cbb)) | ||
| 2037 | goto err; | 1992 | goto err; |
| 2038 | 1993 | ||
| 2039 | ret = 1; | 1994 | ret = 1; |
| 2040 | 1995 | ||
| 2041 | err: | 1996 | err: |
| 2042 | DH_free(dh_clnt); | 1997 | DH_free(dh_clnt); |
| 2043 | freezero(key, key_size); | 1998 | freezero(key, key_len); |
| 2044 | 1999 | ||
| 2045 | return (ret); | 2000 | return (ret); |
| 2046 | } | 2001 | } |
| @@ -2072,6 +2027,7 @@ ssl3_send_client_kex_ecdhe_ecp(SSL *s, SESS_CERT *sc, CBB *cbb) | |||
| 2072 | 2027 | ||
| 2073 | if (!ssl_kex_derive_ecdhe_ecp(ecdh, sc->peer_ecdh_tmp, &key, &key_len)) | 2028 | if (!ssl_kex_derive_ecdhe_ecp(ecdh, sc->peer_ecdh_tmp, &key, &key_len)) |
| 2074 | goto err; | 2029 | goto err; |
| 2030 | |||
| 2075 | if (!tls12_derive_master_secret(s, key, key_len)) | 2031 | if (!tls12_derive_master_secret(s, key, key_len)) |
| 2076 | goto err; | 2032 | goto err; |
| 2077 | 2033 | ||
diff --git a/src/lib/libssl/ssl_kex.c b/src/lib/libssl/ssl_kex.c index 9f05fd60c9..26f991f190 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.2 2020/04/18 14:07:56 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_kex.c,v 1.3 2021/11/29 16:00:32 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -17,6 +17,7 @@ | |||
| 17 | 17 | ||
| 18 | #include <stdlib.h> | 18 | #include <stdlib.h> |
| 19 | 19 | ||
| 20 | #include <openssl/dh.h> | ||
| 20 | #include <openssl/ec.h> | 21 | #include <openssl/ec.h> |
| 21 | #include <openssl/ecdh.h> | 22 | #include <openssl/ecdh.h> |
| 22 | #include <openssl/evp.h> | 23 | #include <openssl/evp.h> |
| @@ -25,6 +26,148 @@ | |||
| 25 | #include "bytestring.h" | 26 | #include "bytestring.h" |
| 26 | 27 | ||
| 27 | int | 28 | int |
| 29 | ssl_kex_generate_dhe(DH *dh, DH *dh_params) | ||
| 30 | { | ||
| 31 | BN_free(dh->p); | ||
| 32 | BN_free(dh->g); | ||
| 33 | dh->p = NULL; | ||
| 34 | dh->g = NULL; | ||
| 35 | |||
| 36 | if ((dh->p = BN_dup(dh_params->p)) == NULL) | ||
| 37 | return 0; | ||
| 38 | if ((dh->g = BN_dup(dh_params->g)) == NULL) | ||
| 39 | return 0; | ||
| 40 | |||
| 41 | if (!DH_generate_key(dh)) | ||
| 42 | return 0; | ||
| 43 | |||
| 44 | return 1; | ||
| 45 | } | ||
| 46 | |||
| 47 | int | ||
| 48 | ssl_kex_params_dhe(DH *dh, CBB *cbb) | ||
| 49 | { | ||
| 50 | int dh_p_len, dh_g_len; | ||
| 51 | CBB dh_p, dh_g; | ||
| 52 | uint8_t *data; | ||
| 53 | |||
| 54 | if ((dh_p_len = BN_num_bytes(dh->p)) <= 0) | ||
| 55 | return 0; | ||
| 56 | if ((dh_g_len = BN_num_bytes(dh->g)) <= 0) | ||
| 57 | return 0; | ||
| 58 | |||
| 59 | if (!CBB_add_u16_length_prefixed(cbb, &dh_p)) | ||
| 60 | return 0; | ||
| 61 | if (!CBB_add_space(&dh_p, &data, dh_p_len)) | ||
| 62 | return 0; | ||
| 63 | if (BN_bn2bin(dh->p, data) != dh_p_len) | ||
| 64 | return 0; | ||
| 65 | |||
| 66 | if (!CBB_add_u16_length_prefixed(cbb, &dh_g)) | ||
| 67 | return 0; | ||
| 68 | if (!CBB_add_space(&dh_g, &data, dh_g_len)) | ||
| 69 | return 0; | ||
| 70 | if (BN_bn2bin(dh->g, data) != dh_g_len) | ||
| 71 | return 0; | ||
| 72 | |||
| 73 | if (!CBB_flush(cbb)) | ||
| 74 | return 0; | ||
| 75 | |||
| 76 | return 1; | ||
| 77 | } | ||
| 78 | |||
| 79 | int | ||
| 80 | ssl_kex_public_dhe(DH *dh, CBB *cbb) | ||
| 81 | { | ||
| 82 | uint8_t *data; | ||
| 83 | int dh_y_len; | ||
| 84 | CBB dh_y; | ||
| 85 | |||
| 86 | if ((dh_y_len = BN_num_bytes(dh->pub_key)) <= 0) | ||
| 87 | return 0; | ||
| 88 | |||
| 89 | if (!CBB_add_u16_length_prefixed(cbb, &dh_y)) | ||
| 90 | return 0; | ||
| 91 | if (!CBB_add_space(&dh_y, &data, dh_y_len)) | ||
| 92 | return 0; | ||
| 93 | if (BN_bn2bin(dh->pub_key, data) != dh_y_len) | ||
| 94 | return 0; | ||
| 95 | |||
| 96 | if (!CBB_flush(cbb)) | ||
| 97 | return 0; | ||
| 98 | |||
| 99 | return 1; | ||
| 100 | } | ||
| 101 | |||
| 102 | int | ||
| 103 | ssl_kex_peer_params_dhe(DH *dh, CBS *cbs) | ||
| 104 | { | ||
| 105 | CBS dh_p, dh_g; | ||
| 106 | |||
| 107 | BN_free(dh->p); | ||
| 108 | BN_free(dh->g); | ||
| 109 | dh->p = NULL; | ||
| 110 | dh->g = NULL; | ||
| 111 | |||
| 112 | if (!CBS_get_u16_length_prefixed(cbs, &dh_p)) | ||
| 113 | return 0; | ||
| 114 | if (!CBS_get_u16_length_prefixed(cbs, &dh_g)) | ||
| 115 | return 0; | ||
| 116 | |||
| 117 | if ((dh->p = BN_bin2bn(CBS_data(&dh_p), CBS_len(&dh_p), NULL)) == NULL) | ||
| 118 | return 0; | ||
| 119 | if ((dh->g = BN_bin2bn(CBS_data(&dh_g), CBS_len(&dh_g), NULL)) == NULL) | ||
| 120 | return 0; | ||
| 121 | |||
| 122 | return 1; | ||
| 123 | } | ||
| 124 | |||
| 125 | int | ||
| 126 | ssl_kex_peer_public_dhe(DH *dh, CBS *cbs) | ||
| 127 | { | ||
| 128 | CBS dh_y; | ||
| 129 | |||
| 130 | BN_free(dh->pub_key); | ||
| 131 | dh->pub_key = NULL; | ||
| 132 | |||
| 133 | if (!CBS_get_u16_length_prefixed(cbs, &dh_y)) | ||
| 134 | return 0; | ||
| 135 | if ((dh->pub_key = BN_bin2bn(CBS_data(&dh_y), CBS_len(&dh_y), | ||
| 136 | NULL)) == NULL) | ||
| 137 | return 0; | ||
| 138 | |||
| 139 | return 1; | ||
| 140 | } | ||
| 141 | |||
| 142 | int | ||
| 143 | ssl_kex_derive_dhe(DH *dh, DH *dh_peer, | ||
| 144 | uint8_t **shared_key, size_t *shared_key_len) | ||
| 145 | { | ||
| 146 | uint8_t *key = NULL; | ||
| 147 | int key_len = 0; | ||
| 148 | int ret = 0; | ||
| 149 | |||
| 150 | if ((key_len = DH_size(dh)) <= 0) | ||
| 151 | goto err; | ||
| 152 | if ((key = calloc(1, key_len)) == NULL) | ||
| 153 | goto err; | ||
| 154 | |||
| 155 | if ((key_len = DH_compute_key(key, dh_peer->pub_key, dh)) <= 0) | ||
| 156 | goto err; | ||
| 157 | |||
| 158 | *shared_key = key; | ||
| 159 | *shared_key_len = key_len; | ||
| 160 | key = NULL; | ||
| 161 | |||
| 162 | ret = 1; | ||
| 163 | |||
| 164 | err: | ||
| 165 | freezero(key, key_len); | ||
| 166 | |||
| 167 | return ret; | ||
| 168 | } | ||
| 169 | |||
| 170 | int | ||
| 28 | ssl_kex_dummy_ecdhe_x25519(EVP_PKEY *pkey) | 171 | ssl_kex_dummy_ecdhe_x25519(EVP_PKEY *pkey) |
| 29 | { | 172 | { |
| 30 | EC_GROUP *group = NULL; | 173 | EC_GROUP *group = NULL; |
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 27bf5ec41f..7810bcd05e 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.368 2021/10/25 10:09:28 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.369 2021/11/29 16:00:32 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 | * |
| @@ -1447,6 +1447,14 @@ int ssl3_get_client_certificate(SSL *s); | |||
| 1447 | int ssl3_get_client_key_exchange(SSL *s); | 1447 | int ssl3_get_client_key_exchange(SSL *s); |
| 1448 | int ssl3_get_cert_verify(SSL *s); | 1448 | int ssl3_get_cert_verify(SSL *s); |
| 1449 | 1449 | ||
| 1450 | int ssl_kex_generate_dhe(DH *dh, DH *dh_params); | ||
| 1451 | int ssl_kex_params_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); | ||
| 1454 | int ssl_kex_peer_public_dhe(DH *dh, CBS *cbs); | ||
| 1455 | int ssl_kex_derive_dhe(DH *dh, DH *dh_peer, | ||
| 1456 | uint8_t **shared_key, size_t *shared_key_len); | ||
| 1457 | |||
| 1450 | int ssl_kex_dummy_ecdhe_x25519(EVP_PKEY *pkey); | 1458 | int ssl_kex_dummy_ecdhe_x25519(EVP_PKEY *pkey); |
| 1451 | int ssl_kex_generate_ecdhe_ecp(EC_KEY *ecdh, int nid); | 1459 | int ssl_kex_generate_ecdhe_ecp(EC_KEY *ecdh, int nid); |
| 1452 | int ssl_kex_public_ecdhe_ecp(EC_KEY *ecdh, CBB *cbb); | 1460 | int ssl_kex_public_ecdhe_ecp(EC_KEY *ecdh, CBB *cbb); |
