⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wpa_auth_ie.c

📁 最新的Host AP 新添加了许多pcmcia 的驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
	const u8 *aa;	const u8 *spa;	const u8 *pmkid;};static int wpa_auth_okc_iter(struct wpa_authenticator *a, void *ctx){	struct wpa_auth_okc_iter_data *data = ctx;	data->pmksa = pmksa_cache_get_okc(a->pmksa, data->aa, data->spa,					  data->pmkid);	if (data->pmksa)		return 1;	return 0;}int wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth,			struct wpa_state_machine *sm,			const u8 *wpa_ie, size_t wpa_ie_len,			const u8 *mdie, size_t mdie_len){	struct wpa_ie_data data;	int ciphers, key_mgmt, res, version;	u32 selector;	size_t i;	const u8 *pmkid = NULL;	if (wpa_auth == NULL || sm == NULL)		return WPA_NOT_ENABLED;	if (wpa_ie == NULL || wpa_ie_len < 1)		return WPA_INVALID_IE;	if (wpa_ie[0] == WLAN_EID_RSN)		version = WPA_PROTO_RSN;	else		version = WPA_PROTO_WPA;	if (!(wpa_auth->conf.wpa & version)) {		wpa_printf(MSG_DEBUG, "Invalid WPA proto (%d) from " MACSTR,			   version, MAC2STR(sm->addr));		return WPA_INVALID_PROTO;	}	if (version == WPA_PROTO_RSN) {		res = wpa_parse_wpa_ie_rsn(wpa_ie, wpa_ie_len, &data);		selector = RSN_AUTH_KEY_MGMT_UNSPEC_802_1X;		if (0) {		}#ifdef CONFIG_IEEE80211R		else if (data.key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)			selector = RSN_AUTH_KEY_MGMT_FT_802_1X;		else if (data.key_mgmt & WPA_KEY_MGMT_FT_PSK)			selector = RSN_AUTH_KEY_MGMT_FT_PSK;#endif /* CONFIG_IEEE80211R */#ifdef CONFIG_IEEE80211W		else if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256)			selector = RSN_AUTH_KEY_MGMT_802_1X_SHA256;		else if (data.key_mgmt & WPA_KEY_MGMT_PSK_SHA256)			selector = RSN_AUTH_KEY_MGMT_PSK_SHA256;#endif /* CONFIG_IEEE80211W */		else if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X)			selector = RSN_AUTH_KEY_MGMT_UNSPEC_802_1X;		else if (data.key_mgmt & WPA_KEY_MGMT_PSK)			selector = RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X;		wpa_auth->dot11RSNAAuthenticationSuiteSelected = selector;		selector = RSN_CIPHER_SUITE_CCMP;		if (data.pairwise_cipher & WPA_CIPHER_CCMP)			selector = RSN_CIPHER_SUITE_CCMP;		else if (data.pairwise_cipher & WPA_CIPHER_TKIP)			selector = RSN_CIPHER_SUITE_TKIP;		else if (data.pairwise_cipher & WPA_CIPHER_WEP104)			selector = RSN_CIPHER_SUITE_WEP104;		else if (data.pairwise_cipher & WPA_CIPHER_WEP40)			selector = RSN_CIPHER_SUITE_WEP40;		else if (data.pairwise_cipher & WPA_CIPHER_NONE)			selector = RSN_CIPHER_SUITE_NONE;		wpa_auth->dot11RSNAPairwiseCipherSelected = selector;		selector = RSN_CIPHER_SUITE_CCMP;		if (data.group_cipher & WPA_CIPHER_CCMP)			selector = RSN_CIPHER_SUITE_CCMP;		else if (data.group_cipher & WPA_CIPHER_TKIP)			selector = RSN_CIPHER_SUITE_TKIP;		else if (data.group_cipher & WPA_CIPHER_WEP104)			selector = RSN_CIPHER_SUITE_WEP104;		else if (data.group_cipher & WPA_CIPHER_WEP40)			selector = RSN_CIPHER_SUITE_WEP40;		else if (data.group_cipher & WPA_CIPHER_NONE)			selector = RSN_CIPHER_SUITE_NONE;		wpa_auth->dot11RSNAGroupCipherSelected = selector;	} else {		res = wpa_parse_wpa_ie_wpa(wpa_ie, wpa_ie_len, &data);		selector = WPA_AUTH_KEY_MGMT_UNSPEC_802_1X;		if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X)			selector = WPA_AUTH_KEY_MGMT_UNSPEC_802_1X;		else if (data.key_mgmt & WPA_KEY_MGMT_PSK)			selector = WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X;		wpa_auth->dot11RSNAAuthenticationSuiteSelected = selector;		selector = WPA_CIPHER_SUITE_TKIP;		if (data.pairwise_cipher & WPA_CIPHER_CCMP)			selector = WPA_CIPHER_SUITE_CCMP;		else if (data.pairwise_cipher & WPA_CIPHER_TKIP)			selector = WPA_CIPHER_SUITE_TKIP;		else if (data.pairwise_cipher & WPA_CIPHER_WEP104)			selector = WPA_CIPHER_SUITE_WEP104;		else if (data.pairwise_cipher & WPA_CIPHER_WEP40)			selector = WPA_CIPHER_SUITE_WEP40;		else if (data.pairwise_cipher & WPA_CIPHER_NONE)			selector = WPA_CIPHER_SUITE_NONE;		wpa_auth->dot11RSNAPairwiseCipherSelected = selector;		selector = WPA_CIPHER_SUITE_TKIP;		if (data.group_cipher & WPA_CIPHER_CCMP)			selector = WPA_CIPHER_SUITE_CCMP;		else if (data.group_cipher & WPA_CIPHER_TKIP)			selector = WPA_CIPHER_SUITE_TKIP;		else if (data.group_cipher & WPA_CIPHER_WEP104)			selector = WPA_CIPHER_SUITE_WEP104;		else if (data.group_cipher & WPA_CIPHER_WEP40)			selector = WPA_CIPHER_SUITE_WEP40;		else if (data.group_cipher & WPA_CIPHER_NONE)			selector = WPA_CIPHER_SUITE_NONE;		wpa_auth->dot11RSNAGroupCipherSelected = selector;	}	if (res) {		wpa_printf(MSG_DEBUG, "Failed to parse WPA/RSN IE from "			   MACSTR " (res=%d)", MAC2STR(sm->addr), res);		wpa_hexdump(MSG_DEBUG, "WPA/RSN IE", wpa_ie, wpa_ie_len);		return WPA_INVALID_IE;	}	if (data.group_cipher != wpa_auth->conf.wpa_group) {		wpa_printf(MSG_DEBUG, "Invalid WPA group cipher (0x%x) from "			   MACSTR, data.group_cipher, MAC2STR(sm->addr));		return WPA_INVALID_GROUP;	}	key_mgmt = data.key_mgmt & wpa_auth->conf.wpa_key_mgmt;	if (!key_mgmt) {		wpa_printf(MSG_DEBUG, "Invalid WPA key mgmt (0x%x) from "			   MACSTR, data.key_mgmt, MAC2STR(sm->addr));		return WPA_INVALID_AKMP;	}	if (0) {	}#ifdef CONFIG_IEEE80211R	else if (key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)		sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;	else if (key_mgmt & WPA_KEY_MGMT_FT_PSK)		sm->wpa_key_mgmt = WPA_KEY_MGMT_FT_PSK;#endif /* CONFIG_IEEE80211R */#ifdef CONFIG_IEEE80211W	else if (key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256)		sm->wpa_key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;	else if (key_mgmt & WPA_KEY_MGMT_PSK_SHA256)		sm->wpa_key_mgmt = WPA_KEY_MGMT_PSK_SHA256;#endif /* CONFIG_IEEE80211W */	else if (key_mgmt & WPA_KEY_MGMT_IEEE8021X)		sm->wpa_key_mgmt = WPA_KEY_MGMT_IEEE8021X;	else		sm->wpa_key_mgmt = WPA_KEY_MGMT_PSK;	if (version == WPA_PROTO_RSN)		ciphers = data.pairwise_cipher & wpa_auth->conf.rsn_pairwise;	else		ciphers = data.pairwise_cipher & wpa_auth->conf.wpa_pairwise;	if (!ciphers) {		wpa_printf(MSG_DEBUG, "Invalid %s pairwise cipher (0x%x) "			   "from " MACSTR,			   version == WPA_PROTO_RSN ? "RSN" : "WPA",			   data.pairwise_cipher, MAC2STR(sm->addr));		return WPA_INVALID_PAIRWISE;	}#ifdef CONFIG_IEEE80211W	if (wpa_auth->conf.ieee80211w == WPA_IEEE80211W_REQUIRED) {		if (!(data.capabilities & WPA_CAPABILITY_MFPC)) {			wpa_printf(MSG_DEBUG, "Management frame protection "				   "required, but client did not enable it");			return WPA_MGMT_FRAME_PROTECTION_VIOLATION;		}		if (ciphers & WPA_CIPHER_TKIP) {			wpa_printf(MSG_DEBUG, "Management frame protection "				   "cannot use TKIP");			return WPA_MGMT_FRAME_PROTECTION_VIOLATION;		}		if (data.mgmt_group_cipher != WPA_CIPHER_AES_128_CMAC) {			wpa_printf(MSG_DEBUG, "Unsupported management group "				   "cipher %d", data.mgmt_group_cipher);			return WPA_INVALID_MGMT_GROUP_CIPHER;		}	}	if (wpa_auth->conf.ieee80211w == WPA_NO_IEEE80211W ||	    !(data.capabilities & WPA_CAPABILITY_MFPC))		sm->mgmt_frame_prot = 0;	else		sm->mgmt_frame_prot = 1;#endif /* CONFIG_IEEE80211W */#ifdef CONFIG_IEEE80211R	if (wpa_key_mgmt_ft(sm->wpa_key_mgmt)) {		if (mdie == NULL || mdie_len < MOBILITY_DOMAIN_ID_LEN + 1) {			wpa_printf(MSG_DEBUG, "RSN: Trying to use FT, but "				   "MDIE not included");			return WPA_INVALID_MDIE;		}		if (os_memcmp(mdie, wpa_auth->conf.mobility_domain,			      MOBILITY_DOMAIN_ID_LEN) != 0) {			wpa_hexdump(MSG_DEBUG, "RSN: Attempted to use unknown "				    "MDIE", mdie, MOBILITY_DOMAIN_ID_LEN);			return WPA_INVALID_MDIE;		}	}#endif /* CONFIG_IEEE80211R */	if (ciphers & WPA_CIPHER_CCMP)		sm->pairwise = WPA_CIPHER_CCMP;	else		sm->pairwise = WPA_CIPHER_TKIP;	/* TODO: clear WPA/WPA2 state if STA changes from one to another */	if (wpa_ie[0] == WLAN_EID_RSN)		sm->wpa = WPA_VERSION_WPA2;	else		sm->wpa = WPA_VERSION_WPA;	sm->pmksa = NULL;	for (i = 0; i < data.num_pmkid; i++) {		wpa_hexdump(MSG_DEBUG, "RSN IE: STA PMKID",			    &data.pmkid[i * PMKID_LEN], PMKID_LEN);		sm->pmksa = pmksa_cache_get(wpa_auth->pmksa, sm->addr,					    &data.pmkid[i * PMKID_LEN]);		if (sm->pmksa) {			pmkid = sm->pmksa->pmkid;			break;		}	}	for (i = 0; sm->pmksa == NULL && wpa_auth->conf.okc &&		     i < data.num_pmkid; i++) {		struct wpa_auth_okc_iter_data idata;		idata.pmksa = NULL;		idata.aa = wpa_auth->addr;		idata.spa = sm->addr;		idata.pmkid = &data.pmkid[i * PMKID_LEN];		wpa_auth_for_each_auth(wpa_auth, wpa_auth_okc_iter, &idata);		if (idata.pmksa) {			wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,					 "OKC match for PMKID");			sm->pmksa = pmksa_cache_add_okc(wpa_auth->pmksa,							idata.pmksa,							wpa_auth->addr,							idata.pmkid);			pmkid = idata.pmkid;			break;		}	}	if (sm->pmksa) {		wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_DEBUG,				 "PMKID found from PMKSA cache "				 "eap_type=%d vlan_id=%d",				 sm->pmksa->eap_type_authsrv,				 sm->pmksa->vlan_id);		os_memcpy(wpa_auth->dot11RSNAPMKIDUsed, pmkid, PMKID_LEN);	}	if (sm->wpa_ie == NULL || sm->wpa_ie_len < wpa_ie_len) {		os_free(sm->wpa_ie);		sm->wpa_ie = os_malloc(wpa_ie_len);		if (sm->wpa_ie == NULL)			return WPA_ALLOC_FAIL;	}	os_memcpy(sm->wpa_ie, wpa_ie, wpa_ie_len);	sm->wpa_ie_len = wpa_ie_len;	return WPA_IE_OK;}/** * wpa_parse_generic - Parse EAPOL-Key Key Data Generic IEs * @pos: Pointer to the IE header * @end: Pointer to the end of the Key Data buffer * @ie: Pointer to parsed IE data * Returns: 0 on success, 1 if end mark is found, -1 on failure */static int wpa_parse_generic(const u8 *pos, const u8 *end,			     struct wpa_eapol_ie_parse *ie){	if (pos[1] == 0)		return 1;	if (pos[1] >= 6 &&	    RSN_SELECTOR_GET(pos + 2) == WPA_OUI_TYPE &&	    pos[2 + WPA_SELECTOR_LEN] == 1 &&	    pos[2 + WPA_SELECTOR_LEN + 1] == 0) {		ie->wpa_ie = pos;		ie->wpa_ie_len = pos[1] + 2;		return 0;	}	if (pos + 1 + RSN_SELECTOR_LEN < end &&	    pos[1] >= RSN_SELECTOR_LEN + PMKID_LEN &&	    RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_PMKID) {		ie->pmkid = pos + 2 + RSN_SELECTOR_LEN;		return 0;	}	if (pos[1] > RSN_SELECTOR_LEN + 2 &&	    RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_GROUPKEY) {		ie->gtk = pos + 2 + RSN_SELECTOR_LEN;		ie->gtk_len = pos[1] - RSN_SELECTOR_LEN;		return 0;	}	if (pos[1] > RSN_SELECTOR_LEN + 2 &&	    RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_MAC_ADDR) {		ie->mac_addr = pos + 2 + RSN_SELECTOR_LEN;		ie->mac_addr_len = pos[1] - RSN_SELECTOR_LEN;		return 0;	}#ifdef CONFIG_PEERKEY	if (pos[1] > RSN_SELECTOR_LEN + 2 &&	    RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_SMK) {		ie->smk = pos + 2 + RSN_SELECTOR_LEN;		ie->smk_len = pos[1] - RSN_SELECTOR_LEN;		return 0;	}	if (pos[1] > RSN_SELECTOR_LEN + 2 &&	    RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_NONCE) {		ie->nonce = pos + 2 + RSN_SELECTOR_LEN;		ie->nonce_len = pos[1] - RSN_SELECTOR_LEN;		return 0;	}	if (pos[1] > RSN_SELECTOR_LEN + 2 &&	    RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_LIFETIME) {		ie->lifetime = pos + 2 + RSN_SELECTOR_LEN;		ie->lifetime_len = pos[1] - RSN_SELECTOR_LEN;		return 0;	}	if (pos[1] > RSN_SELECTOR_LEN + 2 &&	    RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_ERROR) {		ie->error = pos + 2 + RSN_SELECTOR_LEN;		ie->error_len = pos[1] - RSN_SELECTOR_LEN;		return 0;	}#endif /* CONFIG_PEERKEY */#ifdef CONFIG_IEEE80211W	if (pos[1] > RSN_SELECTOR_LEN + 2 &&	    RSN_SELECTOR_GET(pos + 2) == RSN_KEY_DATA_IGTK) {		ie->igtk = pos + 2 + RSN_SELECTOR_LEN;		ie->igtk_len = pos[1] - RSN_SELECTOR_LEN;		return 0;	}#endif /* CONFIG_IEEE80211W */	return 0;}/** * wpa_parse_kde_ies - Parse EAPOL-Key Key Data IEs * @buf: Pointer to the Key Data buffer * @len: Key Data Length * @ie: Pointer to parsed IE data * Returns: 0 on success, -1 on failure */int wpa_parse_kde_ies(const u8 *buf, size_t len, struct wpa_eapol_ie_parse *ie){	const u8 *pos, *end;	int ret = 0;	os_memset(ie, 0, sizeof(*ie));	for (pos = buf, end = pos + len; pos + 1 < end; pos += 2 + pos[1]) {		if (pos[0] == 0xdd &&		    ((pos == buf + len - 1) || pos[1] == 0)) {			/* Ignore padding */			break;		}		if (pos + 2 + pos[1] > end) {			wpa_printf(MSG_DEBUG, "WPA: EAPOL-Key Key Data "				   "underflow (ie=%d len=%d pos=%d)",				   pos[0], pos[1], (int) (pos - buf));			wpa_hexdump_key(MSG_DEBUG, "WPA: Key Data",					buf, len);			ret = -1;			break;		}		if (*pos == WLAN_EID_RSN) {			ie->rsn_ie = pos;			ie->rsn_ie_len = pos[1] + 2;#ifdef CONFIG_IEEE80211R		} else if (*pos == WLAN_EID_MOBILITY_DOMAIN) {			ie->mdie = pos;			ie->mdie_len = pos[1] + 2;#endif /* CONFIG_IEEE80211R */		} else if (*pos == WLAN_EID_VENDOR_SPECIFIC) {			ret = wpa_parse_generic(pos, end, ie);			if (ret < 0)				break;			if (ret > 0) {				ret = 0;				break;			}		} else {			wpa_hexdump(MSG_DEBUG, "WPA: Unrecognized EAPOL-Key "				    "Key Data IE", pos, 2 + pos[1]);		}	}	return ret;}int wpa_auth_uses_mfp(struct wpa_state_machine *sm){	return sm ? sm->mgmt_frame_prot : 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -