summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libssl/s3_lib.c48
-rw-r--r--src/lib/libssl/ssl_kex.c43
-rw-r--r--src/lib/libssl/ssl_locl.h3
-rw-r--r--src/lib/libssl/tls13_internal.h3
-rw-r--r--src/lib/libssl/tls13_key_share.c18
5 files changed, 79 insertions, 36 deletions
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c
index dfd5893a2f..87b43a3521 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.191 2020/02/16 14:33:04 inoguchi Exp $ */ 1/* $OpenBSD: s3_lib.c,v 1.192 2020/04/18 14:07:56 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 *
@@ -1652,10 +1652,6 @@ static long
1652ssl_ctrl_get_server_tmp_key(SSL *s, EVP_PKEY **pkey_tmp) 1652ssl_ctrl_get_server_tmp_key(SSL *s, EVP_PKEY **pkey_tmp)
1653{ 1653{
1654 EVP_PKEY *pkey = NULL; 1654 EVP_PKEY *pkey = NULL;
1655 EC_GROUP *group = NULL;
1656 EC_POINT *point = NULL;
1657 EC_KEY *ec_key = NULL;
1658 BIGNUM *order = NULL;
1659 SESS_CERT *sc; 1655 SESS_CERT *sc;
1660 int ret = 0; 1656 int ret = 0;
1661 1657
@@ -1672,41 +1668,29 @@ ssl_ctrl_get_server_tmp_key(SSL *s, EVP_PKEY **pkey_tmp)
1672 return 0; 1668 return 0;
1673 1669
1674 if (sc->peer_dh_tmp != NULL) { 1670 if (sc->peer_dh_tmp != NULL) {
1675 ret = EVP_PKEY_set1_DH(pkey, sc->peer_dh_tmp); 1671 if (!EVP_PKEY_set1_DH(pkey, sc->peer_dh_tmp))
1676 } else if (sc->peer_ecdh_tmp) {
1677 ret = EVP_PKEY_set1_EC_KEY(pkey, sc->peer_ecdh_tmp);
1678 } else if (sc->peer_x25519_tmp != NULL) {
1679 /* Fudge up an EC_KEY that looks like X25519... */
1680 if ((group = EC_GROUP_new_by_curve_name(
1681 NID_X9_62_prime256v1)) == NULL)
1682 goto err;
1683 if ((point = EC_POINT_new(group)) == NULL)
1684 goto err;
1685 if ((order = BN_new()) == NULL)
1686 goto err; 1672 goto err;
1687 if (!BN_set_bit(order, 252)) 1673 } else if (sc->peer_ecdh_tmp) {
1688 goto err; 1674 if (!EVP_PKEY_set1_EC_KEY(pkey, sc->peer_ecdh_tmp))
1689 if (!EC_GROUP_set_generator(group, point, order, NULL))
1690 goto err; 1675 goto err;
1691 EC_GROUP_set_curve_name(group, NID_X25519); 1676 } else if (sc->peer_x25519_tmp != NULL) {
1692 if ((ec_key = EC_KEY_new()) == NULL) 1677 if (!ssl_kex_dummy_ecdhe_x25519(pkey))
1693 goto err; 1678 goto err;
1694 if (!EC_KEY_set_group(ec_key, group)) 1679 } else if (S3I(s)->hs_tls13.key_share != NULL) {
1680 if (!tls13_key_share_peer_pkey(S3I(s)->hs_tls13.key_share,
1681 pkey))
1695 goto err; 1682 goto err;
1696 ret = EVP_PKEY_set1_EC_KEY(pkey, ec_key); 1683 } else {
1684 goto err;
1697 } 1685 }
1698 1686
1699 if (ret == 1) { 1687 *pkey_tmp = pkey;
1700 *pkey_tmp = pkey; 1688 pkey = NULL;
1701 pkey = NULL;
1702 }
1703 1689
1704 err: 1690 ret = 1;
1691
1692 err:
1705 EVP_PKEY_free(pkey); 1693 EVP_PKEY_free(pkey);
1706 EC_GROUP_free(group);
1707 EC_POINT_free(point);
1708 EC_KEY_free(ec_key);
1709 BN_free(order);
1710 1694
1711 return (ret); 1695 return (ret);
1712} 1696}
diff --git a/src/lib/libssl/ssl_kex.c b/src/lib/libssl/ssl_kex.c
index 439c1702b3..9f05fd60c9 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.1 2020/01/30 16:25:09 jsing Exp $ */ 1/* $OpenBSD: ssl_kex.c,v 1.2 2020/04/18 14:07:56 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2020 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -19,10 +19,51 @@
19 19
20#include <openssl/ec.h> 20#include <openssl/ec.h>
21#include <openssl/ecdh.h> 21#include <openssl/ecdh.h>
22#include <openssl/evp.h>
23#include <openssl/objects.h>
22 24
23#include "bytestring.h" 25#include "bytestring.h"
24 26
25int 27int
28ssl_kex_dummy_ecdhe_x25519(EVP_PKEY *pkey)
29{
30 EC_GROUP *group = NULL;
31 EC_POINT *point = NULL;
32 EC_KEY *ec_key = NULL;
33 BIGNUM *order = NULL;
34 int ret = 0;
35
36 /* Fudge up an EC_KEY that looks like X25519... */
37 if ((group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)) == NULL)
38 goto err;
39 if ((point = EC_POINT_new(group)) == NULL)
40 goto err;
41 if ((order = BN_new()) == NULL)
42 goto err;
43 if (!BN_set_bit(order, 252))
44 goto err;
45 if (!EC_GROUP_set_generator(group, point, order, NULL))
46 goto err;
47 EC_GROUP_set_curve_name(group, NID_X25519);
48 if ((ec_key = EC_KEY_new()) == NULL)
49 goto err;
50 if (!EC_KEY_set_group(ec_key, group))
51 goto err;
52 if (!EVP_PKEY_set1_EC_KEY(pkey, ec_key))
53 goto err;
54
55 ret = 1;
56
57 err:
58 EC_GROUP_free(group);
59 EC_POINT_free(point);
60 EC_KEY_free(ec_key);
61 BN_free(order);
62
63 return ret;
64}
65
66int
26ssl_kex_generate_ecdhe_ecp(EC_KEY *ecdh, int nid) 67ssl_kex_generate_ecdhe_ecp(EC_KEY *ecdh, int nid)
27{ 68{
28 EC_GROUP *group; 69 EC_GROUP *group;
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index 07240e31a2..0212166678 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.271 2020/03/16 15:25:14 tb Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.272 2020/04/18 14:07:56 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 *
@@ -1288,6 +1288,7 @@ int ssl3_get_client_certificate(SSL *s);
1288int ssl3_get_client_key_exchange(SSL *s); 1288int ssl3_get_client_key_exchange(SSL *s);
1289int ssl3_get_cert_verify(SSL *s); 1289int ssl3_get_cert_verify(SSL *s);
1290 1290
1291int ssl_kex_dummy_ecdhe_x25519(EVP_PKEY *pkey);
1291int ssl_kex_generate_ecdhe_ecp(EC_KEY *ecdh, int nid); 1292int ssl_kex_generate_ecdhe_ecp(EC_KEY *ecdh, int nid);
1292int ssl_kex_public_ecdhe_ecp(EC_KEY *ecdh, CBB *cbb); 1293int ssl_kex_public_ecdhe_ecp(EC_KEY *ecdh, CBB *cbb);
1293int ssl_kex_peer_public_ecdhe_ecp(EC_KEY *ecdh, int nid, CBS *cbs); 1294int ssl_kex_peer_public_ecdhe_ecp(EC_KEY *ecdh, int nid, CBS *cbs);
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h
index 8d5d9c4efe..6f5f5197d0 100644
--- a/src/lib/libssl/tls13_internal.h
+++ b/src/lib/libssl/tls13_internal.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_internal.h,v 1.62 2020/04/17 17:16:53 jsing Exp $ */ 1/* $OpenBSD: tls13_internal.h,v 1.63 2020/04/18 14:07:56 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018 Bob Beck <beck@openbsd.org>
4 * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> 4 * Copyright (c) 2018 Theo Buehler <tb@openbsd.org>
@@ -128,6 +128,7 @@ struct tls13_key_share *tls13_key_share_new_nid(int nid);
128void tls13_key_share_free(struct tls13_key_share *ks); 128void tls13_key_share_free(struct tls13_key_share *ks);
129 129
130uint16_t tls13_key_share_group(struct tls13_key_share *ks); 130uint16_t tls13_key_share_group(struct tls13_key_share *ks);
131int tls13_key_share_peer_pkey(struct tls13_key_share *ks, EVP_PKEY *pkey);
131int tls13_key_share_generate(struct tls13_key_share *ks); 132int tls13_key_share_generate(struct tls13_key_share *ks);
132int tls13_key_share_public(struct tls13_key_share *ks, CBB *cbb); 133int tls13_key_share_public(struct tls13_key_share *ks, CBB *cbb);
133int tls13_key_share_peer_public(struct tls13_key_share *ks, uint16_t group, 134int tls13_key_share_peer_public(struct tls13_key_share *ks, uint16_t group,
diff --git a/src/lib/libssl/tls13_key_share.c b/src/lib/libssl/tls13_key_share.c
index 58544dc1db..0d1c091462 100644
--- a/src/lib/libssl/tls13_key_share.c
+++ b/src/lib/libssl/tls13_key_share.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_key_share.c,v 1.5 2020/04/18 13:43:47 jsing Exp $ */ 1/* $OpenBSD: tls13_key_share.c,v 1.6 2020/04/18 14:07:56 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2020 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -86,6 +86,22 @@ tls13_key_share_group(struct tls13_key_share *ks)
86 return ks->group_id; 86 return ks->group_id;
87} 87}
88 88
89int
90tls13_key_share_peer_pkey(struct tls13_key_share *ks, EVP_PKEY *pkey)
91{
92 if (ks->nid == NID_X25519 && ks->x25519_peer_public != NULL) {
93 if (!ssl_kex_dummy_ecdhe_x25519(pkey))
94 return 0;
95 } else if (ks->ecdhe_peer != NULL) {
96 if (!EVP_PKEY_set1_EC_KEY(pkey, ks->ecdhe_peer))
97 return 0;
98 } else {
99 return 0;
100 }
101
102 return 1;
103}
104
89static int 105static int
90tls13_key_share_generate_ecdhe_ecp(struct tls13_key_share *ks) 106tls13_key_share_generate_ecdhe_ecp(struct tls13_key_share *ks)
91{ 107{