[RFC PATCH 10/34] APIs to add and clear Device Identity Key, password and PMK
Peddolla Harshavardhan Reddy
peddolla at qti.qualcomm.com
Thu May 15 00:17:33 PDT 2025
Signed-off-by: Peddolla Harshavardhan Reddy <peddolla at qti.qualcomm.com>
---
src/common/proximity_ranging.c | 75 ++++++++++++++++++++++++++++++++++
src/common/proximity_ranging.h | 31 ++++++++++++++
wpa_supplicant/pr_supplicant.c | 23 +++++++++++
wpa_supplicant/pr_supplicant.h | 14 +++++++
4 files changed, 143 insertions(+)
diff --git a/src/common/proximity_ranging.c b/src/common/proximity_ranging.c
index 33478bac3..f5fe438bf 100644
--- a/src/common/proximity_ranging.c
+++ b/src/common/proximity_ranging.c
@@ -88,6 +88,7 @@ struct pr_data * pr_init(const struct pr_config *cfg)
pr->cfg->dev_name = NULL;
dl_list_init(&pr->devices);
+ dl_list_init(&pr->dev_iks);
return pr;
}
@@ -96,6 +97,7 @@ struct pr_data * pr_init(const struct pr_config *cfg)
void pr_deinit(struct pr_data *pr)
{
struct pr_device *dev, *prev;
+ struct pr_dev_ik *dev_ik, *prev_dev_ik;
if (!pr)
return;
@@ -106,12 +108,85 @@ void pr_deinit(struct pr_data *pr)
dl_list_del(&dev->list);
pr_device_free(pr, dev);
}
+ dl_list_for_each_safe(dev_ik, prev_dev_ik, &pr->dev_iks,
+ struct pr_dev_ik, list) {
+ dl_list_del(&dev_ik->list);
+ os_free(dev_ik);
+ }
os_free(pr);
wpa_printf(MSG_DEBUG, "PR: Deinit done");
}
+void pr_clear_dev_iks(struct pr_data *pr)
+{
+ struct pr_device *dev;
+ struct pr_dev_ik *dev_ik, *prev_dev_ik;
+
+ pr->cfg->dik_len = 0;
+ pr->cfg->global_password_valid = false;
+ os_memset(pr->cfg->dik_data, 0, DEVICE_IDENTITY_KEY_LEN);
+ os_memset(pr->cfg->global_password, 0,
+ sizeof(pr->cfg->global_password));
+
+ dl_list_for_each(dev, &pr->devices, struct pr_device, list) {
+ dev->password_valid = false;
+ os_memset(dev->password, 0, sizeof(dev->password));
+ }
+
+ dl_list_for_each_safe(dev_ik, prev_dev_ik, &pr->dev_iks,
+ struct pr_dev_ik, list) {
+ dl_list_del(&dev_ik->list);
+ os_free(dev_ik);
+ }
+}
+
+
+void pr_add_dev_ik(struct pr_data *pr, const u8 *dik, const char *password,
+ const u8 *pmk, bool own)
+{
+ struct pr_dev_ik *dev_ik;
+
+ if (own) {
+ os_memcpy(pr->cfg->dik_data, dik, DEVICE_IDENTITY_KEY_LEN);
+ pr->cfg->dik_len = DEVICE_IDENTITY_KEY_LEN;
+ if (password) {
+ os_strlcpy(pr->cfg->global_password, password,
+ sizeof(pr->cfg->global_password));
+ pr->cfg->global_password_valid = true;
+ }
+ return;
+ }
+
+ dl_list_for_each(dev_ik, &pr->dev_iks, struct pr_dev_ik, list) {
+ if (!os_memcmp(dik, dev_ik->dik, DEVICE_IDENTITY_KEY_LEN)) {
+ dl_list_del(&dev_ik->list);
+ os_free(dev_ik);
+ break;
+ }
+ }
+
+ dev_ik = os_zalloc(sizeof(*dev_ik));
+ if (!dev_ik)
+ return;
+
+ dl_list_add(&pr->dev_iks, &dev_ik->list);
+ os_memcpy(dev_ik->dik, dik, DEVICE_IDENTITY_KEY_LEN);
+ if (password) {
+ os_strlcpy(dev_ik->password, password,
+ sizeof(dev_ik->password));
+ dev_ik->password_valid = true;
+ }
+ if (pmk) {
+ os_memcpy(dev_ik->pmk, pmk, WPA_PASN_PMK_LEN);
+ dev_ik->pmk_valid = true;
+ }
+
+ wpa_printf(MSG_DEBUG, "PR: New Device Identity add to list");
+}
+
+
static struct wpabuf * pr_encaps_ie(const struct wpabuf *subelems, u32 ie_type)
{
struct wpabuf *ie = NULL;
diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h
index cbd7a7ef8..85c1b1a5e 100644
--- a/src/common/proximity_ranging.h
+++ b/src/common/proximity_ranging.h
@@ -171,6 +171,15 @@ enum pr_attr_id {
#define PR_ISTA_SUPPORT BIT(0)
#define PR_RSTA_SUPPORT BIT(1)
+struct pr_dev_ik {
+ struct dl_list list;
+ u8 dik[DEVICE_IDENTITY_KEY_LEN];
+ char password[100];
+ bool password_valid;
+ u8 pmk[WPA_PASN_PMK_LEN];
+ bool pmk_valid;
+};
+
/**
* struct pr_device_info - Proximity ranging peer information
*/
@@ -183,6 +192,18 @@ struct pr_device {
* pr_device_addr - PR Device Address of the peer
*/
u8 pr_device_addr[ETH_ALEN];
+
+ /* Password to be used in PASN-SAE by the Seeker
+ * This is updated with valid password if DIRA matches for the peer
+ */
+ char password[100];
+ bool password_valid;
+
+ /* PMK to be used in PASN-PMK by the Seeker
+ * This is updated with valid PMK if DIRA matches for the peer
+ */
+ u8 pmk[PMK_LEN_MAX];
+ bool pmk_valid;
};
@@ -250,6 +271,11 @@ struct pr_config {
/* DevIK expiration */
int expiration;
+ /* Global Password to be used in PASN-SAE for Advertiser */
+ char global_password[100];
+
+ bool global_password_valid;
+
/**
* cb_ctx - Context to use with callback functions
*/
@@ -266,6 +292,8 @@ struct pr_data {
struct pr_config *cfg;
struct dl_list devices;
+
+ struct dl_list dev_iks;
};
@@ -285,6 +313,9 @@ struct pr_dira {
struct pr_data * pr_init(const struct pr_config *cfg);
void pr_deinit(struct pr_data *pr);
+void pr_clear_dev_iks(struct pr_data *pr);
+void pr_add_dev_ik(struct pr_data *pr, const u8 *dik, const char *password,
+ const u8 *pmk, bool own);
struct wpabuf * pr_prepare_usd_elems(struct pr_data *pr, const char *country);
void pr_process_usd_elems(struct pr_data *pr, const u8 *ies, u16 ies_len,
const u8 *peer_addr, unsigned int freq);
diff --git a/wpa_supplicant/pr_supplicant.c b/wpa_supplicant/pr_supplicant.c
index 65af512c7..18eebea73 100644
--- a/wpa_supplicant/pr_supplicant.c
+++ b/wpa_supplicant/pr_supplicant.c
@@ -190,3 +190,26 @@ void wpas_pr_deinit(struct wpa_supplicant *wpa_s)
wpa_s->global->pr_init_wpa_s = NULL;
}
}
+
+
+void wpas_pr_clear_dev_iks(struct wpa_supplicant *wpa_s)
+{
+ struct pr_data *pr = wpa_s->global->pr;
+
+ if (!pr)
+ return;
+
+ pr_clear_dev_iks(pr);
+}
+
+
+void wpas_pr_set_dev_ik(struct wpa_supplicant *wpa_s, const u8 *dik,
+ const char *password, const u8 *pmk, bool own)
+{
+ struct pr_data *pr = wpa_s->global->pr;
+
+ if (!pr || !dik)
+ return;
+
+ pr_add_dev_ik(pr, dik, password, pmk, own);
+}
diff --git a/wpa_supplicant/pr_supplicant.h b/wpa_supplicant/pr_supplicant.h
index 2bad595bb..ff4478ef9 100644
--- a/wpa_supplicant/pr_supplicant.h
+++ b/wpa_supplicant/pr_supplicant.h
@@ -15,6 +15,9 @@
int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s);
void wpas_pr_deinit(struct wpa_supplicant *wpa_s);
+void wpas_pr_clear_dev_iks(struct wpa_supplicant *wpa_s);
+void wpas_pr_set_dev_ik(struct wpa_supplicant *wpa_s, const u8 *dik,
+ const char *password, const u8 *pmk, bool own);
struct wpabuf * wpas_pr_usd_elems(struct wpa_supplicant *wpa_s);
void wpas_pr_process_usd_elems(struct wpa_supplicant *wpa_s, const u8 *buf,
u16 buf_len, const u8 *peer_addr,
@@ -30,6 +33,17 @@ static inline void wpas_pr_deinit(struct wpa_supplicant *wpa_s)
{
}
+
+static inline void wpas_pr_clear_dev_iks(struct wpa_supplicant *wpa_s)
+{
+}
+
+static inline void wpas_pr_set_dev_ik(struct wpa_supplicant *wpa_s,
+ const u8 *dik, const char *password,
+ const u8 *pmk, bool own)
+{
+}
+
static inline struct wpabuf * wpas_pr_usd_elems(struct wpa_supplicant *wpa_s)
{
return NULL;
--
2.34.1
More information about the Hostap
mailing list