P2P: Store P2P Device Address in per-device PSK records

This makes the P2P Device Address of the Enrollee available with the PSK
records to allow P2P Device Address instead of P2P Interface Address to
be used for finding the correct PSK.

Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2013-09-01 10:47:34 +03:00
parent 05766ed8de
commit 52177fbb70
5 changed files with 36 additions and 13 deletions

View file

@ -105,6 +105,7 @@ struct hostapd_wpa_psk {
int group; int group;
u8 psk[PMK_LEN]; u8 psk[PMK_LEN];
u8 addr[ETH_ALEN]; u8 addr[ETH_ALEN];
u8 p2p_dev_addr[ETH_ALEN];
}; };
struct hostapd_eap_user { struct hostapd_eap_user {

View file

@ -91,15 +91,24 @@ static int hostapd_wps_for_each(struct hostapd_data *hapd,
} }
static int hostapd_wps_new_psk_cb(void *ctx, const u8 *mac_addr, const u8 *psk, static int hostapd_wps_new_psk_cb(void *ctx, const u8 *mac_addr,
const u8 *p2p_dev_addr, const u8 *psk,
size_t psk_len) size_t psk_len)
{ {
struct hostapd_data *hapd = ctx; struct hostapd_data *hapd = ctx;
struct hostapd_wpa_psk *p; struct hostapd_wpa_psk *p;
struct hostapd_ssid *ssid = &hapd->conf->ssid; struct hostapd_ssid *ssid = &hapd->conf->ssid;
wpa_printf(MSG_DEBUG, "Received new WPA/WPA2-PSK from WPS for STA " if (is_zero_ether_addr(p2p_dev_addr)) {
MACSTR, MAC2STR(mac_addr)); wpa_printf(MSG_DEBUG,
"Received new WPA/WPA2-PSK from WPS for STA " MACSTR,
MAC2STR(mac_addr));
} else {
wpa_printf(MSG_DEBUG,
"Received new WPA/WPA2-PSK from WPS for STA " MACSTR
" P2P Device Addr " MACSTR,
MAC2STR(mac_addr), MAC2STR(p2p_dev_addr));
}
wpa_hexdump_key(MSG_DEBUG, "Per-device PSK", psk, psk_len); wpa_hexdump_key(MSG_DEBUG, "Per-device PSK", psk, psk_len);
if (psk_len != PMK_LEN) { if (psk_len != PMK_LEN) {
@ -113,6 +122,7 @@ static int hostapd_wps_new_psk_cb(void *ctx, const u8 *mac_addr, const u8 *psk,
if (p == NULL) if (p == NULL)
return -1; return -1;
os_memcpy(p->addr, mac_addr, ETH_ALEN); os_memcpy(p->addr, mac_addr, ETH_ALEN);
os_memcpy(p->p2p_dev_addr, p2p_dev_addr, ETH_ALEN);
os_memcpy(p->psk, psk, PMK_LEN); os_memcpy(p->psk, psk, PMK_LEN);
p->next = ssid->wpa_psk; p->next = ssid->wpa_psk;

View file

@ -246,14 +246,15 @@ struct wps_registrar_config {
* new_psk_cb - Callback for new PSK * new_psk_cb - Callback for new PSK
* @ctx: Higher layer context data (cb_ctx) * @ctx: Higher layer context data (cb_ctx)
* @mac_addr: MAC address of the Enrollee * @mac_addr: MAC address of the Enrollee
* @p2p_dev_addr: P2P Device Address of the Enrollee or all zeros if not
* @psk: The new PSK * @psk: The new PSK
* @psk_len: The length of psk in octets * @psk_len: The length of psk in octets
* Returns: 0 on success, -1 on failure * Returns: 0 on success, -1 on failure
* *
* This callback is called when a new per-device PSK is provisioned. * This callback is called when a new per-device PSK is provisioned.
*/ */
int (*new_psk_cb)(void *ctx, const u8 *mac_addr, const u8 *psk, int (*new_psk_cb)(void *ctx, const u8 *mac_addr, const u8 *p2p_dev_addr,
size_t psk_len); const u8 *psk, size_t psk_len);
/** /**
* set_ie_cb - Callback for WPS IE changes * set_ie_cb - Callback for WPS IE changes

View file

@ -142,8 +142,8 @@ struct wps_registrar {
int pbc; int pbc;
int selected_registrar; int selected_registrar;
int (*new_psk_cb)(void *ctx, const u8 *mac_addr, const u8 *psk, int (*new_psk_cb)(void *ctx, const u8 *mac_addr, const u8 *p2p_dev_addr,
size_t psk_len); const u8 *psk, size_t psk_len);
int (*set_ie_cb)(void *ctx, struct wpabuf *beacon_ie, int (*set_ie_cb)(void *ctx, struct wpabuf *beacon_ie,
struct wpabuf *probe_resp_ie); struct wpabuf *probe_resp_ie);
void (*pin_needed_cb)(void *ctx, const u8 *uuid_e, void (*pin_needed_cb)(void *ctx, const u8 *uuid_e,
@ -1164,12 +1164,13 @@ void wps_registrar_probe_req_rx(struct wps_registrar *reg, const u8 *addr,
static int wps_cb_new_psk(struct wps_registrar *reg, const u8 *mac_addr, static int wps_cb_new_psk(struct wps_registrar *reg, const u8 *mac_addr,
const u8 *psk, size_t psk_len) const u8 *p2p_dev_addr, const u8 *psk, size_t psk_len)
{ {
if (reg->new_psk_cb == NULL) if (reg->new_psk_cb == NULL)
return 0; return 0;
return reg->new_psk_cb(reg->cb_ctx, mac_addr, psk, psk_len); return reg->new_psk_cb(reg->cb_ctx, mac_addr, p2p_dev_addr, psk,
psk_len);
} }
@ -3168,7 +3169,8 @@ static enum wps_process_res wps_process_wsc_done(struct wps_data *wps,
if (wps->new_psk) { if (wps->new_psk) {
if (wps_cb_new_psk(wps->wps->registrar, wps->mac_addr_e, if (wps_cb_new_psk(wps->wps->registrar, wps->mac_addr_e,
wps->new_psk, wps->new_psk_len)) { wps->p2p_dev_addr, wps->new_psk,
wps->new_psk_len)) {
wpa_printf(MSG_DEBUG, "WPS: Failed to configure the " wpa_printf(MSG_DEBUG, "WPS: Failed to configure the "
"new PSK"); "new PSK");
} }

View file

@ -1205,11 +1205,20 @@ int wpas_wps_start_reg(struct wpa_supplicant *wpa_s, const u8 *bssid,
} }
static int wpas_wps_new_psk_cb(void *ctx, const u8 *mac_addr, const u8 *psk, static int wpas_wps_new_psk_cb(void *ctx, const u8 *mac_addr,
const u8 *p2p_dev_addr, const u8 *psk,
size_t psk_len) size_t psk_len)
{ {
wpa_printf(MSG_DEBUG, "WPS: Received new WPA/WPA2-PSK from WPS for " if (is_zero_ether_addr(p2p_dev_addr)) {
"STA " MACSTR, MAC2STR(mac_addr)); wpa_printf(MSG_DEBUG,
"Received new WPA/WPA2-PSK from WPS for STA " MACSTR,
MAC2STR(mac_addr));
} else {
wpa_printf(MSG_DEBUG,
"Received new WPA/WPA2-PSK from WPS for STA " MACSTR
" P2P Device Addr " MACSTR,
MAC2STR(mac_addr), MAC2STR(p2p_dev_addr));
}
wpa_hexdump_key(MSG_DEBUG, "Per-device PSK", psk, psk_len); wpa_hexdump_key(MSG_DEBUG, "Per-device PSK", psk, psk_len);
/* TODO */ /* TODO */