summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2020-04-18 14:07:56 +0000
committerjsing <>2020-04-18 14:07:56 +0000
commitd82ca953a5e7d61a103ae2e7c9744db82d74f016 (patch)
treeb56b281a4429eb0ae90ce91eefde6f9a80d7d18f
parent33d8c111a77ac681a8ecffcda0713ec96c6fe953 (diff)
downloadopenbsd-d82ca953a5e7d61a103ae2e7c9744db82d74f016.tar.gz
openbsd-d82ca953a5e7d61a103ae2e7c9744db82d74f016.tar.bz2
openbsd-d82ca953a5e7d61a103ae2e7c9744db82d74f016.zip
Expose the peer ephemeral public key used for TLSv1.3 key exchange.
SSL_get_server_tmp_key() provides the peer ephemeral public key used for key exchange. In the case of TLSv1.3 this is essentially the peer public key from the key share used for TLSv1.3 key exchange, hence make it availaable via SSL_get_server_tmp_key(). ok inoguchi@ tb@
-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{