b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | From: Rohan Dutta <drohan@codeaurora.org> |
| 2 | Date: Tue, 27 Oct 2020 12:09:10 +0200 |
| 3 | Subject: [PATCH] cfg80211: Add support to configure SAE PWE value to drivers |
| 4 | |
| 5 | Add support to configure SAE PWE preference from userspace to drivers in |
| 6 | both AP and STA modes. This is needed for cases where the driver takes |
| 7 | care of Authentication frame processing (SME in the driver) so that |
| 8 | correct enforcement of the acceptable PWE derivation mechanism can be |
| 9 | performed. |
| 10 | |
| 11 | The userspace applications can pass the sae_pwe value using the |
| 12 | NL80211_ATTR_SAE_PWE attribute in the NL80211_CMD_CONNECT and |
| 13 | NL80211_CMD_START_AP commands to the driver. This allows selection |
| 14 | between the hunting-and-pecking loop and hash-to-element options for PWE |
| 15 | derivation. For backwards compatibility, this new attribute is optional |
| 16 | and if not included, the driver is notified of the value being |
| 17 | unspecified. |
| 18 | |
| 19 | Signed-off-by: Rohan Dutta <drohan@codeaurora.org> |
| 20 | Signed-off-by: Jouni Malinen <jouni@codeaurora.org> |
| 21 | Link: https://lore.kernel.org/r/20201027100910.22283-1-jouni@codeaurora.org |
| 22 | Signed-off-by: Johannes Berg <johannes.berg@intel.com> |
| 23 | --- |
| 24 | |
| 25 | --- a/include/net/cfg80211.h |
| 26 | +++ b/include/net/cfg80211.h |
| 27 | @@ -1009,6 +1009,14 @@ struct survey_info { |
| 28 | * @sae_pwd: password for SAE authentication (for devices supporting SAE |
| 29 | * offload) |
| 30 | * @sae_pwd_len: length of SAE password (for devices supporting SAE offload) |
| 31 | + * @sae_pwe: The mechanisms allowed for SAE PWE derivation |
| 32 | + * NL80211_SAE_PWE_UNSPECIFIED: Not-specified, used to indicate userspace |
| 33 | + * did not specify any preference. The driver should follow its |
| 34 | + * internal policy in such a scenario. |
| 35 | + * NL80211_SAE_PWE_HUNT_AND_PECK: Allow hunting-and-pecking loop only |
| 36 | + * NL80211_SAE_PWE_HASH_TO_ELEMENT: Allow hash-to-element only |
| 37 | + * NL80211_SAE_PWE_BOTH: Allow either hunting-and-pecking loop |
| 38 | + * or hash-to-element |
| 39 | */ |
| 40 | struct cfg80211_crypto_settings { |
| 41 | u32 wpa_versions; |
| 42 | @@ -1027,6 +1035,7 @@ struct cfg80211_crypto_settings { |
| 43 | const u8 *psk; |
| 44 | const u8 *sae_pwd; |
| 45 | u8 sae_pwd_len; |
| 46 | + enum nl80211_sae_pwe_mechanism sae_pwe; |
| 47 | }; |
| 48 | |
| 49 | /** |
| 50 | --- a/net/wireless/nl80211.c |
| 51 | +++ b/net/wireless/nl80211.c |
| 52 | @@ -741,6 +741,9 @@ static const struct nla_policy nl80211_p |
| 53 | NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), |
| 54 | [NL80211_ATTR_S1G_CAPABILITY_MASK] = |
| 55 | NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), |
| 56 | + [NL80211_ATTR_SAE_PWE] = |
| 57 | + NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK, |
| 58 | + NL80211_SAE_PWE_BOTH), |
| 59 | [NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT }, |
| 60 | }; |
| 61 | |
| 62 | @@ -9778,6 +9781,12 @@ static int nl80211_crypto_settings(struc |
| 63 | nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); |
| 64 | } |
| 65 | |
| 66 | + if (info->attrs[NL80211_ATTR_SAE_PWE]) |
| 67 | + settings->sae_pwe = |
| 68 | + nla_get_u8(info->attrs[NL80211_ATTR_SAE_PWE]); |
| 69 | + else |
| 70 | + settings->sae_pwe = NL80211_SAE_PWE_UNSPECIFIED; |
| 71 | + |
| 72 | return 0; |
| 73 | } |
| 74 | |