p2p_invitation_req_cb(p2p, success);
break;
case P2P_PENDING_INVITATION_RESPONSE:
- p2p_invitation_resp_cb(p2p, success);
+ p2p_invitation_resp_cb(p2p, dst, success);
break;
case P2P_PENDING_DEV_DISC_REQUEST:
p2p_dev_disc_req_cb(p2p, success);
p2p->cfg->invitation_result(
p2p->cfg->cb_ctx, -1, NULL, NULL,
p2p->invite_peer->info.p2p_device_addr,
- 0, 0);
+ 0, 0, NULL, NULL, 0);
}
p2p_set_state(p2p, P2P_IDLE);
}
p2p_handle_go_neg_conf(p2p, mgmt->sa, data + 1,
data_len - 1, true);
else
- p2p_invitation_resp_cb(p2p, P2P_SEND_ACTION_SUCCESS);
+ p2p_invitation_resp_cb(p2p, mgmt->sa,
+ P2P_SEND_ACTION_SUCCESS);
}
p2p_parse_free(&msg);
return 0;
void (*invitation_received)(void *ctx, const u8 *sa, const u8 *bssid,
const u8 *ssid, size_t ssid_len,
const u8 *go_dev_addr, u8 status,
- int op_freq);
+ int op_freq, const u8 *pmkid, const u8 *pmk,
+ size_t pmk_len);
/**
* invitation_result - Callback on Invitation result
*/
void (*invitation_result)(void *ctx, int status, const u8 *bssid,
const struct p2p_channels *channels,
- const u8 *addr, int freq, int peer_oper_freq);
+ const u8 *addr, int freq, int peer_oper_freq,
+ const u8 *pmkid, const u8 *pmk,
+ size_t pmk_len);
/**
* go_connected - Check whether we are connected to a GO
int p2p_invite_send(struct p2p_data *p2p, struct p2p_device *dev,
const u8 *go_dev_addr, int dev_pw_id);
void p2p_invitation_req_cb(struct p2p_data *p2p, int success);
-void p2p_invitation_resp_cb(struct p2p_data *p2p, int success);
+void p2p_invitation_resp_cb(struct p2p_data *p2p, const u8 *dst, int success);
/* p2p_dev_disc.c */
void p2p_process_dev_disc_req(struct p2p_data *p2p, const u8 *sa,
#include "common.h"
#include "common/ieee802_11_defs.h"
#include "common/wpa_ctrl.h"
+#include "common/sae.h"
+#include "crypto/sha384.h"
+#include "common/wpa_common.h"
+#include "pasn/pasn_common.h"
#include "p2p_i.h"
#include "p2p.h"
p2p->cfg->invitation_result(p2p->cfg->cb_ctx, *msg.status,
msg.group_bssid, channels, sa,
- freq, peer_oper_freq);
+ freq, peer_oper_freq, NULL, NULL,
+ 0);
}
p2p_parse_free(&msg);
}
-void p2p_invitation_resp_cb(struct p2p_data *p2p, int success)
+void p2p_invitation_resp_cb(struct p2p_data *p2p, const u8 *peer, int success)
{
+ size_t pmk_len = 0;
+ const u8 *pmkid = NULL, *pmk = NULL;
+
+#ifdef CONFIG_PASN
+ u8 _pmkid[PMKID_LEN];
+ u8 _pmk[PMK_LEN_MAX];
+ struct p2p_device *dev;
+
+ dev = p2p_get_device(p2p, peer);
+ if (dev && dev->pasn) {
+ pasn_responder_pmksa_cache_get(dev->pasn->pmksa,
+ dev->pasn->peer_addr, _pmkid,
+ _pmk, &pmk_len);
+ pmkid = _pmkid;
+ pmk = _pmk;
+ }
+#endif /* CONFIG_PASN */
+
p2p_dbg(p2p, "Invitation Response TX callback: success=%d", success);
p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
p2p->inv_ssid, p2p->inv_ssid_len,
p2p->inv_go_dev_addr,
p2p->inv_status,
- p2p->inv_op_freq);
+ p2p->inv_op_freq, pmkid, pmk,
+ pmk_len);
}
+
+#ifdef CONFIG_PASN
+ /* Reset PMK and PMKID from stack */
+ forced_memzero(_pmkid, sizeof(_pmkid));
+ forced_memzero(_pmk, sizeof(_pmk));
+#endif /* CONFIG_PASN */
}
#include "utils/eloop.h"
#include "common/ieee802_11_defs.h"
#include "p2p/p2p.h"
+#include "ap/hostapd.h"
+#include "ap/ieee802_1x.h"
+#include "ap/pmksa_cache_auth.h"
#include "../fuzzer-common.h"
+int pasn_responder_pmksa_cache_get(struct rsn_pmksa_cache *pmksa,
+ const u8 *bssid, u8 *pmkid, u8 *pmk,
+ size_t *pmk_len)
+{
+ return -1;
+}
+
+
static void debug_print(void *ctx, int level, const char *msg)
{
wpa_printf(level, "P2P: %s", msg);
static void wpas_invitation_received(void *ctx, const u8 *sa, const u8 *bssid,
const u8 *ssid, size_t ssid_len,
const u8 *go_dev_addr, u8 status,
- int op_freq)
+ int op_freq, const u8 *pmkid,
+ const u8 *pmk, size_t pmk_len)
{
struct wpa_supplicant *wpa_s = ctx;
struct wpa_ssid *s;
static void wpas_invitation_result(void *ctx, int status, const u8 *bssid,
const struct p2p_channels *channels,
const u8 *peer, int neg_freq,
- int peer_oper_freq)
+ int peer_oper_freq, const u8 *pmkid,
+ const u8 *pmk, size_t pmk_len)
{
struct wpa_supplicant *wpa_s = ctx;
struct wpa_ssid *ssid;