]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
PASN: Define PMKSA helper functions for initiator and responder
authorShivani Baranwal <quic_shivbara@quicinc.com>
Sun, 4 Aug 2024 20:13:58 +0000 (01:43 +0530)
committerJouni Malinen <j@w1.fi>
Thu, 5 Sep 2024 20:56:16 +0000 (23:56 +0300)
Define helper functions to init, add, get, remove, flush, and deinit
PMKSA cache for PASN initiator and responder. P2P devices can be in
a role of pairing initiator and responder. Hence define a cache for
each role separately.

Signed-off-by: Shivani Baranwal <quic_shivbara@quicinc.com>
src/pasn/pasn_common.h
src/pasn/pasn_initiator.c
src/pasn/pasn_responder.c

index eb0c16abf983ea9b81b1e3e05a9b1162497265d7..36d129f4e2b7b0d16efcd9d8da2c4d7f069bd434 100644 (file)
@@ -207,6 +207,17 @@ void pasn_set_initiator_pmksa(struct pasn_data *pasn,
 void pasn_set_responder_pmksa(struct pasn_data *pasn,
                              struct rsn_pmksa_cache *pmksa);
 int pasn_set_pt(struct pasn_data *pasn, struct sae_pt *pt);
+struct rsn_pmksa_cache * pasn_initiator_pmksa_cache_init(void);
+void pasn_initiator_pmksa_cache_deinit(struct rsn_pmksa_cache *pmksa);
+int pasn_initiator_pmksa_cache_add(struct rsn_pmksa_cache *pmksa,
+                                  const u8 *own_addr, const u8 *bssid, u8 *pmk,
+                                  size_t pmk_len, u8 *pmkid);
+int pasn_initiator_pmksa_cache_get(struct rsn_pmksa_cache *pmksa,
+                                  const u8 *bssid, u8 *pmkid, u8 *pmk,
+                                  size_t *pmk_len);
+void pasn_initiator_pmksa_cache_remove(struct rsn_pmksa_cache *pmksa,
+                                      const u8 *bssid);
+void pasn_initiator_pmksa_cache_flush(struct rsn_pmksa_cache *pmksa);
 
 /* Responder */
 void pasn_set_noauth(struct pasn_data *pasn, bool noauth);
@@ -218,6 +229,17 @@ void pasn_set_rsnxe_ie(struct pasn_data *pasn, const u8 *rsnxe_ie);
 void pasn_set_custom_pmkid(struct pasn_data *pasn, const u8 *pmkid);
 int pasn_set_extra_ies(struct pasn_data *pasn, const u8 *extra_ies,
                       size_t extra_ies_len);
+struct rsn_pmksa_cache * pasn_responder_pmksa_cache_init(void);
+void pasn_responder_pmksa_cache_deinit(struct rsn_pmksa_cache *pmksa);
+int pasn_responder_pmksa_cache_add(struct rsn_pmksa_cache *pmksa,
+                                  const u8 *own_addr, const u8 *bssid, u8 *pmk,
+                                  size_t pmk_len, u8 *pmkid);
+int pasn_responder_pmksa_cache_get(struct rsn_pmksa_cache *pmksa,
+                                  const u8 *bssid, u8 *pmkid, u8 *pmk,
+                                  size_t *pmk_len);
+void pasn_responder_pmksa_cache_remove(struct rsn_pmksa_cache *pmksa,
+                                      const u8 *bssid);
+void pasn_responder_pmksa_cache_flush(struct rsn_pmksa_cache *pmksa);
 
 int pasn_get_akmp(struct pasn_data *pasn);
 int pasn_get_cipher(struct pasn_data *pasn);
index c9771c70b6490b5f3cf190bbf93ab1aec011af86..dbcc91a71bd43ed8f33ac178528b3ceee72f8683 100644 (file)
 #include "pasn_common.h"
 
 
+struct rsn_pmksa_cache * pasn_initiator_pmksa_cache_init(void)
+{
+       return pmksa_cache_init(NULL, NULL, NULL, NULL, NULL);
+}
+
+
+void pasn_initiator_pmksa_cache_deinit(struct rsn_pmksa_cache *pmksa)
+{
+       return pmksa_cache_deinit(pmksa);
+}
+
+
+int pasn_initiator_pmksa_cache_add(struct rsn_pmksa_cache *pmksa,
+                                  const u8 *own_addr, const u8 *bssid, u8 *pmk,
+                                  size_t pmk_len, u8 *pmkid)
+{
+       if (pmksa_cache_add(pmksa, pmk, pmk_len, pmkid, NULL, 0, bssid,
+                           own_addr, NULL, WPA_KEY_MGMT_SAE, 0))
+               return 0;
+       return -1;
+}
+
+
+void pasn_initiator_pmksa_cache_remove(struct rsn_pmksa_cache *pmksa,
+                                      const u8 *bssid)
+{
+       struct rsn_pmksa_cache_entry *entry;
+
+       entry = pmksa_cache_get(pmksa, bssid, NULL, NULL, NULL, 0);
+       if (!entry)
+               return;
+
+       pmksa_cache_remove(pmksa, entry);
+}
+
+
+int pasn_initiator_pmksa_cache_get(struct rsn_pmksa_cache *pmksa,
+                                  const u8 *bssid, u8 *pmkid, u8 *pmk,
+                                  size_t *pmk_len)
+{
+       struct rsn_pmksa_cache_entry *entry;
+
+       entry = pmksa_cache_get(pmksa, bssid, NULL, NULL, NULL, 0);
+       if (entry) {
+               os_memcpy(pmkid, entry->pmkid, PMKID_LEN);
+               os_memcpy(pmk, entry->pmk, entry->pmk_len);
+               *pmk_len = entry->pmk_len;
+               return 0;
+       }
+       return -1;
+}
+
+
+void pasn_initiator_pmksa_cache_flush(struct rsn_pmksa_cache *pmksa)
+{
+       return pmksa_cache_flush(pmksa, NULL, NULL, 0, false);
+}
+
+
 void pasn_set_initiator_pmksa(struct pasn_data *pasn,
                              struct rsn_pmksa_cache *pmksa)
 {
index 09e9f0d2ded9dfa8558dae2257e8eb311799e522..1c08136cb514b406e5fec2b6751e44d4830b468a 100644 (file)
 #include "pasn_common.h"
 
 
+struct rsn_pmksa_cache * pasn_responder_pmksa_cache_init(void)
+{
+       return pmksa_cache_auth_init(NULL, NULL);
+}
+
+
+void pasn_responder_pmksa_cache_deinit(struct rsn_pmksa_cache *pmksa)
+{
+       return pmksa_cache_auth_deinit(pmksa);
+}
+
+
+int pasn_responder_pmksa_cache_add(struct rsn_pmksa_cache *pmksa,
+                                  const u8 *own_addr, const u8 *bssid, u8 *pmk,
+                                  size_t pmk_len, u8 *pmkid)
+{
+       if (pmksa_cache_auth_add(pmksa, pmk, pmk_len, pmkid, NULL, 0, own_addr,
+                                bssid, 0, NULL, WPA_KEY_MGMT_SAE))
+               return 0;
+       return -1;
+}
+
+
+int pasn_responder_pmksa_cache_get(struct rsn_pmksa_cache *pmksa,
+                                  const u8 *bssid, u8 *pmkid, u8 *pmk,
+                                  size_t *pmk_len)
+{
+       struct rsn_pmksa_cache_entry *entry;
+
+       entry = pmksa_cache_auth_get(pmksa, bssid, NULL);
+       if (entry) {
+               os_memcpy(pmkid, entry->pmkid, PMKID_LEN);
+               os_memcpy(pmk, entry->pmk, entry->pmk_len);
+               *pmk_len = entry->pmk_len;
+               return 0;
+       }
+       return -1;
+}
+
+
+void pasn_responder_pmksa_cache_remove(struct rsn_pmksa_cache *pmksa,
+                                      const u8 *bssid)
+{
+       struct rsn_pmksa_cache_entry *entry;
+
+       entry = pmksa_cache_auth_get(pmksa, bssid, NULL);
+       if (!entry)
+               return;
+
+       pmksa_cache_free_entry(pmksa, entry);
+}
+
+
+void pasn_responder_pmksa_cache_flush(struct rsn_pmksa_cache *pmksa)
+{
+       return pmksa_cache_auth_flush(pmksa);
+}
+
+
 void pasn_set_responder_pmksa(struct pasn_data *pasn,
                              struct rsn_pmksa_cache *pmksa)
 {