@ -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 ) {