]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
tests: SAE PWE derivation methods
authorJouni Malinen <jouni@codeaurora.org>
Thu, 5 Sep 2019 09:34:48 +0000 (12:34 +0300)
committerJouni Malinen <j@w1.fi>
Tue, 15 Oct 2019 12:39:22 +0000 (15:39 +0300)
Verify behavior with sae_pwe configuration values 0..2, i.e., test the
new hash-to-element mechanism for deriving PWE and negotiation for which
method to use.

Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
tests/hwsim/test_sae.py
tests/hwsim/test_wpas_ap.py

index 1035f16d7c4279aa4d974ba9cda5ab09398feee1..2f612dfe76d731b7948b30d1fb364addbe7f2f22 100644 (file)
@@ -1709,3 +1709,172 @@ def test_sae_confirm_immediate(dev, apdev):
 
     dev[0].request("SET sae_groups ")
     dev[0].connect("test-sae", psk="12345678", key_mgmt="SAE", scan_freq="2412")
+
+def test_sae_pwe_group_19(dev, apdev):
+    """SAE PWE derivation options with group 19"""
+    run_sae_pwe_group(dev, apdev, 19)
+
+def test_sae_pwe_group_20(dev, apdev):
+    """SAE PWE derivation options with group 20"""
+    run_sae_pwe_group(dev, apdev, 20)
+
+def test_sae_pwe_group_21(dev, apdev):
+    """SAE PWE derivation options with group 21"""
+    run_sae_pwe_group(dev, apdev, 21)
+
+def test_sae_pwe_group_25(dev, apdev):
+    """SAE PWE derivation options with group 21"""
+    run_sae_pwe_group(dev, apdev, 21)
+
+def test_sae_pwe_group_26(dev, apdev):
+    """SAE PWE derivation options with group 21"""
+    run_sae_pwe_group(dev, apdev, 21)
+
+def test_sae_pwe_group_28(dev, apdev):
+    """SAE PWE derivation options with group 21"""
+    run_sae_pwe_group(dev, apdev, 21)
+
+def test_sae_pwe_group_29(dev, apdev):
+    """SAE PWE derivation options with group 21"""
+    run_sae_pwe_group(dev, apdev, 21)
+
+def test_sae_pwe_group_30(dev, apdev):
+    """SAE PWE derivation options with group 21"""
+    run_sae_pwe_group(dev, apdev, 21)
+
+def test_sae_pwe_group_1(dev, apdev):
+    """SAE PWE derivation options with group 1"""
+    run_sae_pwe_group(dev, apdev, 1)
+
+def test_sae_pwe_group_2(dev, apdev):
+    """SAE PWE derivation options with group 2"""
+    run_sae_pwe_group(dev, apdev, 2)
+
+def test_sae_pwe_group_5(dev, apdev):
+    """SAE PWE derivation options with group 5"""
+    run_sae_pwe_group(dev, apdev, 5)
+
+def test_sae_pwe_group_14(dev, apdev):
+    """SAE PWE derivation options with group 14"""
+    run_sae_pwe_group(dev, apdev, 14)
+
+def test_sae_pwe_group_15(dev, apdev):
+    """SAE PWE derivation options with group 15"""
+    run_sae_pwe_group(dev, apdev, 15)
+
+def test_sae_pwe_group_16(dev, apdev):
+    """SAE PWE derivation options with group 16"""
+    run_sae_pwe_group(dev, apdev, 16)
+
+def test_sae_pwe_group_22(dev, apdev):
+    """SAE PWE derivation options with group 22"""
+    run_sae_pwe_group(dev, apdev, 22)
+
+def test_sae_pwe_group_23(dev, apdev):
+    """SAE PWE derivation options with group 23"""
+    run_sae_pwe_group(dev, apdev, 23)
+
+def test_sae_pwe_group_24(dev, apdev):
+    """SAE PWE derivation options with group 24"""
+    run_sae_pwe_group(dev, apdev, 24)
+
+def start_sae_pwe_ap(apdev, group, sae_pwe):
+    params = hostapd.wpa2_params(ssid="sae-pwe", passphrase="12345678")
+    params['wpa_key_mgmt'] = 'SAE'
+    params['sae_groups'] = str(group)
+    params['sae_pwe'] = str(sae_pwe)
+    return hostapd.add_ap(apdev, params)
+
+def run_sae_pwe_group(dev, apdev, group):
+    if "SAE" not in dev[0].get_capability("auth_alg"):
+        raise HwsimSkip("SAE not supported")
+    tls = dev[0].request("GET tls_library")
+    if group in [27, 28, 29, 30]:
+        if tls.startswith("OpenSSL") and "run=OpenSSL 1." in tls:
+            logger.info("Add Brainpool EC groups since OpenSSL is new enough")
+        else:
+            raise HwsimSkip("Brainpool curve not supported")
+    start_sae_pwe_ap(apdev[0], group, 2)
+    try:
+        check_sae_pwe_group(dev[0], group, 0)
+        check_sae_pwe_group(dev[0], group, 1)
+        check_sae_pwe_group(dev[0], group, 2)
+    finally:
+        dev[0].set("sae_groups", "")
+        dev[0].set("sae_pwe", "0")
+
+def check_sae_pwe_group(dev, group, sae_pwe):
+    dev.set("sae_groups", str(group))
+    dev.set("sae_pwe", str(sae_pwe))
+    dev.connect("sae-pwe", psk="12345678", key_mgmt="SAE", scan_freq="2412")
+    dev.request("REMOVE_NETWORK all")
+    dev.wait_disconnected()
+    dev.dump_monitor()
+
+def test_sae_pwe_h2e_only_ap(dev, apdev):
+    """SAE PWE derivation with H2E-only AP"""
+    start_sae_pwe_ap(apdev[0], 19, 1)
+    try:
+        check_sae_pwe_group(dev[0], 19, 1)
+        check_sae_pwe_group(dev[0], 19, 2)
+    finally:
+        dev[0].set("sae_groups", "")
+        dev[0].set("sae_pwe", "0")
+
+    dev[0].connect("sae-pwe", psk="12345678", key_mgmt="SAE", scan_freq="2412",
+                   wait_connect=False)
+    ev = dev[0].wait_event(["CTRL-EVENT-NETWORK-NOT-FOUND"], timeout=10)
+    if ev is None:
+        raise Exception("No indication of mismatching network seen")
+
+def test_sae_pwe_loop_only_ap(dev, apdev):
+    """SAE PWE derivation with loop-only AP"""
+    start_sae_pwe_ap(apdev[0], 19, 0)
+    try:
+        check_sae_pwe_group(dev[0], 19, 0)
+        check_sae_pwe_group(dev[0], 19, 2)
+        dev[0].set("sae_pwe", "1")
+        dev[0].connect("sae-pwe", psk="12345678", key_mgmt="SAE",
+                       scan_freq="2412", wait_connect=False)
+        ev = dev[0].wait_event(["CTRL-EVENT-NETWORK-NOT-FOUND"], timeout=10)
+        if ev is None:
+            raise Exception("No indication of mismatching network seen")
+    finally:
+        dev[0].set("sae_groups", "")
+        dev[0].set("sae_pwe", "0")
+
+def test_sae_h2e_rejected_groups(dev, apdev):
+    """SAE H2E and rejected groups indication"""
+    params = hostapd.wpa2_params(ssid="sae-pwe", passphrase="12345678")
+    params['wpa_key_mgmt'] = 'SAE'
+    params['sae_groups'] = "19"
+    params['sae_pwe'] = "1"
+    hapd = hostapd.add_ap(apdev[0], params)
+    try:
+        dev[0].set("sae_groups", "21 20 19")
+        dev[0].set("sae_pwe", "1")
+        dev[0].connect("sae-pwe", psk="12345678", key_mgmt="SAE",
+                       scan_freq="2412")
+    finally:
+        dev[0].set("sae_groups", "")
+        dev[0].set("sae_pwe", "0")
+
+def test_sae_h2e_password_id(dev, apdev):
+    """SAE H2E and password identifier"""
+    if "SAE" not in dev[0].get_capability("auth_alg"):
+        raise HwsimSkip("SAE not supported")
+    params = hostapd.wpa2_params(ssid="test-sae")
+    params['wpa_key_mgmt'] = 'SAE'
+    params['sae_pwe'] = '1'
+    params['sae_password'] = 'secret|id=pw id'
+    hapd = hostapd.add_ap(apdev[0], params)
+
+    try:
+        dev[0].request("SET sae_groups ")
+        dev[0].set("sae_pwe", "1")
+        dev[0].connect("test-sae", sae_password="secret",
+                       sae_password_id="pw id",
+                       key_mgmt="SAE", scan_freq="2412")
+    finally:
+        dev[0].set("sae_groups", "")
+        dev[0].set("sae_pwe", "0")
index 92b39d0150197f6b8e20ec4cda42d668dbadfc95..5d6dfeddea8ac2b323a4b25dfcd13feefb7ad006 100644 (file)
@@ -771,7 +771,17 @@ def test_wpas_ap_sae_password(dev):
     """wpa_supplicant AP mode - SAE using sae_password"""
     run_wpas_ap_sae(dev, True)
 
-def run_wpas_ap_sae(dev, sae_password):
+def test_wpas_ap_sae_pwe_1(dev):
+    """wpa_supplicant AP mode - SAE using sae_password and sae_pwe=1"""
+    try:
+        dev[0].set("sae_pwe", "1")
+        dev[1].set("sae_pwe", "1")
+        run_wpas_ap_sae(dev, True, sae_password_id=True)
+    finally:
+        dev[0].set("sae_pwe", "0")
+        dev[1].set("sae_pwe", "0")
+
+def run_wpas_ap_sae(dev, sae_password, sae_password_id=False):
     if "SAE" not in dev[0].get_capability("auth_alg"):
         raise HwsimSkip("SAE not supported")
     if "SAE" not in dev[1].get_capability("auth_alg"):
@@ -788,6 +798,11 @@ def run_wpas_ap_sae(dev, sae_password):
         dev[0].set_network_quoted(id, "sae_password", "12345678")
     else:
         dev[0].set_network_quoted(id, "psk", "12345678")
+    if sae_password_id:
+        pw_id = "pw id"
+        dev[0].set_network_quoted(id, "sae_password_id", pw_id)
+    else:
+        pw_id = None
     dev[0].set_network(id, "frequency", "2412")
     dev[0].set_network(id, "scan_freq", "2412")
     dev[0].set_network(id, "wps_disabled", "1")
@@ -795,5 +810,5 @@ def run_wpas_ap_sae(dev, sae_password):
     wait_ap_ready(dev[0])
 
     dev[1].request("SET sae_groups ")
-    dev[1].connect("wpas-ap-sae", key_mgmt="SAE", psk="12345678",
-                   scan_freq="2412")
+    dev[1].connect("wpas-ap-sae", key_mgmt="SAE", sae_password="12345678",
+                   sae_password_id=pw_id, scan_freq="2412")