summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/libssl/tls13_key_share.c103
1 files changed, 98 insertions, 5 deletions
diff --git a/src/lib/libssl/tls13_key_share.c b/src/lib/libssl/tls13_key_share.c
index 3fe38ecc37..c38a3e3cb8 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.2 2020/02/01 12:41:58 jsing Exp $ */ 1/* $OpenBSD: tls13_key_share.c,v 1.3 2020/02/04 18:06:26 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2020 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -27,6 +27,9 @@ struct tls13_key_share {
27 int nid; 27 int nid;
28 uint16_t group_id; 28 uint16_t group_id;
29 29
30 EC_KEY *ecdhe;
31 EC_KEY *ecdhe_peer;
32
30 uint8_t *x25519_public; 33 uint8_t *x25519_public;
31 uint8_t *x25519_private; 34 uint8_t *x25519_private;
32 uint8_t *x25519_peer_public; 35 uint8_t *x25519_peer_public;
@@ -59,6 +62,9 @@ tls13_key_share_free(struct tls13_key_share *ks)
59 if (ks == NULL) 62 if (ks == NULL)
60 return; 63 return;
61 64
65 EC_KEY_free(ks->ecdhe);
66 EC_KEY_free(ks->ecdhe_peer);
67
62 freezero(ks->x25519_public, X25519_KEY_LENGTH); 68 freezero(ks->x25519_public, X25519_KEY_LENGTH);
63 freezero(ks->x25519_private, X25519_KEY_LENGTH); 69 freezero(ks->x25519_private, X25519_KEY_LENGTH);
64 freezero(ks->x25519_peer_public, X25519_KEY_LENGTH); 70 freezero(ks->x25519_peer_public, X25519_KEY_LENGTH);
@@ -73,6 +79,31 @@ tls13_key_share_group(struct tls13_key_share *ks)
73} 79}
74 80
75static int 81static int
82tls13_key_share_generate_ecdhe_ecp(struct tls13_key_share *ks)
83{
84 EC_KEY *ecdhe = NULL;
85 int ret = 0;
86
87 if (ks->ecdhe != NULL)
88 goto err;
89
90 if ((ecdhe = EC_KEY_new()) == NULL)
91 goto err;
92 if (!ssl_kex_generate_ecdhe_ecp(ecdhe, ks->nid))
93 goto err;
94
95 ks->ecdhe = ecdhe;
96 ecdhe = NULL;
97
98 ret = 1;
99
100 err:
101 EC_KEY_free(ecdhe);
102
103 return ret;
104}
105
106static int
76tls13_key_share_generate_x25519(struct tls13_key_share *ks) 107tls13_key_share_generate_x25519(struct tls13_key_share *ks)
77{ 108{
78 uint8_t *public = NULL, *private = NULL; 109 uint8_t *public = NULL, *private = NULL;
@@ -105,13 +136,24 @@ tls13_key_share_generate_x25519(struct tls13_key_share *ks)
105int 136int
106tls13_key_share_generate(struct tls13_key_share *ks) 137tls13_key_share_generate(struct tls13_key_share *ks)
107{ 138{
108 if (ks->nid == NID_X25519) 139 if (ks->nid == NID_X9_62_prime256v1 || ks->nid == NID_secp384r1)
140 return tls13_key_share_generate_ecdhe_ecp(ks);
141 else if (ks->nid == NID_X25519)
109 return tls13_key_share_generate_x25519(ks); 142 return tls13_key_share_generate_x25519(ks);
110 143
111 return 0; 144 return 0;
112} 145}
113 146
114static int 147static int
148tls13_key_share_public_ecdhe_ecp(struct tls13_key_share *ks, CBB *cbb)
149{
150 if (ks->ecdhe == NULL)
151 return 0;
152
153 return ssl_kex_public_ecdhe_ecp(ks->ecdhe, cbb);
154}
155
156static int
115tls13_key_share_public_x25519(struct tls13_key_share *ks, CBB *cbb) 157tls13_key_share_public_x25519(struct tls13_key_share *ks, CBB *cbb)
116{ 158{
117 if (ks->x25519_public == NULL) 159 if (ks->x25519_public == NULL)
@@ -130,7 +172,10 @@ tls13_key_share_public(struct tls13_key_share *ks, CBB *cbb)
130 if (!CBB_add_u16_length_prefixed(cbb, &key_exchange)) 172 if (!CBB_add_u16_length_prefixed(cbb, &key_exchange))
131 goto err; 173 goto err;
132 174
133 if (ks->nid == NID_X25519) { 175 if (ks->nid == NID_X9_62_prime256v1 || ks->nid == NID_secp384r1) {
176 if (!tls13_key_share_public_ecdhe_ecp(ks, &key_exchange))
177 goto err;
178 } else if (ks->nid == NID_X25519) {
134 if (!tls13_key_share_public_x25519(ks, &key_exchange)) 179 if (!tls13_key_share_public_x25519(ks, &key_exchange))
135 goto err; 180 goto err;
136 } else { 181 } else {
@@ -147,10 +192,38 @@ tls13_key_share_public(struct tls13_key_share *ks, CBB *cbb)
147} 192}
148 193
149static int 194static int
195tls13_key_share_peer_public_ecdhe_ecp(struct tls13_key_share *ks, CBS *cbs)
196{
197 EC_KEY *ecdhe = NULL;
198 int ret = 0;
199
200 if (ks->ecdhe_peer != NULL)
201 goto err;
202
203 if ((ecdhe = EC_KEY_new()) == NULL)
204 goto err;
205 if (!ssl_kex_peer_public_ecdhe_ecp(ecdhe, ks->nid, cbs))
206 goto err;
207
208 ks->ecdhe_peer = ecdhe;
209 ecdhe = NULL;
210
211 ret = 1;
212
213 err:
214 EC_KEY_free(ecdhe);
215
216 return ret;
217}
218
219static int
150tls13_key_share_peer_public_x25519(struct tls13_key_share *ks, CBS *cbs) 220tls13_key_share_peer_public_x25519(struct tls13_key_share *ks, CBS *cbs)
151{ 221{
152 size_t out_len; 222 size_t out_len;
153 223
224 if (ks->x25519_peer_public != NULL)
225 return 0;
226
154 if (CBS_len(cbs) != X25519_KEY_LENGTH) 227 if (CBS_len(cbs) != X25519_KEY_LENGTH)
155 return 0; 228 return 0;
156 229
@@ -164,15 +237,31 @@ tls13_key_share_peer_public(struct tls13_key_share *ks, uint16_t group,
164 if (ks->group_id != group) 237 if (ks->group_id != group)
165 return 0; 238 return 0;
166 239
167 if (ks->nid == NID_X25519) { 240 if (ks->nid == NID_X9_62_prime256v1 || ks->nid == NID_secp384r1) {
241 if (!tls13_key_share_peer_public_ecdhe_ecp(ks, cbs))
242 return 0;
243 } else if (ks->nid == NID_X25519) {
168 if (!tls13_key_share_peer_public_x25519(ks, cbs)) 244 if (!tls13_key_share_peer_public_x25519(ks, cbs))
169 return 0; 245 return 0;
246 } else {
247 return 0;
170 } 248 }
171 249
172 return 1; 250 return 1;
173} 251}
174 252
175static int 253static int
254tls13_key_share_derive_ecdhe_ecp(struct tls13_key_share *ks,
255 uint8_t **shared_key, size_t *shared_key_len)
256{
257 if (ks->ecdhe == NULL || ks->ecdhe_peer == NULL)
258 return 0;
259
260 return ssl_kex_derive_ecdhe_ecp(ks->ecdhe, ks->ecdhe_peer,
261 shared_key, shared_key_len);
262}
263
264static int
176tls13_key_share_derive_x25519(struct tls13_key_share *ks, 265tls13_key_share_derive_x25519(struct tls13_key_share *ks,
177 uint8_t **shared_key, size_t *shared_key_len) 266 uint8_t **shared_key, size_t *shared_key_len)
178{ 267{
@@ -208,9 +297,13 @@ tls13_key_share_derive(struct tls13_key_share *ks, uint8_t **shared_key,
208 297
209 *shared_key_len = 0; 298 *shared_key_len = 0;
210 299
211 if (ks->nid == NID_X25519) 300 if (ks->nid == NID_X9_62_prime256v1 || ks->nid == NID_secp384r1) {
301 return tls13_key_share_derive_ecdhe_ecp(ks, shared_key,
302 shared_key_len);
303 } else if (ks->nid == NID_X25519) {
212 return tls13_key_share_derive_x25519(ks, shared_key, 304 return tls13_key_share_derive_x25519(ks, shared_key,
213 shared_key_len); 305 shared_key_len);
306 }
214 307
215 return 0; 308 return 0;
216} 309}