void pr_add_dev_ik(struct pr_data *pr, const u8 *dik, const char *password,
- const u8 *pmk, bool own)
+ const u8 *pmk, size_t pmk_len, bool own)
{
struct pr_dev_ik *dev_ik;
return;
}
+ if (pmk && (pmk_len != 32 && pmk_len != 48 && pmk_len != 64)) {
+ wpa_printf(MSG_INFO, "PR: Unexpected PMK length %zu", pmk_len);
+ 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) == 0) {
dl_list_del(&dev_ik->list);
dev_ik->password_valid = true;
}
if (pmk) {
- os_memcpy(dev_ik->pmk, pmk, WPA_PASN_PMK_LEN);
+ os_memcpy(dev_ik->pmk, pmk, pmk_len);
+ dev_ik->pmk_len = pmk_len;
dev_ik->pmk_valid = true;
}
}
if (dev_ik->pmk_valid) {
os_memcpy(dev->pmk, dev_ik->pmk,
- WPA_PASN_PMK_LEN);
+ dev_ik->pmk_len);
+ dev->pmk_len = dev_ik->pmk_len;
dev->pmk_valid = true;
}
return 0;
pasn->own_addr,
pasn->peer_addr,
dev->pmk,
- WPA_PASN_PMK_LEN,
+ dev->pmk_len,
pmkid);
else
pasn_responder_pmksa_cache_add(pr->responder_pmksa,
pasn->own_addr,
pasn->peer_addr,
dev->pmk,
- WPA_PASN_PMK_LEN,
+ dev->pmk_len,
pmkid);
pasn->akmp = WPA_KEY_MGMT_SAE;
} else {
u8 dik[DEVICE_IDENTITY_KEY_LEN];
char password[100];
bool password_valid;
- u8 pmk[WPA_PASN_PMK_LEN];
+ u8 pmk[PMK_LEN_MAX];
+ size_t pmk_len;
bool pmk_valid;
};
* This is updated with valid PMK if DIRA matches for the peer.
*/
u8 pmk[PMK_LEN_MAX];
+ size_t pmk_len;
bool pmk_valid;
#ifdef CONFIG_PASN
void pr_set_dev_addr(struct pr_data *pr, const u8 *addr);
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);
+ const u8 *pmk, size_t pmk_len, bool own);
struct wpabuf * pr_prepare_usd_elems(struct pr_data *pr);
void pr_process_usd_elems(struct pr_data *pr, const u8 *ies, u16 ies_len,
const u8 *peer_addr, unsigned int freq);
const char *password = NULL;
const u8 *pmk = NULL, *dik = NULL;
struct wpabuf *pmk_buf = NULL, *dik_buf = NULL;
+ size_t pmk_len;
while ((token = str_token(cmd, " ", &context))) {
if (os_strcmp(token, "self") == 0) {
if (!pmk_buf)
goto fail;
pmk = wpabuf_head_u8(pmk_buf);
+ pmk_len = wpabuf_len(pmk_buf);
continue;
}
}
if (!dik)
goto fail;
- wpas_pr_set_dev_ik(wpa_s, dik, password, pmk, own);
+ wpas_pr_set_dev_ik(wpa_s, dik, password, pmk, pmk_len, own);
ret = 0;
fail:
wpabuf_clear_free(dik_buf);
void wpas_pr_set_dev_ik(struct wpa_supplicant *wpa_s, const u8 *dik,
- const char *password, const u8 *pmk, bool own)
+ const char *password, const u8 *pmk, size_t pmk_len,
+ bool own)
{
struct pr_data *pr = wpa_s->global->pr;
if (!pr || !dik)
return;
- pr_add_dev_ik(pr, dik, password, pmk, own);
+ pr_add_dev_ik(pr, dik, password, pmk, pmk_len, own);
}
void wpas_pr_update_dev_addr(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);
+ const char *password, const u8 *pmk, size_t pmk_len,
+ 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,
static inline void wpas_pr_set_dev_ik(struct wpa_supplicant *wpa_s,
const u8 *dik, const char *password,
- const u8 *pmk, bool own)
+ const u8 *pmk, size_t pmk_len, bool own)
{
}