DPP: Update hostapd configurator parameters to match wpa_supplicant
This updates the previously copied implementation to be up-to-date with the more recent wpa_supplicant changes. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
2605405aa4
commit
6b140f0fa2
3 changed files with 136 additions and 56 deletions
|
@ -1325,6 +1325,11 @@ static int hostapd_ctrl_iface_set(struct hostapd_data *hapd, char *cmd)
|
||||||
* disallowing station logic.
|
* disallowing station logic.
|
||||||
*/
|
*/
|
||||||
#endif /* CONFIG_MBO */
|
#endif /* CONFIG_MBO */
|
||||||
|
#ifdef CONFIG_DPP
|
||||||
|
} else if (os_strcasecmp(cmd, "dpp_configurator_params") == 0) {
|
||||||
|
os_free(hapd->dpp_configurator_params);
|
||||||
|
hapd->dpp_configurator_params = os_strdup(value);
|
||||||
|
#endif /* CONFIG_DPP */
|
||||||
} else {
|
} else {
|
||||||
struct sta_info *sta;
|
struct sta_info *sta;
|
||||||
struct vlan_description vlan_id;
|
struct vlan_description vlan_id;
|
||||||
|
|
|
@ -25,6 +25,20 @@ static void hostapd_dpp_auth_success(struct hostapd_data *hapd, int initiator);
|
||||||
static const u8 broadcast[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
static const u8 broadcast[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||||
|
|
||||||
|
|
||||||
|
static struct dpp_configurator *
|
||||||
|
hostapd_dpp_configurator_get_id(struct hostapd_data *hapd, unsigned int id)
|
||||||
|
{
|
||||||
|
struct dpp_configurator *conf;
|
||||||
|
|
||||||
|
dl_list_for_each(conf, &hapd->dpp_configurator,
|
||||||
|
struct dpp_configurator, list) {
|
||||||
|
if (conf->id == id)
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static unsigned int hapd_dpp_next_id(struct hostapd_data *hapd)
|
static unsigned int hapd_dpp_next_id(struct hostapd_data *hapd)
|
||||||
{
|
{
|
||||||
struct dpp_bootstrap_info *bi;
|
struct dpp_bootstrap_info *bi;
|
||||||
|
@ -293,6 +307,117 @@ static void hostapd_dpp_set_testing_options(struct hostapd_data *hapd,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void hostapd_dpp_set_configurator(struct hostapd_data *hapd,
|
||||||
|
struct dpp_authentication *auth,
|
||||||
|
const char *cmd)
|
||||||
|
{
|
||||||
|
const char *pos, *end;
|
||||||
|
struct dpp_configuration *conf_sta = NULL, *conf_ap = NULL;
|
||||||
|
struct dpp_configurator *conf = NULL;
|
||||||
|
u8 ssid[32] = { "test" };
|
||||||
|
size_t ssid_len = 4;
|
||||||
|
char pass[64] = { };
|
||||||
|
size_t pass_len = 0;
|
||||||
|
|
||||||
|
if (!cmd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
wpa_printf(MSG_DEBUG, "DPP: Set configurator parameters: %s", cmd);
|
||||||
|
pos = os_strstr(cmd, " ssid=");
|
||||||
|
if (pos) {
|
||||||
|
pos += 6;
|
||||||
|
end = os_strchr(pos, ' ');
|
||||||
|
ssid_len = end ? (size_t) (end - pos) : os_strlen(pos);
|
||||||
|
ssid_len /= 2;
|
||||||
|
if (ssid_len > sizeof(ssid) ||
|
||||||
|
hexstr2bin(pos, ssid, ssid_len) < 0)
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos = os_strstr(cmd, " pass=");
|
||||||
|
if (pos) {
|
||||||
|
pos += 6;
|
||||||
|
end = os_strchr(pos, ' ');
|
||||||
|
pass_len = end ? (size_t) (end - pos) : os_strlen(pos);
|
||||||
|
pass_len /= 2;
|
||||||
|
if (pass_len > sizeof(pass) - 1 || pass_len < 8 ||
|
||||||
|
hexstr2bin(pos, (u8 *) pass, pass_len) < 0)
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (os_strstr(cmd, " conf=sta-")) {
|
||||||
|
conf_sta = os_zalloc(sizeof(struct dpp_configuration));
|
||||||
|
if (!conf_sta)
|
||||||
|
goto fail;
|
||||||
|
os_memcpy(conf_sta->ssid, ssid, ssid_len);
|
||||||
|
conf_sta->ssid_len = ssid_len;
|
||||||
|
if (os_strstr(cmd, " conf=sta-psk")) {
|
||||||
|
conf_sta->dpp = 0;
|
||||||
|
conf_sta->passphrase = os_strdup(pass);
|
||||||
|
if (!conf_sta->passphrase)
|
||||||
|
goto fail;
|
||||||
|
} else if (os_strstr(cmd, " conf=sta-dpp")) {
|
||||||
|
conf_sta->dpp = 1;
|
||||||
|
} else {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (os_strstr(cmd, " conf=ap-")) {
|
||||||
|
conf_ap = os_zalloc(sizeof(struct dpp_configuration));
|
||||||
|
if (!conf_ap)
|
||||||
|
goto fail;
|
||||||
|
os_memcpy(conf_ap->ssid, ssid, ssid_len);
|
||||||
|
conf_ap->ssid_len = ssid_len;
|
||||||
|
if (os_strstr(cmd, " conf=ap-psk")) {
|
||||||
|
conf_ap->dpp = 0;
|
||||||
|
conf_ap->passphrase = os_strdup(pass);
|
||||||
|
if (!conf_ap->passphrase)
|
||||||
|
goto fail;
|
||||||
|
} else if (os_strstr(cmd, " conf=ap-dpp")) {
|
||||||
|
conf_ap->dpp = 1;
|
||||||
|
} else {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pos = os_strstr(cmd, " expiry=");
|
||||||
|
if (pos) {
|
||||||
|
long int val;
|
||||||
|
|
||||||
|
pos += 8;
|
||||||
|
val = strtol(pos, NULL, 0);
|
||||||
|
if (val <= 0)
|
||||||
|
goto fail;
|
||||||
|
if (conf_sta)
|
||||||
|
conf_sta->netaccesskey_expiry = val;
|
||||||
|
if (conf_ap)
|
||||||
|
conf_ap->netaccesskey_expiry = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos = os_strstr(cmd, " configurator=");
|
||||||
|
if (pos) {
|
||||||
|
auth->configurator = 1;
|
||||||
|
pos += 14;
|
||||||
|
conf = hostapd_dpp_configurator_get_id(hapd, atoi(pos));
|
||||||
|
if (!conf) {
|
||||||
|
wpa_printf(MSG_INFO,
|
||||||
|
"DPP: Could not find the specified configurator");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
auth->conf_sta = conf_sta;
|
||||||
|
auth->conf_ap = conf_ap;
|
||||||
|
auth->conf = conf;
|
||||||
|
return;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
wpa_printf(MSG_DEBUG, "DPP: Failed to set configurator parameters");
|
||||||
|
dpp_configuration_free(conf_sta);
|
||||||
|
dpp_configuration_free(conf_ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int hostapd_dpp_auth_init(struct hostapd_data *hapd, const char *cmd)
|
int hostapd_dpp_auth_init(struct hostapd_data *hapd, const char *cmd)
|
||||||
{
|
{
|
||||||
const char *pos;
|
const char *pos;
|
||||||
|
@ -343,68 +468,13 @@ int hostapd_dpp_auth_init(struct hostapd_data *hapd, const char *cmd)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (os_strstr(cmd, " conf=sta-")) {
|
|
||||||
conf_sta = os_zalloc(sizeof(struct dpp_configuration));
|
|
||||||
if (!conf_sta)
|
|
||||||
goto fail;
|
|
||||||
/* TODO: Configuration of network parameters from upper layers
|
|
||||||
*/
|
|
||||||
os_memcpy(conf_sta->ssid, "test", 4);
|
|
||||||
conf_sta->ssid_len = 4;
|
|
||||||
if (os_strstr(cmd, " conf=sta-psk")) {
|
|
||||||
conf_sta->dpp = 0;
|
|
||||||
conf_sta->passphrase = os_strdup("secret passphrase");
|
|
||||||
if (!conf_sta->passphrase)
|
|
||||||
goto fail;
|
|
||||||
} else if (os_strstr(cmd, " conf=sta-dpp")) {
|
|
||||||
conf_sta->dpp = 1;
|
|
||||||
} else {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (os_strstr(cmd, " conf=ap-")) {
|
|
||||||
conf_ap = os_zalloc(sizeof(struct dpp_configuration));
|
|
||||||
if (!conf_ap)
|
|
||||||
goto fail;
|
|
||||||
/* TODO: Configuration of network parameters from upper layers
|
|
||||||
*/
|
|
||||||
os_memcpy(conf_ap->ssid, "test", 4);
|
|
||||||
conf_ap->ssid_len = 4;
|
|
||||||
if (os_strstr(cmd, " conf=ap-psk")) {
|
|
||||||
conf_ap->dpp = 0;
|
|
||||||
conf_ap->passphrase = os_strdup("secret passphrase");
|
|
||||||
if (!conf_ap->passphrase)
|
|
||||||
goto fail;
|
|
||||||
} else if (os_strstr(cmd, " conf=ap-dpp")) {
|
|
||||||
conf_ap->dpp = 1;
|
|
||||||
} else {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pos = os_strstr(cmd, " expiry=");
|
|
||||||
if (pos) {
|
|
||||||
long int val;
|
|
||||||
|
|
||||||
pos += 8;
|
|
||||||
val = strtol(pos, NULL, 0);
|
|
||||||
if (val <= 0)
|
|
||||||
goto fail;
|
|
||||||
if (conf_sta)
|
|
||||||
conf_sta->netaccesskey_expiry = val;
|
|
||||||
if (conf_ap)
|
|
||||||
conf_ap->netaccesskey_expiry = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hapd->dpp_auth)
|
if (hapd->dpp_auth)
|
||||||
dpp_auth_deinit(hapd->dpp_auth);
|
dpp_auth_deinit(hapd->dpp_auth);
|
||||||
hapd->dpp_auth = dpp_auth_init(hapd, peer_bi, own_bi, configurator);
|
hapd->dpp_auth = dpp_auth_init(hapd, peer_bi, own_bi, configurator);
|
||||||
if (!hapd->dpp_auth)
|
if (!hapd->dpp_auth)
|
||||||
goto fail;
|
goto fail;
|
||||||
hostapd_dpp_set_testing_options(hapd, hapd->dpp_auth);
|
hostapd_dpp_set_testing_options(hapd, hapd->dpp_auth);
|
||||||
hapd->dpp_auth->conf_sta = conf_sta;
|
hostapd_dpp_set_configurator(hapd, hapd->dpp_auth, cmd);
|
||||||
hapd->dpp_auth->conf_ap = conf_ap;
|
|
||||||
|
|
||||||
/* TODO: Support iteration over all frequencies and filtering of
|
/* TODO: Support iteration over all frequencies and filtering of
|
||||||
* frequencies based on locally enabled channels that allow initiation
|
* frequencies based on locally enabled channels that allow initiation
|
||||||
|
@ -530,6 +600,8 @@ static void hostapd_dpp_rx_auth_req(struct hostapd_data *hapd, const u8 *src,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
hostapd_dpp_set_testing_options(hapd, hapd->dpp_auth);
|
hostapd_dpp_set_testing_options(hapd, hapd->dpp_auth);
|
||||||
|
hostapd_dpp_set_configurator(hapd, hapd->dpp_auth,
|
||||||
|
hapd->dpp_configurator_params);
|
||||||
os_memcpy(hapd->dpp_auth->peer_mac_addr, src, ETH_ALEN);
|
os_memcpy(hapd->dpp_auth->peer_mac_addr, src, ETH_ALEN);
|
||||||
|
|
||||||
msg = dpp_alloc_msg(DPP_PA_AUTHENTICATION_RESP,
|
msg = dpp_alloc_msg(DPP_PA_AUTHENTICATION_RESP,
|
||||||
|
@ -1395,4 +1467,6 @@ void hostapd_dpp_deinit(struct hostapd_data *hapd)
|
||||||
hapd->dpp_auth = NULL;
|
hapd->dpp_auth = NULL;
|
||||||
hostapd_dpp_pkex_remove(hapd, "*");
|
hostapd_dpp_pkex_remove(hapd, "*");
|
||||||
hapd->dpp_pkex = NULL;
|
hapd->dpp_pkex = NULL;
|
||||||
|
os_free(hapd->dpp_configurator_params);
|
||||||
|
hapd->dpp_configurator_params = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -334,6 +334,7 @@ struct hostapd_data {
|
||||||
char *dpp_pkex_code;
|
char *dpp_pkex_code;
|
||||||
char *dpp_pkex_identifier;
|
char *dpp_pkex_identifier;
|
||||||
char *dpp_pkex_auth_cmd;
|
char *dpp_pkex_auth_cmd;
|
||||||
|
char *dpp_configurator_params;
|
||||||
#ifdef CONFIG_TESTING_OPTIONS
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
char *dpp_config_obj_override;
|
char *dpp_config_obj_override;
|
||||||
char *dpp_discovery_override;
|
char *dpp_discovery_override;
|
||||||
|
|
Loading…
Reference in a new issue