Skip to content

Commit cf18c62

Browse files
masapnemesifier
authored andcommitted
[feature] OpenWrt: Added support for WPA3/WPA2 Enterprise Mixed #194
This patch is tested on these. - RADIUS authentication server: FreeRadius 3.0.25 - OpenWrt: latest (4b587f25614f3f7215360f96807ce760fa4ef3aa) - hardware: TP-Link Archer C6 v2 Related to #194 Signed-off-by: Masashi Honma <masashi.honma@gmail.com>
1 parent d74fa86 commit cf18c62

3 files changed

Lines changed: 141 additions & 0 deletions

File tree

netjsonconfig/backends/openwrt/converters/wireless.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ def __intermediate_encryption(self, wireless):
100100
'wpa2_enterprise': 'wpa2',
101101
'wpa3_enterprise': 'wpa3',
102102
'wpa_enterprise_mixed': 'wpa-mixed',
103+
'wpa2_enterprise_mixed': 'wpa3-mixed',
103104
'wps': 'psk',
104105
}
105106
# if encryption disabled return empty dict
@@ -128,6 +129,7 @@ def __intermediate_encryption(self, wireless):
128129
protocol == 'wpa3_personal'
129130
or protocol == 'wpa3_enterprise'
130131
or protocol == 'wpa2_personal_mixed'
132+
or protocol == 'wpa2_enterprise_mixed'
131133
):
132134
cipher = 'ccmp'
133135
if cipher and protocol.startswith('wpa') and cipher != 'auto':
@@ -270,6 +272,7 @@ def __netjson_encryption(self, wifi):
270272
'wpa2': 'wpa2_enterprise',
271273
'wpa3': 'wpa3_enterprise',
272274
'wpa-mixed': 'wpa_enterprise_mixed',
275+
'wpa3-mixed': 'wpa2_enterprise_mixed',
273276
}
274277
settings['protocol'] = protocol_mapping[protocol]
275278
settings['cipher'] = cipher

netjsonconfig/schema.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@
361361
{"$ref": "#/definitions/encryption_wpa3_personal"},
362362
{"$ref": "#/definitions/encryption_wpa3_enterprise_ap"},
363363
{"$ref": "#/definitions/encryption_wpa3_2_personal"},
364+
{"$ref": "#/definitions/encryption_wpa3_2_enterprise_ap"},
364365
{"$ref": "#/definitions/encryption_wpa_personal"},
365366
{"$ref": "#/definitions/encryption_wpa_enterprise_ap"},
366367
{"$ref": "#/definitions/encryption_wps"},
@@ -381,6 +382,7 @@
381382
{"$ref": "#/definitions/encryption_wpa3_personal"},
382383
{"$ref": "#/definitions/encryption_wpa3_enterprise_sta"},
383384
{"$ref": "#/definitions/encryption_wpa3_2_personal"},
385+
{"$ref": "#/definitions/encryption_wpa3_2_enterprise_sta"},
384386
{"$ref": "#/definitions/encryption_wpa_personal"},
385387
{"$ref": "#/definitions/encryption_wpa_enterprise_sta"},
386388
{"$ref": "#/definitions/encryption_wep"},
@@ -620,6 +622,17 @@
620622
}
621623
}
622624
},
625+
"encryption_wpa3_2_enterprise_base_settings": {
626+
"properties": {
627+
"protocol": {
628+
"type": "string",
629+
"title": "encryption protocol",
630+
"enum": ["wpa2_enterprise_mixed"],
631+
"options": {"enum_titles": ["WPA3/WPA2 Enterprise Mixed Mode"]},
632+
"propertyOrder": 1,
633+
}
634+
}
635+
},
623636
"encryption_wpa3_enterprise_ap": {
624637
"title": "WPA3 only Enterprise (access point)",
625638
"allOf": [
@@ -630,6 +643,16 @@
630643
{"$ref": "#/definitions/encryption_wpa_enterprise_ap_base_settings"},
631644
],
632645
},
646+
"encryption_wpa3_2_enterprise_ap": {
647+
"title": "WPA3/WPA2 Enterprise (access point)",
648+
"allOf": [
649+
{"$ref": "#/definitions/encryption_base_settings"},
650+
{"$ref": "#/definitions/encryption_cipher_property"},
651+
{"$ref": "#/definitions/encryption_mfp_property_optional"},
652+
{"$ref": "#/definitions/encryption_wpa3_2_enterprise_base_settings"},
653+
{"$ref": "#/definitions/encryption_wpa_enterprise_ap_base_settings"},
654+
],
655+
},
633656
"encryption_wpa3_enterprise_sta": {
634657
"title": "WPA3 only Enterprise (client)",
635658
"additionalProperties": True,
@@ -640,6 +663,16 @@
640663
{"$ref": "#/definitions/encryption_wpa_enterprise_sta_base_settings"},
641664
],
642665
},
666+
"encryption_wpa3_2_enterprise_sta": {
667+
"title": "WPA3/WPA2 Enterprise (client)",
668+
"additionalProperties": True,
669+
"allOf": [
670+
{"$ref": "#/definitions/encryption_cipher_property"},
671+
{"$ref": "#/definitions/encryption_mfp_property_optional"},
672+
{"$ref": "#/definitions/encryption_wpa3_2_enterprise_base_settings"},
673+
{"$ref": "#/definitions/encryption_wpa_enterprise_sta_base_settings"},
674+
],
675+
},
643676
"encryption_wpa_enterprise_base_settings": {
644677
"properties": {
645678
"protocol": {

tests/openwrt/test_encryption.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,55 @@ def test_parse_wpa_personal(self):
240240
o = OpenWrt(native=self._wpa_personal_uci)
241241
self.assertEqual(o.config, self._wpa_personal_netjson)
242242

243+
_wpa2_enterprise_mixed_ap_netjson = {
244+
"interfaces": [
245+
{
246+
"name": "wlan0",
247+
"type": "wireless",
248+
"wireless": {
249+
"radio": "radio0",
250+
"mode": "access_point",
251+
"ssid": "enterprise-mixed",
252+
"encryption": {
253+
"protocol": "wpa2_enterprise_mixed",
254+
"cipher": "ccmp",
255+
"key": "radius_secret",
256+
"server": "192.168.0.1",
257+
"ieee80211w": "1",
258+
},
259+
},
260+
}
261+
]
262+
}
263+
_wpa2_enterprise_mixed_ap_uci = """package network
264+
265+
config interface 'wlan0'
266+
option ifname 'wlan0'
267+
option proto 'none'
268+
269+
package wireless
270+
271+
config wifi-iface 'wifi_wlan0'
272+
option device 'radio0'
273+
option encryption 'wpa3-mixed+ccmp'
274+
option ieee80211w '1'
275+
option ifname 'wlan0'
276+
option key 'radius_secret'
277+
option mode 'ap'
278+
option network 'wlan0'
279+
option server '192.168.0.1'
280+
option ssid 'enterprise-mixed'
281+
"""
282+
283+
def test_render_wpa2_enterprise_mixed_ap(self):
284+
o = OpenWrt(self._wpa2_enterprise_mixed_ap_netjson)
285+
expected = self._tabs(self._wpa2_enterprise_mixed_ap_uci)
286+
self.assertEqual(o.render(), expected)
287+
288+
def test_parse_wpa2_enterprise_mixed_ap(self):
289+
o = OpenWrt(native=self._wpa2_enterprise_mixed_ap_uci)
290+
self.assertEqual(o.config, self._wpa2_enterprise_mixed_ap_netjson)
291+
243292
_wpa3_enterprise_ap_netjson = {
244293
"interfaces": [
245294
{
@@ -1012,3 +1061,59 @@ def test_render_ieee80211w(self):
10121061
OpenWrt(_netjson_wpa2_personal_mixed_cipher_tkip).render(),
10131062
_uci_wpa2_personal_mixed_cipher_tkip,
10141063
)
1064+
1065+
_netjson_wpa2_enterprise_mixed_cipher_tkip = {
1066+
"interfaces": [
1067+
{
1068+
"name": "wlan0",
1069+
"type": "wireless",
1070+
"wireless": {
1071+
"radio": "radio0",
1072+
"mode": "access_point",
1073+
"ssid": "wpa3-enterprise",
1074+
"encryption": {
1075+
"protocol": "wpa2_enterprise_mixed",
1076+
"cipher": "tkip",
1077+
"key": "radius_secret",
1078+
"server": "192.168.0.1",
1079+
"port": 1812,
1080+
"acct_server": "192.168.0.2",
1081+
"acct_port": 1813,
1082+
"nasid": "2",
1083+
"wpa_group_rekey": "350",
1084+
"ieee80211w": "2",
1085+
},
1086+
},
1087+
}
1088+
]
1089+
}
1090+
_uci_wpa2_enterprise_mixed_cipher_tkip = self._tabs(
1091+
"""package network
1092+
1093+
config interface 'wlan0'
1094+
option ifname 'wlan0'
1095+
option proto 'none'
1096+
1097+
package wireless
1098+
1099+
config wifi-iface 'wifi_wlan0'
1100+
option acct_port '1813'
1101+
option acct_server '192.168.0.2'
1102+
option device 'radio0'
1103+
option encryption 'wpa3-mixed+ccmp'
1104+
option ieee80211w '2'
1105+
option ifname 'wlan0'
1106+
option key 'radius_secret'
1107+
option mode 'ap'
1108+
option nasid '2'
1109+
option network 'wlan0'
1110+
option port '1812'
1111+
option server '192.168.0.1'
1112+
option ssid 'wpa3-enterprise'
1113+
option wpa_group_rekey '350'
1114+
"""
1115+
)
1116+
self.assertEqual(
1117+
OpenWrt(_netjson_wpa2_enterprise_mixed_cipher_tkip).render(),
1118+
_uci_wpa2_enterprise_mixed_cipher_tkip,
1119+
)

0 commit comments

Comments
 (0)