tests: EAP-SIM/AKA/AKA' with SQLite
Extend EAP-SIM/AKA/AKA' test coverage by setting up another authentication server instance to store dynamic SIM/AKA/AKA' information into an SQLite database. This allows the stored reauth/pseudonym data to be modified on the server side and by doing so, allows testing fallback from reauth to pseudonym/permanent identity. Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
		
							parent
							
								
									04cad507e1
								
							
						
					
					
						commit
						5b1aaf6cfb
					
				
					 4 changed files with 208 additions and 4 deletions
				
			
		
							
								
								
									
										21
									
								
								tests/hwsim/auth_serv/as2.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								tests/hwsim/auth_serv/as2.conf
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| driver=none | ||||
| radius_server_clients=auth_serv/radius_clients.conf | ||||
| radius_server_auth_port=1814 | ||||
| eap_server=1 | ||||
| eap_user_file=auth_serv/eap_user.conf | ||||
| 
 | ||||
| interface=as2 | ||||
| ctrl_interface=/var/run/hostapd | ||||
| ctrl_interface_group=admin | ||||
| 
 | ||||
| ca_cert=auth_serv/ca.pem | ||||
| server_cert=auth_serv/server.pem | ||||
| private_key=auth_serv/server.key | ||||
| ocsp_stapling_response=auth_serv/ocsp-server-cache.der | ||||
| server_id=server2.w1.fi | ||||
| eap_sim_db=unix:/tmp/hlr_auc_gw.sock db=LOGDIR/hostapd.db | ||||
| dh_file=auth_serv/dh.conf | ||||
| pac_opaque_encr_key=000102030405060708090a0b0c0d0e0f | ||||
| eap_fast_a_id=101112131415161718191a1b1c1d1e1f | ||||
| eap_fast_a_id_info=test server2 | ||||
| eap_sim_aka_result_ind=1 | ||||
|  | @ -64,7 +64,7 @@ CONFIG_NO_RANDOM_POOL=y | |||
| CONFIG_WNM=y | ||||
| CONFIG_INTERWORKING=y | ||||
| CONFIG_HS20=y | ||||
| #CONFIG_SQLITE=y | ||||
| CONFIG_SQLITE=y | ||||
| CONFIG_SAE=y | ||||
| CFLAGS += -DALL_DH_GROUPS | ||||
| 
 | ||||
|  |  | |||
|  | @ -43,6 +43,7 @@ for i in 0 1 2; do | |||
| done | ||||
| 
 | ||||
| sed "s/group=admin/group=$GROUP/" "$DIR/auth_serv/as.conf" > "$LOGDIR/as.conf" | ||||
| sed "s/group=admin/group=$GROUP/;s%LOGDIR%$LOGDIR%" "$DIR/auth_serv/as2.conf" > "$LOGDIR/as2.conf" | ||||
| 
 | ||||
| if [ "$1" = "valgrind" ]; then | ||||
|     VALGRIND=y | ||||
|  | @ -87,7 +88,8 @@ if [ -x $HLR_AUC_GW ]; then | |||
|     sudo $HLR_AUC_GW -u -m $LOGDIR/hlr_auc_gw.milenage_db -g $DIR/auth_serv/hlr_auc_gw.gsm > $LOGDIR/hlr_auc_gw & | ||||
| fi | ||||
| 
 | ||||
| sudo $HAPD_AS -ddKt $LOGDIR/as.conf > $LOGDIR/auth_serv & | ||||
| touch $LOGDIR/hostapd.db | ||||
| sudo $HAPD_AS -ddKt $LOGDIR/as.conf $LOGDIR/as2.conf > $LOGDIR/auth_serv & | ||||
| 
 | ||||
| # wait for programs to be fully initialized | ||||
| for i in 0 1 2; do | ||||
|  |  | |||
|  | @ -96,9 +96,10 @@ def eap_check_auth(dev, method, initial, rsn=True, sha256=False, | |||
|     if status["key_mgmt"] != e: | ||||
|         raise Exception("Unexpected key_mgmt status: " + status["key_mgmt"]) | ||||
| 
 | ||||
| def eap_reauth(dev, method, rsn=True, sha256=False): | ||||
| def eap_reauth(dev, method, rsn=True, sha256=False, expect_failure=False): | ||||
|     dev.request("REAUTHENTICATE") | ||||
|     eap_check_auth(dev, method, False, rsn=rsn, sha256=sha256) | ||||
|     eap_check_auth(dev, method, False, rsn=rsn, sha256=sha256, | ||||
|                    expect_failure=expect_failure) | ||||
| 
 | ||||
| def test_ap_wpa2_eap_sim(dev, apdev): | ||||
|     """WPA2-Enterprise connection using EAP-SIM""" | ||||
|  | @ -124,6 +125,66 @@ def test_ap_wpa2_eap_sim(dev, apdev): | |||
|                 password="ffdca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581", | ||||
|                 expect_failure=True) | ||||
| 
 | ||||
| def test_ap_wpa2_eap_sim_sql(dev, apdev, params): | ||||
|     """WPA2-Enterprise connection using EAP-SIM (SQL)""" | ||||
|     if not os.path.exists("/tmp/hlr_auc_gw.sock"): | ||||
|         logger.info("No hlr_auc_gw available"); | ||||
|         return "skip" | ||||
|     try: | ||||
|         import sqlite3 | ||||
|     except ImportError: | ||||
|         return "skip" | ||||
|     con = sqlite3.connect(os.path.join(params['logdir'], "hostapd.db")) | ||||
|     params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap") | ||||
|     params['auth_server_port'] = "1814" | ||||
|     hostapd.add_ap(apdev[0]['ifname'], params) | ||||
|     eap_connect(dev[0], apdev[0], "SIM", "1232010000000000", | ||||
|                 password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581") | ||||
| 
 | ||||
|     logger.info("SIM fast re-authentication") | ||||
|     eap_reauth(dev[0], "SIM") | ||||
| 
 | ||||
|     logger.info("SIM full auth with pseudonym") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("DELETE FROM reauth WHERE permanent='1232010000000000'") | ||||
|     eap_reauth(dev[0], "SIM") | ||||
| 
 | ||||
|     logger.info("SIM full auth with permanent identity") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("DELETE FROM reauth WHERE permanent='1232010000000000'") | ||||
|         cur.execute("DELETE FROM pseudonyms WHERE permanent='1232010000000000'") | ||||
|     eap_reauth(dev[0], "SIM") | ||||
| 
 | ||||
|     logger.info("SIM reauth with mismatching MK") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("UPDATE reauth SET mk='0000000000000000000000000000000000000000' WHERE permanent='1232010000000000'") | ||||
|     eap_reauth(dev[0], "SIM", expect_failure=True) | ||||
|     dev[0].request("REMOVE_NETWORK all") | ||||
| 
 | ||||
|     eap_connect(dev[0], apdev[0], "SIM", "1232010000000000", | ||||
|                 password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("UPDATE reauth SET counter='10' WHERE permanent='1232010000000000'") | ||||
|     eap_reauth(dev[0], "SIM") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("UPDATE reauth SET counter='10' WHERE permanent='1232010000000000'") | ||||
|     logger.info("SIM reauth with mismatching counter") | ||||
|     eap_reauth(dev[0], "SIM") | ||||
|     dev[0].request("REMOVE_NETWORK all") | ||||
| 
 | ||||
|     eap_connect(dev[0], apdev[0], "SIM", "1232010000000000", | ||||
|                 password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("UPDATE reauth SET counter='1001' WHERE permanent='1232010000000000'") | ||||
|     logger.info("SIM reauth with max reauth count reached") | ||||
|     eap_reauth(dev[0], "SIM") | ||||
| 
 | ||||
| def test_ap_wpa2_eap_aka(dev, apdev): | ||||
|     """WPA2-Enterprise connection using EAP-AKA""" | ||||
|     if not os.path.exists("/tmp/hlr_auc_gw.sock"): | ||||
|  | @ -142,6 +203,66 @@ def test_ap_wpa2_eap_aka(dev, apdev): | |||
|                 password="ffdca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123", | ||||
|                 expect_failure=True) | ||||
| 
 | ||||
| def test_ap_wpa2_eap_aka_sql(dev, apdev, params): | ||||
|     """WPA2-Enterprise connection using EAP-AKA (SQL)""" | ||||
|     if not os.path.exists("/tmp/hlr_auc_gw.sock"): | ||||
|         logger.info("No hlr_auc_gw available"); | ||||
|         return "skip" | ||||
|     try: | ||||
|         import sqlite3 | ||||
|     except ImportError: | ||||
|         return "skip" | ||||
|     con = sqlite3.connect(os.path.join(params['logdir'], "hostapd.db")) | ||||
|     params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap") | ||||
|     params['auth_server_port'] = "1814" | ||||
|     hostapd.add_ap(apdev[0]['ifname'], params) | ||||
|     eap_connect(dev[0], apdev[0], "AKA", "0232010000000000", | ||||
|                 password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123") | ||||
| 
 | ||||
|     logger.info("AKA fast re-authentication") | ||||
|     eap_reauth(dev[0], "AKA") | ||||
| 
 | ||||
|     logger.info("AKA full auth with pseudonym") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("DELETE FROM reauth WHERE permanent='0232010000000000'") | ||||
|     eap_reauth(dev[0], "AKA") | ||||
| 
 | ||||
|     logger.info("AKA full auth with permanent identity") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("DELETE FROM reauth WHERE permanent='0232010000000000'") | ||||
|         cur.execute("DELETE FROM pseudonyms WHERE permanent='0232010000000000'") | ||||
|     eap_reauth(dev[0], "AKA") | ||||
| 
 | ||||
|     logger.info("AKA reauth with mismatching MK") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("UPDATE reauth SET mk='0000000000000000000000000000000000000000' WHERE permanent='0232010000000000'") | ||||
|     eap_reauth(dev[0], "AKA", expect_failure=True) | ||||
|     dev[0].request("REMOVE_NETWORK all") | ||||
| 
 | ||||
|     eap_connect(dev[0], apdev[0], "AKA", "0232010000000000", | ||||
|                 password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("UPDATE reauth SET counter='10' WHERE permanent='0232010000000000'") | ||||
|     eap_reauth(dev[0], "AKA") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("UPDATE reauth SET counter='10' WHERE permanent='0232010000000000'") | ||||
|     logger.info("AKA reauth with mismatching counter") | ||||
|     eap_reauth(dev[0], "AKA") | ||||
|     dev[0].request("REMOVE_NETWORK all") | ||||
| 
 | ||||
|     eap_connect(dev[0], apdev[0], "AKA", "0232010000000000", | ||||
|                 password="90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82581:000000000123") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("UPDATE reauth SET counter='1001' WHERE permanent='0232010000000000'") | ||||
|     logger.info("AKA reauth with max reauth count reached") | ||||
|     eap_reauth(dev[0], "AKA") | ||||
| 
 | ||||
| def test_ap_wpa2_eap_aka_prime(dev, apdev): | ||||
|     """WPA2-Enterprise connection using EAP-AKA'""" | ||||
|     if not os.path.exists("/tmp/hlr_auc_gw.sock"): | ||||
|  | @ -160,6 +281,66 @@ def test_ap_wpa2_eap_aka_prime(dev, apdev): | |||
|                 password="ff22250214c33e723a5dd523fc145fc0:981d464c7c52eb6e5036234984ad0bcf:000000000123", | ||||
|                 expect_failure=True) | ||||
| 
 | ||||
| def test_ap_wpa2_eap_aka_prime_sql(dev, apdev, params): | ||||
|     """WPA2-Enterprise connection using EAP-AKA' (SQL)""" | ||||
|     if not os.path.exists("/tmp/hlr_auc_gw.sock"): | ||||
|         logger.info("No hlr_auc_gw available"); | ||||
|         return "skip" | ||||
|     try: | ||||
|         import sqlite3 | ||||
|     except ImportError: | ||||
|         return "skip" | ||||
|     con = sqlite3.connect(os.path.join(params['logdir'], "hostapd.db")) | ||||
|     params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap") | ||||
|     params['auth_server_port'] = "1814" | ||||
|     hostapd.add_ap(apdev[0]['ifname'], params) | ||||
|     eap_connect(dev[0], apdev[0], "AKA'", "6555444333222111", | ||||
|                 password="5122250214c33e723a5dd523fc145fc0:981d464c7c52eb6e5036234984ad0bcf:000000000123") | ||||
| 
 | ||||
|     logger.info("AKA' fast re-authentication") | ||||
|     eap_reauth(dev[0], "AKA'") | ||||
| 
 | ||||
|     logger.info("AKA' full auth with pseudonym") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("DELETE FROM reauth WHERE permanent='6555444333222111'") | ||||
|     eap_reauth(dev[0], "AKA'") | ||||
| 
 | ||||
|     logger.info("AKA' full auth with permanent identity") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("DELETE FROM reauth WHERE permanent='6555444333222111'") | ||||
|         cur.execute("DELETE FROM pseudonyms WHERE permanent='6555444333222111'") | ||||
|     eap_reauth(dev[0], "AKA'") | ||||
| 
 | ||||
|     logger.info("AKA' reauth with mismatching k_aut") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("UPDATE reauth SET k_aut='0000000000000000000000000000000000000000000000000000000000000000' WHERE permanent='6555444333222111'") | ||||
|     eap_reauth(dev[0], "AKA'", expect_failure=True) | ||||
|     dev[0].request("REMOVE_NETWORK all") | ||||
| 
 | ||||
|     eap_connect(dev[0], apdev[0], "AKA'", "6555444333222111", | ||||
|                 password="5122250214c33e723a5dd523fc145fc0:981d464c7c52eb6e5036234984ad0bcf:000000000123") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("UPDATE reauth SET counter='10' WHERE permanent='6555444333222111'") | ||||
|     eap_reauth(dev[0], "AKA'") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("UPDATE reauth SET counter='10' WHERE permanent='6555444333222111'") | ||||
|     logger.info("AKA' reauth with mismatching counter") | ||||
|     eap_reauth(dev[0], "AKA'") | ||||
|     dev[0].request("REMOVE_NETWORK all") | ||||
| 
 | ||||
|     eap_connect(dev[0], apdev[0], "AKA'", "6555444333222111", | ||||
|                 password="5122250214c33e723a5dd523fc145fc0:981d464c7c52eb6e5036234984ad0bcf:000000000123") | ||||
|     with con: | ||||
|         cur = con.cursor() | ||||
|         cur.execute("UPDATE reauth SET counter='1001' WHERE permanent='6555444333222111'") | ||||
|     logger.info("AKA' reauth with max reauth count reached") | ||||
|     eap_reauth(dev[0], "AKA'") | ||||
| 
 | ||||
| def test_ap_wpa2_eap_ttls_pap(dev, apdev): | ||||
|     """WPA2-Enterprise connection using EAP-TTLS/PAP""" | ||||
|     params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap") | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Jouni Malinen
						Jouni Malinen