summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libssl/s3_lib.c58
-rw-r--r--src/lib/libssl/ssl.h5
-rw-r--r--src/lib/libssl/ssl_cert.c4
-rw-r--r--src/lib/libssl/ssl_lib.c10
-rw-r--r--src/lib/libssl/ssl_locl.h4
-rw-r--r--src/lib/libssl/ssl_srvr.c76
-rw-r--r--src/lib/libssl/t1_lib.c17
7 files changed, 54 insertions, 120 deletions
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c
index 1abe01cd88..abebaa0fc4 100644
--- a/src/lib/libssl/s3_lib.c
+++ b/src/lib/libssl/s3_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_lib.c,v 1.154 2017/08/09 17:49:54 jsing Exp $ */ 1/* $OpenBSD: s3_lib.c,v 1.155 2017/08/10 17:18:38 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 *
@@ -1838,39 +1838,26 @@ _SSL_set_dh_auto(SSL *s, int state)
1838static int 1838static int
1839_SSL_set_tmp_ecdh(SSL *s, EC_KEY *ecdh) 1839_SSL_set_tmp_ecdh(SSL *s, EC_KEY *ecdh)
1840{ 1840{
1841 const EC_GROUP *group;
1842 int nid;
1843
1841 if (!ssl_cert_inst(&s->cert)) { 1844 if (!ssl_cert_inst(&s->cert)) {
1842 SSLerror(s, ERR_R_MALLOC_FAILURE); 1845 SSLerror(s, ERR_R_MALLOC_FAILURE);
1843 return 0; 1846 return 0;
1844 } 1847 }
1845 1848
1846 if (ecdh == NULL) { 1849 if (ecdh == NULL)
1847 SSLerror(s, ERR_R_PASSED_NULL_PARAMETER);
1848 return 0; 1850 return 0;
1849 } 1851 if ((group = EC_KEY_get0_group(ecdh)) == NULL)
1850
1851 if (!EC_KEY_up_ref(ecdh)) {
1852 SSLerror(s, ERR_R_ECDH_LIB);
1853 return 0; 1852 return 0;
1854 }
1855
1856 if (!(s->internal->options & SSL_OP_SINGLE_ECDH_USE)) {
1857 if (!EC_KEY_generate_key(ecdh)) {
1858 EC_KEY_free(ecdh);
1859 SSLerror(s, ERR_R_ECDH_LIB);
1860 return 0;
1861 }
1862 }
1863
1864 EC_KEY_free(s->cert->ecdh_tmp);
1865 s->cert->ecdh_tmp = ecdh;
1866 1853
1867 return 1; 1854 nid = EC_GROUP_get_curve_name(group);
1855 return SSL_set1_groups(s, &nid, 1);
1868} 1856}
1869 1857
1870static int 1858static int
1871_SSL_set_ecdh_auto(SSL *s, int state) 1859_SSL_set_ecdh_auto(SSL *s, int state)
1872{ 1860{
1873 s->cert->ecdh_tmp_auto = state;
1874 return 1; 1861 return 1;
1875} 1862}
1876 1863
@@ -2095,7 +2082,6 @@ ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void))
2095 return 1; 2082 return 1;
2096 2083
2097 case SSL_CTRL_SET_TMP_ECDH_CB: 2084 case SSL_CTRL_SET_TMP_ECDH_CB:
2098 s->cert->ecdh_tmp_cb = (EC_KEY *(*)(SSL *, int, int))fp;
2099 return 1; 2085 return 1;
2100 2086
2101 case SSL_CTRL_SET_TLSEXT_DEBUG_CB: 2087 case SSL_CTRL_SET_TLSEXT_DEBUG_CB:
@@ -2133,35 +2119,21 @@ _SSL_CTX_set_dh_auto(SSL_CTX *ctx, int state)
2133static int 2119static int
2134_SSL_CTX_set_tmp_ecdh(SSL_CTX *ctx, EC_KEY *ecdh) 2120_SSL_CTX_set_tmp_ecdh(SSL_CTX *ctx, EC_KEY *ecdh)
2135{ 2121{
2136 EC_KEY *ecdh_tmp; 2122 const EC_GROUP *group;
2123 int nid;
2137 2124
2138 if (ecdh == NULL) { 2125 if (ecdh == NULL)
2139 SSLerrorx(ERR_R_ECDH_LIB);
2140 return 0; 2126 return 0;
2141 } 2127 if ((group = EC_KEY_get0_group(ecdh)) == NULL)
2142
2143 if ((ecdh_tmp = EC_KEY_dup(ecdh)) == NULL) {
2144 SSLerrorx(ERR_R_EC_LIB);
2145 return 0; 2128 return 0;
2146 }
2147 if (!(ctx->internal->options & SSL_OP_SINGLE_ECDH_USE)) {
2148 if (!EC_KEY_generate_key(ecdh_tmp)) {
2149 EC_KEY_free(ecdh_tmp);
2150 SSLerrorx(ERR_R_ECDH_LIB);
2151 return 0;
2152 }
2153 }
2154 2129
2155 EC_KEY_free(ctx->internal->cert->ecdh_tmp); 2130 nid = EC_GROUP_get_curve_name(group);
2156 ctx->internal->cert->ecdh_tmp = ecdh_tmp; 2131 return SSL_CTX_set1_groups(ctx, &nid, 1);
2157
2158 return 1;
2159} 2132}
2160 2133
2161static int 2134static int
2162_SSL_CTX_set_ecdh_auto(SSL_CTX *ctx, int state) 2135_SSL_CTX_set_ecdh_auto(SSL_CTX *ctx, int state)
2163{ 2136{
2164 ctx->internal->cert->ecdh_tmp_auto = state;
2165 return 1; 2137 return 1;
2166} 2138}
2167 2139
@@ -2347,8 +2319,6 @@ ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void))
2347 return 1; 2319 return 1;
2348 2320
2349 case SSL_CTRL_SET_TMP_ECDH_CB: 2321 case SSL_CTRL_SET_TMP_ECDH_CB:
2350 ctx->internal->cert->ecdh_tmp_cb =
2351 (EC_KEY *(*)(SSL *, int, int))fp;
2352 return 1; 2322 return 1;
2353 2323
2354 case SSL_CTRL_SET_TLSEXT_SERVERNAME_CB: 2324 case SSL_CTRL_SET_TLSEXT_SERVERNAME_CB:
diff --git a/src/lib/libssl/ssl.h b/src/lib/libssl/ssl.h
index dda5192c10..e816dec83c 100644
--- a/src/lib/libssl/ssl.h
+++ b/src/lib/libssl/ssl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl.h,v 1.129 2017/05/07 04:22:24 beck Exp $ */ 1/* $OpenBSD: ssl.h,v 1.130 2017/08/10 17:18:38 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 *
@@ -503,8 +503,6 @@ struct ssl_session_st {
503#define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 0x00010000L 503#define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 0x00010000L
504/* Disallow client initiated renegotiation. */ 504/* Disallow client initiated renegotiation. */
505#define SSL_OP_NO_CLIENT_RENEGOTIATION 0x00020000L 505#define SSL_OP_NO_CLIENT_RENEGOTIATION 0x00020000L
506/* If set, always create a new key when using tmp_ecdh parameters */
507#define SSL_OP_SINGLE_ECDH_USE 0x00080000L
508/* If set, always create a new key when using tmp_dh parameters */ 506/* If set, always create a new key when using tmp_dh parameters */
509#define SSL_OP_SINGLE_DH_USE 0x00100000L 507#define SSL_OP_SINGLE_DH_USE 0x00100000L
510/* Set on servers to choose the cipher according to the server's 508/* Set on servers to choose the cipher according to the server's
@@ -549,6 +547,7 @@ struct ssl_session_st {
549#define SSL_OP_PKCS1_CHECK_1 0x0 547#define SSL_OP_PKCS1_CHECK_1 0x0
550#define SSL_OP_PKCS1_CHECK_2 0x0 548#define SSL_OP_PKCS1_CHECK_2 0x0
551#define SSL_OP_SAFARI_ECDHE_ECDSA_BUG 0x0 549#define SSL_OP_SAFARI_ECDHE_ECDSA_BUG 0x0
550#define SSL_OP_SINGLE_ECDH_USE 0x0
552#define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x0 551#define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x0
553#define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x0 552#define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x0
554#define SSL_OP_TLS_BLOCK_PADDING_BUG 0x0 553#define SSL_OP_TLS_BLOCK_PADDING_BUG 0x0
diff --git a/src/lib/libssl/ssl_cert.c b/src/lib/libssl/ssl_cert.c
index 83a9f2e92d..174441c70e 100644
--- a/src/lib/libssl/ssl_cert.c
+++ b/src/lib/libssl/ssl_cert.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_cert.c,v 1.64 2017/02/07 02:08:38 beck Exp $ */ 1/* $OpenBSD: ssl_cert.c,v 1.65 2017/08/10 17:18:38 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 *
@@ -242,8 +242,6 @@ ssl_cert_dup(CERT *cert)
242 goto err; 242 goto err;
243 } 243 }
244 } 244 }
245 ret->ecdh_tmp_cb = cert->ecdh_tmp_cb;
246 ret->ecdh_tmp_auto = cert->ecdh_tmp_auto;
247 245
248 for (i = 0; i < SSL_PKEY_NUM; i++) { 246 for (i = 0; i < SSL_PKEY_NUM; i++) {
249 if (cert->pkeys[i].x509 != NULL) { 247 if (cert->pkeys[i].x509 != NULL) {
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c
index d933acb32d..bc8b56d3be 100644
--- a/src/lib/libssl/ssl_lib.c
+++ b/src/lib/libssl/ssl_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_lib.c,v 1.162 2017/08/09 22:24:25 jsing Exp $ */ 1/* $OpenBSD: ssl_lib.c,v 1.163 2017/08/10 17:18:38 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 *
@@ -2042,7 +2042,7 @@ void
2042ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher) 2042ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher)
2043{ 2043{
2044 int rsa_enc, rsa_sign, dh_tmp, dsa_sign; 2044 int rsa_enc, rsa_sign, dh_tmp, dsa_sign;
2045 int have_ecc_cert, have_ecdh_tmp; 2045 int have_ecc_cert;
2046 unsigned long mask_k, mask_a; 2046 unsigned long mask_k, mask_a;
2047 X509 *x = NULL; 2047 X509 *x = NULL;
2048 CERT_PKEY *cpk; 2048 CERT_PKEY *cpk;
@@ -2053,9 +2053,6 @@ ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher)
2053 dh_tmp = (c->dh_tmp != NULL || c->dh_tmp_cb != NULL || 2053 dh_tmp = (c->dh_tmp != NULL || c->dh_tmp_cb != NULL ||
2054 c->dh_tmp_auto != 0); 2054 c->dh_tmp_auto != 0);
2055 2055
2056 have_ecdh_tmp = (c->ecdh_tmp != NULL || c->ecdh_tmp_cb != NULL ||
2057 c->ecdh_tmp_auto != 0);
2058
2059 cpk = &(c->pkeys[SSL_PKEY_RSA_ENC]); 2056 cpk = &(c->pkeys[SSL_PKEY_RSA_ENC]);
2060 rsa_enc = (cpk->x509 != NULL && cpk->privatekey != NULL); 2057 rsa_enc = (cpk->x509 != NULL && cpk->privatekey != NULL);
2061 cpk = &(c->pkeys[SSL_PKEY_RSA_SIGN]); 2058 cpk = &(c->pkeys[SSL_PKEY_RSA_SIGN]);
@@ -2104,8 +2101,7 @@ ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher)
2104 mask_a|=SSL_aECDSA; 2101 mask_a|=SSL_aECDSA;
2105 } 2102 }
2106 2103
2107 if (have_ecdh_tmp) 2104 mask_k |= SSL_kECDHE;
2108 mask_k|=SSL_kECDHE;
2109 2105
2110 c->mask_k = mask_k; 2106 c->mask_k = mask_k;
2111 c->mask_a = mask_a; 2107 c->mask_a = mask_a;
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index f98ce681a2..8ef2d01402 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.183 2017/08/09 22:24:25 jsing Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.184 2017/08/10 17:18:38 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 *
@@ -993,8 +993,6 @@ typedef struct cert_st {
993 int dh_tmp_auto; 993 int dh_tmp_auto;
994 994
995 EC_KEY *ecdh_tmp; 995 EC_KEY *ecdh_tmp;
996 EC_KEY *(*ecdh_tmp_cb)(SSL *ssl, int is_export, int keysize);
997 int ecdh_tmp_auto;
998 996
999 CERT_PKEY pkeys[SSL_PKEY_NUM]; 997 CERT_PKEY pkeys[SSL_PKEY_NUM];
1000 998
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index 730d4ed1ad..575621a0ce 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.17 2017/05/07 04:22:24 beck Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.18 2017/08/10 17:18:38 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 *
@@ -1267,27 +1267,23 @@ ssl3_send_server_kex_dhe(SSL *s, CBB *cbb)
1267static int 1267static int
1268ssl3_send_server_kex_ecdhe_ecp(SSL *s, int nid, CBB *cbb) 1268ssl3_send_server_kex_ecdhe_ecp(SSL *s, int nid, CBB *cbb)
1269{ 1269{
1270 CBB ecpoint;
1271 unsigned char *data;
1272 EC_KEY *ecdh = NULL, *ecdhp;
1273 const EC_GROUP *group; 1270 const EC_GROUP *group;
1271 const EC_POINT *pubkey;
1272 unsigned char *data;
1274 int encoded_len = 0; 1273 int encoded_len = 0;
1275 int curve_id = 0; 1274 int curve_id = 0;
1276 BN_CTX *bn_ctx = NULL; 1275 BN_CTX *bn_ctx = NULL;
1276 EC_KEY *ecdh;
1277 CBB ecpoint;
1277 int al; 1278 int al;
1278 1279
1279 ecdhp = s->cert->ecdh_tmp; 1280 /*
1280 if (s->cert->ecdh_tmp_auto != 0) { 1281 * Only named curves are supported in ECDH ephemeral key exchanges.
1281 if (nid != NID_undef) 1282 * For supported named curves, curve_id is non-zero.
1282 ecdhp = EC_KEY_new_by_curve_name(nid); 1283 */
1283 } else if (ecdhp == NULL && s->cert->ecdh_tmp_cb != NULL) { 1284 if ((curve_id = tls1_ec_nid2curve_id(nid)) == 0) {
1284 ecdhp = s->cert->ecdh_tmp_cb(s, 0, 1285 SSLerror(s, SSL_R_UNSUPPORTED_ELLIPTIC_CURVE);
1285 SSL_C_PKEYLENGTH(S3I(s)->hs.new_cipher)); 1286 goto err;
1286 }
1287 if (ecdhp == NULL) {
1288 al = SSL_AD_HANDSHAKE_FAILURE;
1289 SSLerror(s, SSL_R_MISSING_TMP_ECDH_KEY);
1290 goto f_err;
1291 } 1287 }
1292 1288
1293 if (S3I(s)->tmp.ecdh != NULL) { 1289 if (S3I(s)->tmp.ecdh != NULL) {
@@ -1295,46 +1291,28 @@ ssl3_send_server_kex_ecdhe_ecp(SSL *s, int nid, CBB *cbb)
1295 goto err; 1291 goto err;
1296 } 1292 }
1297 1293
1298 /* Duplicate the ECDH structure. */ 1294 if ((S3I(s)->tmp.ecdh = EC_KEY_new_by_curve_name(nid)) == NULL) {
1299 if (s->cert->ecdh_tmp_auto != 0) { 1295 al = SSL_AD_HANDSHAKE_FAILURE;
1300 ecdh = ecdhp; 1296 SSLerror(s, SSL_R_MISSING_TMP_ECDH_KEY);
1301 } else if ((ecdh = EC_KEY_dup(ecdhp)) == NULL) { 1297 goto f_err;
1302 SSLerror(s, ERR_R_ECDH_LIB);
1303 goto err;
1304 }
1305 S3I(s)->tmp.ecdh = ecdh;
1306
1307 if ((EC_KEY_get0_public_key(ecdh) == NULL) ||
1308 (EC_KEY_get0_private_key(ecdh) == NULL) ||
1309 (s->internal->options & SSL_OP_SINGLE_ECDH_USE)) {
1310 if (!EC_KEY_generate_key(ecdh)) {
1311 SSLerror(s, ERR_R_ECDH_LIB);
1312 goto err;
1313 }
1314 } 1298 }
1299 ecdh = S3I(s)->tmp.ecdh;
1315 1300
1316 if (((group = EC_KEY_get0_group(ecdh)) == NULL) || 1301 if (!EC_KEY_generate_key(ecdh)) {
1317 (EC_KEY_get0_public_key(ecdh) == NULL) ||
1318 (EC_KEY_get0_private_key(ecdh) == NULL)) {
1319 SSLerror(s, ERR_R_ECDH_LIB); 1302 SSLerror(s, ERR_R_ECDH_LIB);
1320 goto err; 1303 goto err;
1321 } 1304 }
1322 1305 if ((group = EC_KEY_get0_group(ecdh)) == NULL ||
1323 /* 1306 (pubkey = EC_KEY_get0_public_key(ecdh)) == NULL ||
1324 * Only named curves are supported in ECDH ephemeral key exchanges. 1307 EC_KEY_get0_private_key(ecdh) == NULL) {
1325 * For supported named curves, curve_id is non-zero. 1308 SSLerror(s, ERR_R_ECDH_LIB);
1326 */
1327 if ((curve_id = tls1_ec_nid2curve_id(
1328 EC_GROUP_get_curve_name(group))) == 0) {
1329 SSLerror(s, SSL_R_UNSUPPORTED_ELLIPTIC_CURVE);
1330 goto err; 1309 goto err;
1331 } 1310 }
1332 1311
1333 /* 1312 /*
1334 * Encode the public key. First check the size of encoding and 1313 * Encode the public key.
1335 * allocate memory accordingly.
1336 */ 1314 */
1337 encoded_len = EC_POINT_point2oct(group, EC_KEY_get0_public_key(ecdh), 1315 encoded_len = EC_POINT_point2oct(group, pubkey,
1338 POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL); 1316 POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL);
1339 if (encoded_len == 0) { 1317 if (encoded_len == 0) {
1340 SSLerror(s, ERR_R_ECDH_LIB); 1318 SSLerror(s, ERR_R_ECDH_LIB);
@@ -1360,8 +1338,8 @@ ssl3_send_server_kex_ecdhe_ecp(SSL *s, int nid, CBB *cbb)
1360 goto err; 1338 goto err;
1361 if (!CBB_add_space(&ecpoint, &data, encoded_len)) 1339 if (!CBB_add_space(&ecpoint, &data, encoded_len))
1362 goto err; 1340 goto err;
1363 if (EC_POINT_point2oct(group, EC_KEY_get0_public_key(ecdh), 1341 if (EC_POINT_point2oct(group, pubkey, POINT_CONVERSION_UNCOMPRESSED,
1364 POINT_CONVERSION_UNCOMPRESSED, data, encoded_len, bn_ctx) == 0) { 1342 data, encoded_len, bn_ctx) == 0) {
1365 SSLerror(s, ERR_R_ECDH_LIB); 1343 SSLerror(s, ERR_R_ECDH_LIB);
1366 goto err; 1344 goto err;
1367 } 1345 }
@@ -1431,7 +1409,7 @@ ssl3_send_server_kex_ecdhe(SSL *s, CBB *cbb)
1431 1409
1432 nid = tls1_get_shared_curve(s); 1410 nid = tls1_get_shared_curve(s);
1433 1411
1434 if (s->cert->ecdh_tmp_auto != 0 && nid == NID_X25519) 1412 if (nid == NID_X25519)
1435 return ssl3_send_server_kex_ecdhe_ecx(s, nid, cbb); 1413 return ssl3_send_server_kex_ecdhe_ecx(s, nid, cbb);
1436 1414
1437 return ssl3_send_server_kex_ecdhe_ecp(s, nid, cbb); 1415 return ssl3_send_server_kex_ecdhe_ecp(s, nid, cbb);
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c
index ea44e7579a..42fd18fe2d 100644
--- a/src/lib/libssl/t1_lib.c
+++ b/src/lib/libssl/t1_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: t1_lib.c,v 1.123 2017/08/09 22:24:25 jsing Exp $ */ 1/* $OpenBSD: t1_lib.c,v 1.124 2017/08/10 17:18:38 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 *
@@ -611,18 +611,13 @@ tls1_check_ec_tmp_key(SSL *s)
611 EC_KEY *ec = s->cert->ecdh_tmp; 611 EC_KEY *ec = s->cert->ecdh_tmp;
612 uint16_t curve_id; 612 uint16_t curve_id;
613 613
614 if (s->cert->ecdh_tmp_auto != 0) { 614 /* Need a shared curve. */
615 /* Need a shared curve. */ 615 if (tls1_get_shared_curve(s) != NID_undef)
616 if (tls1_get_shared_curve(s) != NID_undef) 616 return (1);
617 return (1);
618 return (0);
619 }
620 617
621 if (ec == NULL) { 618 if (ec == NULL)
622 if (s->cert->ecdh_tmp_cb != NULL)
623 return (1);
624 return (0); 619 return (0);
625 } 620
626 if (tls1_set_ec_id(&curve_id, NULL, ec) != 1) 621 if (tls1_set_ec_id(&curve_id, NULL, ec) != 1)
627 return (0); 622 return (0);
628 623