WPS NFC: Add AP mode connection handover report
The new NFC connection handover design requires the AP/Registrar to process the connection handover request message received from the Enrollee. Add control interface commands for handling this. Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
41f9ffb635
commit
3189ca055d
3 changed files with 162 additions and 8 deletions
|
@ -1808,6 +1808,100 @@ struct wpabuf * hostapd_wps_nfc_hs_cr(struct hostapd_data *hapd, int ndef)
|
|||
}
|
||||
|
||||
|
||||
int hostapd_wps_nfc_report_handover(struct hostapd_data *hapd,
|
||||
const struct wpabuf *req,
|
||||
const struct wpabuf *sel)
|
||||
{
|
||||
struct wpabuf *wps;
|
||||
int ret = -1;
|
||||
u16 wsc_len;
|
||||
const u8 *pos;
|
||||
struct wpabuf msg;
|
||||
struct wps_parse_attr attr;
|
||||
u16 dev_pw_id;
|
||||
|
||||
/*
|
||||
* Enrollee/station is always initiator of the NFC connection handover,
|
||||
* so use the request message here to find Enrollee public key hash.
|
||||
*/
|
||||
wps = ndef_parse_wifi(req);
|
||||
if (wps == NULL)
|
||||
return -1;
|
||||
wpa_printf(MSG_DEBUG, "WPS: Received application/vnd.wfa.wsc "
|
||||
"payload from NFC connection handover");
|
||||
wpa_hexdump_buf(MSG_DEBUG, "WPS: NFC payload", wps);
|
||||
if (wpabuf_len(wps) < 2) {
|
||||
wpa_printf(MSG_DEBUG, "WPS: Too short Wi-Fi Handover Request "
|
||||
"Message");
|
||||
goto out;
|
||||
}
|
||||
pos = wpabuf_head(wps);
|
||||
wsc_len = WPA_GET_BE16(pos);
|
||||
if (wsc_len > wpabuf_len(wps) - 2) {
|
||||
wpa_printf(MSG_DEBUG, "WPS: Invalid WSC attribute length (%u) "
|
||||
"in rt Wi-Fi Handover Request Message", wsc_len);
|
||||
goto out;
|
||||
}
|
||||
pos += 2;
|
||||
|
||||
wpa_hexdump(MSG_DEBUG,
|
||||
"WPS: WSC attributes in Wi-Fi Handover Request Message",
|
||||
pos, wsc_len);
|
||||
if (wsc_len < wpabuf_len(wps) - 2) {
|
||||
wpa_hexdump(MSG_DEBUG,
|
||||
"WPS: Ignore extra data after WSC attributes",
|
||||
pos + wsc_len, wpabuf_len(wps) - 2 - wsc_len);
|
||||
}
|
||||
|
||||
wpabuf_set(&msg, pos, wsc_len);
|
||||
ret = wps_parse_msg(&msg, &attr);
|
||||
if (ret < 0) {
|
||||
wpa_printf(MSG_DEBUG, "WPS: Could not parse WSC attributes in "
|
||||
"Wi-Fi Handover Request Message");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (attr.oob_dev_password == NULL ||
|
||||
attr.oob_dev_password_len < WPS_OOB_PUBKEY_HASH_LEN + 2) {
|
||||
wpa_printf(MSG_DEBUG, "WPS: No Out-of-Band Device Password "
|
||||
"included in Wi-Fi Handover Request Message");
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (attr.uuid_e == NULL) {
|
||||
wpa_printf(MSG_DEBUG, "WPS: No UUID-E included in Wi-Fi "
|
||||
"Handover Request Message");
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
wpa_hexdump(MSG_DEBUG, "WPS: UUID-E", attr.uuid_e, WPS_UUID_LEN);
|
||||
|
||||
wpa_hexdump(MSG_DEBUG, "WPS: Out-of-Band Device Password",
|
||||
attr.oob_dev_password, attr.oob_dev_password_len);
|
||||
dev_pw_id = WPA_GET_BE16(attr.oob_dev_password +
|
||||
WPS_OOB_PUBKEY_HASH_LEN);
|
||||
if (dev_pw_id != DEV_PW_NFC_CONNECTION_HANDOVER) {
|
||||
wpa_printf(MSG_DEBUG, "WPS: Unexpected OOB Device Password ID "
|
||||
"%u in Wi-Fi Handover Request Message", dev_pw_id);
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
wpa_hexdump(MSG_DEBUG, "WPS: Enrollee Public Key hash",
|
||||
attr.oob_dev_password, WPS_OOB_PUBKEY_HASH_LEN);
|
||||
|
||||
ret = wps_registrar_add_nfc_pw_token(hapd->wps->registrar,
|
||||
attr.oob_dev_password,
|
||||
DEV_PW_NFC_CONNECTION_HANDOVER,
|
||||
NULL, 0, 1);
|
||||
|
||||
out:
|
||||
wpabuf_free(wps);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
struct wpabuf * hostapd_wps_nfc_token_gen(struct hostapd_data *hapd, int ndef)
|
||||
{
|
||||
if (hapd->conf->wps_nfc_pw_from_config) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue