]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P2: Parse and store peer's SAE password
authorShivani Baranwal <quic_shivbara@quicinc.com>
Sun, 4 Aug 2024 21:13:59 +0000 (02:43 +0530)
committerJouni Malinen <j@w1.fi>
Sun, 13 Oct 2024 18:41:53 +0000 (21:41 +0300)
Store the peer's password during group formation after opportunistic
PASN authentication or while joining an existing group.

Signed-off-by: Shivani Baranwal <quic_shivbara@quicinc.com>
src/p2p/p2p.c
src/p2p/p2p_i.h

index 0dde48b4218b4dd4a1ce72c35c1755c9849af9b1..cfb2273c7f5e925f0c27ba0653b6f2eb65a743bb 100644 (file)
@@ -249,6 +249,7 @@ void p2p_go_neg_failed(struct p2p_data *p2p, int status)
 #ifdef CONFIG_PASN
        if (peer->p2p2 && peer->pasn)
                wpa_pasn_reset(peer->pasn);
+       os_memset(p2p->peer_sae_password, 0, sizeof(p2p->peer_sae_password));
 #endif /* CONFIG_PASN */
 
        os_memset(&res, 0, sizeof(res));
@@ -6490,6 +6491,18 @@ int p2p_parse_data_element(struct p2p_data *p2p, const u8 *data, size_t len)
                                "Received peer DevIK of length %zu octets and lifetime %u",
                                p2p->peer_dik_len, p2p->peer_dik_lifetime);
                        break;
+               case P2P_ATTR_PASSWORD:
+                       if (attr_len < 1 ||
+                           attr_len > sizeof(p2p->peer_sae_password) - 1) {
+                               p2p_dbg(p2p,
+                                       "P2P: Invalid password length %d",
+                                       attr_len);
+                               return -1;
+                       }
+                       os_memset(p2p->peer_sae_password, 0,
+                                 sizeof(p2p->peer_sae_password));
+                       os_memcpy(p2p->peer_sae_password, pos, attr_len);
+                       break;
                default:
                        p2p_dbg(p2p,
                                "Unsupported Attribute ID %u in P2P2 IE in PASN Encrypted Data element",
@@ -6620,6 +6633,8 @@ static int p2p_handle_pasn_auth(struct p2p_data *p2p, struct p2p_device *dev,
                        /* Drop keying material from a failed pairing attempt */
                        os_memset(p2p->peer_dik_data, 0,
                                  sizeof(p2p->peer_dik_data));
+                       os_memset(p2p->peer_sae_password, 0,
+                                 sizeof(p2p->peer_sae_password));
                        return -1;
                }
                forced_memzero(pasn_get_ptk(pasn), sizeof(pasn->ptk));
index 571f4fc93342c0194f9d81dbab27b00602dd7f8c..e7aeb4197f1b48b9b4313d7987380cdae9e6a6f5 100644 (file)
@@ -655,6 +655,12 @@ struct p2p_data {
        u8 peer_dik_data[DEVICE_IDENTITY_KEY_MAX_LEN];
        size_t peer_dik_len;
        unsigned int peer_dik_lifetime;
+
+       /* Password used during an ongoing group formation after opportunistic
+        * PASN authentication or while joining an existing group. This will be
+        * moved to a more permanent location from struct p2p_data at the
+        * conclusion of a successful pairing. */
+       char peer_sae_password[100];
 };
 
 /**