diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index bf5cf396d340..44b44ceee375 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -123,6 +123,8 @@ uint8_t ccp_rsn_oui_10[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x10}; uint8_t ccp_rsn_oui_11[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x11}; #endif uint8_t ccp_rsn_oui_12[HDD_RSN_OUI_SIZE] = {0x50, 0x6F, 0x9A, 0x02}; +uint8_t ccp_rsn_oui_0b[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x0B}; +uint8_t ccp_rsn_oui_0c[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x0C}; /* OWE https://tools.ietf.org/html/rfc8110 */ uint8_t ccp_rsn_oui_18[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x12}; @@ -4785,6 +4787,12 @@ eCsrAuthType hdd_translate_rsn_to_csr_auth_type(uint8_t auth_suite[4]) #endif if (memcmp(auth_suite, ccp_rsn_oui_12, 4) == 0) { auth_type = eCSR_AUTH_TYPE_DPP_RSN; + } else if (memcmp(auth_suite, ccp_rsn_oui_0b, 4) == 0) { + /* Check for Suite B EAP 256 */ + auth_type = eCSR_AUTH_TYPE_SUITEB_EAP_SHA256; + } else if (memcmp(auth_suite, ccp_rsn_oui_0c, 4) == 0) { + /* Check for Suite B EAP 384 */ + auth_type = eCSR_AUTH_TYPE_SUITEB_EAP_SHA384; } else { hdd_translate_fils_rsn_to_csr_auth(auth_suite, &auth_type); @@ -5249,6 +5257,22 @@ int hdd_set_csr_auth_type(struct hdd_adapter *adapter, /* OWE case */ roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_OWE; + } else if ((RSNAuthType == + eCSR_AUTH_TYPE_SUITEB_EAP_SHA256) && + ((pWextState-> + authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) + == IW_AUTH_KEY_MGMT_802_1X)) { + /* Suite B EAP SHA 256 */ + roam_profile->AuthType.authType[0] = + eCSR_AUTH_TYPE_SUITEB_EAP_SHA256; + } else if ((RSNAuthType == + eCSR_AUTH_TYPE_SUITEB_EAP_SHA384) && + ((pWextState-> + authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) + == IW_AUTH_KEY_MGMT_802_1X)) { + /* Suite B EAP SHA 384 */ + roam_profile->AuthType.authType[0] = + eCSR_AUTH_TYPE_SUITEB_EAP_SHA384; } else if ((pWextState-> authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) == IW_AUTH_KEY_MGMT_802_1X) { diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index e52b1282a0ad..cba2865d59a8 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -17180,6 +17180,15 @@ static int wlan_hdd_set_akm_suite(struct hdd_adapter *adapter, u32 key_mgmt) pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; break; + case WLAN_AKM_SUITE_EAP_SHA256: + hdd_debug("setting key mgmt type to EAP_SHA256"); + pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; + break; + case WLAN_AKM_SUITE_EAP_SHA384: + hdd_debug("setting key mgmt type to EAP_SHA384"); + pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; + break; + default: hdd_err("Unsupported key mgmt type: %d", key_mgmt); return -EINVAL; diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h index bea34786278e..f125ed0cc061 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.h +++ b/core/hdd/src/wlan_hdd_cfg80211.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -115,6 +115,9 @@ struct hdd_context; #endif #define WLAN_AKM_SUITE_OWE 0x000FAC12 +#define WLAN_AKM_SUITE_EAP_SHA256 0x000FAC0B +#define WLAN_AKM_SUITE_EAP_SHA384 0x000FAC0C + #ifdef FEATURE_WLAN_TDLS #define WLAN_IS_TDLS_SETUP_ACTION(action) \ diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index 18501e231f13..3399afad60cd 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -72,6 +72,8 @@ typedef enum { eCSR_AUTH_TYPE_FT_FILS_SHA384, eCSR_AUTH_TYPE_DPP_RSN, eCSR_AUTH_TYPE_OWE, + eCSR_AUTH_TYPE_SUITEB_EAP_SHA256, + eCSR_AUTH_TYPE_SUITEB_EAP_SHA384, eCSR_NUM_OF_SUPPORT_AUTH_TYPE, eCSR_AUTH_TYPE_FAILED = 0xff, eCSR_AUTH_TYPE_UNKNOWN = eCSR_AUTH_TYPE_FAILED, diff --git a/core/sme/src/csr/csr_api_scan.c b/core/sme/src/csr/csr_api_scan.c index 81693b783e76..f71d9b92ab78 100644 --- a/core/sme/src/csr/csr_api_scan.c +++ b/core/sme/src/csr/csr_api_scan.c @@ -5109,6 +5109,10 @@ static enum wlan_auth_type csr_covert_auth_type_new(eCsrAuthType auth) return WLAN_AUTH_TYPE_DPP_RSN; case eCSR_AUTH_TYPE_OWE: return WLAN_AUTH_TYPE_OWE; + case eCSR_AUTH_TYPE_SUITEB_EAP_SHA256: + return WLAN_AUTH_TYPE_SUITEB_EAP_SHA256; + case eCSR_AUTH_TYPE_SUITEB_EAP_SHA384: + return WLAN_AUTH_TYPE_SUITEB_EAP_SHA384; case eCSR_NUM_OF_SUPPORT_AUTH_TYPE: default: return WLAN_AUTH_TYPE_OPEN_SYSTEM; @@ -5162,6 +5166,10 @@ static eCsrAuthType csr_covert_auth_type_old(enum wlan_auth_type auth) return eCSR_AUTH_TYPE_DPP_RSN; case WLAN_AUTH_TYPE_OWE: return eCSR_AUTH_TYPE_OWE; + case WLAN_AUTH_TYPE_SUITEB_EAP_SHA256: + return eCSR_AUTH_TYPE_SUITEB_EAP_SHA256; + case WLAN_AUTH_TYPE_SUITEB_EAP_SHA384: + return eCSR_AUTH_TYPE_SUITEB_EAP_SHA384; case WLAN_NUM_OF_SUPPORT_AUTH_TYPE: default: return eCSR_AUTH_TYPE_OPEN_SYSTEM; diff --git a/core/sme/src/csr/csr_util.c b/core/sme/src/csr/csr_util.c index 68b3156b028a..5bf3aa00eb7d 100644 --- a/core/sme/src/csr/csr_util.c +++ b/core/sme/src/csr/csr_util.c @@ -119,6 +119,11 @@ uint8_t csr_rsn_oui[][CSR_RSN_OUI_SIZE] = { #define ENUM_OWE 16 /* OWE https://tools.ietf.org/html/rfc8110 */ {0x00, 0x0F, 0xAC, 0x12}, +#define ENUM_SUITEB_EAP256 17 + {0x00, 0x0F, 0xAC, 0x0B}, +#define ENUM_SUITEB_EAP384 18 + {0x00, 0x0F, 0xAC, 0x0C}, + /* define new oui here, update #define CSR_OUI_***_INDEX */ }; @@ -2429,6 +2434,8 @@ bool csr_is_profile_rsn(tCsrRoamProfile *pProfile) break; case eCSR_AUTH_TYPE_OWE: + case eCSR_AUTH_TYPE_SUITEB_EAP_SHA256: + case eCSR_AUTH_TYPE_SUITEB_EAP_SHA384: fRSNProfile = true; break; @@ -3226,6 +3233,41 @@ static bool csr_is_auth_wpa_owe(tpAniSirGlobal mac, (mac, all_suites, suite_count, csr_rsn_oui[ENUM_OWE], oui); } +/* + * csr_is_auth_suiteb_eap_256() - check whether oui is SuiteB EAP256 + * @mac: Global MAC context + * @all_suites: pointer to all supported akm suites + * @suite_count: all supported akm suites count + * @oui: Oui needs to be matched + * + * Return: True if OUI is SuiteB EAP256, false otherwise + */ +static bool csr_is_auth_suiteb_eap_256(tpAniSirGlobal mac, + uint8_t all_suites[][CSR_RSN_OUI_SIZE], + uint8_t suite_count, uint8_t oui[]) +{ + return csr_is_oui_match(mac, all_suites, suite_count, + csr_rsn_oui[ENUM_SUITEB_EAP256], oui); +} + +/* + * csr_is_auth_suiteb_eap_384() - check whether oui is SuiteB EAP384 + * @mac: Global MAC context + * @all_suites: pointer to all supported akm suites + * @suite_count: all supported akm suites count + * @oui: Oui needs to be matched + * + * Return: True if OUI is SuiteB EAP384, false otherwise + */ +static bool csr_is_auth_suiteb_eap_384(tpAniSirGlobal mac, + uint8_t all_suites[][CSR_RSN_OUI_SIZE], + uint8_t suite_count, uint8_t oui[]) +{ + return csr_is_oui_match(mac, all_suites, suite_count, + csr_rsn_oui[ENUM_SUITEB_EAP384], oui); +} + + static bool csr_is_auth_wpa(tpAniSirGlobal pMac, uint8_t AllSuites[][CSR_WPA_OUI_SIZE], uint8_t cAllSuites, uint8_t Oui[]) @@ -3493,6 +3535,20 @@ static bool csr_get_rsn_information(tHalHandle hal, tCsrAuthList *auth_type, if (eCSR_AUTH_TYPE_OWE == auth_type->authType[i]) neg_authtype = eCSR_AUTH_TYPE_OWE; } + if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) && + csr_is_auth_suiteb_eap_256(mac_ctx, authsuites, + c_auth_suites, authentication)) { + if (eCSR_AUTH_TYPE_SUITEB_EAP_SHA256 == + auth_type->authType[i]) + neg_authtype = eCSR_AUTH_TYPE_SUITEB_EAP_SHA256; + } + if ((neg_authtype == eCSR_AUTH_TYPE_UNKNOWN) && + csr_is_auth_suiteb_eap_384(mac_ctx, authsuites, + c_auth_suites, authentication)) { + if (eCSR_AUTH_TYPE_SUITEB_EAP_SHA384 == + auth_type->authType[i]) + neg_authtype = eCSR_AUTH_TYPE_SUITEB_EAP_SHA384; + } /* * The 1st auth type in the APs RSN IE, to match stations