diff options
Diffstat (limited to 'src/lib/libssl/s3_clnt.c')
-rw-r--r-- | src/lib/libssl/s3_clnt.c | 260 |
1 files changed, 180 insertions, 80 deletions
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c index be6e461a1e..07457e95a7 100644 --- a/src/lib/libssl/s3_clnt.c +++ b/src/lib/libssl/s3_clnt.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: s3_clnt.c,v 1.156 2016/12/18 13:52:53 jsing Exp $ */ | 1 | /* $OpenBSD: s3_clnt.c,v 1.157 2016/12/21 16:44:31 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 | * |
@@ -156,6 +156,7 @@ | |||
156 | 156 | ||
157 | #include <openssl/bn.h> | 157 | #include <openssl/bn.h> |
158 | #include <openssl/buffer.h> | 158 | #include <openssl/buffer.h> |
159 | #include <openssl/curve25519.h> | ||
159 | #include <openssl/dh.h> | 160 | #include <openssl/dh.h> |
160 | #include <openssl/evp.h> | 161 | #include <openssl/evp.h> |
161 | #include <openssl/md5.h> | 162 | #include <openssl/md5.h> |
@@ -1184,19 +1185,99 @@ ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | |||
1184 | } | 1185 | } |
1185 | 1186 | ||
1186 | static int | 1187 | static int |
1188 | ssl3_get_server_kex_ecdhe_ecp(SSL *s, SESS_CERT *sc, int nid, CBS *public) | ||
1189 | { | ||
1190 | const EC_GROUP *group; | ||
1191 | EC_GROUP *ngroup = NULL; | ||
1192 | EC_POINT *point = NULL; | ||
1193 | BN_CTX *bn_ctx = NULL; | ||
1194 | EC_KEY *ecdh = NULL; | ||
1195 | int ret = -1; | ||
1196 | |||
1197 | /* | ||
1198 | * Extract the server's ephemeral ECDH public key. | ||
1199 | */ | ||
1200 | |||
1201 | if ((ecdh = EC_KEY_new()) == NULL) { | ||
1202 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | ||
1203 | goto err; | ||
1204 | } | ||
1205 | |||
1206 | if ((ngroup = EC_GROUP_new_by_curve_name(nid)) == NULL) { | ||
1207 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_EC_LIB); | ||
1208 | goto err; | ||
1209 | } | ||
1210 | if (EC_KEY_set_group(ecdh, ngroup) == 0) { | ||
1211 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_EC_LIB); | ||
1212 | goto err; | ||
1213 | } | ||
1214 | |||
1215 | group = EC_KEY_get0_group(ecdh); | ||
1216 | |||
1217 | if ((point = EC_POINT_new(group)) == NULL || | ||
1218 | (bn_ctx = BN_CTX_new()) == NULL) { | ||
1219 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | ||
1220 | goto err; | ||
1221 | } | ||
1222 | |||
1223 | if (EC_POINT_oct2point(group, point, CBS_data(public), | ||
1224 | CBS_len(public), bn_ctx) == 0) { | ||
1225 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_ECPOINT); | ||
1226 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | ||
1227 | goto err; | ||
1228 | } | ||
1229 | |||
1230 | EC_KEY_set_public_key(ecdh, point); | ||
1231 | sc->peer_ecdh_tmp = ecdh; | ||
1232 | ecdh = NULL; | ||
1233 | |||
1234 | ret = 1; | ||
1235 | |||
1236 | err: | ||
1237 | BN_CTX_free(bn_ctx); | ||
1238 | EC_GROUP_free(ngroup); | ||
1239 | EC_POINT_free(point); | ||
1240 | EC_KEY_free(ecdh); | ||
1241 | |||
1242 | return (ret); | ||
1243 | } | ||
1244 | |||
1245 | static int | ||
1246 | ssl3_get_server_kex_ecdhe_ecx(SSL *s, SESS_CERT *sc, int nid, CBS *public) | ||
1247 | { | ||
1248 | size_t outlen; | ||
1249 | |||
1250 | if (nid != NID_X25519) { | ||
1251 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); | ||
1252 | goto err; | ||
1253 | } | ||
1254 | |||
1255 | if (CBS_len(public) != X25519_KEY_LENGTH) { | ||
1256 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_ECPOINT); | ||
1257 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); | ||
1258 | goto err; | ||
1259 | } | ||
1260 | |||
1261 | if (!CBS_stow(public, &sc->peer_x25519_tmp, &outlen)) { | ||
1262 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | ||
1263 | goto err; | ||
1264 | } | ||
1265 | |||
1266 | return (1); | ||
1267 | |||
1268 | err: | ||
1269 | return (-1); | ||
1270 | } | ||
1271 | |||
1272 | static int | ||
1187 | ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | 1273 | ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) |
1188 | { | 1274 | { |
1189 | CBS cbs, ecpoint; | 1275 | CBS cbs, public; |
1190 | uint8_t curve_type; | 1276 | uint8_t curve_type; |
1191 | uint16_t curve_id; | 1277 | uint16_t curve_id; |
1192 | EC_POINT *srvr_ecpoint = NULL; | ||
1193 | EC_KEY *ecdh = NULL; | ||
1194 | BN_CTX *bn_ctx = NULL; | ||
1195 | const EC_GROUP *group; | ||
1196 | EC_GROUP *ngroup = NULL; | ||
1197 | SESS_CERT *sc; | 1278 | SESS_CERT *sc; |
1198 | int curve_nid; | ||
1199 | long alg_a; | 1279 | long alg_a; |
1280 | int nid; | ||
1200 | int al; | 1281 | int al; |
1201 | 1282 | ||
1202 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; | 1283 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; |
@@ -1207,15 +1288,6 @@ ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | |||
1207 | 1288 | ||
1208 | CBS_init(&cbs, *pp, *nn); | 1289 | CBS_init(&cbs, *pp, *nn); |
1209 | 1290 | ||
1210 | /* | ||
1211 | * Extract EC parameters and the server's ephemeral ECDH public key. | ||
1212 | */ | ||
1213 | |||
1214 | if ((ecdh = EC_KEY_new()) == NULL) { | ||
1215 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | ||
1216 | goto err; | ||
1217 | } | ||
1218 | |||
1219 | /* Only named curves are supported. */ | 1291 | /* Only named curves are supported. */ |
1220 | if (!CBS_get_u8(&cbs, &curve_type) || | 1292 | if (!CBS_get_u8(&cbs, &curve_type) || |
1221 | curve_type != NAMED_CURVE_TYPE || | 1293 | curve_type != NAMED_CURVE_TYPE || |
@@ -1235,39 +1307,22 @@ ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | |||
1235 | goto f_err; | 1307 | goto f_err; |
1236 | } | 1308 | } |
1237 | 1309 | ||
1238 | if ((curve_nid = tls1_ec_curve_id2nid(curve_id)) == 0) { | 1310 | if ((nid = tls1_ec_curve_id2nid(curve_id)) == 0) { |
1239 | al = SSL_AD_INTERNAL_ERROR; | 1311 | al = SSL_AD_INTERNAL_ERROR; |
1240 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | 1312 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, |
1241 | SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS); | 1313 | SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS); |
1242 | goto f_err; | 1314 | goto f_err; |
1243 | } | 1315 | } |
1244 | 1316 | ||
1245 | if ((ngroup = EC_GROUP_new_by_curve_name(curve_nid)) == NULL) { | 1317 | if (!CBS_get_u8_length_prefixed(&cbs, &public)) |
1246 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_EC_LIB); | ||
1247 | goto err; | ||
1248 | } | ||
1249 | if (EC_KEY_set_group(ecdh, ngroup) == 0) { | ||
1250 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_EC_LIB); | ||
1251 | goto err; | ||
1252 | } | ||
1253 | |||
1254 | group = EC_KEY_get0_group(ecdh); | ||
1255 | |||
1256 | /* Next, get the encoded ECPoint */ | ||
1257 | if ((srvr_ecpoint = EC_POINT_new(group)) == NULL || | ||
1258 | (bn_ctx = BN_CTX_new()) == NULL) { | ||
1259 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); | ||
1260 | goto err; | ||
1261 | } | ||
1262 | |||
1263 | if (!CBS_get_u8_length_prefixed(&cbs, &ecpoint)) | ||
1264 | goto truncated; | 1318 | goto truncated; |
1265 | 1319 | ||
1266 | if (EC_POINT_oct2point(group, srvr_ecpoint, CBS_data(&ecpoint), | 1320 | if (nid == NID_X25519) { |
1267 | CBS_len(&ecpoint), bn_ctx) == 0) { | 1321 | if (ssl3_get_server_kex_ecdhe_ecx(s, sc, nid, &public) != 1) |
1268 | al = SSL_AD_DECODE_ERROR; | 1322 | goto err; |
1269 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_ECPOINT); | 1323 | } else { |
1270 | goto f_err; | 1324 | if (ssl3_get_server_kex_ecdhe_ecp(s, sc, nid, &public) != 1) |
1325 | goto err; | ||
1271 | } | 1326 | } |
1272 | 1327 | ||
1273 | /* | 1328 | /* |
@@ -1283,13 +1338,6 @@ ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | |||
1283 | /* XXX - Anonymous ECDH, so no certificate or pkey. */ | 1338 | /* XXX - Anonymous ECDH, so no certificate or pkey. */ |
1284 | *pkey = NULL; | 1339 | *pkey = NULL; |
1285 | 1340 | ||
1286 | EC_KEY_set_public_key(ecdh, srvr_ecpoint); | ||
1287 | sc->peer_ecdh_tmp = ecdh; | ||
1288 | |||
1289 | BN_CTX_free(bn_ctx); | ||
1290 | EC_GROUP_free(ngroup); | ||
1291 | EC_POINT_free(srvr_ecpoint); | ||
1292 | |||
1293 | *nn = CBS_len(&cbs); | 1341 | *nn = CBS_len(&cbs); |
1294 | *pp = (unsigned char *)CBS_data(&cbs); | 1342 | *pp = (unsigned char *)CBS_data(&cbs); |
1295 | 1343 | ||
@@ -1303,11 +1351,6 @@ ssl3_get_server_kex_ecdhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | |||
1303 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1351 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
1304 | 1352 | ||
1305 | err: | 1353 | err: |
1306 | BN_CTX_free(bn_ctx); | ||
1307 | EC_GROUP_free(ngroup); | ||
1308 | EC_POINT_free(srvr_ecpoint); | ||
1309 | EC_KEY_free(ecdh); | ||
1310 | |||
1311 | return (-1); | 1354 | return (-1); |
1312 | } | 1355 | } |
1313 | 1356 | ||
@@ -1360,6 +1403,9 @@ ssl3_get_server_key_exchange(SSL *s) | |||
1360 | 1403 | ||
1361 | EC_KEY_free(s->session->sess_cert->peer_ecdh_tmp); | 1404 | EC_KEY_free(s->session->sess_cert->peer_ecdh_tmp); |
1362 | s->session->sess_cert->peer_ecdh_tmp = NULL; | 1405 | s->session->sess_cert->peer_ecdh_tmp = NULL; |
1406 | |||
1407 | free(s->session->sess_cert->peer_x25519_tmp); | ||
1408 | s->session->sess_cert->peer_x25519_tmp = NULL; | ||
1363 | } else { | 1409 | } else { |
1364 | s->session->sess_cert = ssl_sess_cert_new(); | 1410 | s->session->sess_cert = ssl_sess_cert_new(); |
1365 | if (s->session->sess_cert == NULL) | 1411 | if (s->session->sess_cert == NULL) |
@@ -2010,11 +2056,11 @@ err: | |||
2010 | } | 2056 | } |
2011 | 2057 | ||
2012 | static int | 2058 | static int |
2013 | ssl3_send_client_kex_ecdhe(SSL *s, SESS_CERT *sess_cert, CBB *cbb) | 2059 | ssl3_send_client_kex_ecdhe_ecp(SSL *s, SESS_CERT *sc, CBB *cbb) |
2014 | { | 2060 | { |
2015 | EC_KEY *clnt_ecdh = NULL; | 2061 | const EC_GROUP *group = NULL; |
2016 | const EC_GROUP *srvr_group = NULL; | 2062 | const EC_POINT *point = NULL; |
2017 | const EC_POINT *srvr_ecpoint = NULL; | 2063 | EC_KEY *ecdh = NULL; |
2018 | BN_CTX *bn_ctx = NULL; | 2064 | BN_CTX *bn_ctx = NULL; |
2019 | unsigned char *key = NULL; | 2065 | unsigned char *key = NULL; |
2020 | unsigned char *data; | 2066 | unsigned char *data; |
@@ -2023,40 +2069,30 @@ ssl3_send_client_kex_ecdhe(SSL *s, SESS_CERT *sess_cert, CBB *cbb) | |||
2023 | int ret = -1; | 2069 | int ret = -1; |
2024 | CBB ecpoint; | 2070 | CBB ecpoint; |
2025 | 2071 | ||
2026 | if (sess_cert->peer_ecdh_tmp == NULL) { | 2072 | if ((group = EC_KEY_get0_group(sc->peer_ecdh_tmp)) == NULL || |
2027 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | 2073 | (point = EC_KEY_get0_public_key(sc->peer_ecdh_tmp)) == NULL) { |
2028 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2074 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
2029 | ERR_R_INTERNAL_ERROR); | 2075 | ERR_R_INTERNAL_ERROR); |
2030 | goto err; | 2076 | goto err; |
2031 | } | 2077 | } |
2032 | 2078 | ||
2033 | srvr_group = EC_KEY_get0_group(sess_cert->peer_ecdh_tmp); | 2079 | if ((ecdh = EC_KEY_new()) == NULL) { |
2034 | srvr_ecpoint = EC_KEY_get0_public_key(sess_cert->peer_ecdh_tmp); | ||
2035 | |||
2036 | if (srvr_group == NULL || srvr_ecpoint == NULL) { | ||
2037 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
2038 | ERR_R_INTERNAL_ERROR); | ||
2039 | goto err; | ||
2040 | } | ||
2041 | |||
2042 | if ((clnt_ecdh = EC_KEY_new()) == NULL) { | ||
2043 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2080 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
2044 | ERR_R_MALLOC_FAILURE); | 2081 | ERR_R_MALLOC_FAILURE); |
2045 | goto err; | 2082 | goto err; |
2046 | } | 2083 | } |
2047 | 2084 | ||
2048 | if (!EC_KEY_set_group(clnt_ecdh, srvr_group)) { | 2085 | if (!EC_KEY_set_group(ecdh, group)) { |
2049 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_EC_LIB); | 2086 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_EC_LIB); |
2050 | goto err; | 2087 | goto err; |
2051 | } | 2088 | } |
2052 | 2089 | ||
2053 | /* Generate a new ECDH key pair. */ | 2090 | /* Generate a new ECDH key pair. */ |
2054 | if (!(EC_KEY_generate_key(clnt_ecdh))) { | 2091 | if (!(EC_KEY_generate_key(ecdh))) { |
2055 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB); | 2092 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB); |
2056 | goto err; | 2093 | goto err; |
2057 | } | 2094 | } |
2058 | key_size = ECDH_size(clnt_ecdh); | 2095 | if ((key_size = ECDH_size(ecdh)) <= 0) { |
2059 | if (key_size <= 0) { | ||
2060 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB); | 2096 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB); |
2061 | goto err; | 2097 | goto err; |
2062 | } | 2098 | } |
@@ -2064,7 +2100,7 @@ ssl3_send_client_kex_ecdhe(SSL *s, SESS_CERT *sess_cert, CBB *cbb) | |||
2064 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | 2100 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, |
2065 | ERR_R_MALLOC_FAILURE); | 2101 | ERR_R_MALLOC_FAILURE); |
2066 | } | 2102 | } |
2067 | key_len = ECDH_compute_key(key, key_size, srvr_ecpoint, clnt_ecdh, NULL); | 2103 | key_len = ECDH_compute_key(key, key_size, point, ecdh, NULL); |
2068 | if (key_len <= 0) { | 2104 | if (key_len <= 0) { |
2069 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB); | 2105 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB); |
2070 | goto err; | 2106 | goto err; |
@@ -2075,8 +2111,7 @@ ssl3_send_client_kex_ecdhe(SSL *s, SESS_CERT *sess_cert, CBB *cbb) | |||
2075 | s->method->ssl3_enc->generate_master_secret(s, | 2111 | s->method->ssl3_enc->generate_master_secret(s, |
2076 | s->session->master_key, key, key_len); | 2112 | s->session->master_key, key, key_len); |
2077 | 2113 | ||
2078 | encoded_len = EC_POINT_point2oct(srvr_group, | 2114 | encoded_len = EC_POINT_point2oct(group, EC_KEY_get0_public_key(ecdh), |
2079 | EC_KEY_get0_public_key(clnt_ecdh), | ||
2080 | POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL); | 2115 | POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL); |
2081 | if (encoded_len == 0) { | 2116 | if (encoded_len == 0) { |
2082 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB); | 2117 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB); |
@@ -2094,7 +2129,7 @@ ssl3_send_client_kex_ecdhe(SSL *s, SESS_CERT *sess_cert, CBB *cbb) | |||
2094 | goto err; | 2129 | goto err; |
2095 | if (!CBB_add_space(&ecpoint, &data, encoded_len)) | 2130 | if (!CBB_add_space(&ecpoint, &data, encoded_len)) |
2096 | goto err; | 2131 | goto err; |
2097 | if (EC_POINT_point2oct(srvr_group, EC_KEY_get0_public_key(clnt_ecdh), | 2132 | if (EC_POINT_point2oct(group, EC_KEY_get0_public_key(ecdh), |
2098 | POINT_CONVERSION_UNCOMPRESSED, data, encoded_len, | 2133 | POINT_CONVERSION_UNCOMPRESSED, data, encoded_len, |
2099 | bn_ctx) == 0) | 2134 | bn_ctx) == 0) |
2100 | goto err; | 2135 | goto err; |
@@ -2108,13 +2143,78 @@ ssl3_send_client_kex_ecdhe(SSL *s, SESS_CERT *sess_cert, CBB *cbb) | |||
2108 | explicit_bzero(key, key_size); | 2143 | explicit_bzero(key, key_size); |
2109 | free(key); | 2144 | free(key); |
2110 | 2145 | ||
2111 | BN_CTX_free(bn_ctx); | 2146 | return (ret); |
2112 | EC_KEY_free(clnt_ecdh); | 2147 | } |
2148 | |||
2149 | static int | ||
2150 | ssl3_send_client_kex_ecdhe_ecx(SSL *s, SESS_CERT *sc, CBB *cbb) | ||
2151 | { | ||
2152 | uint8_t *public_key = NULL, *private_key = NULL, *shared_key = NULL; | ||
2153 | int ret = -1; | ||
2154 | CBB ecpoint; | ||
2155 | |||
2156 | /* Generate X25519 key pair and derive shared key. */ | ||
2157 | if ((public_key = malloc(X25519_KEY_LENGTH)) == NULL) | ||
2158 | goto err; | ||
2159 | if ((private_key = malloc(X25519_KEY_LENGTH)) == NULL) | ||
2160 | goto err; | ||
2161 | if ((shared_key = malloc(X25519_KEY_LENGTH)) == NULL) | ||
2162 | goto err; | ||
2163 | X25519_keypair(public_key, private_key); | ||
2164 | if (!X25519(shared_key, private_key, sc->peer_x25519_tmp)) | ||
2165 | goto err; | ||
2166 | |||
2167 | /* Serialize the public key. */ | ||
2168 | if (!CBB_add_u8_length_prefixed(cbb, &ecpoint)) | ||
2169 | goto err; | ||
2170 | if (!CBB_add_bytes(&ecpoint, public_key, X25519_KEY_LENGTH)) | ||
2171 | goto err; | ||
2172 | if (!CBB_flush(cbb)) | ||
2173 | goto err; | ||
2174 | |||
2175 | /* Generate master key from the result. */ | ||
2176 | s->session->master_key_length = | ||
2177 | s->method->ssl3_enc->generate_master_secret(s, | ||
2178 | s->session->master_key, shared_key, X25519_KEY_LENGTH); | ||
2179 | |||
2180 | ret = 1; | ||
2181 | |||
2182 | err: | ||
2183 | if (private_key != NULL) | ||
2184 | explicit_bzero(private_key, X25519_KEY_LENGTH); | ||
2185 | if (shared_key != NULL) | ||
2186 | explicit_bzero(shared_key, X25519_KEY_LENGTH); | ||
2187 | |||
2188 | free(public_key); | ||
2189 | free(private_key); | ||
2190 | free(shared_key); | ||
2113 | 2191 | ||
2114 | return (ret); | 2192 | return (ret); |
2115 | } | 2193 | } |
2116 | 2194 | ||
2117 | static int | 2195 | static int |
2196 | ssl3_send_client_kex_ecdhe(SSL *s, SESS_CERT *sc, CBB *cbb) | ||
2197 | { | ||
2198 | if (sc->peer_x25519_tmp != NULL) { | ||
2199 | if (ssl3_send_client_kex_ecdhe_ecx(s, sc, cbb) != 1) | ||
2200 | goto err; | ||
2201 | } else if (sc->peer_ecdh_tmp != NULL) { | ||
2202 | if (ssl3_send_client_kex_ecdhe_ecp(s, sc, cbb) != 1) | ||
2203 | goto err; | ||
2204 | } else { | ||
2205 | ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); | ||
2206 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, | ||
2207 | ERR_R_INTERNAL_ERROR); | ||
2208 | goto err; | ||
2209 | } | ||
2210 | |||
2211 | return (1); | ||
2212 | |||
2213 | err: | ||
2214 | return (-1); | ||
2215 | } | ||
2216 | |||
2217 | static int | ||
2118 | ssl3_send_client_kex_gost(SSL *s, SESS_CERT *sess_cert, CBB *cbb) | 2218 | ssl3_send_client_kex_gost(SSL *s, SESS_CERT *sess_cert, CBB *cbb) |
2119 | { | 2219 | { |
2120 | unsigned char premaster_secret[32], shared_ukm[32], tmp[256]; | 2220 | unsigned char premaster_secret[32], shared_ukm[32], tmp[256]; |