Module Name: src Committed By: christos Date: Thu Jul 25 01:47:01 UTC 2024
Modified Files: src/sys/net: if_wg.c Log Message: Add more debugging from Taylor To generate a diff of this commit: cvs rdiff -u -r1.89 -r1.90 src/sys/net/if_wg.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/if_wg.c diff -u src/sys/net/if_wg.c:1.89 src/sys/net/if_wg.c:1.90 --- src/sys/net/if_wg.c:1.89 Wed Jul 24 20:55:53 2024 +++ src/sys/net/if_wg.c Wed Jul 24 21:47:00 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wg.c,v 1.89 2024/07/25 00:55:53 kre Exp $ */ +/* $NetBSD: if_wg.c,v 1.90 2024/07/25 01:47:00 christos Exp $ */ /* * Copyright (C) Ryota Ozaki <ozaki.ry...@gmail.com> @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wg.c,v 1.89 2024/07/25 00:55:53 kre Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wg.c,v 1.90 2024/07/25 01:47:00 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_altq_enabled.h" @@ -2660,6 +2660,12 @@ wg_handle_msg_data(struct wg_softc *wg, KASSERT(m->m_len >= sizeof(*wgmd)); wgmd = mtod(m, struct wg_msg_data *); +#ifdef WG_DEBUG_PACKET + if (wg_debug & WG_DEBUG_FLAGS_PACKET) { + hexdump(printf, "incoming packet", encrypted_buf, + encrypted_len); + } +#endif /* * Get a buffer for the plaintext. Add WG_AUTHTAG_LEN to avoid * a zero-length buffer (XXX). Drop if plaintext is longer @@ -4100,6 +4106,34 @@ wg_send_data_msg(struct wg_peer *wgp, st wgs->wgs_tkey_send, le64toh(wgmd->wgmd_counter), padded_buf, padded_len, NULL, 0); +#ifdef WG_DEBUG_PACKET + if (wg_debug & WG_DEBUG_FLAGS_PACKET) { + hexdump(aprint_debug, "outgoing packet", + (char *)wgmd + sizeof(*wgmd), encrypted_len); + size_t decrypted_len = encrypted_len - WG_AUTHTAG_LEN; + char *decrypted_buf = kmem_intr_alloc((decrypted_len + + WG_AUTHTAG_LEN/*XXX*/), KM_NOSLEEP); + if (decrypted_buf != NULL) { + error = wg_algo_aead_dec( + 1 + decrypted_buf /* force misalignment */, + encrypted_len - WG_AUTHTAG_LEN /* XXX */, + wgs->wgs_tkey_send, le64toh(wgmd->wgmd_counter), + (char *)wgmd + sizeof(*wgmd), encrypted_len, + NULL, 0); + if (error) { + WG_DLOG("wg_algo_aead_dec failed: %d\n", + error); + } + if (!consttime_memequal(1 + decrypted_buf, + (char *)wgmd + sizeof(*wgmd), + decrypted_len)) { + WG_DLOG("wg_algo_aead_dec returned garbage\n"); + } + kmem_intr_free(decrypted_buf, (decrypted_len + + WG_AUTHTAG_LEN/*XXX*/)); + } + } +#endif error = wg->wg_ops->send_data_msg(wgp, n); if (error == 0) {