Add call backs and API's to send the keys derived as part of PASN for Proximity Ranging to the driver. Signed-off-by: Peddolla Harshavardhan Reddy <peddolla@xxxxxxxxxxxxxxxx> --- src/common/proximity_ranging.c | 19 +++++++++++++++++-- src/common/proximity_ranging.h | 5 +++++ wpa_supplicant/pr_supplicant.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/common/proximity_ranging.c b/src/common/proximity_ranging.c index 6238c2dcb..6df1c438a 100644 --- a/src/common/proximity_ranging.c +++ b/src/common/proximity_ranging.c @@ -2302,6 +2302,10 @@ static int pr_pasn_handle_auth_1(struct pr_data *pr, struct pr_device *dev, goto fail; } + if (pr->cfg->set_keys) + pr->cfg->set_keys(pr->cfg->cb_ctx, pr->cfg->dev_addr, + dev->pr_device_addr, dev->pasn->cipher, + dev->pasn->akmp, &dev->pasn->ptk); ret = 0; fail: @@ -2340,6 +2344,10 @@ static int pr_pasn_handle_auth_2(struct pr_data *pr, struct pr_device *dev, goto fail; } + if (pr->cfg->set_keys) + pr->cfg->set_keys(pr->cfg->cb_ctx, pr->cfg->dev_addr, + dev->pr_device_addr, dev->pasn->cipher, + dev->pasn->akmp, &dev->pasn->ptk); ret = 0; fail: @@ -2358,15 +2366,22 @@ static int pr_pasn_handle_auth_3(struct pr_data *pr, struct pr_device *dev, if (pr_process_pasn_ranging_wrapper_result(pr, dev, mgmt, len)) { wpa_printf(MSG_ERROR, "PR PASN: Handle Auth3 action wrapper failed"); - return -1; + goto fail; } if (handle_auth_pasn_3(dev->pasn, pr->cfg->dev_addr, mgmt->sa, mgmt, len) < 0) { wpa_printf(MSG_ERROR, "PR PASN: Handle Auth3 failed"); - return -1; + goto fail; } return 0; +fail: + + /* Clear the keys as M3 processing failed */ + if (pr->cfg->clear_keys) + pr->cfg->clear_keys(pr->cfg->cb_ctx, pr->cfg->dev_addr, + dev->pr_device_addr); + return -1; } diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h index 158ed0f2d..676985a14 100644 --- a/src/common/proximity_ranging.h +++ b/src/common/proximity_ranging.h @@ -416,6 +416,11 @@ struct pr_config { int (*pasn_send_mgmt)(void *ctx, const u8 *data, size_t data_len, int noack, unsigned int freq, unsigned int wait); + + void (*set_keys)(void *ctx, const u8 *own_addr, const u8 *peer_addr, + int cipher, int akmp, struct wpa_ptk *ptk); + + void (*clear_keys)(void *ctx, const u8 *own_addr, const u8 *peer_addr); }; struct pr_data { diff --git a/wpa_supplicant/pr_supplicant.c b/wpa_supplicant/pr_supplicant.c index db0d8aa47..285a7d445 100644 --- a/wpa_supplicant/pr_supplicant.c +++ b/wpa_supplicant/pr_supplicant.c @@ -246,6 +246,33 @@ static int wpas_pr_pasn_send_mgmt(void *ctx, const u8 *data, size_t data_len, } +static void wpas_pr_pasn_set_keys(void *ctx, const u8 *own_addr, + const u8 *peer_addr, int cipher, int akmp, + struct wpa_ptk *ptk) +{ + struct wpa_supplicant *wpa_s = ctx; + + wpa_printf(MSG_DEBUG, "PASN: set secure ranging context for " MACSTR, + MAC2STR(peer_addr)); + wpa_drv_set_secure_ranging_ctx(wpa_s, own_addr, peer_addr, cipher, + ptk->tk_len, ptk->tk, + ptk->ltf_keyseed_len, + ptk->ltf_keyseed, 0); +} + + +static void wpas_pr_pasn_clear_keys(void *ctx, const u8 *own_addr, + const u8 *peer_addr) +{ + struct wpa_supplicant *wpa_s = ctx; + + wpa_printf(MSG_DEBUG, "PASN: clear secure ranging context for " MACSTR, + MAC2STR(peer_addr)); + wpa_drv_set_secure_ranging_ctx(wpa_s, own_addr, peer_addr, 0, 0, NULL, + 0, NULL, 1); +} + + struct wpabuf * wpas_pr_usd_elems(struct wpa_supplicant *wpa_s) { return pr_prepare_usd_elems(wpa_s->global->pr, wpa_s->conf->country); @@ -307,6 +334,8 @@ int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s) pr.support_6ghz = wpas_is_6ghz_supported(wpa_s, true); pr.pasn_send_mgmt = wpas_pr_pasn_send_mgmt; + pr.set_keys = wpas_pr_pasn_set_keys; + pr.clear_keys = wpas_pr_pasn_clear_keys; pr.secure_he_ltf = wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_SEC_LTF_STA; -- 2.34.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap