Add support for offloading key management operations to the driver
This commit introduces a QCA vendor command and event to provide an option to use extended versions of the nl80211 connect/roam operations in a way that allows drivers to offload key management operations to the driver/firmware. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
fbb79f94eb
commit
b41f26845a
12 changed files with 348 additions and 2 deletions
|
@ -138,6 +138,24 @@ void wpa_sm_key_request(struct wpa_sm *sm, int error, int pairwise)
|
|||
}
|
||||
|
||||
|
||||
static void wpa_supplicant_key_mgmt_set_pmk(struct wpa_sm *sm)
|
||||
{
|
||||
#ifdef CONFIG_IEEE80211R
|
||||
if (sm->key_mgmt == WPA_KEY_MGMT_FT_IEEE8021X) {
|
||||
if (wpa_sm_key_mgmt_set_pmk(sm, sm->xxkey, sm->xxkey_len))
|
||||
wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
|
||||
"RSN: Cannot set low order 256 bits of MSK for key management offload");
|
||||
} else {
|
||||
#endif /* CONFIG_IEEE80211R */
|
||||
if (wpa_sm_key_mgmt_set_pmk(sm, sm->pmk, sm->pmk_len))
|
||||
wpa_dbg(sm->ctx->msg_ctx, MSG_DEBUG,
|
||||
"RSN: Cannot set PMK for key management offload");
|
||||
#ifdef CONFIG_IEEE80211R
|
||||
}
|
||||
#endif /* CONFIG_IEEE80211R */
|
||||
}
|
||||
|
||||
|
||||
static int wpa_supplicant_get_pmk(struct wpa_sm *sm,
|
||||
const unsigned char *src_addr,
|
||||
const u8 *pmkid)
|
||||
|
@ -198,6 +216,7 @@ static int wpa_supplicant_get_pmk(struct wpa_sm *sm,
|
|||
wpa_hexdump_key(MSG_DEBUG, "WPA: PMK from EAPOL state "
|
||||
"machines", sm->pmk, pmk_len);
|
||||
sm->pmk_len = pmk_len;
|
||||
wpa_supplicant_key_mgmt_set_pmk(sm);
|
||||
if (sm->proto == WPA_PROTO_RSN &&
|
||||
!wpa_key_mgmt_ft(sm->key_mgmt)) {
|
||||
sa = pmksa_cache_add(sm->pmksa,
|
||||
|
@ -2787,3 +2806,30 @@ int wpa_sm_get_p2p_ip_addr(struct wpa_sm *sm, u8 *buf)
|
|||
}
|
||||
|
||||
#endif /* CONFIG_P2P */
|
||||
|
||||
|
||||
void wpa_sm_set_rx_replay_ctr(struct wpa_sm *sm, const u8 *rx_replay_counter)
|
||||
{
|
||||
if (rx_replay_counter == NULL)
|
||||
return;
|
||||
|
||||
os_memcpy(sm->rx_replay_counter, rx_replay_counter,
|
||||
WPA_REPLAY_COUNTER_LEN);
|
||||
sm->rx_replay_counter_set = 1;
|
||||
wpa_printf(MSG_DEBUG, "Updated key replay counter");
|
||||
}
|
||||
|
||||
|
||||
void wpa_sm_set_ptk_kck_kek(struct wpa_sm *sm, const u8 *ptk_kck,
|
||||
const u8 *ptk_kek)
|
||||
{
|
||||
if (ptk_kck) {
|
||||
os_memcpy(sm->ptk.kck, ptk_kck, 16);
|
||||
wpa_printf(MSG_DEBUG, "Updated PTK KCK");
|
||||
}
|
||||
if (ptk_kek) {
|
||||
os_memcpy(sm->ptk.kek, ptk_kek, 16);
|
||||
wpa_printf(MSG_DEBUG, "Updated PTK KEK");
|
||||
}
|
||||
sm->ptk_set = 1;
|
||||
}
|
||||
|
|
|
@ -70,6 +70,7 @@ struct wpa_sm_ctx {
|
|||
#endif /* CONFIG_TDLS */
|
||||
void (*set_rekey_offload)(void *ctx, const u8 *kek, const u8 *kck,
|
||||
const u8 *replay_ctr);
|
||||
int (*key_mgmt_set_pmk)(void *ctx, const u8 *pmk, size_t pmk_len);
|
||||
};
|
||||
|
||||
|
||||
|
@ -148,6 +149,10 @@ void wpa_sm_pmksa_cache_flush(struct wpa_sm *sm, void *network_ctx);
|
|||
|
||||
int wpa_sm_get_p2p_ip_addr(struct wpa_sm *sm, u8 *buf);
|
||||
|
||||
void wpa_sm_set_rx_replay_ctr(struct wpa_sm *sm, const u8 *rx_replay_counter);
|
||||
void wpa_sm_set_ptk_kck_kek(struct wpa_sm *sm, const u8 *ptk_kck,
|
||||
const u8 *ptk_kek);
|
||||
|
||||
#else /* CONFIG_NO_WPA */
|
||||
|
||||
static inline struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx)
|
||||
|
@ -302,6 +307,16 @@ static inline void wpa_sm_pmksa_cache_flush(struct wpa_sm *sm,
|
|||
{
|
||||
}
|
||||
|
||||
static inline void wpa_sm_set_rx_replay_ctr(struct wpa_sm *sm,
|
||||
const u8 *rx_replay_counter)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void wpa_sm_set_ptk_kck_kek(struct wpa_sm *sm, const u8 *ptk_kck,
|
||||
const u8 *ptk_kek)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NO_WPA */
|
||||
|
||||
#ifdef CONFIG_PEERKEY
|
||||
|
|
|
@ -312,6 +312,16 @@ wpa_sm_tdls_peer_addset(struct wpa_sm *sm, const u8 *addr, int add,
|
|||
}
|
||||
#endif /* CONFIG_TDLS */
|
||||
|
||||
static inline int wpa_sm_key_mgmt_set_pmk(struct wpa_sm *sm,
|
||||
const u8 *pmk, size_t pmk_len)
|
||||
{
|
||||
if (!sm->proactive_key_caching)
|
||||
return 0;
|
||||
if (!sm->ctx->key_mgmt_set_pmk)
|
||||
return -1;
|
||||
return sm->ctx->key_mgmt_set_pmk(sm->ctx->ctx, pmk, pmk_len);
|
||||
}
|
||||
|
||||
void wpa_eapol_key_send(struct wpa_sm *sm, const u8 *kck,
|
||||
int ver, const u8 *dest, u16 proto,
|
||||
u8 *msg, size_t msg_len, u8 *key_mic);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue