]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrMisc.c
NetworkPkg: Add Wi-Fi Wpa3 support in WifiConnectManager
[mirror_edk2.git] / NetworkPkg / WifiConnectionManagerDxe / WifiConnectionMgrMisc.c
index 4e7c2417186a4e98d0f7a7cebb40811e56604695..4ad5643c2453a47ee005d10228f4850ccaf9939b 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   The Miscellaneous Routines for WiFi Connection Manager.\r
 \r
-  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2019 - 2022, Intel Corporation. All rights reserved.<BR>\r
 \r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
@@ -9,6 +9,24 @@
 \r
 #include "WifiConnectionMgrDxe.h"\r
 \r
+//\r
+//  STA AKM preference order\r
+//  REF: https://www.wi-fi.org/file/wpa3-specification\r
+//\r
+STATIC UINT32  mAKMSuitePreference[] = {\r
+  IEEE_80211_AKM_SUITE_8021X_SUITE_B192,            // AKM Suite 12\r
+  IEEE_80211_AKM_SUITE_8021X_SUITE_B,               // AKM Suite 11\r
+  IEEE_80211_AKM_SUITE_8021X_OR_PMKSA_SHA256,       // AKM Suite 5\r
+  IEEE_80211_AKM_SUITE_8021X_OR_PMKSA,              // AKM Suite 1\r
+\r
+  IEEE_80211_AKM_SUITE_SAE,                         // AKM Suite 8\r
+  IEEE_80211_AKM_SUITE_PSK_SHA256,                  // AKM Suite 6\r
+  IEEE_80211_AKM_SUITE_PSK,                         // AKM Suite 2\r
+\r
+  IEEE_80211_AKM_SUITE_OWE                          // AKM Suite 18\r
+};\r
+#define AKM_SUITE_PREFERENCE_COUNT  (sizeof (mAKMSuitePreference)  / sizeof (UINT32))\r
+\r
 /**\r
   Empty function for event process function.\r
 \r
@@ -340,7 +358,7 @@ WifiMgrCheckRSN (
   EFI_80211_AKM_SUITE_SELECTOR     *SupportedAKMSuites;\r
   EFI_80211_CIPHER_SUITE_SELECTOR  *SupportedSwCipherSuites;\r
   EFI_80211_CIPHER_SUITE_SELECTOR  *SupportedHwCipherSuites;\r
-  EFI_80211_SUITE_SELECTOR         *AKMSuite;\r
+  UINT32                           *AKMSuite;\r
   EFI_80211_SUITE_SELECTOR         *CipherSuite;\r
   UINT16                           AKMIndex;\r
   UINT16                           CipherIndex;\r
@@ -371,18 +389,29 @@ WifiMgrCheckRSN (
     return EFI_SUCCESS;\r
   }\r
 \r
-  for (AKMIndex = 0; AKMIndex < AKMList->AKMSuiteCount; AKMIndex++) {\r
-    AKMSuite = AKMList->AKMSuiteList + AKMIndex;\r
-    if (WifiMgrSupportAKMSuite (\r
-          SupportedAKMSuites->AKMSuiteCount,\r
-          (UINT32 *)SupportedAKMSuites->AKMSuiteList,\r
-          (UINT32 *)AKMSuite\r
-          ))\r
+  for (AKMIndex = 0; AKMIndex < AKM_SUITE_PREFERENCE_COUNT; AKMIndex++) {\r
+    AKMSuite = mAKMSuitePreference + AKMIndex;\r
+    if (WifiMgrSupportAKMSuite (AKMList->AKMSuiteCount, (UINT32 *)AKMList->AKMSuiteList, AKMSuite) &&\r
+        WifiMgrSupportAKMSuite (SupportedAKMSuites->AKMSuiteCount, (UINT32 *)SupportedAKMSuites->AKMSuiteList, AKMSuite))\r
     {\r
       if ((AKMSuiteSupported != NULL) && (CipherSuiteSupported != NULL)) {\r
         *AKMSuiteSupported = TRUE;\r
       }\r
 \r
+      //\r
+      // OWE transition mode allow CipherSuiteCount is 0\r
+      //\r
+      if (CipherList->CipherSuiteCount == 0) {\r
+        *SecurityType = WifiMgrGetSecurityType ((UINT32 *)AKMSuite, NULL);\r
+        if (*SecurityType != SECURITY_TYPE_UNKNOWN) {\r
+          if ((AKMSuiteSupported != NULL) && (CipherSuiteSupported != NULL)) {\r
+            *CipherSuiteSupported = TRUE;\r
+          }\r
+\r
+          return EFI_SUCCESS;\r
+        }\r
+      }\r
+\r
       for (CipherIndex = 0; CipherIndex < CipherList->CipherSuiteCount; CipherIndex++) {\r
         CipherSuite = CipherList->CipherSuiteList + CipherIndex;\r
 \r
@@ -450,6 +479,10 @@ WifiMgrGetSecurityType (
   IN  UINT32  *CipherSuite\r
   )\r
 {\r
+  if ((AKMSuite != NULL) && (*AKMSuite == IEEE_80211_AKM_SUITE_OWE)) {\r
+    return SECURITY_TYPE_NONE;\r
+  }\r
+\r
   if (CipherSuite == NULL) {\r
     if (AKMSuite == NULL) {\r
       return SECURITY_TYPE_NONE;\r
@@ -471,8 +504,10 @@ WifiMgrGetSecurityType (
       return SECURITY_TYPE_UNKNOWN;\r
     }\r
 \r
-    if ((*AKMSuite == IEEE_80211_AKM_SUITE_8021X_OR_PMKSA) ||\r
-        (*AKMSuite == IEEE_80211_AKM_SUITE_8021X_OR_PMKSA_SHA256))\r
+    if (*AKMSuite == IEEE_80211_AKM_SUITE_SAE) {\r
+      return SECURITY_TYPE_WPA3_PERSONAL;\r
+    } else if ((*AKMSuite == IEEE_80211_AKM_SUITE_8021X_OR_PMKSA) ||\r
+               (*AKMSuite == IEEE_80211_AKM_SUITE_8021X_OR_PMKSA_SHA256))\r
     {\r
       return SECURITY_TYPE_WPA2_ENTERPRISE;\r
     } else if ((*AKMSuite == IEEE_80211_AKM_SUITE_PSK) ||\r
@@ -498,6 +533,26 @@ WifiMgrGetSecurityType (
     } else {\r
       return SECURITY_TYPE_UNKNOWN;\r
     }\r
+  } else if (*CipherSuite == IEEE_80211_PAIRWISE_CIPHER_SUITE_GCMP) {\r
+    if (AKMSuite == NULL) {\r
+      return SECURITY_TYPE_UNKNOWN;\r
+    }\r
+\r
+    if (*AKMSuite == IEEE_80211_AKM_SUITE_8021X_SUITE_B) {\r
+      return SECURITY_TYPE_WPA3_ENTERPRISE;\r
+    } else {\r
+      return SECURITY_TYPE_UNKNOWN;\r
+    }\r
+  } else if (*CipherSuite == IEEE_80211_PAIRWISE_CIPHER_SUITE_GCMP256) {\r
+    if (AKMSuite == NULL) {\r
+      return SECURITY_TYPE_UNKNOWN;\r
+    }\r
+\r
+    if (*AKMSuite == IEEE_80211_AKM_SUITE_8021X_SUITE_B192) {\r
+      return SECURITY_TYPE_WPA3_ENTERPRISE;\r
+    } else {\r
+      return SECURITY_TYPE_UNKNOWN;\r
+    }\r
   } else {\r
     return SECURITY_TYPE_UNKNOWN;\r
   }\r