P2P2: Device Identity Key generation and storage in configuration
Generate a random device identity key and save it to the config file. Use the same identity key from config to derive DIRA for NAN SDF frames. Signed-off-by: Shivani Baranwal <quic_shivbara@quicinc.com>
This commit is contained in:
parent
58ba550c53
commit
bcab29a78c
4 changed files with 41 additions and 0 deletions
|
@ -3095,6 +3095,7 @@ void wpa_config_free(struct wpa_config *config)
|
||||||
os_free(config->dpp_mud_url);
|
os_free(config->dpp_mud_url);
|
||||||
os_free(config->dpp_extra_conf_req_name);
|
os_free(config->dpp_extra_conf_req_name);
|
||||||
os_free(config->dpp_extra_conf_req_value);
|
os_free(config->dpp_extra_conf_req_value);
|
||||||
|
wpabuf_free(config->dik);
|
||||||
|
|
||||||
os_free(config);
|
os_free(config);
|
||||||
}
|
}
|
||||||
|
@ -5486,6 +5487,8 @@ static const struct global_parse_data global_fields[] = {
|
||||||
{ FUNC(p2p_device_persistent_mac_addr), 0 },
|
{ FUNC(p2p_device_persistent_mac_addr), 0 },
|
||||||
{ INT(p2p_interface_random_mac_addr), 0 },
|
{ INT(p2p_interface_random_mac_addr), 0 },
|
||||||
{ INT(p2p_6ghz_disable), 0 },
|
{ INT(p2p_6ghz_disable), 0 },
|
||||||
|
{ INT(dik_cipher), 0},
|
||||||
|
{ BIN(dik), 0 },
|
||||||
#endif /* CONFIG_P2P */
|
#endif /* CONFIG_P2P */
|
||||||
{ FUNC(country), CFG_CHANGED_COUNTRY },
|
{ FUNC(country), CFG_CHANGED_COUNTRY },
|
||||||
{ INT(bss_max_count), 0 },
|
{ INT(bss_max_count), 0 },
|
||||||
|
|
|
@ -1814,6 +1814,12 @@ struct wpa_config {
|
||||||
|
|
||||||
int mld_force_single_link;
|
int mld_force_single_link;
|
||||||
#endif /* CONFIG_TESTING_OPTIONS */
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
|
/* Cipher version type */
|
||||||
|
int dik_cipher;
|
||||||
|
|
||||||
|
/* DevIK */
|
||||||
|
struct wpabuf *dik;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1629,6 +1629,10 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
|
||||||
#endif /* CONFIG_TESTING_OPTIONS */
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
if (config->ft_prepend_pmkid)
|
if (config->ft_prepend_pmkid)
|
||||||
fprintf(f, "ft_prepend_pmkid=%d\n", config->ft_prepend_pmkid);
|
fprintf(f, "ft_prepend_pmkid=%d\n", config->ft_prepend_pmkid);
|
||||||
|
if (config->dik) {
|
||||||
|
fprintf(f, "dik_cipher=%d\n", config->dik_cipher);
|
||||||
|
write_global_bin(f, "dik", config->dik);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_NO_CONFIG_WRITE */
|
#endif /* CONFIG_NO_CONFIG_WRITE */
|
||||||
|
|
|
@ -5057,6 +5057,34 @@ int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
|
||||||
else
|
else
|
||||||
p2p.passphrase_len = 8;
|
p2p.passphrase_len = 8;
|
||||||
|
|
||||||
|
if (wpa_s->conf->dik &&
|
||||||
|
wpabuf_len(wpa_s->conf->dik) <= DEVICE_IDENTITY_KEY_MAX_LEN) {
|
||||||
|
p2p.pairing_config.dik_cipher = wpa_s->conf->dik_cipher;
|
||||||
|
p2p.pairing_config.dik_len = wpabuf_len(wpa_s->conf->dik);
|
||||||
|
os_memcpy(p2p.pairing_config.dik_data,
|
||||||
|
wpabuf_head(wpa_s->conf->dik),
|
||||||
|
p2p.pairing_config.dik_len);
|
||||||
|
} else {
|
||||||
|
p2p.pairing_config.dik_cipher = DIRA_CIPHER_VERSION_128;
|
||||||
|
p2p.pairing_config.dik_len = DEVICE_IDENTITY_KEY_LEN;
|
||||||
|
if (os_get_random(p2p.pairing_config.dik_data,
|
||||||
|
p2p.pairing_config.dik_len) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
wpa_s->conf->dik =
|
||||||
|
wpabuf_alloc_copy(p2p.pairing_config.dik_data,
|
||||||
|
p2p.pairing_config.dik_len);
|
||||||
|
if (!wpa_s->conf->dik)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
wpa_s->conf->dik_cipher = p2p.pairing_config.dik_cipher;
|
||||||
|
|
||||||
|
if (wpa_s->conf->update_config &&
|
||||||
|
wpa_config_write(wpa_s->confname, wpa_s->conf))
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"P2P: Failed to update configuration");
|
||||||
|
}
|
||||||
|
|
||||||
global->p2p = p2p_init(&p2p);
|
global->p2p = p2p_init(&p2p);
|
||||||
if (global->p2p == NULL)
|
if (global->p2p == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Loading…
Reference in a new issue