1*c9675a23Stb /* $OpenBSD: tls_key_share.c,v 1.8 2022/11/26 16:08:56 tb Exp $ */
2b8e3503dSjsing /*
3aebe2672Sjsing * Copyright (c) 2020, 2021 Joel Sing <jsing@openbsd.org>
4b8e3503dSjsing *
5b8e3503dSjsing * Permission to use, copy, modify, and distribute this software for any
6b8e3503dSjsing * purpose with or without fee is hereby granted, provided that the above
7b8e3503dSjsing * copyright notice and this permission notice appear in all copies.
8b8e3503dSjsing *
9b8e3503dSjsing * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10b8e3503dSjsing * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11b8e3503dSjsing * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12b8e3503dSjsing * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13b8e3503dSjsing * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14b8e3503dSjsing * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15b8e3503dSjsing * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16b8e3503dSjsing */
17b8e3503dSjsing
18b8e3503dSjsing #include <stdlib.h>
19b8e3503dSjsing
20b8e3503dSjsing #include <openssl/curve25519.h>
21aebe2672Sjsing #include <openssl/dh.h>
22b8e3503dSjsing #include <openssl/ec.h>
23aebe2672Sjsing #include <openssl/evp.h>
24b8e3503dSjsing
25b8e3503dSjsing #include "bytestring.h"
26*c9675a23Stb #include "ssl_local.h"
27b8e3503dSjsing #include "tls_internal.h"
28b8e3503dSjsing
29b8e3503dSjsing struct tls_key_share {
30b8e3503dSjsing int nid;
31b8e3503dSjsing uint16_t group_id;
32aebe2672Sjsing size_t key_bits;
33b8e3503dSjsing
34892af70eSjsing DH *dhe;
35892af70eSjsing DH *dhe_peer;
36892af70eSjsing
37b8e3503dSjsing EC_KEY *ecdhe;
38b8e3503dSjsing EC_KEY *ecdhe_peer;
39b8e3503dSjsing
40b8e3503dSjsing uint8_t *x25519_public;
41b8e3503dSjsing uint8_t *x25519_private;
42b8e3503dSjsing uint8_t *x25519_peer_public;
43b8e3503dSjsing };
44b8e3503dSjsing
45892af70eSjsing static struct tls_key_share *
tls_key_share_new_internal(int nid,uint16_t group_id)46892af70eSjsing tls_key_share_new_internal(int nid, uint16_t group_id)
47b8e3503dSjsing {
48b8e3503dSjsing struct tls_key_share *ks;
49b8e3503dSjsing
50b8e3503dSjsing if ((ks = calloc(1, sizeof(struct tls_key_share))) == NULL)
51b8e3503dSjsing return NULL;
52b8e3503dSjsing
53b8e3503dSjsing ks->group_id = group_id;
54b8e3503dSjsing ks->nid = nid;
55b8e3503dSjsing
56b8e3503dSjsing return ks;
57b8e3503dSjsing }
58b8e3503dSjsing
59b8e3503dSjsing struct tls_key_share *
tls_key_share_new(uint16_t group_id)60892af70eSjsing tls_key_share_new(uint16_t group_id)
61b8e3503dSjsing {
62892af70eSjsing int nid;
63b8e3503dSjsing
64c5270c5dStb if (!tls1_ec_group_id2nid(group_id, &nid))
65b8e3503dSjsing return NULL;
66b8e3503dSjsing
67892af70eSjsing return tls_key_share_new_internal(nid, group_id);
68892af70eSjsing }
69892af70eSjsing
70892af70eSjsing struct tls_key_share *
tls_key_share_new_nid(int nid)71892af70eSjsing tls_key_share_new_nid(int nid)
72892af70eSjsing {
73892af70eSjsing uint16_t group_id = 0;
74892af70eSjsing
75892af70eSjsing if (nid != NID_dhKeyAgreement) {
76c5270c5dStb if (!tls1_ec_nid2group_id(nid, &group_id))
77892af70eSjsing return NULL;
78892af70eSjsing }
79892af70eSjsing
80892af70eSjsing return tls_key_share_new_internal(nid, group_id);
81b8e3503dSjsing }
82b8e3503dSjsing
83b8e3503dSjsing void
tls_key_share_free(struct tls_key_share * ks)84b8e3503dSjsing tls_key_share_free(struct tls_key_share *ks)
85b8e3503dSjsing {
86b8e3503dSjsing if (ks == NULL)
87b8e3503dSjsing return;
88b8e3503dSjsing
89892af70eSjsing DH_free(ks->dhe);
90892af70eSjsing DH_free(ks->dhe_peer);
91892af70eSjsing
92b8e3503dSjsing EC_KEY_free(ks->ecdhe);
93b8e3503dSjsing EC_KEY_free(ks->ecdhe_peer);
94b8e3503dSjsing
95b8e3503dSjsing freezero(ks->x25519_public, X25519_KEY_LENGTH);
96b8e3503dSjsing freezero(ks->x25519_private, X25519_KEY_LENGTH);
97b8e3503dSjsing freezero(ks->x25519_peer_public, X25519_KEY_LENGTH);
98b8e3503dSjsing
99b8e3503dSjsing freezero(ks, sizeof(*ks));
100b8e3503dSjsing }
101b8e3503dSjsing
102b8e3503dSjsing uint16_t
tls_key_share_group(struct tls_key_share * ks)103b8e3503dSjsing tls_key_share_group(struct tls_key_share *ks)
104b8e3503dSjsing {
105b8e3503dSjsing return ks->group_id;
106b8e3503dSjsing }
107b8e3503dSjsing
108b8e3503dSjsing int
tls_key_share_nid(struct tls_key_share * ks)109892af70eSjsing tls_key_share_nid(struct tls_key_share *ks)
110892af70eSjsing {
111892af70eSjsing return ks->nid;
112892af70eSjsing }
113892af70eSjsing
114aebe2672Sjsing void
tls_key_share_set_key_bits(struct tls_key_share * ks,size_t key_bits)115aebe2672Sjsing tls_key_share_set_key_bits(struct tls_key_share *ks, size_t key_bits)
116aebe2672Sjsing {
117aebe2672Sjsing ks->key_bits = key_bits;
118aebe2672Sjsing }
119aebe2672Sjsing
120aebe2672Sjsing int
tls_key_share_set_dh_params(struct tls_key_share * ks,DH * dh_params)121aebe2672Sjsing tls_key_share_set_dh_params(struct tls_key_share *ks, DH *dh_params)
122aebe2672Sjsing {
123aebe2672Sjsing if (ks->nid != NID_dhKeyAgreement)
124aebe2672Sjsing return 0;
125aebe2672Sjsing if (ks->dhe != NULL || ks->dhe_peer != NULL)
126aebe2672Sjsing return 0;
127aebe2672Sjsing
128aebe2672Sjsing if ((ks->dhe = DHparams_dup(dh_params)) == NULL)
129aebe2672Sjsing return 0;
130aebe2672Sjsing if ((ks->dhe_peer = DHparams_dup(dh_params)) == NULL)
131aebe2672Sjsing return 0;
132aebe2672Sjsing
133aebe2672Sjsing return 1;
134aebe2672Sjsing }
135aebe2672Sjsing
136892af70eSjsing int
tls_key_share_peer_pkey(struct tls_key_share * ks,EVP_PKEY * pkey)137b8e3503dSjsing tls_key_share_peer_pkey(struct tls_key_share *ks, EVP_PKEY *pkey)
138b8e3503dSjsing {
139892af70eSjsing if (ks->nid == NID_dhKeyAgreement && ks->dhe_peer != NULL)
140892af70eSjsing return EVP_PKEY_set1_DH(pkey, ks->dhe_peer);
141892af70eSjsing
142892af70eSjsing if (ks->nid == NID_X25519 && ks->x25519_peer_public != NULL)
143892af70eSjsing return ssl_kex_dummy_ecdhe_x25519(pkey);
144892af70eSjsing
145892af70eSjsing if (ks->ecdhe_peer != NULL)
146892af70eSjsing return EVP_PKEY_set1_EC_KEY(pkey, ks->ecdhe_peer);
147892af70eSjsing
148b8e3503dSjsing return 0;
149b8e3503dSjsing }
150b8e3503dSjsing
151892af70eSjsing static int
tls_key_share_generate_dhe(struct tls_key_share * ks)152892af70eSjsing tls_key_share_generate_dhe(struct tls_key_share *ks)
153892af70eSjsing {
154aebe2672Sjsing /*
155aebe2672Sjsing * If auto params are not being used then we must already have DH
156aebe2672Sjsing * parameters set.
157aebe2672Sjsing */
158aebe2672Sjsing if (ks->key_bits == 0) {
159892af70eSjsing if (ks->dhe == NULL)
160892af70eSjsing return 0;
161892af70eSjsing
162892af70eSjsing return ssl_kex_generate_dhe(ks->dhe, ks->dhe);
163b8e3503dSjsing }
164b8e3503dSjsing
165aebe2672Sjsing if (ks->dhe != NULL || ks->dhe_peer != NULL)
166aebe2672Sjsing return 0;
167aebe2672Sjsing
168aebe2672Sjsing if ((ks->dhe = DH_new()) == NULL)
169aebe2672Sjsing return 0;
170aebe2672Sjsing if (!ssl_kex_generate_dhe_params_auto(ks->dhe, ks->key_bits))
171aebe2672Sjsing return 0;
172aebe2672Sjsing if ((ks->dhe_peer = DHparams_dup(ks->dhe)) == NULL)
173aebe2672Sjsing return 0;
174aebe2672Sjsing
175aebe2672Sjsing return 1;
176aebe2672Sjsing }
177aebe2672Sjsing
178b8e3503dSjsing static int
tls_key_share_generate_ecdhe_ecp(struct tls_key_share * ks)179b8e3503dSjsing tls_key_share_generate_ecdhe_ecp(struct tls_key_share *ks)
180b8e3503dSjsing {
181b8e3503dSjsing EC_KEY *ecdhe = NULL;
182b8e3503dSjsing int ret = 0;
183b8e3503dSjsing
184b8e3503dSjsing if (ks->ecdhe != NULL)
185b8e3503dSjsing goto err;
186b8e3503dSjsing
187b8e3503dSjsing if ((ecdhe = EC_KEY_new()) == NULL)
188b8e3503dSjsing goto err;
189b8e3503dSjsing if (!ssl_kex_generate_ecdhe_ecp(ecdhe, ks->nid))
190b8e3503dSjsing goto err;
191b8e3503dSjsing
192b8e3503dSjsing ks->ecdhe = ecdhe;
193b8e3503dSjsing ecdhe = NULL;
194b8e3503dSjsing
195b8e3503dSjsing ret = 1;
196b8e3503dSjsing
197b8e3503dSjsing err:
198b8e3503dSjsing EC_KEY_free(ecdhe);
199b8e3503dSjsing
200b8e3503dSjsing return ret;
201b8e3503dSjsing }
202b8e3503dSjsing
203b8e3503dSjsing static int
tls_key_share_generate_x25519(struct tls_key_share * ks)204b8e3503dSjsing tls_key_share_generate_x25519(struct tls_key_share *ks)
205b8e3503dSjsing {
206b8e3503dSjsing uint8_t *public = NULL, *private = NULL;
207b8e3503dSjsing int ret = 0;
208b8e3503dSjsing
209b8e3503dSjsing if (ks->x25519_public != NULL || ks->x25519_private != NULL)
210b8e3503dSjsing goto err;
211b8e3503dSjsing
212b8e3503dSjsing if ((public = calloc(1, X25519_KEY_LENGTH)) == NULL)
213b8e3503dSjsing goto err;
214b8e3503dSjsing if ((private = calloc(1, X25519_KEY_LENGTH)) == NULL)
215b8e3503dSjsing goto err;
216b8e3503dSjsing
217b8e3503dSjsing X25519_keypair(public, private);
218b8e3503dSjsing
219b8e3503dSjsing ks->x25519_public = public;
220b8e3503dSjsing ks->x25519_private = private;
221b8e3503dSjsing public = NULL;
222b8e3503dSjsing private = NULL;
223b8e3503dSjsing
224b8e3503dSjsing ret = 1;
225b8e3503dSjsing
226b8e3503dSjsing err:
227b8e3503dSjsing freezero(public, X25519_KEY_LENGTH);
228b8e3503dSjsing freezero(private, X25519_KEY_LENGTH);
229b8e3503dSjsing
230b8e3503dSjsing return ret;
231b8e3503dSjsing }
232b8e3503dSjsing
233b8e3503dSjsing int
tls_key_share_generate(struct tls_key_share * ks)234b8e3503dSjsing tls_key_share_generate(struct tls_key_share *ks)
235b8e3503dSjsing {
236892af70eSjsing if (ks->nid == NID_dhKeyAgreement)
237892af70eSjsing return tls_key_share_generate_dhe(ks);
238892af70eSjsing
239b8e3503dSjsing if (ks->nid == NID_X25519)
240b8e3503dSjsing return tls_key_share_generate_x25519(ks);
241b8e3503dSjsing
242b8e3503dSjsing return tls_key_share_generate_ecdhe_ecp(ks);
243b8e3503dSjsing }
244b8e3503dSjsing
245b8e3503dSjsing static int
tls_key_share_params_dhe(struct tls_key_share * ks,CBB * cbb)246aebe2672Sjsing tls_key_share_params_dhe(struct tls_key_share *ks, CBB *cbb)
247aebe2672Sjsing {
248aebe2672Sjsing if (ks->dhe == NULL)
249aebe2672Sjsing return 0;
250aebe2672Sjsing
251aebe2672Sjsing return ssl_kex_params_dhe(ks->dhe, cbb);
252aebe2672Sjsing }
253aebe2672Sjsing
254aebe2672Sjsing int
tls_key_share_params(struct tls_key_share * ks,CBB * cbb)255aebe2672Sjsing tls_key_share_params(struct tls_key_share *ks, CBB *cbb)
256aebe2672Sjsing {
257aebe2672Sjsing if (ks->nid == NID_dhKeyAgreement)
258aebe2672Sjsing return tls_key_share_params_dhe(ks, cbb);
259aebe2672Sjsing
260aebe2672Sjsing return 0;
261aebe2672Sjsing }
262aebe2672Sjsing
263aebe2672Sjsing static int
tls_key_share_public_dhe(struct tls_key_share * ks,CBB * cbb)264892af70eSjsing tls_key_share_public_dhe(struct tls_key_share *ks, CBB *cbb)
265892af70eSjsing {
266892af70eSjsing if (ks->dhe == NULL)
267892af70eSjsing return 0;
268892af70eSjsing
269892af70eSjsing return ssl_kex_public_dhe(ks->dhe, cbb);
270892af70eSjsing }
271892af70eSjsing
272892af70eSjsing static int
tls_key_share_public_ecdhe_ecp(struct tls_key_share * ks,CBB * cbb)273b8e3503dSjsing tls_key_share_public_ecdhe_ecp(struct tls_key_share *ks, CBB *cbb)
274b8e3503dSjsing {
275b8e3503dSjsing if (ks->ecdhe == NULL)
276b8e3503dSjsing return 0;
277b8e3503dSjsing
278b8e3503dSjsing return ssl_kex_public_ecdhe_ecp(ks->ecdhe, cbb);
279b8e3503dSjsing }
280b8e3503dSjsing
281b8e3503dSjsing static int
tls_key_share_public_x25519(struct tls_key_share * ks,CBB * cbb)282b8e3503dSjsing tls_key_share_public_x25519(struct tls_key_share *ks, CBB *cbb)
283b8e3503dSjsing {
284b8e3503dSjsing if (ks->x25519_public == NULL)
285b8e3503dSjsing return 0;
286b8e3503dSjsing
287b8e3503dSjsing return CBB_add_bytes(cbb, ks->x25519_public, X25519_KEY_LENGTH);
288b8e3503dSjsing }
289b8e3503dSjsing
290b8e3503dSjsing int
tls_key_share_public(struct tls_key_share * ks,CBB * cbb)291b8e3503dSjsing tls_key_share_public(struct tls_key_share *ks, CBB *cbb)
292b8e3503dSjsing {
293892af70eSjsing if (ks->nid == NID_dhKeyAgreement)
294892af70eSjsing return tls_key_share_public_dhe(ks, cbb);
295892af70eSjsing
296b8e3503dSjsing if (ks->nid == NID_X25519)
297b8e3503dSjsing return tls_key_share_public_x25519(ks, cbb);
298b8e3503dSjsing
299b8e3503dSjsing return tls_key_share_public_ecdhe_ecp(ks, cbb);
300b8e3503dSjsing }
301b8e3503dSjsing
302b8e3503dSjsing static int
tls_key_share_peer_params_dhe(struct tls_key_share * ks,CBS * cbs,int * decode_error,int * invalid_params)303892af70eSjsing tls_key_share_peer_params_dhe(struct tls_key_share *ks, CBS *cbs,
3047dd422f8Sjsing int *decode_error, int *invalid_params)
305892af70eSjsing {
306892af70eSjsing if (ks->dhe != NULL || ks->dhe_peer != NULL)
307892af70eSjsing return 0;
308892af70eSjsing
309892af70eSjsing if ((ks->dhe_peer = DH_new()) == NULL)
310892af70eSjsing return 0;
3117dd422f8Sjsing if (!ssl_kex_peer_params_dhe(ks->dhe_peer, cbs, decode_error,
3127dd422f8Sjsing invalid_params))
313892af70eSjsing return 0;
314892af70eSjsing if ((ks->dhe = DHparams_dup(ks->dhe_peer)) == NULL)
315892af70eSjsing return 0;
316892af70eSjsing
317892af70eSjsing return 1;
318892af70eSjsing }
319892af70eSjsing
320892af70eSjsing int
tls_key_share_peer_params(struct tls_key_share * ks,CBS * cbs,int * decode_error,int * invalid_params)321892af70eSjsing tls_key_share_peer_params(struct tls_key_share *ks, CBS *cbs,
3227dd422f8Sjsing int *decode_error, int *invalid_params)
323892af70eSjsing {
324892af70eSjsing if (ks->nid != NID_dhKeyAgreement)
325892af70eSjsing return 0;
326892af70eSjsing
3277dd422f8Sjsing return tls_key_share_peer_params_dhe(ks, cbs, decode_error,
3287dd422f8Sjsing invalid_params);
329892af70eSjsing }
330892af70eSjsing
331892af70eSjsing static int
tls_key_share_peer_public_dhe(struct tls_key_share * ks,CBS * cbs,int * decode_error,int * invalid_key)332892af70eSjsing tls_key_share_peer_public_dhe(struct tls_key_share *ks, CBS *cbs,
3337dd422f8Sjsing int *decode_error, int *invalid_key)
334892af70eSjsing {
335892af70eSjsing if (ks->dhe_peer == NULL)
336892af70eSjsing return 0;
337892af70eSjsing
3387dd422f8Sjsing return ssl_kex_peer_public_dhe(ks->dhe_peer, cbs, decode_error,
3397dd422f8Sjsing invalid_key);
340892af70eSjsing }
341892af70eSjsing
342892af70eSjsing static int
tls_key_share_peer_public_ecdhe_ecp(struct tls_key_share * ks,CBS * cbs)343b8e3503dSjsing tls_key_share_peer_public_ecdhe_ecp(struct tls_key_share *ks, CBS *cbs)
344b8e3503dSjsing {
345b8e3503dSjsing EC_KEY *ecdhe = NULL;
346b8e3503dSjsing int ret = 0;
347b8e3503dSjsing
348b8e3503dSjsing if (ks->ecdhe_peer != NULL)
349b8e3503dSjsing goto err;
350b8e3503dSjsing
351b8e3503dSjsing if ((ecdhe = EC_KEY_new()) == NULL)
352b8e3503dSjsing goto err;
353b8e3503dSjsing if (!ssl_kex_peer_public_ecdhe_ecp(ecdhe, ks->nid, cbs))
354b8e3503dSjsing goto err;
355b8e3503dSjsing
356b8e3503dSjsing ks->ecdhe_peer = ecdhe;
357b8e3503dSjsing ecdhe = NULL;
358b8e3503dSjsing
359b8e3503dSjsing ret = 1;
360b8e3503dSjsing
361b8e3503dSjsing err:
362b8e3503dSjsing EC_KEY_free(ecdhe);
363b8e3503dSjsing
364b8e3503dSjsing return ret;
365b8e3503dSjsing }
366b8e3503dSjsing
367b8e3503dSjsing static int
tls_key_share_peer_public_x25519(struct tls_key_share * ks,CBS * cbs,int * decode_error)3687dd422f8Sjsing tls_key_share_peer_public_x25519(struct tls_key_share *ks, CBS *cbs,
3697dd422f8Sjsing int *decode_error)
370b8e3503dSjsing {
371b8e3503dSjsing size_t out_len;
372b8e3503dSjsing
3737dd422f8Sjsing *decode_error = 0;
3747dd422f8Sjsing
375b8e3503dSjsing if (ks->x25519_peer_public != NULL)
376b8e3503dSjsing return 0;
377b8e3503dSjsing
3787dd422f8Sjsing if (CBS_len(cbs) != X25519_KEY_LENGTH) {
3797dd422f8Sjsing *decode_error = 1;
380b8e3503dSjsing return 0;
3817dd422f8Sjsing }
382b8e3503dSjsing
383b8e3503dSjsing return CBS_stow(cbs, &ks->x25519_peer_public, &out_len);
384b8e3503dSjsing }
385b8e3503dSjsing
386b8e3503dSjsing int
tls_key_share_peer_public(struct tls_key_share * ks,CBS * cbs,int * decode_error,int * invalid_key)3877dd422f8Sjsing tls_key_share_peer_public(struct tls_key_share *ks, CBS *cbs, int *decode_error,
3887dd422f8Sjsing int *invalid_key)
389b8e3503dSjsing {
3907dd422f8Sjsing *decode_error = 0;
3917dd422f8Sjsing
392892af70eSjsing if (invalid_key != NULL)
393892af70eSjsing *invalid_key = 0;
394b8e3503dSjsing
395892af70eSjsing if (ks->nid == NID_dhKeyAgreement)
3967dd422f8Sjsing return tls_key_share_peer_public_dhe(ks, cbs, decode_error,
3977dd422f8Sjsing invalid_key);
398892af70eSjsing
399892af70eSjsing if (ks->nid == NID_X25519)
4007dd422f8Sjsing return tls_key_share_peer_public_x25519(ks, cbs, decode_error);
401892af70eSjsing
402892af70eSjsing return tls_key_share_peer_public_ecdhe_ecp(ks, cbs);
403b8e3503dSjsing }
404b8e3503dSjsing
405892af70eSjsing static int
tls_key_share_derive_dhe(struct tls_key_share * ks,uint8_t ** shared_key,size_t * shared_key_len)406892af70eSjsing tls_key_share_derive_dhe(struct tls_key_share *ks,
407892af70eSjsing uint8_t **shared_key, size_t *shared_key_len)
408892af70eSjsing {
409892af70eSjsing if (ks->dhe == NULL || ks->dhe_peer == NULL)
410892af70eSjsing return 0;
411892af70eSjsing
412892af70eSjsing return ssl_kex_derive_dhe(ks->dhe, ks->dhe_peer, shared_key,
413892af70eSjsing shared_key_len);
414b8e3503dSjsing }
415b8e3503dSjsing
416b8e3503dSjsing static int
tls_key_share_derive_ecdhe_ecp(struct tls_key_share * ks,uint8_t ** shared_key,size_t * shared_key_len)417b8e3503dSjsing tls_key_share_derive_ecdhe_ecp(struct tls_key_share *ks,
418b8e3503dSjsing uint8_t **shared_key, size_t *shared_key_len)
419b8e3503dSjsing {
420b8e3503dSjsing if (ks->ecdhe == NULL || ks->ecdhe_peer == NULL)
421b8e3503dSjsing return 0;
422b8e3503dSjsing
423b8e3503dSjsing return ssl_kex_derive_ecdhe_ecp(ks->ecdhe, ks->ecdhe_peer,
424b8e3503dSjsing shared_key, shared_key_len);
425b8e3503dSjsing }
426b8e3503dSjsing
427b8e3503dSjsing static int
tls_key_share_derive_x25519(struct tls_key_share * ks,uint8_t ** shared_key,size_t * shared_key_len)428b8e3503dSjsing tls_key_share_derive_x25519(struct tls_key_share *ks,
429b8e3503dSjsing uint8_t **shared_key, size_t *shared_key_len)
430b8e3503dSjsing {
431b8e3503dSjsing uint8_t *sk = NULL;
432b8e3503dSjsing int ret = 0;
433b8e3503dSjsing
434b8e3503dSjsing if (ks->x25519_private == NULL || ks->x25519_peer_public == NULL)
435b8e3503dSjsing goto err;
436b8e3503dSjsing
437b8e3503dSjsing if ((sk = calloc(1, X25519_KEY_LENGTH)) == NULL)
438b8e3503dSjsing goto err;
439b8e3503dSjsing if (!X25519(sk, ks->x25519_private, ks->x25519_peer_public))
440b8e3503dSjsing goto err;
441b8e3503dSjsing
442b8e3503dSjsing *shared_key = sk;
443b8e3503dSjsing *shared_key_len = X25519_KEY_LENGTH;
444b8e3503dSjsing sk = NULL;
445b8e3503dSjsing
446b8e3503dSjsing ret = 1;
447b8e3503dSjsing
448b8e3503dSjsing err:
449b8e3503dSjsing freezero(sk, X25519_KEY_LENGTH);
450b8e3503dSjsing
451b8e3503dSjsing return ret;
452b8e3503dSjsing }
453b8e3503dSjsing
454b8e3503dSjsing int
tls_key_share_derive(struct tls_key_share * ks,uint8_t ** shared_key,size_t * shared_key_len)455b8e3503dSjsing tls_key_share_derive(struct tls_key_share *ks, uint8_t **shared_key,
456b8e3503dSjsing size_t *shared_key_len)
457b8e3503dSjsing {
458b8e3503dSjsing if (*shared_key != NULL)
459b8e3503dSjsing return 0;
460b8e3503dSjsing
461b8e3503dSjsing *shared_key_len = 0;
462b8e3503dSjsing
463892af70eSjsing if (ks->nid == NID_dhKeyAgreement)
464892af70eSjsing return tls_key_share_derive_dhe(ks, shared_key,
465892af70eSjsing shared_key_len);
466892af70eSjsing
467b8e3503dSjsing if (ks->nid == NID_X25519)
468b8e3503dSjsing return tls_key_share_derive_x25519(ks, shared_key,
469b8e3503dSjsing shared_key_len);
470b8e3503dSjsing
471b8e3503dSjsing return tls_key_share_derive_ecdhe_ecp(ks, shared_key,
472b8e3503dSjsing shared_key_len);
473b8e3503dSjsing }
4742c1036d8Stb
4752c1036d8Stb int
tls_key_share_peer_security(const SSL * ssl,struct tls_key_share * ks)4762c1036d8Stb tls_key_share_peer_security(const SSL *ssl, struct tls_key_share *ks)
4772c1036d8Stb {
4782c1036d8Stb switch (ks->nid) {
4792c1036d8Stb case NID_dhKeyAgreement:
4802c1036d8Stb return ssl_security_dh(ssl, ks->dhe_peer);
4812c1036d8Stb default:
4822c1036d8Stb return 0;
4832c1036d8Stb }
4842c1036d8Stb }
485