OpenVPN
tls_crypt.c
Go to the documentation of this file.
1/*
2 * OpenVPN -- An application to securely tunnel IP networks
3 * over a single TCP/UDP port, with support for SSL/TLS-based
4 * session authentication and key exchange,
5 * packet encryption, packet authentication, and
6 * packet compression.
7 *
8 * Copyright (C) 2016-2021 Fox Crypto B.V. <openvpn@foxcrypto.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2
12 * as published by the Free Software Foundation.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 */
23
24#ifdef HAVE_CONFIG_H
25#include "config.h"
26#endif
27
28#include "syshead.h"
29
30#include "argv.h"
31#include "base64.h"
32#include "crypto.h"
33#include "platform.h"
34#include "run_command.h"
35#include "session_id.h"
36#include "ssl.h"
37
38#include "tls_crypt.h"
39
40const char *tls_crypt_v2_cli_pem_name = "OpenVPN tls-crypt-v2 client key";
41const char *tls_crypt_v2_srv_pem_name = "OpenVPN tls-crypt-v2 server key";
42
44static const uint8_t TLS_CRYPT_METADATA_TYPE_USER = 0x00;
46static const uint8_t TLS_CRYPT_METADATA_TYPE_TIMESTAMP = 0x01;
47
48static struct key_type
50{
51 return create_kt("AES-256-CTR", "SHA256", "tls-crypt");
52}
53
54int
59
60void
61tls_crypt_init_key(struct key_ctx_bi *key, struct key2 *keydata,
62 const char *key_file, bool key_inline, bool tls_server)
63{
64 const int key_direction = tls_server ?
66 struct key_type kt = tls_crypt_kt();
67 if (!kt.cipher || !kt.digest)
68 {
69 msg(M_FATAL, "ERROR: --tls-crypt not supported");
70 }
71 crypto_read_openvpn_key(&kt, key, key_file, key_inline, key_direction,
72 "Control Channel Encryption", "tls-crypt", keydata);
73}
74
78static void
79xor_key2(struct key2 *key, const struct key2 *other)
80{
81 ASSERT(key->n == 2 && other->n == 2);
82 for (int k = 0; k < 2; k++)
83 {
84 for (int j = 0; j < MAX_CIPHER_KEY_LENGTH; j++)
85 {
86 key->keys[k].cipher[j] = key->keys[k].cipher[j] ^ other->keys[k].cipher[j];
87 }
88
89 for (int j = 0; j < MAX_HMAC_KEY_LENGTH; j++)
90 {
91 key->keys[k].hmac[j] = key->keys[k].hmac[j] ^ other->keys[k].hmac[j];
92 }
93
94 }
95}
96
97bool
99{
100 session->tls_wrap_reneg.opt = session->tls_wrap.opt;
101 session->tls_wrap_reneg.mode = TLS_WRAP_CRYPT;
102 session->tls_wrap_reneg.cleanup_key_ctx = true;
103 session->tls_wrap_reneg.work = alloc_buf(BUF_SIZE(&session->opt->frame));
104 session->tls_wrap_reneg.opt.pid_persist = NULL;
105
106 packet_id_init(&session->tls_wrap_reneg.opt.packet_id,
107 session->opt->replay_window,
108 session->opt->replay_time,
109 "TLS_WRAP_RENEG", session->key_id);
110
111
112 struct key2 rengokeys;
115 rengokeys.keys, sizeof(rengokeys.keys)))
116 {
117 return false;
118 }
119 rengokeys.n = 2;
120
121 if (session->tls_wrap.mode == TLS_WRAP_CRYPT
122 || session->tls_wrap.mode == TLS_WRAP_AUTH)
123 {
124 xor_key2(&rengokeys, &session->tls_wrap.original_wrap_keydata);
125 }
126
127 const int key_direction = session->opt->server ?
129
130 struct key_direction_state kds;
131 key_direction_state_init(&kds, key_direction);
132
133 struct key_type kt = tls_crypt_kt();
134
135 init_key_ctx_bi(&session->tls_wrap_reneg.opt.key_ctx_bi, &rengokeys, key_direction,
136 &kt, "dynamic tls-crypt");
137 secure_memzero(&rengokeys, sizeof(rengokeys));
138
139 return true;
140}
141
142
143bool
144tls_crypt_wrap(const struct buffer *src, struct buffer *dst,
145 struct crypto_options *opt)
146{
147 const struct key_ctx *ctx = &opt->key_ctx_bi.encrypt;
148 struct gc_arena gc;
149
150 /* IV, packet-ID and implicit IV required for this mode. */
151 ASSERT(ctx->cipher);
152 ASSERT(ctx->hmac);
154 ASSERT(hmac_ctx_size(ctx->hmac) == 256/8);
155
156 gc_init(&gc);
157
158 dmsg(D_PACKET_CONTENT, "TLS-CRYPT WRAP FROM: %s",
159 format_hex(BPTR(src), BLEN(src), 80, &gc));
160
161 /* Get packet ID */
162 if (!packet_id_write(&opt->packet_id.send, dst, true, false))
163 {
164 msg(D_CRYPT_ERRORS, "TLS-CRYPT ERROR: packet ID roll over.");
165 goto err;
166 }
167
168 dmsg(D_PACKET_CONTENT, "TLS-CRYPT WRAP AD: %s",
169 format_hex(BPTR(dst), BLEN(dst), 0, &gc));
170
171 /* Buffer overflow check */
173 {
174 msg(D_CRYPT_ERRORS, "TLS-CRYPT WRAP: buffer size error, "
175 "sc=%d so=%d sl=%d dc=%d do=%d dl=%d", src->capacity, src->offset,
176 src->len, dst->capacity, dst->offset, dst->len);
177 goto err;
178 }
179
180 /* Calculate auth tag and synthetic IV */
181 {
182 uint8_t *tag = NULL;
183 hmac_ctx_reset(ctx->hmac);
184 hmac_ctx_update(ctx->hmac, BPTR(dst), BLEN(dst));
185 hmac_ctx_update(ctx->hmac, BPTR(src), BLEN(src));
186
188 hmac_ctx_final(ctx->hmac, tag);
189
190 dmsg(D_PACKET_CONTENT, "TLS-CRYPT WRAP TAG: %s",
191 format_hex(tag, TLS_CRYPT_TAG_SIZE, 0, &gc));
192
193 /* Use the 128 most significant bits of the tag as IV */
194 ASSERT(cipher_ctx_reset(ctx->cipher, tag));
195 }
196
197 /* Encrypt src */
198 {
199 int outlen = 0;
200 ASSERT(cipher_ctx_update(ctx->cipher, BEND(dst), &outlen,
201 BPTR(src), BLEN(src)));
202 ASSERT(buf_inc_len(dst, outlen));
203 ASSERT(cipher_ctx_final(ctx->cipher, BPTR(dst), &outlen));
204 ASSERT(buf_inc_len(dst, outlen));
205 }
206
207 dmsg(D_PACKET_CONTENT, "TLS-CRYPT WRAP TO: %s",
208 format_hex(BPTR(dst), BLEN(dst), 80, &gc));
209
210 gc_free(&gc);
211 return true;
212
213err:
215 dst->len = 0;
216 gc_free(&gc);
217 return false;
218}
219
220bool
221tls_crypt_unwrap(const struct buffer *src, struct buffer *dst,
222 struct crypto_options *opt)
223{
224 static const char error_prefix[] = "tls-crypt unwrap error";
225 const struct key_ctx *ctx = &opt->key_ctx_bi.decrypt;
226 struct gc_arena gc;
227
228 gc_init(&gc);
229
230 ASSERT(opt);
231 ASSERT(src->len > 0);
232 ASSERT(ctx->cipher);
234 || (opt->flags & CO_IGNORE_PACKET_ID));
235
236 dmsg(D_PACKET_CONTENT, "TLS-CRYPT UNWRAP FROM: %s",
237 format_hex(BPTR(src), BLEN(src), 80, &gc));
238
239 if (buf_len(src) < TLS_CRYPT_OFF_CT)
240 {
241 CRYPT_ERROR("packet too short");
242 }
243
244 /* Decrypt cipher text */
245 {
246 int outlen = 0;
247
248 /* Buffer overflow check (should never fail) */
250 {
251 CRYPT_ERROR("potential buffer overflow");
252 }
253
255 {
256 CRYPT_ERROR("cipher reset failed");
257 }
258 if (!cipher_ctx_update(ctx->cipher, BPTR(dst), &outlen,
260 {
261 CRYPT_ERROR("cipher update failed");
262 }
263 ASSERT(buf_inc_len(dst, outlen));
264 if (!cipher_ctx_final(ctx->cipher, BPTR(dst), &outlen))
265 {
266 CRYPT_ERROR("cipher final failed");
267 }
268 ASSERT(buf_inc_len(dst, outlen));
269 }
270
271 /* Check authentication */
272 {
273 const uint8_t *tag = BPTR(src) + TLS_CRYPT_OFF_TAG;
274 uint8_t tag_check[TLS_CRYPT_TAG_SIZE] = { 0 };
275
276 dmsg(D_PACKET_CONTENT, "TLS-CRYPT UNWRAP AD: %s",
277 format_hex(BPTR(src), TLS_CRYPT_OFF_TAG, 0, &gc));
278 dmsg(D_PACKET_CONTENT, "TLS-CRYPT UNWRAP TO: %s",
279 format_hex(BPTR(dst), BLEN(dst), 80, &gc));
280
281 hmac_ctx_reset(ctx->hmac);
283 hmac_ctx_update(ctx->hmac, BPTR(dst), BLEN(dst));
284 hmac_ctx_final(ctx->hmac, tag_check);
285
286 if (memcmp_constant_time(tag, tag_check, sizeof(tag_check)))
287 {
288 dmsg(D_CRYPTO_DEBUG, "tag : %s",
289 format_hex(tag, sizeof(tag_check), 0, &gc));
290 dmsg(D_CRYPTO_DEBUG, "tag_check: %s",
291 format_hex(tag_check, sizeof(tag_check), 0, &gc));
292 CRYPT_ERROR("packet authentication failed");
293 }
294 }
295
296 /* Check replay */
297 if (!(opt->flags & CO_IGNORE_PACKET_ID))
298 {
299 struct packet_id_net pin;
300 struct buffer tmp = *src;
302 ASSERT(packet_id_read(&pin, &tmp, true));
303 if (!crypto_check_replay(opt, &pin, 0, error_prefix, &gc))
304 {
305 CRYPT_ERROR("packet replay");
306 }
307 }
308
309 gc_free(&gc);
310 return true;
311
314 dst->len = 0;
315 gc_free(&gc);
316 return false;
317}
318
319static inline void
321 bool tls_server)
322{
323 const int key_direction = tls_server ?
325 struct key_type kt = tls_crypt_kt();
326 if (!kt.cipher || !kt.digest)
327 {
328 msg(M_FATAL, "ERROR: --tls-crypt-v2 not supported");
329 }
330 init_key_ctx_bi(key, key2, key_direction, &kt,
331 "Control Channel Encryption");
332}
333
334void
335tls_crypt_v2_init_client_key(struct key_ctx_bi *key, struct key2 *original_key,
336 struct buffer *wkc_buf, const char *key_file,
337 bool key_inline)
338{
341
344 {
345 msg(M_FATAL, "ERROR: invalid tls-crypt-v2 client key format");
346 }
347
348 struct key2 key2 = { .n = 2 };
349 if (!buf_read(&client_key, &key2.keys, sizeof(key2.keys)))
350 {
351 msg(M_FATAL, "ERROR: not enough data in tls-crypt-v2 client key");
352 }
353
355 *original_key = key2;
356
357 *wkc_buf = client_key;
358}
359
360void
362 const char *key_file, bool key_inline)
363{
364 struct key srv_key;
365 struct buffer srv_key_buf;
366
367 buf_set_write(&srv_key_buf, (void *)&srv_key, sizeof(srv_key));
370 {
371 msg(M_FATAL, "ERROR: invalid tls-crypt-v2 server key format");
372 }
373
374 struct key_type kt = tls_crypt_kt();
375 if (!kt.cipher || !kt.digest)
376 {
377 msg(M_FATAL, "ERROR: --tls-crypt-v2 not supported");
378 }
379 struct key_parameters srv_key_params;
380
381 key_parameters_from_key(&srv_key_params, &srv_key);
382
383 init_key_ctx(key_ctx, &srv_key_params, &kt, encrypt, "tls-crypt-v2 server key");
384 secure_memzero(&srv_key, sizeof(srv_key));
385}
386
387static bool
389 const struct key2 *src_key,
390 const struct buffer *src_metadata,
391 struct key_ctx *server_key, struct gc_arena *gc)
392{
393 cipher_ctx_t *cipher_ctx = server_key->cipher;
396
397 /* Calculate auth tag and synthetic IV */
399 if (!tag)
400 {
401 msg(M_WARN, "ERROR: could not write tag");
402 return false;
403 }
404 uint16_t net_len = htons(sizeof(src_key->keys) + BLEN(src_metadata)
405 + TLS_CRYPT_V2_TAG_SIZE + sizeof(uint16_t));
408 hmac_ctx_update(hmac_ctx, (void *)&net_len, sizeof(net_len));
409 hmac_ctx_update(hmac_ctx, (void *)src_key->keys, sizeof(src_key->keys));
412
413 dmsg(D_CRYPTO_DEBUG, "TLS-CRYPT WRAP TAG: %s",
415
416 /* Use the 128 most significant bits of the tag as IV */
418
419 /* Overflow check (OpenSSL requires an extra block in the dst buffer) */
420 if (buf_forward_capacity(&work) < (sizeof(src_key->keys)
422 + sizeof(net_len)
424 {
425 msg(M_WARN, "ERROR: could not crypt: insufficient space in dst");
426 return false;
427 }
428
429 /* Encrypt */
430 int outlen = 0;
432 (void *)src_key->keys, sizeof(src_key->keys)));
433 ASSERT(buf_inc_len(&work, outlen));
436 ASSERT(buf_inc_len(&work, outlen));
438 ASSERT(buf_inc_len(&work, outlen));
439 ASSERT(buf_write(&work, &net_len, sizeof(net_len)));
440
441 return buf_copy(wkc, &work);
442}
443
444static bool
445tls_crypt_v2_unwrap_client_key(struct key2 *client_key, struct buffer *metadata,
447 struct key_ctx *server_key)
448{
449 const char *error_prefix = __func__;
450 bool ret = false;
451 struct gc_arena gc = gc_new();
452 /* The crypto API requires one extra cipher block of buffer head room when
453 * decrypting, which nicely matches the tag size of WKc. So
454 * TLS_CRYPT_V2_MAX_WKC_LEN is always large enough for the plaintext. */
455 uint8_t plaintext_buf_data[TLS_CRYPT_V2_MAX_WKC_LEN] = { 0 };
456 struct buffer plaintext = { 0 };
457
458 dmsg(D_TLS_DEBUG_MED, "%s: unwrapping client key (len=%d): %s", __func__,
461 0, &gc));
462
464 {
465 CRYPT_ERROR("wrapped client key too big");
466 }
467
468 /* Decrypt client key and metadata */
469 uint16_t net_len = 0;
471
472 if (BLEN(&wrapped_client_key) < sizeof(net_len))
473 {
474 CRYPT_ERROR("failed to read length");
475 }
476 memcpy(&net_len, BEND(&wrapped_client_key) - sizeof(net_len),
477 sizeof(net_len));
478
479 if (ntohs(net_len) != BLEN(&wrapped_client_key))
480 {
481 dmsg(D_TLS_DEBUG_LOW, "%s: net_len=%u, BLEN=%i", __func__,
482 ntohs(net_len), BLEN(&wrapped_client_key));
483 CRYPT_ERROR("invalid length");
484 }
485
486 buf_inc_len(&wrapped_client_key, -(int)sizeof(net_len));
487
489 {
490 CRYPT_ERROR("failed to read tag");
491 }
492
493 if (!cipher_ctx_reset(server_key->cipher, tag))
494 {
495 CRYPT_ERROR("failed to initialize IV");
496 }
498 int outlen = 0;
502 {
503 CRYPT_ERROR("could not decrypt client key");
504 }
506
508 {
509 CRYPT_ERROR("cipher final failed");
510 }
512
513 /* Check authentication */
516 hmac_ctx_update(server_key->hmac, (void *)&net_len, sizeof(net_len));
518 BLEN(&plaintext));
520
522 {
523 dmsg(D_CRYPTO_DEBUG, "tag : %s",
524 format_hex(tag, sizeof(tag_check), 0, &gc));
525 dmsg(D_CRYPTO_DEBUG, "tag_check: %s",
526 format_hex(tag_check, sizeof(tag_check), 0, &gc));
527 CRYPT_ERROR("client key authentication error");
528 msg(D_TLS_DEBUG_LOW, "This might be a client-key that was generated for "
529 "a different tls-crypt-v2 server key)");
530 }
531
532 if (buf_len(&plaintext) < sizeof(client_key->keys))
533 {
534 CRYPT_ERROR("failed to read client key");
535 }
536 memcpy(&client_key->keys, BPTR(&plaintext), sizeof(client_key->keys));
537 ASSERT(buf_advance(&plaintext, sizeof(client_key->keys)));
538 client_key->n = 2;
539
540 if (!buf_copy(metadata, &plaintext))
541 {
542 CRYPT_ERROR("metadata too large for supplied buffer");
543 }
544
545 ret = true;
547 if (!ret)
548 {
549 secure_memzero(client_key, sizeof(*client_key));
550 }
552 gc_free(&gc);
553 return ret;
554}
555
556static bool
558 const struct tls_options *opt)
559{
560 bool ret = false;
561 struct gc_arena gc = gc_new();
562 const char *tmp_file = NULL;
563 struct buffer metadata = ctx->tls_crypt_v2_metadata;
564 int metadata_type = buf_read_u8(&metadata);
565 if (metadata_type < 0)
566 {
567 msg(M_WARN, "ERROR: no metadata type");
568 goto cleanup;
569 }
570
571 tmp_file = platform_create_temp_file(opt->tmp_dir, "tls_crypt_v2_metadata_",
572 &gc);
573 if (!tmp_file || !buffer_write_file(tmp_file, &metadata))
574 {
575 msg(M_WARN, "ERROR: could not write metadata to file");
576 goto cleanup;
577 }
578
579 char metadata_type_str[4] = { 0 }; /* Max value: 255 */
581 "%i", (uint8_t) metadata_type);
582 struct env_set *es = env_set_create(NULL);
583 setenv_str(es, "script_type", "tls-crypt-v2-verify");
584 setenv_str(es, "metadata_type", metadata_type_str);
585 setenv_str(es, "metadata_file", tmp_file);
586
587 struct argv argv = argv_new();
589 argv_msg_prefix(D_TLS_DEBUG, &argv, "Executing tls-crypt-v2-verify");
590
591 ret = openvpn_run_script(&argv, es, 0, "--tls-crypt-v2-verify");
592
593 argv_free(&argv);
595
596 if (!platform_unlink(tmp_file))
597 {
598 msg(M_WARN, "WARNING: failed to remove temp file '%s", tmp_file);
599 }
600
601 if (ret)
602 {
603 msg(D_HANDSHAKE, "TLS CRYPT V2 VERIFY SCRIPT OK");
604 }
605 else
606 {
607 msg(D_HANDSHAKE, "TLS CRYPT V2 VERIFY SCRIPT ERROR");
608 }
609
610cleanup:
611 gc_free(&gc);
612 return ret;
613}
614
615bool
617 struct tls_wrap_ctx *ctx,
618 const struct tls_options *opt)
619{
621 {
623 "Client wants tls-crypt-v2, but no server key present.");
624 return false;
625 }
626
627 msg(D_HANDSHAKE, "Control Channel: using tls-crypt-v2 key");
628
629 struct buffer wrapped_client_key = *buf;
630 uint16_t net_len = 0;
631
632 if (BLEN(&wrapped_client_key) < sizeof(net_len))
633 {
634 msg(D_TLS_ERRORS, "Can not read tls-crypt-v2 client key length");
635 return false;
636 }
637 memcpy(&net_len, BEND(&wrapped_client_key) - sizeof(net_len),
638 sizeof(net_len));
639
640 uint16_t wkc_len = ntohs(net_len);
642 {
643 msg(D_TLS_ERRORS, "Can not locate tls-crypt-v2 client key");
644 return false;
645 }
646
652 {
653 msg(D_TLS_ERRORS, "Can not unwrap tls-crypt-v2 client key");
655 return false;
656 }
657
658 /* Load the decrypted key */
659 ctx->mode = TLS_WRAP_CRYPT;
660 ctx->cleanup_key_ctx = true;
662 memset(&ctx->opt.key_ctx_bi, 0, sizeof(ctx->opt.key_ctx_bi));
664 &ctx->original_wrap_keydata, true);
665
666 /* Remove client key from buffer so tls-crypt code can unwrap message */
668
669 if (opt && opt->tls_crypt_v2_verify_script)
670 {
671 return tls_crypt_v2_verify_metadata(ctx, opt);
672 }
673
674 return true;
675}
676
677void
682
683void
685 const char *b64_metadata,
686 const char *server_key_file,
688{
689 struct gc_arena gc = gc_new();
690 struct key_ctx server_key = { 0 };
691 struct buffer client_key_pem = { 0 };
694 struct key2 client_key = { .n = 2 };
695
696 if (!rand_bytes((void *)client_key.keys, sizeof(client_key.keys)))
697 {
698 msg(M_FATAL, "ERROR: could not generate random key");
699 goto cleanup;
700 }
701 ASSERT(buf_write(&dst, client_key.keys, sizeof(client_key.keys)));
702
703 struct buffer metadata;
704 if (b64_metadata)
705 {
710 BCAP(&metadata));
711 if (decoded_len < 0)
712 {
713 msg(M_FATAL, "ERROR: failed to base64 decode provided metadata");
714 goto cleanup;
715 }
717 {
718 msg(M_FATAL,
719 "ERROR: metadata too long (%d bytes, max %u bytes)",
721 goto cleanup;
722 }
723 ASSERT(buf_inc_len(&metadata, decoded_len));
724 }
725 else
726 {
727 metadata = alloc_buf_gc(1 + sizeof(int64_t), &gc);
728 int64_t timestamp = htonll((uint64_t)now);
730 ASSERT(buf_write(&metadata, &timestamp, sizeof(timestamp)));
731 }
732
735 if (!tls_crypt_v2_wrap_client_key(&dst, &client_key, &metadata, &server_key,
736 &gc))
737 {
738 msg(M_FATAL, "ERROR: could not wrap generated client key");
739 goto cleanup;
740 }
741
742 /* PEM-encode Kc || WKc */
744 &gc))
745 {
746 msg(M_FATAL, "ERROR: could not PEM-encode client key");
747 goto cleanup;
748 }
749
750 const char *client_file = filename;
751 bool client_inline = false;
752
753 if (!filename || streq(filename, ""))
754 {
756 client_file = (const char *)BPTR(&client_key_pem);
757 client_inline = true;
758 }
759 else if (!buffer_write_file(filename, &client_key_pem))
760 {
761 msg(M_FATAL, "ERROR: could not write client key file");
762 goto cleanup;
763 }
764
765 /* Sanity check: load client key (as "client") */
768 struct key2 keydata;
769 msg(D_GENKEY, "Testing client-side key loading...");
770 tls_crypt_v2_init_client_key(&test_client_key, &keydata, &test_wrapped_client_key,
771 client_file, client_inline);
773
774 /* Sanity check: unwrap and load client key (as "server") */
776 &gc);
777 struct key2 test_client_key2 = { 0 };
778 free_key_ctx(&server_key);
779 tls_crypt_v2_init_server_key(&server_key, false, server_key_file,
780 server_key_inline);
781 msg(D_GENKEY, "Testing server-side key loading...");
782 ASSERT(tls_crypt_v2_unwrap_client_key(&test_client_key2, &test_metadata,
783 test_wrapped_client_key, &server_key));
784 secure_memzero(&test_client_key2, sizeof(test_client_key2));
785 free_buf(&test_wrapped_client_key);
786
787cleanup:
788 secure_memzero(&client_key, sizeof(client_key));
789 free_key_ctx(&server_key);
790 buf_clear(&client_key_pem);
791 buf_clear(&dst);
792
793 gc_free(&gc);
794}
void argv_msg_prefix(const int msglev, const struct argv *a, const char *prefix)
Similar to argv_msg() but prefixes the messages being written with a given string.
Definition argv.c:260
void argv_parse_cmd(struct argv *argres, const char *cmdstr)
Parses a command string, tokenizes it and puts each element into a separate struct argv argument slot...
Definition argv.c:483
void argv_free(struct argv *a)
Frees all memory allocations allocated by the struct argv related functions.
Definition argv.c:102
struct argv argv_new(void)
Allocates a new struct argv and ensures it is initialised.
Definition argv.c:88
#define OPENVPN_BASE64_DECODED_LENGTH(base64_length)
Compute the maximal number of bytes encoded in a base64 string.
Definition base64.h:42
void free_buf(struct buffer *buf)
Definition buffer.c:183
void buf_clear(struct buffer *buf)
Definition buffer.c:162
bool buffer_write_file(const char *filename, const struct buffer *buf)
Write buffer contents to file.
Definition buffer.c:300
struct buffer alloc_buf_gc(size_t size, struct gc_arena *gc)
Definition buffer.c:88
struct buffer alloc_buf(size_t size)
Definition buffer.c:62
#define BEND(buf)
Definition buffer.h:125
static char * format_hex(const uint8_t *data, int size, int maxoutput, struct gc_arena *gc)
Definition buffer.h:505
static bool buf_copy(struct buffer *dest, const struct buffer *src)
Definition buffer.h:712
#define BPTR(buf)
Definition buffer.h:124
static bool buf_inc_len(struct buffer *buf, int inc)
Definition buffer.h:590
static void gc_init(struct gc_arena *a)
Definition buffer.h:1012
static bool buf_safe(const struct buffer *buf, size_t len)
Definition buffer.h:520
static void buf_set_write(struct buffer *buf, uint8_t *data, int size)
Definition buffer.h:331
static bool buf_read(struct buffer *src, void *dest, int size)
Definition buffer.h:778
static bool buf_advance(struct buffer *buf, int size)
Definition buffer.h:618
static int buf_len(const struct buffer *buf)
Definition buffer.h:253
static int buf_forward_capacity(const struct buffer *buf)
Definition buffer.h:541
static void secure_memzero(void *data, size_t len)
Securely zeroise memory.
Definition buffer.h:414
static uint8_t * buf_write_alloc(struct buffer *buf, size_t size)
Definition buffer.h:635
static bool buf_write(struct buffer *dest, const void *src, size_t size)
Definition buffer.h:668
static int buf_read_u8(struct buffer *buf)
Definition buffer.h:790
#define BLEN(buf)
Definition buffer.h:127
#define BCAP(buf)
Definition buffer.h:130
static void gc_free(struct gc_arena *a)
Definition buffer.h:1033
static struct gc_arena gc_new(void)
Definition buffer.h:1025
#define key2
Definition cert_data.h:82
void free_key_ctx_bi(struct key_ctx_bi *ctx)
Definition crypto.c:1125
void init_key_ctx(struct key_ctx *ctx, const struct key_parameters *key, const struct key_type *kt, int enc, const char *prefix)
Definition crypto.c:1015
bool read_pem_key_file(struct buffer *key, const char *pem_name, const char *key_file, bool key_inline)
Read key material from a PEM encoded files into the key structure.
Definition crypto.c:1902
void write_pem_key_file(const char *filename, const char *pem_name)
Generate a server key with enough randomness to fill a key struct and write to file.
Definition crypto.c:1846
void key_parameters_from_key(struct key_parameters *key_params, const struct key *key)
Converts a struct key representation into a struct key_parameters representation.
Definition crypto.c:1219
void init_key_ctx_bi(struct key_ctx_bi *ctx, const struct key2 *key2, int key_direction, const struct key_type *kt, const char *name)
Definition crypto.c:1087
void key_direction_state_init(struct key_direction_state *kds, int key_direction)
Definition crypto.c:1705
void crypto_read_openvpn_key(const struct key_type *key_type, struct key_ctx_bi *ctx, const char *key_file, bool key_inline, const int key_direction, const char *key_name, const char *opt_name, struct key2 *keydata)
Definition crypto.c:1321
bool crypto_check_replay(struct crypto_options *opt, const struct packet_id_net *pin, uint16_t epoch, const char *error_prefix, struct gc_arena *gc)
Check packet ID for replay, and perform replay administration.
Definition crypto.c:384
void free_key_ctx(struct key_ctx *ctx)
Definition crypto.c:1106
Data Channel Cryptography Module.
#define KEY_DIRECTION_NORMAL
Definition crypto.h:231
#define CO_PACKET_ID_LONG_FORM
Bit-flag indicating whether to use OpenVPN's long packet ID format.
Definition crypto.h:344
#define CRYPT_ERROR(format)
Definition crypto.h:390
#define CO_IGNORE_PACKET_ID
Bit-flag indicating whether to ignore the packet ID of a received packet.
Definition crypto.h:347
int memcmp_constant_time(const void *a, const void *b, size_t size)
As memcmp(), but constant-time.
#define KEY_DIRECTION_INVERSE
Definition crypto.h:232
static struct key_type create_kt(const char *cipher, const char *md, const char *optname)
Creates and validates an instance of struct key_type with the provided algs.
Definition crypto.h:685
int cipher_ctx_update(cipher_ctx_t *ctx, uint8_t *dst, int *dst_len, uint8_t *src, int src_len)
Updates the given cipher context, encrypting data in the source buffer, and placing any complete bloc...
void hmac_ctx_update(hmac_ctx_t *ctx, const uint8_t *src, int src_len)
void hmac_ctx_reset(hmac_ctx_t *ctx)
int cipher_ctx_block_size(const cipher_ctx_t *ctx)
Returns the block size of the cipher, in bytes.
void hmac_ctx_final(hmac_ctx_t *ctx, uint8_t *dst)
int hmac_ctx_size(hmac_ctx_t *ctx)
#define MAX_CIPHER_KEY_LENGTH
void crypto_clear_error(void)
int rand_bytes(uint8_t *output, int len)
Wrapper for secure random number generator.
#define MAX_HMAC_KEY_LENGTH
int cipher_ctx_reset(cipher_ctx_t *ctx, const uint8_t *iv_buf)
Resets the given cipher context, setting the IV to the specified value.
int cipher_ctx_final(cipher_ctx_t *ctx, uint8_t *dst, int *dst_len)
Pads the final cipher block using PKCS padding, and output to the destination buffer.
bool crypto_pem_encode(const char *name, struct buffer *dst, const struct buffer *src, struct gc_arena *gc)
Encode binary data as PEM.
mbedtls_cipher_context_t cipher_ctx_t
Generic cipher context.
mbedtls_md_context_t hmac_ctx_t
Generic HMAC context.
void env_set_destroy(struct env_set *es)
Definition env_set.c:166
void setenv_str(struct env_set *es, const char *name, const char *value)
Definition env_set.c:283
struct env_set * env_set_create(struct gc_arena *gc)
Definition env_set.c:156
#define D_TLS_DEBUG_LOW
Definition errlevel.h:77
#define D_CRYPTO_DEBUG
Definition errlevel.h:148
#define D_PACKET_CONTENT
Definition errlevel.h:168
#define D_TLS_DEBUG_MED
Definition errlevel.h:157
#define D_CRYPT_ERRORS
Definition errlevel.h:58
#define D_HANDSHAKE
Definition errlevel.h:72
#define D_GENKEY
Definition errlevel.h:79
#define D_TLS_ERRORS
Definition errlevel.h:59
#define D_TLS_DEBUG
Definition errlevel.h:165
#define TLS_CRYPT_V2_MAX_WKC_LEN
Definition tls_crypt.h:97
#define TLS_CRYPT_BLOCK_SIZE
Definition tls_crypt.h:91
bool tls_crypt_v2_extract_client_key(struct buffer *buf, struct tls_wrap_ctx *ctx, const struct tls_options *opt)
Extract a tls-crypt-v2 client key from a P_CONTROL_HARD_RESET_CLIENT_V3 message, and load the key int...
Definition tls_crypt.c:616
void tls_crypt_init_key(struct key_ctx_bi *key, struct key2 *keydata, const char *key_file, bool key_inline, bool tls_server)
Initialize a key_ctx_bi structure for use with –tls-crypt.
Definition tls_crypt.c:61
#define TLS_CRYPT_TAG_SIZE
Definition tls_crypt.h:89
void tls_crypt_v2_init_server_key(struct key_ctx *key_ctx, bool encrypt, const char *key_file, bool key_inline)
Initialize a tls-crypt-v2 server key (used to encrypt/decrypt client keys).
Definition tls_crypt.c:361
void tls_crypt_v2_write_client_key_file(const char *filename, const char *b64_metadata, const char *server_key_file, bool server_key_inline)
Generate a tls-crypt-v2 client key, and write to file.
Definition tls_crypt.c:684
#define TLS_CRYPT_OFF_PID
Definition tls_crypt.h:93
bool tls_crypt_unwrap(const struct buffer *src, struct buffer *dst, struct crypto_options *opt)
Unwrap a control channel packet (decrypts, authenticates and performs replay checks).
Definition tls_crypt.c:221
#define TLS_CRYPT_OFF_TAG
Definition tls_crypt.h:94
#define TLS_CRYPT_OFF_CT
Definition tls_crypt.h:95
bool tls_session_generate_dynamic_tls_crypt_key(struct tls_session *session)
Generates a TLS-Crypt key to be used with dynamic tls-crypt using the TLS EKM exporter function.
Definition tls_crypt.c:98
void tls_crypt_v2_write_server_key_file(const char *filename)
Generate a tls-crypt-v2 server key, and write to file.
Definition tls_crypt.c:678
int tls_crypt_buf_overhead(void)
Returns the maximum overhead (in bytes) added to the destination buffer by tls_crypt_wrap().
Definition tls_crypt.c:55
#define TLS_CRYPT_V2_CLIENT_KEY_LEN
Definition tls_crypt.h:98
void tls_crypt_v2_init_client_key(struct key_ctx_bi *key, struct key2 *original_key, struct buffer *wkc_buf, const char *key_file, bool key_inline)
Initialize a tls-crypt-v2 client key.
Definition tls_crypt.c:335
bool tls_crypt_wrap(const struct buffer *src, struct buffer *dst, struct crypto_options *opt)
Wrap a control channel packet (both authenticates and encrypts the data).
Definition tls_crypt.c:144
#define TLS_CRYPT_V2_MAX_METADATA_LEN
Definition tls_crypt.h:101
#define TLS_CRYPT_V2_TAG_SIZE
Definition tls_crypt.h:100
#define htonll(x)
Definition integer.h:30
#define BUF_SIZE(f)
Definition mtu.h:172
#define M_FATAL
Definition error.h:89
#define dmsg(flags,...)
Definition error.h:148
#define msg(flags,...)
Definition error.h:144
#define ASSERT(x)
Definition error.h:195
#define M_WARN
Definition error.h:91
#define streq(x, y)
Definition options.h:725
time_t now
Definition otime.c:34
void packet_id_init(struct packet_id *p, int seq_backtrack, int time_backtrack, const char *name, int unit)
Definition packet_id.c:96
bool packet_id_read(struct packet_id_net *pin, struct buffer *buf, bool long_form)
Definition packet_id.c:323
bool packet_id_write(struct packet_id_send *p, struct buffer *buf, bool long_form, bool prepend)
Write a packet ID to buf, and update the packet ID state.
Definition packet_id.c:386
static bool packet_id_initialized(const struct packet_id *pid)
Is this struct packet_id initialized?
Definition packet_id.h:275
static int packet_id_size(bool long_form)
Definition packet_id.h:316
const char * platform_create_temp_file(const char *directory, const char *prefix, struct gc_arena *gc)
Create a temporary file in directory, returns the filename of the created file.
Definition platform.c:541
bool platform_unlink(const char *filename)
Definition platform.c:488
static int openvpn_run_script(const struct argv *a, const struct env_set *es, const unsigned int flags, const char *hook)
Will run a script and return the exit code of the script if between 0 and 255, -1 otherwise.
Definition run_command.h:87
int openvpn_base64_decode(const char *str, void *data, int size)
Definition base64.c:158
Control Channel SSL/Data channel negotiation module.
#define EXPORT_DYNAMIC_TLS_CRYPT_LABEL
bool key_state_export_keying_material(struct tls_session *session, const char *label, size_t label_size, void *ekm, size_t ekm_size)
Keying Material Exporters [RFC 5705] allows additional keying material to be derived from existing TL...
Definition argv.h:35
Wrapper structure for dynamically allocated memory.
Definition buffer.h:61
int capacity
Size in bytes of memory allocated by malloc().
Definition buffer.h:62
int len
Length in bytes of the actual content within the allocated memory.
Definition buffer.h:66
int offset
Offset in bytes of the actual content within the allocated memory.
Definition buffer.h:64
Security parameter state for processing data channel packets.
Definition crypto.h:292
unsigned int flags
Bit-flags determining behavior of security operation functions.
Definition crypto.h:383
struct key_ctx_bi key_ctx_bi
OpenSSL cipher and HMAC contexts for both sending and receiving directions.
Definition crypto.h:293
struct packet_id packet_id
Current packet ID state for both sending and receiving directions.
Definition crypto.h:330
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:117
Container for bidirectional cipher and HMAC key material.
Definition crypto.h:239
int n
The number of key objects stored in the key2.keys array.
Definition crypto.h:240
struct key keys[2]
Two unidirectional sets of key material.
Definition crypto.h:242
Container for two sets of OpenSSL cipher and/or HMAC contexts for both sending and receiving directio...
Definition crypto.h:279
struct key_ctx decrypt
cipher and/or HMAC contexts for receiving direction.
Definition crypto.h:282
struct key_ctx encrypt
Cipher and/or HMAC contexts for sending direction.
Definition crypto.h:280
Container for one set of cipher and/or HMAC contexts.
Definition crypto.h:201
cipher_ctx_t * cipher
Generic cipher context.
Definition crypto.h:202
hmac_ctx_t * hmac
Generic HMAC context.
Definition crypto.h:203
Key ordering of the key2.keys array.
Definition crypto.h:258
internal structure similar to struct key that holds key information but is not represented on wire an...
Definition crypto.h:162
const char * cipher
const name of the cipher
Definition crypto.h:142
const char * digest
Message digest static parameters.
Definition crypto.h:143
Container for unidirectional cipher and HMAC key material.
Definition crypto.h:152
uint8_t cipher[MAX_CIPHER_KEY_LENGTH]
Key material for cipher operations.
Definition crypto.h:153
uint8_t hmac[MAX_HMAC_KEY_LENGTH]
Key material for HMAC operations.
Definition crypto.h:155
Data structure for describing the packet id that is received/send to the network.
Definition packet_id.h:192
struct packet_id_send send
Definition packet_id.h:201
const char * tmp_dir
Definition ssl_common.h:387
const char * tls_crypt_v2_verify_script
Definition ssl_common.h:376
Security parameter state of a single session within a VPN tunnel.
Definition ssl_common.h:480
Control channel wrapping (–tls-auth/–tls-crypt) context.
Definition ssl_common.h:268
struct buffer tls_crypt_v2_metadata
Received from client.
Definition ssl_common.h:279
bool cleanup_key_ctx
opt.key_ctx_bi is owned by this context
Definition ssl_common.h:280
struct crypto_options opt
Crypto state.
Definition ssl_common.h:274
struct key_ctx tls_crypt_v2_server_key
Decrypts client keys.
Definition ssl_common.h:276
enum tls_wrap_ctx::@23 mode
Control channel wrapping mode.
struct key2 original_wrap_keydata
original key data to be xored in to the key for dynamic tls-crypt.
Definition ssl_common.h:290
struct env_set * es
static int cleanup(void **state)
struct gc_arena gc
Definition test_ssl.c:155
static const char * test_client_key
static const uint8_t TLS_CRYPT_METADATA_TYPE_USER
Metadata contains user-specified data.
Definition tls_crypt.c:44
const char * tls_crypt_v2_srv_pem_name
Definition tls_crypt.c:41
static bool tls_crypt_v2_verify_metadata(const struct tls_wrap_ctx *ctx, const struct tls_options *opt)
Definition tls_crypt.c:557
static void tls_crypt_v2_load_client_key(struct key_ctx_bi *key, const struct key2 *key2, bool tls_server)
Definition tls_crypt.c:320
const char * tls_crypt_v2_cli_pem_name
Definition tls_crypt.c:40
static const uint8_t TLS_CRYPT_METADATA_TYPE_TIMESTAMP
Metadata contains a 64-bit unix timestamp in network byte order.
Definition tls_crypt.c:46
static bool tls_crypt_v2_unwrap_client_key(struct key2 *client_key, struct buffer *metadata, struct buffer wrapped_client_key, struct key_ctx *server_key)
Definition tls_crypt.c:445
static bool tls_crypt_v2_wrap_client_key(struct buffer *wkc, const struct key2 *src_key, const struct buffer *src_metadata, struct key_ctx *server_key, struct gc_arena *gc)
Definition tls_crypt.c:388
static void xor_key2(struct key2 *key, const struct key2 *other)
Will produce key = key XOR other.
Definition tls_crypt.c:79
static struct key_type tls_crypt_kt(void)
Definition tls_crypt.c:49