From patchwork Fri Apr 14 09:42:27 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kristof Provost X-Patchwork-Id: 3187 Return-Path: Delivered-To: patchwork@openvpn.net Received: by 2002:a05:7301:1c8f:b0:b9:8aca:e0fc with SMTP id al15csp288442dyc; Fri, 14 Apr 2023 03:13:32 -0700 (PDT) X-Google-Smtp-Source: AKy350Y8eeICC5iF37T/iQcVW6vN1HYaPpjb6dzAjc8TbtkWy+vxxWfbePP7qBen3r0K7euCi9ff X-Received: by 2002:a17:902:ea06:b0:19c:b11b:ffca with SMTP id s6-20020a170902ea0600b0019cb11bffcamr2832194plg.23.1681467212712; Fri, 14 Apr 2023 03:13:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681467212; cv=none; d=google.com; s=arc-20160816; b=EWGNPOZM096A41oEbumufcovA4Bx+/4qhqGjD6rE50UX13jCDnxCJ6wfYNIcWBVyej WiLopehBUrhjKgz5iewLM/tI5xo52zscHSVs95/99zOKvHePo0SPnwnJeWpIj696YLFe WErftlbaPWhsoyq9ha242Xg2Yy/XMsjHIYh4xb+6hNgPIVbzZg+EEchtc+QD++133Uy2 PRZynnf0szBeBszvQu/+ahTVWXnzraDOsNt1xK6Ire0GK5Qe4Yh+6UeJe1zfsFkB3L52 RX0zr/DZZJnTnIn8BsbfYg0o0H7OWLWQWS2fQzrS42fZ5F6eWU1joAN7kqAUUhcJN/m0 Mgvg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:content-transfer-encoding:reply-to:from:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:dkim-signature :dkim-signature:dkim-signature; bh=GNkxyA4o/KSrtBUCg5YSI/VBNucmNtIzNwJSWR/Y2k4=; b=TfjTq5xYApYV4Jeik3zC2M8r47IduwbSQ6sj6o/qFVzVxb6V65Jnm3wfCKDxTWluvH vr3Q2eNhSHaDOZEqA38We/b421Qo+weG56qMMCBS54f/ikKp1SUp4E/o8hvgjA1m6Mut iHmcKL13Po9o5Am2xBDSDRQr0EIVB/3X2Dg09e4WGiSRBp/SkJobencWd//yDOwvop2h J/bXKNyX68eIQhQUU74yfKLzYYgv5pRz9QtR6AR37CLDdfHSu94OK3E6cCGmBGJNqnZX 0HPO9iToXypaXTEgDXs5JK5OAWQh3bCOyRaDGTSuM1LkCUw0WXCwKLN762YtgeEGPyfV NfXA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b="jufFUx/j"; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=QV8nzjDH; dkim=neutral (body hash did not verify) header.i=@netgate.com header.s=google header.b=VlF+Avtv; spf=pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) smtp.mailfrom=openvpn-devel-bounces@lists.sourceforge.net; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=sourceforge.net Received: from lists.sourceforge.net (lists.sourceforge.net. [216.105.38.7]) by mx.google.com with ESMTPS id l73-20020a63914c000000b0050bfa82c23bsi3959329pge.230.2023.04.14.03.13.31 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 14 Apr 2023 03:13:32 -0700 (PDT) Received-SPF: pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) client-ip=216.105.38.7; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b="jufFUx/j"; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=QV8nzjDH; dkim=neutral (body hash did not verify) header.i=@netgate.com header.s=google header.b=VlF+Avtv; spf=pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) smtp.mailfrom=openvpn-devel-bounces@lists.sourceforge.net; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=sourceforge.net Received: from [127.0.0.1] (helo=sfs-ml-3.v29.lw.sourceforge.com) by sfs-ml-3.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1pnGQ3-0000vw-1F; Fri, 14 Apr 2023 10:12:38 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-3.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1pnGQ0-0000vq-KN for openvpn-devel@lists.sourceforge.net; Fri, 14 Apr 2023 10:12:36 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:MIME-Version:Message-Id: Date:Subject:To:From:Sender:Reply-To:Cc:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=Y4JlpgDnhCsPkgNsxnhip1JwxkXJvD1ZxEPQWh5XVPw=; b=jufFUx/juG6WgWeYsg/CVjjGuA ga7ooJqlgDPMjXvuPLX2FdOjxZOUQy3d8LBAQPJCi+roS/yWhXfvk1NaovwhygmVptVjTc1NbwaJp D0wXfPN1OIQ8JEUFaJi/vrS931yi/Y93XIJRcfX5bdfN2hyziq0HcSOLlNN2AS3LpZuo=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:MIME-Version:Message-Id:Date:Subject:To:From: Sender:Reply-To:Cc:Content-Type:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: References:List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post: List-Owner:List-Archive; bh=Y4JlpgDnhCsPkgNsxnhip1JwxkXJvD1ZxEPQWh5XVPw=; b=Q V8nzjDHTGOy7NWAZ11EjA5ffo7Rx4NbxjAE/dnaeSkwiiOOu4TwiN+lyn7+96tMyhG1DZkmBCUDGr 9H+Uqd8xrqzSlNBc5OY6Hr3EnaE89ebcGk5Q24o/Cyt8buOadsmQoVgi/zVLZKQBkSDcu2m04zpQ4 n61mcO8OQrrnLOcA=; Received: from mail-ej1-f47.google.com ([209.85.218.47]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.95) id 1pnGPs-0006Qr-V0 for openvpn-devel@lists.sourceforge.net; Fri, 14 Apr 2023 10:12:34 +0000 Received: by mail-ej1-f47.google.com with SMTP id dm2so44429549ejc.8 for ; Fri, 14 Apr 2023 03:12:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netgate.com; s=google; t=1681467141; x=1684059141; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=Y4JlpgDnhCsPkgNsxnhip1JwxkXJvD1ZxEPQWh5XVPw=; b=VlF+Avtv3wRhD/mtPOzGSJrLz5y8JiuMOp+Z47yuBbpoRSMrJSHXFtuRLoiy4NlT+r SBoJ839MjZ6Gx0oNsFVM14WB3Lwpl7MHnN8kyIdsA2vn2E1vzIqfw94HfueDw2f8Q9VM isrobUrZfwW4IdO4KSDGwcJVxcn06SzjcPTJo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1681467141; x=1684059141; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Y4JlpgDnhCsPkgNsxnhip1JwxkXJvD1ZxEPQWh5XVPw=; b=U4mTGNgCmmFVeI26rTz30Fa8FMgvK0zlSJJjFJHEORj6CczCeu5ACAr9T2Dl/gdfRt LvMisA/HBwTfbl+E/EE6AiM5CVzkczSQOcpJsJ4SipAp0JalyHHZY6oJDbmXMapm6G7r exbX8dVCU06ybMVQKffT34gJ74zW7er0EXLe9AKdWo7Z8AJUHgXnk7FREP+D4piaJyEx OJjDszsCsVDVPRLqNmC8iQhbuIGd/jGBQ0JUyNUN8Yu1Si/MqN2xwjQW9SHoeD7FRNIS JfuqeEd/32HUXT8O3Dr0vKiSHjjvox8rzxVca+Z1azyBmKN4gEoAfyQO3qeJxqxZ/LMZ RLAw== X-Gm-Message-State: AAQBX9d+EFa6qKVqLH4zvpVUsPteS0jvwLcuHOnUORsATTfm+EqBHzPK NfvcPAMoPtjdd/qc5egqT+19bZNlAiJrkugZ/yveLQ== X-Received: by 2002:a05:600c:21d5:b0:3f0:9e27:5b9e with SMTP id x21-20020a05600c21d500b003f09e275b9emr3948208wmj.5.1681465348836; Fri, 14 Apr 2023 02:42:28 -0700 (PDT) Received: from nut.jupiter.sigsegv.be (ptr-8rfalzsse26o3oo9imw.18120a2.ip6.access.telenet.be. [2a02:1811:2402:bf00:f602:70ff:feae:6e98]) by smtp.googlemail.com with ESMTPSA id v10-20020a05600c470a00b003ef36ef3833sm7694470wmo.8.2023.04.14.02.42.28 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Apr 2023 02:42:28 -0700 (PDT) To: openvpn-devel Date: Fri, 14 Apr 2023 11:42:27 +0200 Message-Id: <20230414094227.9153-1-kprovost@netgate.com> X-Mailer: git-send-email 2.40.0 MIME-Version: 1.0 X-Spam-Score: -0.2 (/) X-Spam-Report: Spam detection software, running on the system "util-spamd-1.v13.lw.sourceforge.com", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: From: Kristof Provost Allow the kernel driver to notify us that it's time to renegotiate keys. The intent is to avoid IV re-use after 2^32 packets. This is a first draft intended for discussion. The accompanying kernel change for FreeBSD can be found in https://reviews.freebsd.org/D39570 Content analysis details: (-0.2 points, 6.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [209.85.218.47 listed in list.dnswl.org] -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [209.85.218.47 listed in wl.mailspike.net] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain X-Headers-End: 1pnGPs-0006Qr-V0 Subject: [Openvpn-devel] [PATCH] DCO: support key rotation notifications X-BeenThere: openvpn-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Kristof Provost via Openvpn-devel From: Kristof Provost Reply-To: Kristof Provost Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox X-GMAIL-THRID: =?utf-8?q?1763146163903014480?= X-GMAIL-MSGID: =?utf-8?q?1763146163903014480?= From: Kristof Provost Allow the kernel driver to notify us that it's time to renegotiate keys. The intent is to avoid IV re-use after 2^32 packets. This is a first draft intended for discussion. The accompanying kernel change for FreeBSD can be found in https://reviews.freebsd.org/D39570 Signed-off-by: Kristof Provost Acked-by: Antonio Quartulli --- src/openvpn/dco_freebsd.c | 4 ++++ src/openvpn/dco_freebsd.h | 1 + src/openvpn/forward.c | 32 +++++++++++++++++++++----------- src/openvpn/multi.c | 4 ++++ src/openvpn/ovpn_dco_freebsd.h | 1 + src/openvpn/ssl.c | 6 ++++++ src/openvpn/ssl.h | 3 +++ 7 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/openvpn/dco_freebsd.c b/src/openvpn/dco_freebsd.c index a334d5d2..1111abeb 100644 --- a/src/openvpn/dco_freebsd.c +++ b/src/openvpn/dco_freebsd.c @@ -550,6 +550,10 @@ dco_do_read(dco_context_t *dco) dco->dco_message_type = OVPN_CMD_DEL_PEER; break; + case OVPN_NOTIF_ROTATE_KEY: + dco->dco_message_type = OVPN_CMD_SWAP_KEYS; + break; + default: msg(M_WARN, "Unknown kernel notification %d", type); break; diff --git a/src/openvpn/dco_freebsd.h b/src/openvpn/dco_freebsd.h index a07f9b69..e1a054e0 100644 --- a/src/openvpn/dco_freebsd.h +++ b/src/openvpn/dco_freebsd.h @@ -35,6 +35,7 @@ typedef enum ovpn_key_cipher dco_cipher_t; enum ovpn_message_type_t { OVPN_CMD_DEL_PEER, OVPN_CMD_PACKET, + OVPN_CMD_SWAP_KEYS, }; enum ovpn_del_reason_t { diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c index b3e0ba5d..d50eb457 100644 --- a/src/openvpn/forward.c +++ b/src/openvpn/forward.c @@ -1232,20 +1232,30 @@ process_incoming_dco(struct context *c) return; } - if (dco->dco_message_type != OVPN_CMD_DEL_PEER) + switch (dco->dco_message_type) { - msg(D_DCO_DEBUG, "%s: received message of type %u - ignoring", __func__, - dco->dco_message_type); - return; - } + case OVPN_CMD_DEL_PEER: + if (dco->dco_del_peer_reason == OVPN_DEL_PEER_REASON_EXPIRED) + { + msg(D_DCO_DEBUG, "%s: received peer expired notification of for peer-id " + "%d", __func__, dco->dco_message_peer_id); + trigger_ping_timeout_signal(c); + return; + } + break; - if (dco->dco_del_peer_reason == OVPN_DEL_PEER_REASON_EXPIRED) - { - msg(D_DCO_DEBUG, "%s: received peer expired notification of for peer-id " - "%d", __func__, dco->dco_message_peer_id); - trigger_ping_timeout_signal(c); - return; + case OVPN_CMD_SWAP_KEYS: + msg(D_DCO_DEBUG, "%s: received key rotation notification for peer-id %d", + __func__, dco->dco_message_peer_id); + tls_session_soft_reset(c->c2.tls_multi); + break; + + default: + msg(D_DCO_DEBUG, "%s: received message of type %u - ignoring", __func__, + dco->dco_message_type); + return; } + #endif /* if defined(ENABLE_DCO) && (defined(TARGET_LINUX) || defined(TARGET_FREEBSD)) */ } diff --git a/src/openvpn/multi.c b/src/openvpn/multi.c index 5444e752..6fb9cff2 100644 --- a/src/openvpn/multi.c +++ b/src/openvpn/multi.c @@ -3284,6 +3284,10 @@ multi_process_incoming_dco(struct multi_context *m) { process_incoming_del_peer(m, mi, dco); } + else if (dco->dco_message_type == OVPN_CMD_SWAP_KEYS) + { + tls_session_soft_reset(mi->context.c2.tls_multi); + } } else { diff --git a/src/openvpn/ovpn_dco_freebsd.h b/src/openvpn/ovpn_dco_freebsd.h index fec33835..53f94dfd 100644 --- a/src/openvpn/ovpn_dco_freebsd.h +++ b/src/openvpn/ovpn_dco_freebsd.h @@ -36,6 +36,7 @@ enum ovpn_notif_type { OVPN_NOTIF_DEL_PEER, + OVPN_NOTIF_ROTATE_KEY, }; enum ovpn_del_reason { diff --git a/src/openvpn/ssl.c b/src/openvpn/ssl.c index 60aaee8d..26e86c8d 100644 --- a/src/openvpn/ssl.c +++ b/src/openvpn/ssl.c @@ -1918,6 +1918,12 @@ key_state_soft_reset(struct tls_session *session) ks->remote_addr = ks_lame->remote_addr; } +void +tls_session_soft_reset(struct tls_multi *tls_multi) +{ + key_state_soft_reset(&tls_multi->session[TM_ACTIVE]); +} + /* * Read/write strings from/to a struct buffer with a u16 length prefix. */ diff --git a/src/openvpn/ssl.h b/src/openvpn/ssl.h index 4ed4cfaa..3c40fbed 100644 --- a/src/openvpn/ssl.h +++ b/src/openvpn/ssl.h @@ -573,6 +573,9 @@ bool tls_session_generate_data_channel_keys(struct tls_multi *multi, struct tls_session *session); +void +tls_session_soft_reset(struct tls_multi *multi); + /** * Load ovpn.xkey provider used for external key signing */