From 05b62003fa23d53d4215fd0db0c9d2e26b0a87f7 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Wed, 7 Oct 2026 10:45:56 -0400 Subject: [PATCH] whoops placed tests in wrong files; --- tests/p25/KMM_Rekey_CBC_Test.cpp | 80 ++++++++++++++++++------------- tests/p25/KMM_Rekey_CMAC_Test.cpp | 50 ------------------- tests/p25/P25_KMM_Tests.cpp | 38 +++++++++++++++ 3 files changed, 84 insertions(+), 84 deletions(-) diff --git a/tests/p25/KMM_Rekey_CBC_Test.cpp b/tests/p25/KMM_Rekey_CBC_Test.cpp index 3c9d7114..25ca8974 100644 --- a/tests/p25/KMM_Rekey_CBC_Test.cpp +++ b/tests/p25/KMM_Rekey_CBC_Test.cpp @@ -147,40 +147,52 @@ TEST_CASE("KMM ReKey Command CBC Test", "[p25][kmm_cbc][cap]") { REQUIRE(failed==false); } -TEST_CASE("KMM Key Format follows AACA-D Table 70", "[p25][kmm][key-format]") -{ - REQUIRE(KMM_KEY_FORMAT_TEK == 0x00U); - REQUIRE(KMM_KEY_FORMAT_KEK == 0x80U); - REQUIRE(KMM_KEY_FORMAT_DELETE == 0x20U); - REQUIRE(KMM_BODY_FORMAT_TEK_INCLUDED == 0x80U); - REQUIRE(KMM_BODY_FORMAT_KEK_MISSING == 0x40U); - - auto encodedKeyFormat = [](uint8_t format) { - KMMRekeyCommand command; - command.setSrcLLId(0x010203U); - command.setDstLLId(0x040506U); - command.setDecryptInfoFmt(KMM_DECRYPT_INSTRUCT_NONE); - - KeysetItem keyset; - keyset.keysetId(1U); - keyset.algId(ALGO_AES_256); - keyset.keyLength(1U); - - KeyItem key; - const uint8_t material = 0x5AU; - key.keyFormat(format); - key.sln(1U); - key.kId(2U); - key.setKey(&material, 1U); - keyset.push_back(key); - command.setKeysets({ keyset }); - - std::vector encoded(command.fullLength(), 0U); - command.encode(encoded.data()); - return encoded[20U]; +TEST_CASE("KMM Rekey Encodes Message Number Zero When Present", "[p25][kmm_cbc][cap]") { + // Verify explicit MN presence works even when the message number value is zero. + KMMRekeyCommand outKmm = KMMRekeyCommand(); + + outKmm.setDecryptInfoFmt(KMM_DECRYPT_INSTRUCT_NONE); + outKmm.setSrcLLId(0x712B1DU); + outKmm.setDstLLId(0x643BA8U); + + outKmm.setMACType(KMM_MAC::ENH_MAC); + outKmm.setMACAlgId(ALGO_AES_256); + outKmm.setMACKId(0x2F62U); + outKmm.setMACFormat(KMM_MAC_FORMAT_CBC); + + outKmm.setHasMessageNumber(true); + outKmm.setMessageNumber(0x0000U); + + outKmm.setAlgId(ALGO_AES_256); + outKmm.setKId(0x50BCU); + + KeysetItem ks; + ks.keysetId(1U); + ks.algId(ALGO_AES_256); + ks.keyLength(P25DEF::MAX_WRAPPED_ENC_KEY_LENGTH_BYTES); + + p25::kmm::KeyItem ki = p25::kmm::KeyItem(); + ki.keyFormat(KMM_KEY_FORMAT_TEK); + ki.sln(0U); + ki.kId(0x4983U); + + uint8_t testWrappedKeyFrame[40U] = + { + 0x80, 0x28, 0x9C, 0xF6, 0x35, 0xFB, 0x68, 0xD3, 0x45, 0xD3, 0x4F, 0x62, 0xEF, 0x06, 0x3B, 0xA4, + 0xE0, 0x5C, 0xAE, 0x47, 0x56, 0xE7, 0xD3, 0x04, 0x46, 0xD1, 0xF0, 0x7C, 0x6E, 0xB4, 0xE9, 0xE0, + 0x84, 0x09, 0x45, 0x37, 0x23, 0x72, 0xFB, 0x80 }; + ki.setKey(testWrappedKeyFrame, 40U); + ks.push_back(ki); + + std::vector keysets; + keysets.push_back(ks); + outKmm.setKeysets(keysets); + + UInt8Array kmmFrame = std::make_unique(outKmm.fullLength()); + outKmm.encode(kmmFrame.get()); - REQUIRE(encodedKeyFormat(KMM_KEY_FORMAT_TEK) == 0x00U); - REQUIRE(encodedKeyFormat(KMM_KEY_FORMAT_KEK) == 0x80U); - REQUIRE(encodedKeyFormat(KMM_KEY_FORMAT_TEK | KMM_KEY_FORMAT_DELETE) == 0x20U); + REQUIRE((kmmFrame.get()[3U] & 0x30U) == 0x20U); + REQUIRE(kmmFrame.get()[10U] == 0x00U); + REQUIRE(kmmFrame.get()[11U] == 0x00U); } diff --git a/tests/p25/KMM_Rekey_CMAC_Test.cpp b/tests/p25/KMM_Rekey_CMAC_Test.cpp index aa30f89b..bdeefa5b 100644 --- a/tests/p25/KMM_Rekey_CMAC_Test.cpp +++ b/tests/p25/KMM_Rekey_CMAC_Test.cpp @@ -167,53 +167,3 @@ TEST_CASE("KMM Hello CMAC Test (No Message Number)", "[p25][kmm_cmac][cap]") { hello.generateMAC(macTek, encoded.get()); REQUIRE(::memcmp(encoded.get(), expectedFrame, sizeof(expectedFrame)) == 0); } - -TEST_CASE("KMM Rekey Encodes Message Number Zero When Present", "[p25][kmm_cbc][cap]") { - // Verify explicit MN presence works even when the message number value is zero. - KMMRekeyCommand outKmm = KMMRekeyCommand(); - - outKmm.setDecryptInfoFmt(KMM_DECRYPT_INSTRUCT_NONE); - outKmm.setSrcLLId(0x712B1DU); - outKmm.setDstLLId(0x643BA8U); - - outKmm.setMACType(KMM_MAC::ENH_MAC); - outKmm.setMACAlgId(ALGO_AES_256); - outKmm.setMACKId(0x2F62U); - outKmm.setMACFormat(KMM_MAC_FORMAT_CBC); - - outKmm.setHasMessageNumber(true); - outKmm.setMessageNumber(0x0000U); - - outKmm.setAlgId(ALGO_AES_256); - outKmm.setKId(0x50BCU); - - KeysetItem ks; - ks.keysetId(1U); - ks.algId(ALGO_AES_256); - ks.keyLength(P25DEF::MAX_WRAPPED_ENC_KEY_LENGTH_BYTES); - - p25::kmm::KeyItem ki = p25::kmm::KeyItem(); - ki.keyFormat(KMM_KEY_FORMAT_TEK); - ki.sln(0U); - ki.kId(0x4983U); - - uint8_t testWrappedKeyFrame[40U] = - { - 0x80, 0x28, 0x9C, 0xF6, 0x35, 0xFB, 0x68, 0xD3, 0x45, 0xD3, 0x4F, 0x62, 0xEF, 0x06, 0x3B, 0xA4, - 0xE0, 0x5C, 0xAE, 0x47, 0x56, 0xE7, 0xD3, 0x04, 0x46, 0xD1, 0xF0, 0x7C, 0x6E, 0xB4, 0xE9, 0xE0, - 0x84, 0x09, 0x45, 0x37, 0x23, 0x72, 0xFB, 0x80 - }; - ki.setKey(testWrappedKeyFrame, 40U); - ks.push_back(ki); - - std::vector keysets; - keysets.push_back(ks); - outKmm.setKeysets(keysets); - - UInt8Array kmmFrame = std::make_unique(outKmm.fullLength()); - outKmm.encode(kmmFrame.get()); - - REQUIRE((kmmFrame.get()[3U] & 0x30U) == 0x20U); - REQUIRE(kmmFrame.get()[10U] == 0x00U); - REQUIRE(kmmFrame.get()[11U] == 0x00U); -} diff --git a/tests/p25/P25_KMM_Tests.cpp b/tests/p25/P25_KMM_Tests.cpp index 9db7780c..0bd753f8 100644 --- a/tests/p25/P25_KMM_Tests.cpp +++ b/tests/p25/P25_KMM_Tests.cpp @@ -367,3 +367,41 @@ TEST_CASE("P25 OTAR DLI validates its Version-0 preamble and dispatches KMM", "[ REQUIRE_FALSE(FNETestHooks::hasOTARInboundMessageNumber(harness.traffic, SU_RSI, MN)); } } + +TEST_CASE("KMM Key Format follows AACA-D Table 70", "[p25][kmm][key-format]") +{ + REQUIRE(KMM_KEY_FORMAT_TEK == 0x00U); + REQUIRE(KMM_KEY_FORMAT_KEK == 0x80U); + REQUIRE(KMM_KEY_FORMAT_DELETE == 0x20U); + REQUIRE(KMM_BODY_FORMAT_TEK_INCLUDED == 0x80U); + REQUIRE(KMM_BODY_FORMAT_KEK_MISSING == 0x40U); + + auto encodedKeyFormat = [](uint8_t format) { + KMMRekeyCommand command; + command.setSrcLLId(0x010203U); + command.setDstLLId(0x040506U); + command.setDecryptInfoFmt(KMM_DECRYPT_INSTRUCT_NONE); + + KeysetItem keyset; + keyset.keysetId(1U); + keyset.algId(ALGO_AES_256); + keyset.keyLength(1U); + + KeyItem key; + const uint8_t material = 0x5AU; + key.keyFormat(format); + key.sln(1U); + key.kId(2U); + key.setKey(&material, 1U); + keyset.push_back(key); + command.setKeysets({ keyset }); + + std::vector encoded(command.fullLength(), 0U); + command.encode(encoded.data()); + return encoded[20U]; + }; + + REQUIRE(encodedKeyFormat(KMM_KEY_FORMAT_TEK) == 0x00U); + REQUIRE(encodedKeyFormat(KMM_KEY_FORMAT_KEK) == 0x80U); + REQUIRE(encodedKeyFormat(KMM_KEY_FORMAT_TEK | KMM_KEY_FORMAT_DELETE) == 0x20U); +}