| // Copyright 2022 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. |
| // |
| // Unittest code for the TKIP library. |
| |
| #include "third_party/iwlwifi/platform/tkip.h" |
| |
| #include <gtest/gtest.h> |
| |
| #include "third_party/iwlwifi/platform/compiler.h" |
| #include "third_party/iwlwifi/platform/ieee80211.h" |
| |
| using namespace std; |
| |
| namespace { |
| |
| struct TestVector { |
| uint8_t key[16]; |
| uint8_t addr[6]; |
| uint32_t iv32; |
| uint16_t iv16; |
| // below are the expected results. |
| uint16_t p1k[TKIP_P1K_SIZE]; |
| uint8_t rc4key[RC4_KEY_SIZE]; |
| }; |
| |
| class TkipTest : public testing::Test { |
| public: |
| TkipTest() {} |
| ~TkipTest() {} |
| |
| bool cmp_uint16s(const char* msg, const uint16_t* expected, const uint16_t* actual, size_t size) { |
| if (!memcmp(expected, actual, size)) { |
| return true; |
| } else { |
| printf("%s\n", msg); |
| for (size_t i = 0; i < size; i++) { |
| printf(" expected[%zu]: 0x%04x actual[%zu]: 0x%04x\n", i, expected[i], i, actual[i]); |
| } |
| return false; |
| } |
| } |
| }; |
| |
| TEST_F(TkipTest, TestVectorFromStd) { |
| // From IEEE AMENDMENT 6: MEDIUM ACCESS CONTROL (MAC) SECURITY ENHANCEMENTS Std 802.11i-2004 |
| struct TestVector vector[] = { |
| { |
| // Test vector #1: |
| .key = |
| { |
| 0x00, |
| 0x01, |
| 0x02, |
| 0x03, |
| 0x04, |
| 0x05, |
| 0x06, |
| 0x07, |
| 0x08, |
| 0x09, |
| 0x0A, |
| 0x0B, |
| 0x0C, |
| 0x0D, |
| 0x0E, |
| 0x0F, |
| }, // [LSB on left, MSB on right] |
| .addr = |
| { |
| 0x10, |
| 0x22, |
| 0x33, |
| 0x44, |
| 0x55, |
| 0x66, |
| }, |
| .iv32 = 0x00000000, |
| .iv16 = 0x0000, |
| .p1k = |
| { |
| 0x3DD2, |
| 0x016E, |
| 0x76F4, |
| 0x8697, |
| 0xB2E8, |
| }, |
| .rc4key = |
| { |
| 0x00, |
| 0x20, |
| 0x00, |
| 0x33, |
| 0xEA, |
| 0x8D, |
| 0x2F, |
| 0x60, |
| 0xCA, |
| 0x6D, |
| 0x13, |
| 0x74, |
| 0x23, |
| 0x4A, |
| 0x66, |
| 0x0B, |
| }, |
| }, |
| |
| { |
| // Test vector #2: |
| .key = |
| { |
| 0x00, |
| 0x01, |
| 0x02, |
| 0x03, |
| 0x04, |
| 0x05, |
| 0x06, |
| 0x07, |
| 0x08, |
| 0x09, |
| 0x0A, |
| 0x0B, |
| 0x0C, |
| 0x0D, |
| 0x0E, |
| 0x0F, |
| }, // [LSB on left, MSB on right] |
| .addr = |
| { |
| 0x10, |
| 0x22, |
| 0x33, |
| 0x44, |
| 0x55, |
| 0x66, |
| }, |
| .iv32 = 0x00000000, |
| .iv16 = 0x0001, |
| .p1k = |
| { |
| 0x3DD2, |
| 0x016E, |
| 0x76F4, |
| 0x8697, |
| 0xB2E8, |
| }, |
| .rc4key = |
| { |
| 0x00, |
| 0x20, |
| 0x01, |
| 0x90, |
| 0xFF, |
| 0xDC, |
| 0x31, |
| 0x43, |
| 0x89, |
| 0xA9, |
| 0xD9, |
| 0xD0, |
| 0x74, |
| 0xFD, |
| 0x20, |
| 0xAA, |
| }, |
| }, |
| |
| { |
| // Test vector #3: |
| .key = |
| { |
| 0x63, |
| 0x89, |
| 0x3B, |
| 0x25, |
| 0x08, |
| 0x40, |
| 0xB8, |
| 0xAE, |
| 0x0B, |
| 0xD0, |
| 0xFA, |
| 0x7E, |
| 0x61, |
| 0xD2, |
| 0x78, |
| 0x3E, |
| }, // [LSB on left, MSB on right] |
| .addr = |
| { |
| 0x64, |
| 0xF2, |
| 0xEA, |
| 0xED, |
| 0xDC, |
| 0x25, |
| }, |
| .iv32 = 0x20DCFD43, |
| .iv16 = 0xFFFF, |
| .p1k = |
| { |
| 0x7C67, |
| 0x49D7, |
| 0x9724, |
| 0xB5E9, |
| 0xB4F1, |
| }, |
| .rc4key = |
| { |
| 0xFF, |
| 0x7F, |
| 0xFF, |
| 0x93, |
| 0x81, |
| 0x0F, |
| 0xC6, |
| 0xE5, |
| 0x8F, |
| 0x5D, |
| 0xD3, |
| 0x26, |
| 0x25, |
| 0x15, |
| 0x44, |
| 0xCE, |
| }, |
| }, |
| |
| { |
| // Test vector #4: |
| .key = |
| { |
| 0x63, |
| 0x89, |
| 0x3B, |
| 0x25, |
| 0x08, |
| 0x40, |
| 0xB8, |
| 0xAE, |
| 0x0B, |
| 0xD0, |
| 0xFA, |
| 0x7E, |
| 0x61, |
| 0xD2, |
| 0x78, |
| 0x3E, |
| }, // [LSB on left, MSB on right] |
| .addr = |
| { |
| 0x64, |
| 0xF2, |
| 0xEA, |
| 0xED, |
| 0xDC, |
| 0x25, |
| }, |
| .iv32 = 0x20DCFD44, |
| .iv16 = 0x0000, |
| .p1k = |
| { |
| 0x5A5D, |
| 0x73A8, |
| 0xA859, |
| 0x2EC1, |
| 0xDC8B, |
| }, |
| .rc4key = |
| { |
| 0x00, |
| 0x20, |
| 0x00, |
| 0x49, |
| 0x8C, |
| 0xA4, |
| 0x71, |
| 0xFC, |
| 0xFB, |
| 0xFA, |
| 0xA1, |
| 0x6E, |
| 0x36, |
| 0x10, |
| 0xF0, |
| 0x05, |
| }, |
| }, |
| |
| { |
| // Test vector #5: |
| .key = |
| { |
| 0x98, |
| 0x3A, |
| 0x16, |
| 0xEF, |
| 0x4F, |
| 0xAC, |
| 0xB3, |
| 0x51, |
| 0xAA, |
| 0x9E, |
| 0xCC, |
| 0x27, |
| 0x1D, |
| 0x73, |
| 0x09, |
| 0xE2, |
| }, // [LSB on left, MSB on right] |
| .addr = |
| { |
| 0x50, |
| 0x9C, |
| 0x4B, |
| 0x17, |
| 0x27, |
| 0xD9, |
| }, |
| .iv32 = 0xF0A410FC, |
| .iv16 = 0x058C, |
| .p1k = |
| { |
| 0xF2DF, |
| 0xEBB1, |
| 0x88D3, |
| 0x5923, |
| 0xA07C, |
| }, |
| .rc4key = |
| { |
| 0x05, |
| 0x25, |
| 0x8C, |
| 0xF4, |
| 0xD8, |
| 0x51, |
| 0x52, |
| 0xF4, |
| 0xD9, |
| 0xAF, |
| 0x1A, |
| 0x64, |
| 0xF1, |
| 0xD0, |
| 0x70, |
| 0x21, |
| }, |
| }, |
| |
| { |
| // Test vector #6: |
| .key = |
| { |
| 0x98, |
| 0x3A, |
| 0x16, |
| 0xEF, |
| 0x4F, |
| 0xAC, |
| 0xB3, |
| 0x51, |
| 0xAA, |
| 0x9E, |
| 0xCC, |
| 0x27, |
| 0x1D, |
| 0x73, |
| 0x09, |
| 0xE2, |
| }, // [LSB on left, MSB on right] |
| .addr = |
| { |
| 0x50, |
| 0x9C, |
| 0x4B, |
| 0x17, |
| 0x27, |
| 0xD9, |
| }, |
| .iv32 = 0xF0A410FC, |
| .iv16 = 0x058D, |
| .p1k = |
| { |
| 0xF2DF, |
| 0xEBB1, |
| 0x88D3, |
| 0x5923, |
| 0xA07C, |
| }, |
| .rc4key = |
| { |
| 0x05, |
| 0x25, |
| 0x8D, |
| 0x09, |
| 0xF8, |
| 0x15, |
| 0x43, |
| 0xB7, |
| 0x6A, |
| 0x59, |
| 0x6F, |
| 0xC2, |
| 0xC6, |
| 0x73, |
| 0x8B, |
| 0x30, |
| }, |
| }, |
| |
| { |
| // Test vector #7: |
| .key = |
| { |
| 0xC8, |
| 0xAD, |
| 0xC1, |
| 0x6A, |
| 0x8B, |
| 0x4D, |
| 0xDA, |
| 0x3B, |
| 0x4D, |
| 0xD5, |
| 0xB6, |
| 0x54, |
| 0x38, |
| 0x35, |
| 0x9B, |
| 0x05, |
| }, // [LSB on left, MSB on right] |
| .addr = |
| { |
| 0x94, |
| 0x5E, |
| 0x24, |
| 0x4E, |
| 0x4D, |
| 0x6E, |
| }, |
| .iv32 = 0x8B1573B7, |
| .iv16 = 0x30F8, |
| .p1k = |
| { |
| 0xEFF1, |
| 0x3F38, |
| 0xA364, |
| 0x60A9, |
| 0x76F3, |
| }, |
| .rc4key = |
| { |
| 0x30, |
| 0x30, |
| 0xF8, |
| 0x65, |
| 0x0D, |
| 0xA0, |
| 0x73, |
| 0xEA, |
| 0x61, |
| 0x4E, |
| 0xA8, |
| 0xF4, |
| 0x74, |
| 0xEE, |
| 0x03, |
| 0x19, |
| }, |
| }, |
| |
| { |
| // Test vector #8: |
| .key = |
| { |
| 0xC8, |
| 0xAD, |
| 0xC1, |
| 0x6A, |
| 0x8B, |
| 0x4D, |
| 0xDA, |
| 0x3B, |
| 0x4D, |
| 0xD5, |
| 0xB6, |
| 0x54, |
| 0x38, |
| 0x35, |
| 0x9B, |
| 0x05, |
| }, // [LSB on left, MSB on right] |
| .addr = |
| { |
| 0x94, |
| 0x5E, |
| 0x24, |
| 0x4E, |
| 0x4D, |
| 0x6E, |
| }, |
| .iv32 = 0x8B1573B7, |
| .iv16 = 0x30F9, |
| .p1k = |
| { |
| 0xEFF1, |
| 0x3F38, |
| 0xA364, |
| 0x60A9, |
| 0x76F3, |
| }, |
| .rc4key = |
| { |
| 0x30, |
| 0x30, |
| 0xF9, |
| 0x31, |
| 0x55, |
| 0xCE, |
| 0x29, |
| 0x34, |
| 0x37, |
| 0xCC, |
| 0x76, |
| 0x71, |
| 0x27, |
| 0x16, |
| 0xAB, |
| 0x8F, |
| }, |
| }, |
| }; |
| |
| for (size_t i = 0; i < ARRAY_SIZE(vector); i++) { |
| char msg[80]; |
| snprintf(msg, sizeof(msg), "P1K[%zu] is not equal: ", i); |
| |
| static constexpr size_t key_len = sizeof(vector[i].key); |
| auto key_conf = |
| reinterpret_cast<ieee80211_key_conf*>(malloc(sizeof(ieee80211_key_conf) + key_len)); |
| key_conf->rx_seq = ((uint64_t)vector[i].iv32) << 16; |
| memcpy(key_conf->key, vector[i].key, key_len); |
| |
| uint16_t p1k[TKIP_P1K_SIZE]; |
| ieee80211_get_tkip_rx_p1k(key_conf, vector[i].addr, p1k); |
| |
| EXPECT_TRUE(cmp_uint16s(msg, vector[i].p1k, p1k, TKIP_P1K_SIZE)); |
| |
| free(key_conf); |
| } |
| } |
| |
| } // namespace |