[PATCH] tests: NAN: Add protected unicast follow-up after verification test

Andrei Otcheretianski andrei.otcheretianski at intel.com
Thu Jun 4 00:02:39 PDT 2026


After successful NAN pairing verification (NIRA validated, PASN with
cached PMK), unicast follow-up messages shall be PMF protected with
NM-TK. Add test_nan_prot_ucast_followup_after_verification which
performs pairing verification and then exchanges unicast follow-ups,
verifying they are received successfully.

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
---
 tests/hwsim/test_nan.py | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/tests/hwsim/test_nan.py b/tests/hwsim/test_nan.py
index ecc2f06964..1920374d7f 100644
--- a/tests/hwsim/test_nan.py
+++ b/tests/hwsim/test_nan.py
@@ -1746,7 +1746,8 @@ def test_nan_sae_pairing_bootstrap(dev, apdev, params):
     """NAN Pairing setup using opportunistic bootstrapping"""
     run_nan_pairing_bootstrap("SAE", password="password123")
 
-def run_nan_pairing_verification(pairing_type, password=None):
+def run_nan_pairing_verification(pairing_type, password=None,
+                                  send_followup=False):
     with hwsim_nan_radios(count=2) as [wpas1, wpas2], \
         NanDevice(wpas1, "nan0") as pub, NanDevice(wpas2, "nan1") as sub:
         paddr = pub.wpas.own_addr()
@@ -1787,6 +1788,25 @@ def run_nan_pairing_verification(pairing_type, password=None):
 
         run_nan_pairing(sub, pub, pid, sid, "PMK")
 
+        if send_followup:
+            # Send unicast follow-up to peer's NMI - should be PMF protected
+            # with NM-TK after verification pairing
+            sub.transmit(handle=sid, req_instance_id=pid,
+                         address=paddr, ssi="aabbccddeeff")
+
+            ev = pub.wpas.wait_event(["NAN-RECEIVE"], timeout=2)
+            if ev is None or f"address={saddr}" not in ev or \
+               "ssi=aabbccddeeff" not in ev:
+                raise Exception("NAN-RECEIVE followup event not seen")
+
+            pub.transmit(handle=pid, req_instance_id=sid,
+                         address=saddr, ssi="ffeeddccbbaa")
+
+            ev = sub.wpas.wait_event(["NAN-RECEIVE"], timeout=2)
+            if ev is None or f"address={paddr}" not in ev or \
+               "ssi=ffeeddccbbaa" not in ev:
+                raise Exception("NAN-RECEIVE followup event not seen")
+
 def test_nan_opportunistic_pairing(dev, apdev, params):
     """NAN Pairing setup using opportunistic bootstrapping"""
     run_nan_pairing_verification("PASN")
@@ -1795,6 +1815,11 @@ def test_nan_sae_pairing(dev, apdev, params):
     """NAN Pairing setup using a password (SAE)"""
     run_nan_pairing_verification("SAE", "nanpassword")
 
+def test_nan_prot_ucast_followup_after_verification(dev, apdev, params):
+    """NAN protected unicast follow-up after pairing verification"""
+    run_nan_pairing_verification("SAE", password="nanpassword",
+                                 send_followup=True)
+
 def test_nan_publish_with_pmk(dev, apdev, params):
     """NAN publish with PMK and cipher suites"""
     with hwsim_nan_radios(count=2) as [wpas1, wpas2], \
-- 
2.53.0




More information about the Hostap mailing list