OpenVPN
dco.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) 2021-2026 Arne Schwabe <arne@rfc2549.org>
9 * Copyright (C) 2021-2026 Antonio Quartulli <a@unstable.cc>
10 * Copyright (C) 2021-2026 OpenVPN Inc <sales@openvpn.net>
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2
14 * as published by the Free Software Foundation.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program (see the file COPYING included with this
23 * distribution); if not, see <https://www.gnu.org/licenses/>.
24 */
25
26#ifdef HAVE_CONFIG_H
27#include "config.h"
28#endif
29
30#if defined(ENABLE_DCO)
31
32#include "syshead.h"
33#include "crypto.h"
34#include "dco.h"
35#include "errlevel.h"
36#include "multi.h"
37#include "networking.h"
38#include "openvpn.h"
39#include "options.h"
40#include "ssl_common.h"
41#include "ssl_ncp.h"
42#include "tun.h"
43#include "tun_afunix.h"
44
45#if defined(_WIN32)
46#include "dco_win.h"
47#endif
48
49#ifdef HAVE_LIBCAPNG
50#include <cap-ng.h>
51#endif
52
53static int
54dco_install_key(struct tls_multi *multi, struct key_state *ks, const uint8_t *encrypt_key,
55 const uint8_t *encrypt_iv, const uint8_t *decrypt_key, const uint8_t *decrypt_iv,
56 const char *ciphername)
57
58{
60 msg(D_DCO_DEBUG, "%s: peer_id=%d keyid=%d epoch=%d, currently %d keys installed", __func__,
61 multi->dco_peer_id, ks->key_id, multi->dco_keys_installed, epoch);
62
63 /* Install a key in the PRIMARY slot only when no other key exist.
64 * From that moment on, any new key will be installed in the SECONDARY
65 * slot and will be promoted to PRIMARY when userspace says so (a swap
66 * will be performed in that case)
67 */
68 dco_key_slot_t slot = OVPN_KEY_SLOT_PRIMARY;
69 if (multi->dco_keys_installed > 0)
70 {
72 }
73
74 int ret = dco_new_key(multi->dco, multi->dco_peer_id, ks->key_id, slot, encrypt_key, encrypt_iv,
75 decrypt_key, decrypt_iv, ciphername, epoch);
76 if ((ret == 0) && (multi->dco_keys_installed < 2))
77 {
78 multi->dco_keys_installed++;
79 ks->dco_status =
81 }
82
83 return ret;
84}
85
86int
87init_key_dco_bi(struct tls_multi *multi, struct key_state *ks, const struct key2 *key2,
88 int key_direction, const char *ciphername, bool server)
89{
90 struct key_direction_state kds;
91 key_direction_state_init(&kds, key_direction);
92
93 return dco_install_key(multi, ks, key2->keys[kds.out_key].cipher, key2->keys[(int)server].hmac,
94 key2->keys[kds.in_key].cipher, key2->keys[1 - (int)server].hmac,
95 ciphername);
96}
97
106static struct key_state *
107dco_get_secondary_key(struct tls_multi *multi, const struct key_state *primary)
108{
109 for (int i = 0; i < KEY_SCAN_SIZE; ++i)
110 {
111 struct key_state *ks = get_key_scan(multi, i);
113
114 if (ks == primary)
115 {
116 continue;
117 }
118
120 {
121 ASSERT(key->initialized);
122 return ks;
123 }
124 }
125
126 return NULL;
127}
128
129bool
130dco_update_keys(dco_context_t *dco, struct tls_multi *multi)
131{
132 /* this function checks if keys have to be swapped or erased, therefore it
133 * can't do much if we don't have any key installed
134 */
135 if (multi->dco_keys_installed == 0)
136 {
137 return true;
138 }
139
140 struct key_state *primary = tls_select_encryption_key(multi);
141 /* no primary key available -> no usable key exists, therefore we should
142 * tell DCO to simply wipe all keys
143 */
144 if (!primary)
145 {
146 msg(D_DCO, "No encryption key found. Purging data channel keys");
147
148 int ret = dco_del_key(dco, multi->dco_peer_id, OVPN_KEY_SLOT_PRIMARY);
149 if (ret < 0)
150 {
151 msg(D_DCO, "Cannot delete primary key during wipe: %s (%d)", strerror(-ret), ret);
152 return false;
153 }
154
156 if (ret < 0)
157 {
158 msg(D_DCO, "Cannot delete secondary key during wipe: %s (%d)", strerror(-ret), ret);
159 return false;
160 }
161
162 multi->dco_keys_installed = 0;
163 return true;
164 }
165
166 /* if we have a primary key, it must have been installed already (keys
167 * are installed upon generation in the TLS code)
168 */
170
171 struct key_state *secondary = dco_get_secondary_key(multi, primary);
172 /* if the current primary key was installed as secondary in DCO,
173 * this means we have promoted it since installation in DCO, and
174 * we now need to tell DCO to swap keys
175 */
176 if (primary->dco_status == DCO_INSTALLED_SECONDARY)
177 {
178 if (secondary)
179 {
181 "Swapping primary and secondary keys to "
182 "primary-id=%d secondary-id=%d",
183 primary->key_id, secondary->key_id);
184 }
185 else
186 {
188 "Swapping primary and secondary keys to "
189 "primary-id=%d secondary-id=(to be deleted)",
190 primary->key_id);
191 }
192
193 int ret = dco_swap_keys(dco, multi->dco_peer_id);
194 if (ret < 0)
195 {
196 msg(D_DCO, "Cannot swap keys: %s (%d)", strerror(-ret), ret);
197 return false;
198 }
199
201 if (secondary)
202 {
205 }
206 }
207
208 /* if we have no secondary key anymore, inform DCO about it */
209 if (!secondary && multi->dco_keys_installed == 2)
210 {
211 int ret = dco_del_key(dco, multi->dco_peer_id, OVPN_KEY_SLOT_SECONDARY);
212 if (ret < 0)
213 {
214 msg(D_DCO, "Cannot delete secondary key: %s (%d)", strerror(-ret), ret);
215 return false;
216 }
217 multi->dco_keys_installed = 1;
218 }
219
220 /* all keys that are not installed are set to NOT installed. Include also
221 * keys that might even be considered as active keys to be sure*/
222 for (int i = 0; i < TM_SIZE; ++i)
223 {
224 for (int j = 0; j < KS_SIZE; j++)
225 {
226 struct key_state *ks = &multi->session[i].key[j];
227 if (ks != primary && ks != secondary)
228 {
230 }
231 }
232 }
233 return true;
234}
235
236static bool
237dco_check_option_ce(const struct connection_entry *ce, msglvl_t msglevel, int mode)
238{
239 if (ce->fragment)
240 {
241 msg(msglevel, "Note: --fragment disables data channel offload.");
242 return false;
243 }
244
245 if (ce->http_proxy_options)
246 {
247 msg(msglevel, "Note: --http-proxy disables data channel offload.");
248 return false;
249 }
250
251 if (ce->socks_proxy_server)
252 {
253 msg(msglevel, "Note: --socks-proxy disables data channel offload.");
254 return false;
255 }
256
257#if defined(TARGET_FREEBSD)
258 if (ce->local_list)
259 {
260 for (int i = 0; i < ce->local_list->len; i++)
261 {
262 if (!proto_is_dgram(ce->local_list->array[i]->proto))
263 {
264 msg(msglevel, "NOTE: TCP transport disables data channel offload on FreeBSD.");
265 return false;
266 }
267 }
268 }
269#endif
270
271#if defined(_WIN32)
272 if (!proto_is_udp(ce->local_list->array[0]->proto) && mode == MODE_SERVER)
273 {
274 msg(msglevel,
275 "NOTE: TCP transport disables data channel offload on Windows in server mode.");
276 return false;
277 }
278
279 if (!ce->remote && !dco_win_supports_multipeer())
280 {
281 msg(msglevel,
282 "NOTE: --remote is not defined. This DCO version doesn't support multipeer. Disabling Data Channel Offload");
283 return false;
284 }
285
286 if ((mode == MODE_SERVER) && (ce->local_list->len > 1))
287 {
288 msg(msglevel, "NOTE: multiple --local options defined, disabling data channel offload");
289 return false;
290 }
291#endif
292
293 return true;
294}
295
296bool
297dco_check_startup_option(msglvl_t msglevel, const struct options *o)
298{
299 /* check if no dev name was specified at all. In the case,
300 * later logic will most likely stop OpenVPN, so no need to
301 * print any message here.
302 */
303 if (!o->dev)
304 {
305 return false;
306 }
307
308 if (!o->tls_client && !o->tls_server)
309 {
310 msg(msglevel, "No tls-client or tls-server option in configuration "
311 "detected. Disabling data channel offload.");
312 return false;
313 }
314
315 if (dev_type_enum(o->dev, o->dev_type) != DEV_TYPE_TUN)
316 {
317 msg(msglevel, "Note: dev-type not tun, disabling data channel offload.");
318 return false;
319 }
320
321 if (is_tun_afunix(o->dev_node))
322 {
323 msg(msglevel, "Note: afunix tun type selected, disabling data channel offload");
324 return false;
325 }
326
327 if (is_dev_type(o->dev, o->dev_type, "null"))
328 {
329 msg(msglevel, "Note: null tun type selected, disabling data channel offload");
330 return false;
331 }
332
333 if (o->connection_list)
334 {
335 const struct connection_list *l = o->connection_list;
336 for (int i = 0; i < l->len; ++i)
337 {
338 if (!dco_check_option_ce(l->array[i], msglevel, o->mode))
339 {
340 return false;
341 }
342 }
343 }
344 else
345 {
346 if (!dco_check_option_ce(&o->ce, msglevel, o->mode))
347 {
348 return false;
349 }
350 }
351
352#if defined(_WIN32)
353 if ((o->mode == MODE_SERVER) && !dco_win_supports_multipeer())
354 {
355 msg(msglevel,
356 "--mode server is set. This DCO version doesn't support multipeer. Disabling Data Channel Offload");
357 return false;
358 }
359
360 if ((o->mode == MODE_SERVER) && o->ce.local_list->len > 1)
361 {
362 msg(msglevel, "multiple --local options defined, disabling data channel offload");
363 return false;
364 }
365
366#elif defined(TARGET_LINUX)
367 /* if the device name is fixed, we need to check if an interface with this
368 * name already exists. IF it does, it must be a DCO interface, otherwise
369 * DCO has to be disabled in order to continue.
370 */
371 if (tun_name_is_fixed(o->dev))
372 {
374 /* we pass NULL as net_ctx because using DCO on Linux implies that we
375 * are using SITNL and the latter does not need any context. This way we
376 * don't need to have the net_ctx percolate all the way here
377 */
378 int ret = net_iface_type(NULL, o->dev, iftype);
379 if ((ret == 0) && (strcmp(iftype, "ovpn") != 0))
380 {
381 msg(msglevel, "Interface %s exists and is not using the "
382 "ovpn DCO driver. Disabling data channel offload",
383 o->dev);
384 return false;
385 }
386 else if ((ret < 0) && (ret != -ENODEV))
387 {
388 msg(msglevel, "Cannot retrieve type of device %s: %s (%d)", o->dev, strerror(-ret),
389 ret);
390 }
391 }
392#endif /* if defined(_WIN32) */
393
394#if defined(HAVE_LIBCAPNG)
395 /* DCO can't operate without CAP_NET_ADMIN. To retain it when switching user
396 * we need CAP_SETPCAP. CAP_NET_ADMIN also needs to be part of the permitted set
397 * of capabilities in order to retain it.
398 */
399 if (o->username)
400 {
402 {
403 msg(msglevel, "--user specified but lacking CAP_SETPCAP. "
404 "Cannot retain CAP_NET_ADMIN. Disabling data channel offload");
405 return false;
406 }
408 {
409 msg(msglevel, "--user specified but not permitted to retain CAP_NET_ADMIN. "
410 "Disabling data channel offload");
411 return false;
412 }
413 }
414#endif /* if defined(HAVE_LIBCAPNG) */
415
416 if (o->mode == MODE_SERVER && o->topology != TOP_SUBNET)
417 {
418 msg(msglevel, "Note: NOT using '--topology subnet' disables data channel offload.");
419 return false;
420 }
421
422 if (o->management_flags & MF_QUERY_PROXY)
423 {
424 msg(msglevel, "Note: --management-query-proxy disables data channel offload.");
425 return false;
426 }
427
428 /* now that all options have been confirmed to be supported, check
429 * if DCO is truly available on the system
430 */
431 return dco_available(msglevel);
432}
433
434bool
435dco_check_option(msglvl_t msglevel, const struct options *o)
436{
437 /* At this point the ciphers have already been normalised */
438 if (o->enable_ncp_fallback
440 {
441 msg(msglevel,
442 "Note: --data-ciphers-fallback with cipher '%s' "
443 "disables data channel offload.",
444 o->ciphername);
445 return false;
446 }
447
448#if defined(USE_COMP)
449 if (o->comp.alg != COMP_ALG_UNDEF || o->comp.flags & COMP_F_ALLOW_ASYM)
450 {
451 msg(msglevel,
452 "Note: '--allow-compression' is not set to 'no', disabling data channel offload.");
453
454 if (o->mode == MODE_SERVER && !(o->comp.flags & COMP_F_MIGRATE))
455 {
456 /* We can end up here from the multi.c call, only print the
457 * note if it is not already enabled */
458 msg(msglevel, "Consider using the '--compress migrate' option.");
459 }
460 return false;
461 }
462#endif
463
464 struct gc_arena gc = gc_new();
465 char *tmp_ciphers = string_alloc(o->ncp_ciphers, &gc);
466 const char *token;
467 while ((token = strsep(&tmp_ciphers, ":")))
468 {
470 {
471 msg(msglevel,
472 "Note: cipher '%s' in --data-ciphers is not supported "
473 "by ovpn-dco, disabling data channel offload.",
474 token);
475 gc_free(&gc);
476 return false;
477 }
478 /* FreeBSD supports none as cipher type but requires auth none to be
479 * be also enabled */
480 if (strcmp(token, "none") == 0 && strcmp(o->authname, "none") != 0)
481 {
482 msg(msglevel,
483 "Note: cipher '%s' in --data-ciphers is only supported "
484 "with --auth=none by ovpn-dco, disabling data channel "
485 "offload.",
486 token);
487 gc_free(&gc);
488 return false;
489 }
490 }
491 gc_free(&gc);
492
493 return true;
494}
495
496bool
497dco_check_pull_options(msglvl_t msglevel, const struct options *o)
498{
499 if (!o->use_peer_id)
500 {
501 msg(msglevel, "OPTIONS IMPORT: Server did not request DATA_V2 packet "
502 "format required for data channel offload");
503 return false;
504 }
505 return true;
506}
507
508int
510{
511 if (!dco_enabled(&c->options))
512 {
513 return 0;
514 }
515
516 struct link_socket *sock = c->c2.link_sockets[0];
517
519
520 struct sockaddr *remoteaddr = &sock->info.lsa->actual.dest.addr.sa;
521 struct tls_multi *multi = c->c2.tls_multi;
522#ifdef TARGET_FREEBSD
523 /* In Linux in P2P mode the kernel automatically removes an existing peer
524 * when adding a new peer. FreeBSD needs to explicitly be told to do that */
525 if (c->c2.tls_multi->dco_peer_id != -1)
526 {
528 c->c2.tls_multi->dco_peer_id = -1;
529 }
530#endif
531 int ret = dco_new_peer(&c->c1.tuntap->dco, multi->peer_id, sock->sd, NULL,
532 proto_is_dgram(sock->info.proto) ? remoteaddr : NULL, NULL, NULL);
533 if (ret < 0)
534 {
535 return ret;
536 }
537
538 c->c2.tls_multi->dco_peer_id = multi->peer_id;
539
540 return 0;
541}
542
543void
544dco_remove_peer(struct context *c)
545{
546 if (!dco_enabled(&c->options))
547 {
548 return;
549 }
550
551 if (c->c1.tuntap && c->c2.tls_multi && c->c2.tls_multi->dco_peer_id != -1)
552 {
554 c->c2.tls_multi->dco_peer_id = -1;
555 }
556}
557
558static bool
559dco_multi_get_localaddr(struct multi_context *m, struct multi_instance *mi,
560 struct sockaddr_storage *local)
561{
562#if ENABLE_IP_PKTINFO
563 struct context *c = &mi->context;
564
567 {
568 return false;
569 }
570
571 struct link_socket_actual *actual = &c->c2.link_socket_infos[0]->lsa->actual;
572
573 switch (actual->dest.addr.sa.sa_family)
574 {
575 case AF_INET:
576 {
577 struct sockaddr_in *sock_in4 = (struct sockaddr_in *)local;
578#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
579 sock_in4->sin_addr = actual->pi.in4.ipi_spec_dst;
580#elif defined(IP_RECVDSTADDR)
581 sock_in4->sin_addr = actual->pi.in4;
582#else
583 /* source IP not available on this platform */
584 return false;
585#endif
586 sock_in4->sin_family = AF_INET;
587 break;
588 }
589
590 case AF_INET6:
591 {
592 struct sockaddr_in6 *sock_in6 = (struct sockaddr_in6 *)local;
593 sock_in6->sin6_addr = actual->pi.in6.ipi6_addr;
594 sock_in6->sin6_family = AF_INET6;
595 break;
596 }
597
598 default:
599 ASSERT(false);
600 }
601
602 return true;
603#else /* if ENABLE_IP_PKTINFO */
604 return false;
605#endif /* if ENABLE_IP_PKTINFO */
606}
607
608int
610{
611 struct context *c = &mi->context;
612
613 int peer_id = c->c2.tls_multi->peer_id;
614 struct sockaddr *remoteaddr, *localaddr = NULL;
615 struct sockaddr_storage local = { 0 };
616 const socket_descriptor_t sd = c->c2.link_sockets[0]->sd;
617
618
619 if (c->mode == CM_CHILD_TCP)
620 {
621 /* the remote address will be inferred from the TCP socket endpoint */
622 remoteaddr = NULL;
623 }
624 else
625 {
627 remoteaddr = &c->c2.link_socket_infos[0]->lsa->actual.dest.addr.sa;
628 }
629
630 /* In server mode we need to fetch the remote addresses from the push config */
631 struct in_addr vpn_ip4 = { 0 };
632 struct in_addr *vpn_addr4 = NULL;
634 {
635 vpn_ip4.s_addr = htonl(c->c2.push_ifconfig_local);
636 vpn_addr4 = &vpn_ip4;
637 }
638
639 struct in6_addr *vpn_addr6 = NULL;
641 {
642 vpn_addr6 = &c->c2.push_ifconfig_ipv6_local;
643 }
644
645 if (dco_multi_get_localaddr(m, mi, &local))
646 {
647 localaddr = (struct sockaddr *)&local;
648 }
649
650 int ret =
651 dco_new_peer(&c->c1.tuntap->dco, peer_id, sd, localaddr, remoteaddr, vpn_addr4, vpn_addr6);
652 if (ret < 0)
653 {
654 return ret;
655 }
656
657 c->c2.tls_multi->dco_peer_id = peer_id;
658
659 return 0;
660}
661
662void
663dco_install_iroute(struct multi_context *m, struct multi_instance *mi, struct mroute_addr *addr)
664{
665#if defined(TARGET_LINUX) || defined(TARGET_FREEBSD) || defined(_WIN32)
666 if (!dco_enabled(&m->top.options))
667 {
668 return;
669 }
670
671 int addrtype = (addr->type & MR_ADDR_MASK);
672
673 /* If we do not have local IP addr to install, skip the route */
674 if ((addrtype == MR_ADDR_IPV6 && !mi->context.c2.push_ifconfig_ipv6_defined)
675 || (addrtype == MR_ADDR_IPV4 && !mi->context.c2.push_ifconfig_defined))
676 {
677 return;
678 }
679
680#if defined(_WIN32)
681 if (addr->type & MR_ONLINK_DCO_ADDR)
682 {
683 /* Windows does not need these extra routes, so we ignore/skip them */
684 return;
685 }
686#endif
687
688 struct context *c = &mi->context;
689 if (addrtype == MR_ADDR_IPV6)
690 {
691#if defined(_WIN32)
693 c->c2.tls_multi->peer_id);
694#else
695 const struct in6_addr *gateway = &mi->context.c2.push_ifconfig_ipv6_local;
696 if (addr->type & MR_ONLINK_DCO_ADDR)
697 {
698 gateway = NULL;
699 }
700
701 net_route_v6_add(&m->top.net_ctx, &addr->v6.addr, addr->netbits,
702 gateway, c->c1.tuntap->actual_name, 0,
704#endif
705 }
706 else if (addrtype == MR_ADDR_IPV4)
707 {
708#if defined(_WIN32)
710 c->c2.tls_multi->peer_id);
711#else
712 in_addr_t dest = htonl(addr->v4.addr);
713 const in_addr_t *gateway = &mi->context.c2.push_ifconfig_local;
714 if (addr->type & MR_ONLINK_DCO_ADDR)
715 {
716 gateway = NULL;
717 }
718
719 net_route_v4_add(&m->top.net_ctx, &dest, addr->netbits, gateway,
721#endif
722 }
723#endif /* if defined(TARGET_LINUX) || defined(TARGET_FREEBSD) || defined(_WIN32) */
724}
725
726void
728{
729#if defined(TARGET_LINUX) || defined(TARGET_FREEBSD) || defined(_WIN32)
730 if (!dco_enabled(&m->top.options))
731 {
732 return;
733 }
735
736 struct context *c = &mi->context;
737
739 {
740 for (const struct iroute *ir = c->options.iroutes; ir; ir = ir->next)
741 {
742#if defined(_WIN32)
743 dco_win_del_iroute_ipv4(&c->c1.tuntap->dco, htonl(ir->network), ir->netbits);
744#else
745 net_route_v4_del(&m->top.net_ctx, &ir->network, ir->netbits,
748#endif
749 }
750
751#if !defined(_WIN32)
752 /* Check if we added a host route as the assigned client IP address was
753 * not in the on link scope defined by --ifconfig */
754 in_addr_t ifconfig_local = mi->context.c2.push_ifconfig_local;
755
756 if (multi_check_push_ifconfig_extra_route(mi, htonl(ifconfig_local)))
757 {
758 /* On windows we do not install these routes, so we also do not need to delete them */
759 net_route_v4_del(&m->top.net_ctx, &ifconfig_local,
760 32, NULL, c->c1.tuntap->actual_name, 0,
762 }
763#endif
764 }
765
767 {
768 for (const struct iroute_ipv6 *ir6 = c->options.iroutes_ipv6; ir6; ir6 = ir6->next)
769 {
770#if defined(_WIN32)
771 dco_win_del_iroute_ipv6(&c->c1.tuntap->dco, ir6->network, ir6->netbits);
772#else
773 net_route_v6_del(&m->top.net_ctx, &ir6->network, ir6->netbits,
776#endif
777 }
778
779 /* Checked if we added a host route as the assigned client IP address was
780 * outside the --ifconfig-ipv6 tun interface config */
781#if !defined(_WIN32)
782 struct in6_addr *dest = &mi->context.c2.push_ifconfig_ipv6_local;
784 {
785 /* On windows we do not install these routes, so we also do not need to delete them */
786 net_route_v6_del(&m->top.net_ctx, dest, 128, NULL,
788 }
789#endif
790 }
791#endif /* if defined(TARGET_LINUX) || defined(TARGET_FREEBSD) || defined(_WIN32) */
792}
793
794#endif /* defined(ENABLE_DCO) */
char * string_alloc(const char *str, struct gc_arena *gc)
Definition buffer.c:648
static void gc_free(struct gc_arena *a)
Definition buffer.h:1049
static struct gc_arena gc_new(void)
Definition buffer.h:1041
#define COMP_F_ALLOW_ASYM
Compression was explicitly set to allow asymetric compression.
Definition comp.h:49
#define COMP_F_MIGRATE
push stub-v2 or comp-lzo no when we see a client with comp-lzo in occ
Definition comp.h:47
#define COMP_ALG_UNDEF
Definition comp.h:54
char * strsep(char **stringp, const char *delim)
void key_direction_state_init(struct key_direction_state *kds, int key_direction)
Definition crypto.c:1684
Data Channel Cryptography Module.
#define CO_EPOCH_DATA_KEY_FORMAT
Bit-flag indicating the epoch the data format.
Definition crypto.h:379
static const char * dco_get_supported_ciphers(void)
Definition dco.h:381
static void dco_remove_peer(struct context *c)
Definition dco.h:348
static bool dco_check_startup_option(msglvl_t msglevel, const struct options *o)
Definition dco.h:280
static void dco_install_iroute(struct multi_context *m, struct multi_instance *mi, struct mroute_addr *addr)
Definition dco.h:359
static bool dco_check_pull_options(msglvl_t msglevel, const struct options *o)
Definition dco.h:286
static bool dco_available(msglvl_t msglevel)
Definition dco.h:262
static int dco_p2p_add_new_peer(struct context *c)
Definition dco.h:335
static bool dco_check_option(msglvl_t msglevel, const struct options *o)
Definition dco.h:274
static bool dco_update_keys(dco_context_t *dco, struct tls_multi *multi)
Definition dco.h:328
void * dco_context_t
Definition dco.h:259
#define DCO_IROUTE_METRIC
Definition dco.h:46
static int dco_multi_add_new_peer(struct multi_context *m, struct multi_instance *mi)
Definition dco.h:353
static void dco_delete_iroutes(struct multi_context *m, struct multi_instance *mi)
Definition dco.h:364
static int init_key_dco_bi(struct tls_multi *multi, struct key_state *ks, const struct key2 *key2, int key_direction, const char *ciphername, bool server)
Definition dco.h:321
int dco_del_key(dco_context_t *dco, unsigned int peerid, dco_key_slot_t slot)
Definition dco_win.c:584
int dco_del_peer(dco_context_t *dco, unsigned int peerid)
Definition dco_win.c:469
int dco_new_peer(dco_context_t *dco, unsigned int peerid, socket_descriptor_t sd, struct sockaddr *localaddr, struct sockaddr *remoteaddr, struct in_addr *vpn_ipv4, struct in6_addr *vpn_ipv6)
Definition dco_win.c:418
void dco_win_add_iroute_ipv6(dco_context_t *dco, struct in6_addr dst, unsigned int netbits, unsigned int peer_id)
Definition dco_win.c:1041
void dco_win_del_iroute_ipv4(dco_context_t *dco, in_addr_t dst, unsigned int netbits)
Definition dco_win.c:1062
bool dco_win_supports_multipeer(void)
Definition dco_win.c:1011
void dco_win_del_iroute_ipv6(dco_context_t *dco, struct in6_addr dst, unsigned int netbits)
Definition dco_win.c:1083
int dco_swap_keys(dco_context_t *dco, unsigned int peer_id)
Definition dco_win.c:592
void dco_win_add_iroute_ipv4(dco_context_t *dco, in_addr_t dst, unsigned int netbits, unsigned int peer_id)
Definition dco_win.c:1018
int dco_new_key(dco_context_t *dco, unsigned int peerid, int keyid, dco_key_slot_t slot, const uint8_t *encrypt_key, const uint8_t *encrypt_iv, const uint8_t *decrypt_key, const uint8_t *decrypt_iv, const char *ciphername, bool epoch)
Definition dco_win.c:529
#define D_DCO
Definition errlevel.h:93
#define D_DCO_DEBUG
Definition errlevel.h:117
#define KS_SIZE
Size of the tls_session.key array.
Definition ssl_common.h:469
#define TM_SIZE
Size of the tls_multi.session \ array.
Definition ssl_common.h:550
#define S_GENERATED_KEYS
The data channel keys have been generated The TLS session is fully authenticated when reaching this s...
Definition ssl_common.h:105
struct key_state * tls_select_encryption_key(struct tls_multi *multi)
Selects the primary encryption that should be used to encrypt data of an outgoing packet.
Definition ssl.c:3927
#define MF_QUERY_PROXY
Definition manage.h:41
#define MR_ADDR_IPV4
Definition mroute.h:62
#define MR_ONLINK_DCO_ADDR
Definition mroute.h:79
#define MR_ADDR_IPV6
Definition mroute.h:63
#define MR_ADDR_MASK
Definition mroute.h:64
bool multi_check_push_ifconfig_ipv6_extra_route(struct multi_instance *mi, struct in6_addr *dest)
Determines if the ifconfig_ipv6_local address falls into the range of the local IP addresses of the V...
Definition multi.c:4397
bool multi_check_push_ifconfig_extra_route(struct multi_instance *mi, in_addr_t dest)
Determines if the ifconfig_push_local address falls into the range of the local IP addresses of the V...
Definition multi.c:4376
Header file for server-mode related structures and functions.
#define IFACE_TYPE_LEN_MAX
Definition networking.h:25
#define msg(flags,...)
Definition error.h:152
unsigned int msglvl_t
Definition error.h:77
#define ASSERT(x)
Definition error.h:219
#define CM_CHILD_TCP
Definition openvpn.h:483
#define MODE_SERVER
Definition options.h:263
static bool dco_enabled(const struct options *o)
Returns whether the current configuration has dco enabled.
Definition options.h:987
@ OVPN_KEY_SLOT_SECONDARY
@ OVPN_KEY_SLOT_PRIMARY
#define DEV_TYPE_TUN
Definition proto.h:35
#define TOP_SUBNET
Definition proto.h:43
#define SF_USE_IP_PKTINFO
Definition socket.h:209
static bool proto_is_udp(int proto)
Returns if the protocol being used is UDP.
static bool proto_is_dgram(int proto)
Return if the protocol is datagram (UDP)
Control Channel Common Data Structures.
#define KEY_SCAN_SIZE
Definition ssl_common.h:567
@ DCO_INSTALLED_PRIMARY
Definition ssl_common.h:185
@ DCO_INSTALLED_SECONDARY
Definition ssl_common.h:186
@ DCO_NOT_INSTALLED
Definition ssl_common.h:184
static struct key_state * get_key_scan(struct tls_multi *multi, int index)
gets an item of key_state objects in the order they should be scanned by data channel modules.
Definition ssl_common.h:733
@ KS_AUTH_TRUE
Key state is authenticated.
Definition ssl_common.h:157
bool tls_item_in_cipher_list(const char *item, const char *list)
Return true iff item is present in the colon-separated zero-terminated cipher list.
Definition ssl_ncp.c:206
Control Channel SSL/Data dynamic negotiation Module This file is split from ssl.h to be able to unit ...
Definition options.h:107
struct local_list * local_list
Definition options.h:108
const char * remote
Definition options.h:114
struct http_proxy_options * http_proxy_options
Definition options.h:122
const char * socks_proxy_server
Definition options.h:123
int fragment
Definition options.h:141
struct tuntap * tuntap
Tun/tap virtual network interface.
Definition openvpn.h:172
bool push_ifconfig_ipv6_defined
Definition openvpn.h:431
bool push_ifconfig_defined
Definition openvpn.h:425
struct tls_multi * tls_multi
TLS state structure for this VPN tunnel.
Definition openvpn.h:323
struct in6_addr push_ifconfig_ipv6_local
Definition openvpn.h:432
struct link_socket ** link_sockets
Definition openvpn.h:237
struct link_socket_info ** link_socket_infos
Definition openvpn.h:238
in_addr_t push_ifconfig_local
Definition openvpn.h:427
Contains all state information for one tunnel.
Definition openvpn.h:471
int mode
Role of this context within the OpenVPN process.
Definition openvpn.h:484
openvpn_net_ctx_t net_ctx
Networking API opaque context.
Definition openvpn.h:498
struct context_2 c2
Level 2 context.
Definition openvpn.h:514
struct options options
Options loaded from command line or configuration file.
Definition openvpn.h:472
struct context_1 c1
Level 1 context.
Definition openvpn.h:513
unsigned int flags
Bit-flags determining behavior of security operation functions.
Definition crypto.h:386
struct key_ctx_bi key_ctx_bi
OpenSSL cipher and HMAC contexts for both sending and receiving directions.
Definition crypto.h:294
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:116
Container for bidirectional cipher and HMAC key material.
Definition crypto.h:240
struct key keys[2]
Two unidirectional sets of key material.
Definition crypto.h:243
Container for two sets of OpenSSL cipher and/or HMAC contexts for both sending and receiving directio...
Definition crypto.h:280
Key ordering of the key2.keys array.
Definition crypto.h:259
Security parameter state of one TLS and data channel key session.
Definition ssl_common.h:208
struct crypto_options crypto_options
Definition ssl_common.h:237
enum dco_key_status dco_status
Definition ssl_common.h:271
enum ks_auth_state authenticated
Definition ssl_common.h:259
int key_id
Key id for this key_state, inherited from struct tls_session.
Definition ssl_common.h:217
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
int proto
Definition options.h:103
struct local_entry ** array
Definition options.h:196
struct mroute_addr::@2::@6 v6
uint8_t addr[OPENVPN_ETH_ALEN]
Definition mroute.h:93
struct mroute_addr::@2::@5 v4
uint8_t type
Definition mroute.h:85
uint8_t netbits
Definition mroute.h:86
Main OpenVPN server state structure.
Definition multi.h:162
struct context top
Storage structure for process-wide configuration.
Definition multi.h:201
Server-mode state structure for one single VPN tunnel.
Definition multi.h:102
struct context context
The context structure storing state for this VPN tunnel.
Definition multi.h:142
union openvpn_sockaddr::@27 addr
struct sockaddr sa
Definition socket_util.h:42
struct connection_list * connection_list
Definition options.h:293
bool use_peer_id
Definition options.h:698
const char * authname
Definition options.h:579
const char * dev_type
Definition options.h:321
struct iroute_ipv6 * iroutes_ipv6
Definition options.h:510
const char * ncp_ciphers
Definition options.h:578
bool tls_server
Definition options.h:589
bool tls_client
Definition options.h:590
struct iroute * iroutes
Definition options.h:509
unsigned int sockflags
Definition options.h:419
const char * dev_node
Definition options.h:322
const char * dev
Definition options.h:320
Security parameter state for a single VPN tunnel.
Definition ssl_common.h:612
dco_context_t * dco
Definition ssl_common.h:726
struct tls_session session[TM_SIZE]
Array of tls_session objects representing control channel sessions with the remote peer.
Definition ssl_common.h:712
int dco_keys_installed
Definition ssl_common.h:716
uint32_t peer_id
Definition ssl_common.h:700
int dco_peer_id
This is the handle that DCO uses to identify this session with the kernel.
Definition ssl_common.h:724
struct key_state key[KS_SIZE]
Definition ssl_common.h:525
dco_context_t dco
Definition tun.h:247
char * actual_name
Definition tun.h:205
SOCKET socket_descriptor_t
Definition syshead.h:445
uint32_t in_addr_t
Definition syshead.h:52
struct gc_arena gc
Definition test_ssl.c:133
int dev_type_enum(const char *dev, const char *dev_type)
Definition tun.c:521
bool is_dev_type(const char *dev, const char *dev_type, const char *match_type)
Definition tun.c:503
bool tun_name_is_fixed(const char *dev)
Definition tun.c:1804
#define TUNNEL_TYPE(tt)
Definition tun.h:182
static bool is_tun_afunix(const char *devnode)
Checks whether a –dev-node parameter specifies a AF_UNIX device.
Definition tun_afunix.h:61