inet6: only mark autoconf addresses tentative if detached
[dragonfly.git] / crypto / libressl / ssl / tls_key_share.c
blob048db25bd542120a530095ec7ac160ba1c42b9ba
1 /* $OpenBSD: tls_key_share.c,v 1.7 2022/07/02 16:00:12 tb Exp $ */
2 /*
3 * Copyright (c) 2020, 2021 Joel Sing <jsing@openbsd.org>
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 #include <stdlib.h>
20 #include <openssl/curve25519.h>
21 #include <openssl/dh.h>
22 #include <openssl/ec.h>
23 #include <openssl/evp.h>
25 #include "bytestring.h"
26 #include "ssl_locl.h"
27 #include "tls_internal.h"
29 struct tls_key_share {
30 int nid;
31 uint16_t group_id;
32 size_t key_bits;
34 DH *dhe;
35 DH *dhe_peer;
37 EC_KEY *ecdhe;
38 EC_KEY *ecdhe_peer;
40 uint8_t *x25519_public;
41 uint8_t *x25519_private;
42 uint8_t *x25519_peer_public;
45 static struct tls_key_share *
46 tls_key_share_new_internal(int nid, uint16_t group_id)
48 struct tls_key_share *ks;
50 if ((ks = calloc(1, sizeof(struct tls_key_share))) == NULL)
51 return NULL;
53 ks->group_id = group_id;
54 ks->nid = nid;
56 return ks;
59 struct tls_key_share *
60 tls_key_share_new(uint16_t group_id)
62 int nid;
64 if (!tls1_ec_group_id2nid(group_id, &nid))
65 return NULL;
67 return tls_key_share_new_internal(nid, group_id);
70 struct tls_key_share *
71 tls_key_share_new_nid(int nid)
73 uint16_t group_id = 0;
75 if (nid != NID_dhKeyAgreement) {
76 if (!tls1_ec_nid2group_id(nid, &group_id))
77 return NULL;
80 return tls_key_share_new_internal(nid, group_id);
83 void
84 tls_key_share_free(struct tls_key_share *ks)
86 if (ks == NULL)
87 return;
89 DH_free(ks->dhe);
90 DH_free(ks->dhe_peer);
92 EC_KEY_free(ks->ecdhe);
93 EC_KEY_free(ks->ecdhe_peer);
95 freezero(ks->x25519_public, X25519_KEY_LENGTH);
96 freezero(ks->x25519_private, X25519_KEY_LENGTH);
97 freezero(ks->x25519_peer_public, X25519_KEY_LENGTH);
99 freezero(ks, sizeof(*ks));
102 uint16_t
103 tls_key_share_group(struct tls_key_share *ks)
105 return ks->group_id;
109 tls_key_share_nid(struct tls_key_share *ks)
111 return ks->nid;
114 void
115 tls_key_share_set_key_bits(struct tls_key_share *ks, size_t key_bits)
117 ks->key_bits = key_bits;
121 tls_key_share_set_dh_params(struct tls_key_share *ks, DH *dh_params)
123 if (ks->nid != NID_dhKeyAgreement)
124 return 0;
125 if (ks->dhe != NULL || ks->dhe_peer != NULL)
126 return 0;
128 if ((ks->dhe = DHparams_dup(dh_params)) == NULL)
129 return 0;
130 if ((ks->dhe_peer = DHparams_dup(dh_params)) == NULL)
131 return 0;
133 return 1;
137 tls_key_share_peer_pkey(struct tls_key_share *ks, EVP_PKEY *pkey)
139 if (ks->nid == NID_dhKeyAgreement && ks->dhe_peer != NULL)
140 return EVP_PKEY_set1_DH(pkey, ks->dhe_peer);
142 if (ks->nid == NID_X25519 && ks->x25519_peer_public != NULL)
143 return ssl_kex_dummy_ecdhe_x25519(pkey);
145 if (ks->ecdhe_peer != NULL)
146 return EVP_PKEY_set1_EC_KEY(pkey, ks->ecdhe_peer);
148 return 0;
151 static int
152 tls_key_share_generate_dhe(struct tls_key_share *ks)
155 * If auto params are not being used then we must already have DH
156 * parameters set.
158 if (ks->key_bits == 0) {
159 if (ks->dhe == NULL)
160 return 0;
162 return ssl_kex_generate_dhe(ks->dhe, ks->dhe);
165 if (ks->dhe != NULL || ks->dhe_peer != NULL)
166 return 0;
168 if ((ks->dhe = DH_new()) == NULL)
169 return 0;
170 if (!ssl_kex_generate_dhe_params_auto(ks->dhe, ks->key_bits))
171 return 0;
172 if ((ks->dhe_peer = DHparams_dup(ks->dhe)) == NULL)
173 return 0;
175 return 1;
178 static int
179 tls_key_share_generate_ecdhe_ecp(struct tls_key_share *ks)
181 EC_KEY *ecdhe = NULL;
182 int ret = 0;
184 if (ks->ecdhe != NULL)
185 goto err;
187 if ((ecdhe = EC_KEY_new()) == NULL)
188 goto err;
189 if (!ssl_kex_generate_ecdhe_ecp(ecdhe, ks->nid))
190 goto err;
192 ks->ecdhe = ecdhe;
193 ecdhe = NULL;
195 ret = 1;
197 err:
198 EC_KEY_free(ecdhe);
200 return ret;
203 static int
204 tls_key_share_generate_x25519(struct tls_key_share *ks)
206 uint8_t *public = NULL, *private = NULL;
207 int ret = 0;
209 if (ks->x25519_public != NULL || ks->x25519_private != NULL)
210 goto err;
212 if ((public = calloc(1, X25519_KEY_LENGTH)) == NULL)
213 goto err;
214 if ((private = calloc(1, X25519_KEY_LENGTH)) == NULL)
215 goto err;
217 X25519_keypair(public, private);
219 ks->x25519_public = public;
220 ks->x25519_private = private;
221 public = NULL;
222 private = NULL;
224 ret = 1;
226 err:
227 freezero(public, X25519_KEY_LENGTH);
228 freezero(private, X25519_KEY_LENGTH);
230 return ret;
234 tls_key_share_generate(struct tls_key_share *ks)
236 if (ks->nid == NID_dhKeyAgreement)
237 return tls_key_share_generate_dhe(ks);
239 if (ks->nid == NID_X25519)
240 return tls_key_share_generate_x25519(ks);
242 return tls_key_share_generate_ecdhe_ecp(ks);
245 static int
246 tls_key_share_params_dhe(struct tls_key_share *ks, CBB *cbb)
248 if (ks->dhe == NULL)
249 return 0;
251 return ssl_kex_params_dhe(ks->dhe, cbb);
255 tls_key_share_params(struct tls_key_share *ks, CBB *cbb)
257 if (ks->nid == NID_dhKeyAgreement)
258 return tls_key_share_params_dhe(ks, cbb);
260 return 0;
263 static int
264 tls_key_share_public_dhe(struct tls_key_share *ks, CBB *cbb)
266 if (ks->dhe == NULL)
267 return 0;
269 return ssl_kex_public_dhe(ks->dhe, cbb);
272 static int
273 tls_key_share_public_ecdhe_ecp(struct tls_key_share *ks, CBB *cbb)
275 if (ks->ecdhe == NULL)
276 return 0;
278 return ssl_kex_public_ecdhe_ecp(ks->ecdhe, cbb);
281 static int
282 tls_key_share_public_x25519(struct tls_key_share *ks, CBB *cbb)
284 if (ks->x25519_public == NULL)
285 return 0;
287 return CBB_add_bytes(cbb, ks->x25519_public, X25519_KEY_LENGTH);
291 tls_key_share_public(struct tls_key_share *ks, CBB *cbb)
293 if (ks->nid == NID_dhKeyAgreement)
294 return tls_key_share_public_dhe(ks, cbb);
296 if (ks->nid == NID_X25519)
297 return tls_key_share_public_x25519(ks, cbb);
299 return tls_key_share_public_ecdhe_ecp(ks, cbb);
302 static int
303 tls_key_share_peer_params_dhe(struct tls_key_share *ks, CBS *cbs,
304 int *decode_error, int *invalid_params)
306 if (ks->dhe != NULL || ks->dhe_peer != NULL)
307 return 0;
309 if ((ks->dhe_peer = DH_new()) == NULL)
310 return 0;
311 if (!ssl_kex_peer_params_dhe(ks->dhe_peer, cbs, decode_error,
312 invalid_params))
313 return 0;
314 if ((ks->dhe = DHparams_dup(ks->dhe_peer)) == NULL)
315 return 0;
317 return 1;
321 tls_key_share_peer_params(struct tls_key_share *ks, CBS *cbs,
322 int *decode_error, int *invalid_params)
324 if (ks->nid != NID_dhKeyAgreement)
325 return 0;
327 return tls_key_share_peer_params_dhe(ks, cbs, decode_error,
328 invalid_params);
331 static int
332 tls_key_share_peer_public_dhe(struct tls_key_share *ks, CBS *cbs,
333 int *decode_error, int *invalid_key)
335 if (ks->dhe_peer == NULL)
336 return 0;
338 return ssl_kex_peer_public_dhe(ks->dhe_peer, cbs, decode_error,
339 invalid_key);
342 static int
343 tls_key_share_peer_public_ecdhe_ecp(struct tls_key_share *ks, CBS *cbs)
345 EC_KEY *ecdhe = NULL;
346 int ret = 0;
348 if (ks->ecdhe_peer != NULL)
349 goto err;
351 if ((ecdhe = EC_KEY_new()) == NULL)
352 goto err;
353 if (!ssl_kex_peer_public_ecdhe_ecp(ecdhe, ks->nid, cbs))
354 goto err;
356 ks->ecdhe_peer = ecdhe;
357 ecdhe = NULL;
359 ret = 1;
361 err:
362 EC_KEY_free(ecdhe);
364 return ret;
367 static int
368 tls_key_share_peer_public_x25519(struct tls_key_share *ks, CBS *cbs,
369 int *decode_error)
371 size_t out_len;
373 *decode_error = 0;
375 if (ks->x25519_peer_public != NULL)
376 return 0;
378 if (CBS_len(cbs) != X25519_KEY_LENGTH) {
379 *decode_error = 1;
380 return 0;
383 return CBS_stow(cbs, &ks->x25519_peer_public, &out_len);
387 tls_key_share_peer_public(struct tls_key_share *ks, CBS *cbs, int *decode_error,
388 int *invalid_key)
390 *decode_error = 0;
392 if (invalid_key != NULL)
393 *invalid_key = 0;
395 if (ks->nid == NID_dhKeyAgreement)
396 return tls_key_share_peer_public_dhe(ks, cbs, decode_error,
397 invalid_key);
399 if (ks->nid == NID_X25519)
400 return tls_key_share_peer_public_x25519(ks, cbs, decode_error);
402 return tls_key_share_peer_public_ecdhe_ecp(ks, cbs);
405 static int
406 tls_key_share_derive_dhe(struct tls_key_share *ks,
407 uint8_t **shared_key, size_t *shared_key_len)
409 if (ks->dhe == NULL || ks->dhe_peer == NULL)
410 return 0;
412 return ssl_kex_derive_dhe(ks->dhe, ks->dhe_peer, shared_key,
413 shared_key_len);
416 static int
417 tls_key_share_derive_ecdhe_ecp(struct tls_key_share *ks,
418 uint8_t **shared_key, size_t *shared_key_len)
420 if (ks->ecdhe == NULL || ks->ecdhe_peer == NULL)
421 return 0;
423 return ssl_kex_derive_ecdhe_ecp(ks->ecdhe, ks->ecdhe_peer,
424 shared_key, shared_key_len);
427 static int
428 tls_key_share_derive_x25519(struct tls_key_share *ks,
429 uint8_t **shared_key, size_t *shared_key_len)
431 uint8_t *sk = NULL;
432 int ret = 0;
434 if (ks->x25519_private == NULL || ks->x25519_peer_public == NULL)
435 goto err;
437 if ((sk = calloc(1, X25519_KEY_LENGTH)) == NULL)
438 goto err;
439 if (!X25519(sk, ks->x25519_private, ks->x25519_peer_public))
440 goto err;
442 *shared_key = sk;
443 *shared_key_len = X25519_KEY_LENGTH;
444 sk = NULL;
446 ret = 1;
448 err:
449 freezero(sk, X25519_KEY_LENGTH);
451 return ret;
455 tls_key_share_derive(struct tls_key_share *ks, uint8_t **shared_key,
456 size_t *shared_key_len)
458 if (*shared_key != NULL)
459 return 0;
461 *shared_key_len = 0;
463 if (ks->nid == NID_dhKeyAgreement)
464 return tls_key_share_derive_dhe(ks, shared_key,
465 shared_key_len);
467 if (ks->nid == NID_X25519)
468 return tls_key_share_derive_x25519(ks, shared_key,
469 shared_key_len);
471 return tls_key_share_derive_ecdhe_ecp(ks, shared_key,
472 shared_key_len);
476 tls_key_share_peer_security(const SSL *ssl, struct tls_key_share *ks)
478 switch (ks->nid) {
479 case NID_dhKeyAgreement:
480 return ssl_security_dh(ssl, ks->dhe_peer);
481 default:
482 return 0;