From 1f1478285725b2e6abaae739fb6657ded7d5758b Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Wed, 18 Mar 2020 11:54:17 -0700 Subject: [PATCH] wiphy: add _generate_address_from_ssid This API is being added to support per-network MAC address generation. The MAC is generated based on the network SSID and the adapters permanent address using HMAC-SHA256. The SHA digest is then constrained to make it MAC address compliant. Generating the MAC address like this will ensure that the MAC remains the same each time a given SSID is connected to. --- src/wiphy.c | 34 ++++++++++++++++++++++++++++++---- src/wiphy.h | 2 ++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/wiphy.c b/src/wiphy.c index e0929c09..b8e80b00 100644 --- a/src/wiphy.c +++ b/src/wiphy.c @@ -435,12 +435,10 @@ const uint8_t *wiphy_get_rm_enabled_capabilities(struct wiphy *wiphy) return wiphy->rm_enabled_capabilities; } -void wiphy_generate_random_address(struct wiphy *wiphy, uint8_t addr[static 6]) +static void wiphy_address_constrain(struct wiphy *wiphy, uint8_t addr[static 6]) { switch (mac_randomize_bytes) { case 6: - l_getrandom(addr, 6); - /* Set the locally administered bit */ addr[0] |= 0x2; @@ -448,7 +446,6 @@ void wiphy_generate_random_address(struct wiphy *wiphy, uint8_t addr[static 6]) addr[0] &= 0xfe; break; case 3: - l_getrandom(addr + 3, 3); memcpy(addr, wiphy->permanent_addr, 3); break; } @@ -464,6 +461,35 @@ void wiphy_generate_random_address(struct wiphy *wiphy, uint8_t addr[static 6]) addr[5] = 0x01; } +void wiphy_generate_random_address(struct wiphy *wiphy, uint8_t addr[static 6]) +{ + switch (mac_randomize_bytes) { + case 6: + l_getrandom(addr, 6); + break; + case 3: + l_getrandom(addr + 3, 3); + break; + } + + wiphy_address_constrain(wiphy, addr); +} + +void wiphy_generate_address_from_ssid(struct wiphy *wiphy, const char *ssid, + uint8_t addr[static 6]) +{ + struct l_checksum *sha = l_checksum_new(L_CHECKSUM_SHA256); + + l_checksum_update(sha, ssid, strlen(ssid)); + l_checksum_update(sha, wiphy->permanent_addr, + sizeof(wiphy->permanent_addr)); + l_checksum_get_digest(sha, addr, mac_randomize_bytes); + + l_checksum_free(sha); + + wiphy_address_constrain(wiphy, addr); +} + bool wiphy_constrain_freq_set(const struct wiphy *wiphy, struct scan_freq_set *set) { diff --git a/src/wiphy.h b/src/wiphy.h index dff0e1bd..4d2a4e8f 100644 --- a/src/wiphy.h +++ b/src/wiphy.h @@ -82,6 +82,8 @@ const uint8_t *wiphy_get_extended_capabilities(struct wiphy *wiphy, const uint8_t *wiphy_get_rm_enabled_capabilities(struct wiphy *wiphy); void wiphy_generate_random_address(struct wiphy *wiphy, uint8_t addr[static 6]); +void wiphy_generate_address_from_ssid(struct wiphy *wiphy, const char *ssid, + uint8_t addr[static 6]); uint32_t wiphy_state_watch_add(struct wiphy *wiphy, wiphy_state_watch_func_t func, void *user_data,