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,