WPS: Use pre-configured NFC password token instead of overriding it
"WPS_NFC_TOKEN <WPS/NDEF>" used to generate a new NFC password token regardless of whether there was a pre-configured token in the configuration. Change this to use the pre-configured value, if available, instead. This allows the same command to be used to write the password token to an NFC tag more conveniently. Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
d16531c40c
commit
042ec551d4
9 changed files with 74 additions and 22 deletions
|
@ -2627,15 +2627,19 @@ static int hostapd_config_fill(struct hostapd_config *conf,
|
||||||
"wps_nfc_dev_pw_id value", line);
|
"wps_nfc_dev_pw_id value", line);
|
||||||
errors++;
|
errors++;
|
||||||
}
|
}
|
||||||
|
bss->wps_nfc_pw_from_config = 1;
|
||||||
} else if (os_strcmp(buf, "wps_nfc_dh_pubkey") == 0) {
|
} else if (os_strcmp(buf, "wps_nfc_dh_pubkey") == 0) {
|
||||||
wpabuf_free(bss->wps_nfc_dh_pubkey);
|
wpabuf_free(bss->wps_nfc_dh_pubkey);
|
||||||
bss->wps_nfc_dh_pubkey = hostapd_parse_bin(pos);
|
bss->wps_nfc_dh_pubkey = hostapd_parse_bin(pos);
|
||||||
|
bss->wps_nfc_pw_from_config = 1;
|
||||||
} else if (os_strcmp(buf, "wps_nfc_dh_privkey") == 0) {
|
} else if (os_strcmp(buf, "wps_nfc_dh_privkey") == 0) {
|
||||||
wpabuf_free(bss->wps_nfc_dh_privkey);
|
wpabuf_free(bss->wps_nfc_dh_privkey);
|
||||||
bss->wps_nfc_dh_privkey = hostapd_parse_bin(pos);
|
bss->wps_nfc_dh_privkey = hostapd_parse_bin(pos);
|
||||||
|
bss->wps_nfc_pw_from_config = 1;
|
||||||
} else if (os_strcmp(buf, "wps_nfc_dev_pw") == 0) {
|
} else if (os_strcmp(buf, "wps_nfc_dev_pw") == 0) {
|
||||||
wpabuf_free(bss->wps_nfc_dev_pw);
|
wpabuf_free(bss->wps_nfc_dev_pw);
|
||||||
bss->wps_nfc_dev_pw = hostapd_parse_bin(pos);
|
bss->wps_nfc_dev_pw = hostapd_parse_bin(pos);
|
||||||
|
bss->wps_nfc_pw_from_config = 1;
|
||||||
#endif /* CONFIG_WPS_NFC */
|
#endif /* CONFIG_WPS_NFC */
|
||||||
#endif /* CONFIG_WPS */
|
#endif /* CONFIG_WPS */
|
||||||
#ifdef CONFIG_P2P_MANAGER
|
#ifdef CONFIG_P2P_MANAGER
|
||||||
|
|
|
@ -365,6 +365,7 @@ struct hostapd_bss_config {
|
||||||
char *model_url;
|
char *model_url;
|
||||||
char *upc;
|
char *upc;
|
||||||
struct wpabuf *wps_vendor_ext[MAX_WPS_VENDOR_EXTENSIONS];
|
struct wpabuf *wps_vendor_ext[MAX_WPS_VENDOR_EXTENSIONS];
|
||||||
|
int wps_nfc_pw_from_config;
|
||||||
int wps_nfc_dev_pw_id;
|
int wps_nfc_dev_pw_id;
|
||||||
struct wpabuf *wps_nfc_dh_pubkey;
|
struct wpabuf *wps_nfc_dh_pubkey;
|
||||||
struct wpabuf *wps_nfc_dh_privkey;
|
struct wpabuf *wps_nfc_dh_privkey;
|
||||||
|
|
|
@ -1595,6 +1595,13 @@ struct wpabuf * hostapd_wps_nfc_hs_cr(struct hostapd_data *hapd, int ndef)
|
||||||
|
|
||||||
struct wpabuf * hostapd_wps_nfc_token_gen(struct hostapd_data *hapd, int ndef)
|
struct wpabuf * hostapd_wps_nfc_token_gen(struct hostapd_data *hapd, int ndef)
|
||||||
{
|
{
|
||||||
|
if (hapd->conf->wps_nfc_pw_from_config) {
|
||||||
|
return wps_nfc_token_build(ndef,
|
||||||
|
hapd->conf->wps_nfc_dev_pw_id,
|
||||||
|
hapd->conf->wps_nfc_dh_pubkey,
|
||||||
|
hapd->conf->wps_nfc_dev_pw);
|
||||||
|
}
|
||||||
|
|
||||||
return wps_nfc_token_gen(ndef, &hapd->conf->wps_nfc_dev_pw_id,
|
return wps_nfc_token_gen(ndef, &hapd->conf->wps_nfc_dev_pw_id,
|
||||||
&hapd->conf->wps_nfc_dh_pubkey,
|
&hapd->conf->wps_nfc_dh_pubkey,
|
||||||
&hapd->conf->wps_nfc_dh_privkey,
|
&hapd->conf->wps_nfc_dh_privkey,
|
||||||
|
|
|
@ -810,6 +810,8 @@ u16 wps_config_methods_str2bin(const char *str);
|
||||||
struct wpabuf * wps_build_nfc_pw_token(u16 dev_pw_id,
|
struct wpabuf * wps_build_nfc_pw_token(u16 dev_pw_id,
|
||||||
const struct wpabuf *pubkey,
|
const struct wpabuf *pubkey,
|
||||||
const struct wpabuf *dev_pw);
|
const struct wpabuf *dev_pw);
|
||||||
|
struct wpabuf * wps_nfc_token_build(int ndef, int id, struct wpabuf *pubkey,
|
||||||
|
struct wpabuf *dev_pw);
|
||||||
struct wpabuf * wps_nfc_token_gen(int ndef, int *id, struct wpabuf **pubkey,
|
struct wpabuf * wps_nfc_token_gen(int ndef, int *id, struct wpabuf **pubkey,
|
||||||
struct wpabuf **privkey,
|
struct wpabuf **privkey,
|
||||||
struct wpabuf **dev_pw);
|
struct wpabuf **dev_pw);
|
||||||
|
|
|
@ -562,11 +562,34 @@ struct wpabuf * wps_build_wsc_nack(struct wps_data *wps)
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_WPS_NFC
|
#ifdef CONFIG_WPS_NFC
|
||||||
|
|
||||||
|
struct wpabuf * wps_nfc_token_build(int ndef, int id, struct wpabuf *pubkey,
|
||||||
|
struct wpabuf *dev_pw)
|
||||||
|
{
|
||||||
|
struct wpabuf *ret;
|
||||||
|
|
||||||
|
if (pubkey == NULL || dev_pw == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ret = wps_build_nfc_pw_token(id, pubkey, dev_pw);
|
||||||
|
if (ndef && ret) {
|
||||||
|
struct wpabuf *tmp;
|
||||||
|
tmp = ndef_build_wifi(ret);
|
||||||
|
wpabuf_free(ret);
|
||||||
|
if (tmp == NULL)
|
||||||
|
return NULL;
|
||||||
|
ret = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct wpabuf * wps_nfc_token_gen(int ndef, int *id, struct wpabuf **pubkey,
|
struct wpabuf * wps_nfc_token_gen(int ndef, int *id, struct wpabuf **pubkey,
|
||||||
struct wpabuf **privkey,
|
struct wpabuf **privkey,
|
||||||
struct wpabuf **dev_pw)
|
struct wpabuf **dev_pw)
|
||||||
{
|
{
|
||||||
struct wpabuf *priv = NULL, *pub = NULL, *pw, *ret;
|
struct wpabuf *priv = NULL, *pub = NULL, *pw;
|
||||||
void *dh_ctx;
|
void *dh_ctx;
|
||||||
u16 val;
|
u16 val;
|
||||||
|
|
||||||
|
@ -596,16 +619,7 @@ struct wpabuf * wps_nfc_token_gen(int ndef, int *id, struct wpabuf **pubkey,
|
||||||
wpabuf_free(*dev_pw);
|
wpabuf_free(*dev_pw);
|
||||||
*dev_pw = pw;
|
*dev_pw = pw;
|
||||||
|
|
||||||
ret = wps_build_nfc_pw_token(*id, *pubkey, *dev_pw);
|
return wps_nfc_token_build(ndef, *id, *pubkey, *dev_pw);
|
||||||
if (ndef && ret) {
|
|
||||||
struct wpabuf *tmp;
|
|
||||||
tmp = ndef_build_wifi(ret);
|
|
||||||
wpabuf_free(ret);
|
|
||||||
if (tmp == NULL)
|
|
||||||
return NULL;
|
|
||||||
ret = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_WPS_NFC */
|
#endif /* CONFIG_WPS_NFC */
|
||||||
|
|
|
@ -2980,10 +2980,11 @@ static const struct global_parse_data global_fields[] = {
|
||||||
{ INT_RANGE(access_network_type, 0, 15), 0 },
|
{ INT_RANGE(access_network_type, 0, 15), 0 },
|
||||||
{ INT_RANGE(pbc_in_m1, 0, 1), 0 },
|
{ INT_RANGE(pbc_in_m1, 0, 1), 0 },
|
||||||
{ STR(autoscan), 0 },
|
{ STR(autoscan), 0 },
|
||||||
{ INT_RANGE(wps_nfc_dev_pw_id, 0x10, 0xffff), 0 },
|
{ INT_RANGE(wps_nfc_dev_pw_id, 0x10, 0xffff),
|
||||||
{ BIN(wps_nfc_dh_pubkey), 0 },
|
CFG_CHANGED_NFC_PASSWORD_TOKEN },
|
||||||
{ BIN(wps_nfc_dh_privkey), 0 },
|
{ BIN(wps_nfc_dh_pubkey), CFG_CHANGED_NFC_PASSWORD_TOKEN },
|
||||||
{ BIN(wps_nfc_dev_pw), 0 },
|
{ BIN(wps_nfc_dh_privkey), CFG_CHANGED_NFC_PASSWORD_TOKEN },
|
||||||
|
{ BIN(wps_nfc_dev_pw), CFG_CHANGED_NFC_PASSWORD_TOKEN },
|
||||||
{ STR(ext_password_backend), CFG_CHANGED_EXT_PW_BACKEND },
|
{ STR(ext_password_backend), CFG_CHANGED_EXT_PW_BACKEND },
|
||||||
{ INT(p2p_go_max_inactivity), 0 },
|
{ INT(p2p_go_max_inactivity), 0 },
|
||||||
{ INT_RANGE(auto_interworking, 0, 1), 0 },
|
{ INT_RANGE(auto_interworking, 0, 1), 0 },
|
||||||
|
@ -3020,6 +3021,8 @@ int wpa_config_process_global(struct wpa_config *config, char *pos, int line)
|
||||||
"parse '%s'.", line, pos);
|
"parse '%s'.", line, pos);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
|
if (field->changed_flag == CFG_CHANGED_NFC_PASSWORD_TOKEN)
|
||||||
|
config->wps_nfc_pw_from_config = 1;
|
||||||
config->changed_parameters |= field->changed_flag;
|
config->changed_parameters |= field->changed_flag;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,6 +220,7 @@ struct wpa_cred {
|
||||||
#define CFG_CHANGED_P2P_OPER_CHANNEL BIT(12)
|
#define CFG_CHANGED_P2P_OPER_CHANNEL BIT(12)
|
||||||
#define CFG_CHANGED_P2P_PREF_CHAN BIT(13)
|
#define CFG_CHANGED_P2P_PREF_CHAN BIT(13)
|
||||||
#define CFG_CHANGED_EXT_PW_BACKEND BIT(14)
|
#define CFG_CHANGED_EXT_PW_BACKEND BIT(14)
|
||||||
|
#define CFG_CHANGED_NFC_PASSWORD_TOKEN BIT(15)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct wpa_config - wpa_supplicant configuration data
|
* struct wpa_config - wpa_supplicant configuration data
|
||||||
|
@ -705,6 +706,15 @@ struct wpa_config {
|
||||||
*/
|
*/
|
||||||
char *autoscan;
|
char *autoscan;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wps_nfc_pw_from_config - NFC Device Password was read from config
|
||||||
|
*
|
||||||
|
* This parameter can be determined whether the NFC Device Password was
|
||||||
|
* included in the configuration (1) or generated dynamically (0). Only
|
||||||
|
* the former case is re-written back to the configuration file.
|
||||||
|
*/
|
||||||
|
int wps_nfc_pw_from_config;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wps_nfc_dev_pw_id - NFC Device Password ID for password token
|
* wps_nfc_dev_pw_id - NFC Device Password ID for password token
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -950,12 +950,16 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
|
||||||
#endif /* CONFIG_INTERWORKING */
|
#endif /* CONFIG_INTERWORKING */
|
||||||
if (config->pbc_in_m1)
|
if (config->pbc_in_m1)
|
||||||
fprintf(f, "pbc_in_m1=%u\n", config->pbc_in_m1);
|
fprintf(f, "pbc_in_m1=%u\n", config->pbc_in_m1);
|
||||||
if (config->wps_nfc_dev_pw_id)
|
if (config->wps_nfc_pw_from_config) {
|
||||||
fprintf(f, "wps_nfc_dev_pw_id=%d\n",
|
if (config->wps_nfc_dev_pw_id)
|
||||||
config->wps_nfc_dev_pw_id);
|
fprintf(f, "wps_nfc_dev_pw_id=%d\n",
|
||||||
write_global_bin(f, "wps_nfc_dh_pubkey", config->wps_nfc_dh_pubkey);
|
config->wps_nfc_dev_pw_id);
|
||||||
write_global_bin(f, "wps_nfc_dh_privkey", config->wps_nfc_dh_privkey);
|
write_global_bin(f, "wps_nfc_dh_pubkey",
|
||||||
write_global_bin(f, "wps_nfc_dev_pw", config->wps_nfc_dev_pw);
|
config->wps_nfc_dh_pubkey);
|
||||||
|
write_global_bin(f, "wps_nfc_dh_privkey",
|
||||||
|
config->wps_nfc_dh_privkey);
|
||||||
|
write_global_bin(f, "wps_nfc_dev_pw", config->wps_nfc_dev_pw);
|
||||||
|
}
|
||||||
|
|
||||||
if (config->ext_password_backend)
|
if (config->ext_password_backend)
|
||||||
fprintf(f, "ext_password_backend=%s\n",
|
fprintf(f, "ext_password_backend=%s\n",
|
||||||
|
|
|
@ -1832,6 +1832,13 @@ void wpas_wps_update_config(struct wpa_supplicant *wpa_s)
|
||||||
|
|
||||||
struct wpabuf * wpas_wps_nfc_token(struct wpa_supplicant *wpa_s, int ndef)
|
struct wpabuf * wpas_wps_nfc_token(struct wpa_supplicant *wpa_s, int ndef)
|
||||||
{
|
{
|
||||||
|
if (wpa_s->conf->wps_nfc_pw_from_config) {
|
||||||
|
return wps_nfc_token_build(ndef,
|
||||||
|
wpa_s->conf->wps_nfc_dev_pw_id,
|
||||||
|
wpa_s->conf->wps_nfc_dh_pubkey,
|
||||||
|
wpa_s->conf->wps_nfc_dev_pw);
|
||||||
|
}
|
||||||
|
|
||||||
return wps_nfc_token_gen(ndef, &wpa_s->conf->wps_nfc_dev_pw_id,
|
return wps_nfc_token_gen(ndef, &wpa_s->conf->wps_nfc_dev_pw_id,
|
||||||
&wpa_s->conf->wps_nfc_dh_pubkey,
|
&wpa_s->conf->wps_nfc_dh_pubkey,
|
||||||
&wpa_s->conf->wps_nfc_dh_privkey,
|
&wpa_s->conf->wps_nfc_dh_privkey,
|
||||||
|
|
Loading…
Reference in a new issue