From d195ec67480f5efa99191aaf89661d39700ab14b Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Tue, 21 Jul 2026 14:25:53 -0700 Subject: [PATCH] fix(security): round-trip packet policy defaults --- src/modules/AdminModule.cpp | 4 ++-- test/test_admin_session_repro/test_main.cpp | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index 0edbf99bd..945802aba 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -1138,9 +1138,9 @@ void AdminModule::handleSetConfig(const meshtastic_Config &c, bool fromOthers) } #if MESHTASTIC_EXCLUDE_PKI || MESHTASTIC_EXCLUDE_XEDDSA if (incoming.packet_signature_policy != - meshtastic_Config_SecurityConfig_PacketSignaturePolicy_PACKET_SIGNATURE_POLICY_BALANCED) { + meshtastic_Config_SecurityConfig_PacketSignaturePolicy_PACKET_SIGNATURE_POLICY_COMPATIBLE) { incoming.packet_signature_policy = - meshtastic_Config_SecurityConfig_PacketSignaturePolicy_PACKET_SIGNATURE_POLICY_BALANCED; + meshtastic_Config_SecurityConfig_PacketSignaturePolicy_PACKET_SIGNATURE_POLICY_COMPATIBLE; const char *warning = "Packet authenticity policy is unavailable on this firmware build"; LOG_WARN(warning); sendWarning(warning); diff --git a/test/test_admin_session_repro/test_main.cpp b/test/test_admin_session_repro/test_main.cpp index 801eeec96..851f3c4c8 100644 --- a/test/test_admin_session_repro/test_main.cpp +++ b/test/test_admin_session_repro/test_main.cpp @@ -304,6 +304,26 @@ void test_local_security_config_keeps_private_key(void) admin->drainReply(); } +// A local client writes this device-owned policy, then receives the same value in its next config read. +void test_local_security_config_round_trips_packet_signature_policy(void) +{ + meshtastic_Config set = meshtastic_Config_init_zero; + set.which_payload_variant = meshtastic_Config_security_tag; + set.payload_variant.security = config.security; + set.payload_variant.security.packet_signature_policy = + meshtastic_Config_SecurityConfig_PacketSignaturePolicy_PACKET_SIGNATURE_POLICY_STRICT; + admin->handleSetConfig(set, false); + + meshtastic_MeshPacket req = makeGetConfigRequest(0); + admin->handleGetConfig(req, meshtastic_AdminMessage_ConfigType_SECURITY_CONFIG); + + meshtastic_Config_SecurityConfig sec; + TEST_ASSERT_TRUE(decodeSecurityFromReply(admin->reply(), sec)); + TEST_ASSERT_EQUAL(meshtastic_Config_SecurityConfig_PacketSignaturePolicy_PACKET_SIGNATURE_POLICY_STRICT, + sec.packet_signature_policy); + admin->drainReply(); +} + // Decode the NetworkConfig / MqttConfig out of the response a handler queued in myReply. static bool decodeNetworkFromReply(meshtastic_MeshPacket *reply, meshtastic_Config_NetworkConfig &out) { @@ -652,6 +672,7 @@ void setup() RUN_TEST(test_session_gate_accepts_key_from_a_get_response); RUN_TEST(test_remote_security_config_omits_private_key); RUN_TEST(test_local_security_config_keeps_private_key); + RUN_TEST(test_local_security_config_round_trips_packet_signature_policy); RUN_TEST(test_remote_network_config_omits_wifi_psk); RUN_TEST(test_local_network_config_keeps_wifi_psk); RUN_TEST(test_remote_mqtt_config_omits_password);