Skip to content

Commit 1e948a9

Browse files
seankingyangIsaac_Yang
authored andcommitted
wifi: add support for wpa-psk-sha256
https://pad.lv/2085320 https://pad.lv/2084237
1 parent f0d64c4 commit 1e948a9

File tree

10 files changed

+125
-1
lines changed

10 files changed

+125
-1
lines changed

doc/netplan-yaml.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -910,7 +910,8 @@ interfaces, as well as individual Wi-Fi networks, by means of the `auth` block.
910910
- **`key-management`** (scalar)
911911

912912
> The supported key management modes are `none` (no key management);
913-
> `psk` (WPA with pre-shared key, common for home Wi-Fi); `eap` (WPA
913+
> `psk` (WPA with pre-shared key, common for home Wi-Fi); `psk-sha256`
914+
> (WPA2 with pre-shared key, common for home Wi-Fi); `eap` (WPA
914915
> with EAP, common for enterprise Wi-Fi); `eap-sha256` (used with WPA3-Enterprise);
915916
> `eap-suite-b-192` (used with WPA3-Enterprise); `sae` (used by WPA3);
916917
> and `802.1x` (used primarily for wired Ethernet connections).

src/abi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ typedef enum {
145145
NETPLAN_AUTH_KEY_MANAGEMENT_WPA_EAPSUITE_B_192,
146146
NETPLAN_AUTH_KEY_MANAGEMENT_8021X,
147147
NETPLAN_AUTH_KEY_MANAGEMENT_WPA_SAE,
148+
NETPLAN_AUTH_KEY_MANAGEMENT_WPA_PSKSHA256,
148149
NETPLAN_AUTH_KEY_MANAGEMENT_MAX,
149150
} NetplanAuthKeyManagementType;
150151

src/names.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ static const char* const
5959
netplan_auth_key_management_type_to_str[NETPLAN_AUTH_KEY_MANAGEMENT_MAX] = {
6060
[NETPLAN_AUTH_KEY_MANAGEMENT_NONE] = "none",
6161
[NETPLAN_AUTH_KEY_MANAGEMENT_WPA_PSK] = "psk",
62+
[NETPLAN_AUTH_KEY_MANAGEMENT_WPA_PSKSHA256] = "psk-sha256",
6263
[NETPLAN_AUTH_KEY_MANAGEMENT_WPA_EAP] = "eap",
6364
[NETPLAN_AUTH_KEY_MANAGEMENT_WPA_EAPSHA256] = "eap-sha256",
6465
[NETPLAN_AUTH_KEY_MANAGEMENT_WPA_EAPSUITE_B_192] = "eap-suite-b-192",

src/networkd.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,6 +1188,10 @@ append_wpa_auth_conf(GString* s, const NetplanAuthenticationSettings* auth, cons
11881188
g_string_append(s, " key_mgmt=WPA-PSK\n");
11891189
break;
11901190

1191+
case NETPLAN_AUTH_KEY_MANAGEMENT_WPA_PSKSHA256:
1192+
g_string_append(s, " key_mgmt=WPA-PSK WPA-PSK-SHA256\n");
1193+
break;
1194+
11911195
case NETPLAN_AUTH_KEY_MANAGEMENT_WPA_EAP:
11921196
g_string_append(s, " key_mgmt=WPA-EAP\n");
11931197
break;

src/nm.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,7 @@ write_wifi_auth_parameters(const NetplanAuthenticationSettings* auth, GKeyFile *
515515
case NETPLAN_AUTH_KEY_MANAGEMENT_NONE:
516516
break;
517517
case NETPLAN_AUTH_KEY_MANAGEMENT_WPA_PSK:
518+
case NETPLAN_AUTH_KEY_MANAGEMENT_WPA_PSKSHA256:
518519
g_key_file_set_string(kf, "wifi-security", "key-mgmt", "wpa-psk");
519520
break;
520521
case NETPLAN_AUTH_KEY_MANAGEMENT_WPA_EAP:

src/parse-nm.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,6 +1019,9 @@ netplan_parser_load_keyfile(NetplanParser* npp, const char* filename, GError** e
10191019
*/
10201020
if (ap->auth.key_management == NETPLAN_AUTH_KEY_MANAGEMENT_WPA_EAP)
10211021
ap->auth.key_management = NETPLAN_AUTH_KEY_MANAGEMENT_WPA_EAPSHA256;
1022+
/*The same logic is used for WPA-PSK*/
1023+
else if (ap->auth.key_management == NETPLAN_AUTH_KEY_MANAGEMENT_WPA_PSK)
1024+
ap->auth.key_management = NETPLAN_AUTH_KEY_MANAGEMENT_WPA_PSKSHA256;
10221025
break;
10231026

10241027
case 3:

src/parse.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,13 @@ handle_auth_key_management(NetplanParser* npp, yaml_node_t* node, __unused const
10151015
auth->key_management = NETPLAN_AUTH_KEY_MANAGEMENT_NONE;
10161016
else if (strcmp(scalar(node), "psk") == 0)
10171017
auth->key_management = NETPLAN_AUTH_KEY_MANAGEMENT_WPA_PSK;
1018+
else if (strcmp(scalar(node), "psk-sha256") == 0) {
1019+
/* WPA-PSK-SHA256 is commonly used with Protected Management Frames
1020+
* so let's set it as optional
1021+
*/
1022+
auth->key_management = NETPLAN_AUTH_KEY_MANAGEMENT_WPA_PSKSHA256;
1023+
auth->pmf_mode = NETPLAN_AUTH_PMF_MODE_OPTIONAL;
1024+
}
10181025
else if (strcmp(scalar(node), "eap") == 0)
10191026
auth->key_management = NETPLAN_AUTH_KEY_MANAGEMENT_WPA_EAP;
10201027
else if (strcmp(scalar(node), "eap-sha256") == 0) {

src/util.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,6 +1235,7 @@ gboolean
12351235
_is_auth_key_management_psk(const NetplanAuthenticationSettings* auth)
12361236
{
12371237
return ( auth->key_management == NETPLAN_AUTH_KEY_MANAGEMENT_WPA_PSK
1238+
|| auth->key_management == NETPLAN_AUTH_KEY_MANAGEMENT_WPA_PSKSHA256
12381239
|| auth->key_management == NETPLAN_AUTH_KEY_MANAGEMENT_WPA_SAE);
12391240
}
12401241

tests/generator/test_wifis.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,27 @@ def test_wifi_wowlan_default(self):
275275
self.assertTrue(os.path.islink(os.path.join(
276276
self.workdir.name, 'run/systemd/system/systemd-networkd.service.wants/netplan-wpa-wl0.service')))
277277

278+
def test_wifi_wpa_sha256(self):
279+
self.generate('''network:
280+
version: 2
281+
wifis:
282+
wl0:
283+
access-points:
284+
homenet:
285+
auth:
286+
key-management: psk-sha256
287+
password: "********"''')
288+
289+
self.assert_wpa_supplicant("wl0", """ctrl_interface=/run/wpa_supplicant
290+
291+
network={
292+
ssid=P"homenet"
293+
key_mgmt=WPA-PSK WPA-PSK-SHA256
294+
ieee80211w=1
295+
psk="********"
296+
}
297+
""")
298+
278299
def test_wifi_wpa3_personal(self):
279300
self.generate('''network:
280301
version: 2
@@ -794,6 +815,39 @@ def test_wifi_adhoc_wpa_5ghz(self):
794815
}
795816
""")
796817

818+
def test_wifi_wpa_sha256(self):
819+
self.generate('''network:
820+
version: 2
821+
renderer: NetworkManager
822+
wifis:
823+
wl0:
824+
access-points:
825+
homenet:
826+
auth:
827+
key-management: psk-sha256
828+
password: "********"''')
829+
830+
self.assert_nm({'wl0-homenet': '''[connection]
831+
id=netplan-wl0-homenet
832+
type=wifi
833+
interface-name=wl0
834+
835+
[ipv4]
836+
method=link-local
837+
838+
[ipv6]
839+
method=ignore
840+
841+
[wifi]
842+
ssid=homenet
843+
mode=infrastructure
844+
845+
[wifi-security]
846+
key-mgmt=wpa-psk
847+
pmf=2
848+
psk=********
849+
'''})
850+
797851
def test_wifi_wpa3_personal(self):
798852
self.generate('''network:
799853
version: 2

tests/parser/test_keyfile.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1505,6 +1505,57 @@ def test_keyfile_wpa3_sae(self):
15051505
name: "test2"
15061506
'''.format(UUID, UUID)})
15071507

1508+
def test_keyfile_wpa_sha256(self):
1509+
self.generate_from_keyfile('''[connection]
1510+
id=test2
1511+
uuid={}
1512+
type=wifi
1513+
interface-name=wlan0
1514+
1515+
[wifi]
1516+
mode=infrastructure
1517+
ssid=ubuntu-wpa-sha256
1518+
1519+
[wifi-security]
1520+
key-mgmt=wpa-psk
1521+
pmf=2
1522+
psk=test1234
1523+
1524+
[ipv4]
1525+
method=auto
1526+
1527+
[ipv6]
1528+
addr-gen-mode=stable-privacy
1529+
method=auto
1530+
1531+
[proxy]
1532+
'''.format(UUID))
1533+
self.assert_netplan({UUID: '''network:
1534+
version: 2
1535+
wifis:
1536+
NM-{}:
1537+
renderer: NetworkManager
1538+
match:
1539+
name: "wlan0"
1540+
dhcp4: true
1541+
dhcp6: true
1542+
ipv6-address-generation: "stable-privacy"
1543+
access-points:
1544+
"ubuntu-wpa-sha256":
1545+
auth:
1546+
key-management: "psk-sha256"
1547+
password: "test1234"
1548+
networkmanager:
1549+
uuid: "ff9d6ebc-226d-4f82-a485-b7ff83b9607f"
1550+
name: "test2"
1551+
passthrough:
1552+
ipv6.ip6-privacy: "-1"
1553+
proxy._: ""
1554+
networkmanager:
1555+
uuid: "{}"
1556+
name: "test2"
1557+
'''.format(UUID, UUID)})
1558+
15081559
def test_keyfile_wpa3_enterprise_eap_sha256(self):
15091560
self.generate_from_keyfile('''[connection]
15101561
id=test2

0 commit comments

Comments
 (0)