diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 42 |
1 files changed, 15 insertions, 27 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index d98a76f8f0..aae7275998 100644 --- a/src/lib/libssl/ssl_srvr.c +++ b/src/lib/libssl/ssl_srvr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_srvr.c,v 1.11 2017/03/10 16:03:27 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.12 2017/04/14 15:19:39 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 | * |
@@ -1271,8 +1271,7 @@ ssl3_send_server_kex_ecdhe_ecp(SSL *s, int nid, CBB *cbb) | |||
1271 | unsigned char *data; | 1271 | unsigned char *data; |
1272 | EC_KEY *ecdh = NULL, *ecdhp; | 1272 | EC_KEY *ecdh = NULL, *ecdhp; |
1273 | const EC_GROUP *group; | 1273 | const EC_GROUP *group; |
1274 | unsigned char *encodedPoint = NULL; | 1274 | int encoded_len = 0; |
1275 | int encodedlen = 0; | ||
1276 | int curve_id = 0; | 1275 | int curve_id = 0; |
1277 | BN_CTX *bn_ctx = NULL; | 1276 | BN_CTX *bn_ctx = NULL; |
1278 | int al; | 1277 | int al; |
@@ -1335,28 +1334,17 @@ ssl3_send_server_kex_ecdhe_ecp(SSL *s, int nid, CBB *cbb) | |||
1335 | * Encode the public key. First check the size of encoding and | 1334 | * Encode the public key. First check the size of encoding and |
1336 | * allocate memory accordingly. | 1335 | * allocate memory accordingly. |
1337 | */ | 1336 | */ |
1338 | encodedlen = EC_POINT_point2oct(group, EC_KEY_get0_public_key(ecdh), | 1337 | encoded_len = EC_POINT_point2oct(group, EC_KEY_get0_public_key(ecdh), |
1339 | POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL); | 1338 | POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL); |
1340 | 1339 | if (encoded_len == 0) { | |
1341 | encodedPoint = malloc(encodedlen); | 1340 | SSLerror(s, ERR_R_ECDH_LIB); |
1342 | |||
1343 | bn_ctx = BN_CTX_new(); | ||
1344 | if ((encodedPoint == NULL) || (bn_ctx == NULL)) { | ||
1345 | SSLerror(s, ERR_R_MALLOC_FAILURE); | ||
1346 | goto err; | 1341 | goto err; |
1347 | } | 1342 | } |
1348 | 1343 | if ((bn_ctx = BN_CTX_new()) == NULL) { | |
1349 | encodedlen = EC_POINT_point2oct(group, EC_KEY_get0_public_key(ecdh), | 1344 | SSLerror(s, ERR_R_MALLOC_FAILURE); |
1350 | POINT_CONVERSION_UNCOMPRESSED, encodedPoint, encodedlen, bn_ctx); | ||
1351 | |||
1352 | if (encodedlen == 0) { | ||
1353 | SSLerror(s, ERR_R_ECDH_LIB); | ||
1354 | goto err; | 1345 | goto err; |
1355 | } | 1346 | } |
1356 | 1347 | ||
1357 | BN_CTX_free(bn_ctx); | ||
1358 | bn_ctx = NULL; | ||
1359 | |||
1360 | /* | 1348 | /* |
1361 | * Only named curves are supported in ECDH ephemeral key exchanges. | 1349 | * Only named curves are supported in ECDH ephemeral key exchanges. |
1362 | * In this case the ServerKeyExchange message has: | 1350 | * In this case the ServerKeyExchange message has: |
@@ -1370,23 +1358,23 @@ ssl3_send_server_kex_ecdhe_ecp(SSL *s, int nid, CBB *cbb) | |||
1370 | goto err; | 1358 | goto err; |
1371 | if (!CBB_add_u8_length_prefixed(cbb, &ecpoint)) | 1359 | if (!CBB_add_u8_length_prefixed(cbb, &ecpoint)) |
1372 | goto err; | 1360 | goto err; |
1373 | if (!CBB_add_space(&ecpoint, &data, encodedlen)) | 1361 | if (!CBB_add_space(&ecpoint, &data, encoded_len)) |
1374 | goto err; | 1362 | goto err; |
1375 | 1363 | if (EC_POINT_point2oct(group, EC_KEY_get0_public_key(ecdh), | |
1376 | memcpy(data, encodedPoint, encodedlen); | 1364 | POINT_CONVERSION_UNCOMPRESSED, data, encoded_len, bn_ctx) == 0) { |
1377 | 1365 | SSLerror(s, ERR_R_ECDH_LIB); | |
1378 | free(encodedPoint); | 1366 | goto err; |
1379 | encodedPoint = NULL; | 1367 | } |
1380 | |||
1381 | if (!CBB_flush(cbb)) | 1368 | if (!CBB_flush(cbb)) |
1382 | goto err; | 1369 | goto err; |
1383 | 1370 | ||
1371 | BN_CTX_free(bn_ctx); | ||
1372 | |||
1384 | return (1); | 1373 | return (1); |
1385 | 1374 | ||
1386 | f_err: | 1375 | f_err: |
1387 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1376 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
1388 | err: | 1377 | err: |
1389 | free(encodedPoint); | ||
1390 | BN_CTX_free(bn_ctx); | 1378 | BN_CTX_free(bn_ctx); |
1391 | 1379 | ||
1392 | return (-1); | 1380 | return (-1); |