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

📄 wpa_common.c

📁 最新的Host AP 新添加了许多pcmcia 的驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
	pos = (const u8 *) (hdr + 1);	left = rsn_ie_len - sizeof(*hdr);	if (left >= RSN_SELECTOR_LEN) {		data->group_cipher = rsn_selector_to_bitfield(pos);#ifdef CONFIG_IEEE80211W		if (data->group_cipher == WPA_CIPHER_AES_128_CMAC) {			wpa_printf(MSG_DEBUG, "%s: AES-128-CMAC used as group "				   "cipher", __func__);			return -1;		}#endif /* CONFIG_IEEE80211W */		pos += RSN_SELECTOR_LEN;		left -= RSN_SELECTOR_LEN;	} else if (left > 0) {		wpa_printf(MSG_DEBUG, "%s: ie length mismatch, %u too much",			   __func__, left);		return -3;	}	if (left >= 2) {		data->pairwise_cipher = 0;		count = WPA_GET_LE16(pos);		pos += 2;		left -= 2;		if (count == 0 || left < count * RSN_SELECTOR_LEN) {			wpa_printf(MSG_DEBUG, "%s: ie count botch (pairwise), "				   "count %u left %u", __func__, count, left);			return -4;		}		for (i = 0; i < count; i++) {			data->pairwise_cipher |= rsn_selector_to_bitfield(pos);			pos += RSN_SELECTOR_LEN;			left -= RSN_SELECTOR_LEN;		}#ifdef CONFIG_IEEE80211W		if (data->pairwise_cipher & WPA_CIPHER_AES_128_CMAC) {			wpa_printf(MSG_DEBUG, "%s: AES-128-CMAC used as "				   "pairwise cipher", __func__);			return -1;		}#endif /* CONFIG_IEEE80211W */	} else if (left == 1) {		wpa_printf(MSG_DEBUG, "%s: ie too short (for key mgmt)",			   __func__);		return -5;	}	if (left >= 2) {		data->key_mgmt = 0;		count = WPA_GET_LE16(pos);		pos += 2;		left -= 2;		if (count == 0 || left < count * RSN_SELECTOR_LEN) {			wpa_printf(MSG_DEBUG, "%s: ie count botch (key mgmt), "				   "count %u left %u", __func__, count, left);			return -6;		}		for (i = 0; i < count; i++) {			data->key_mgmt |= rsn_key_mgmt_to_bitfield(pos);			pos += RSN_SELECTOR_LEN;			left -= RSN_SELECTOR_LEN;		}	} else if (left == 1) {		wpa_printf(MSG_DEBUG, "%s: ie too short (for capabilities)",			   __func__);		return -7;	}	if (left >= 2) {		data->capabilities = WPA_GET_LE16(pos);		pos += 2;		left -= 2;	}	if (left >= 2) {		data->num_pmkid = WPA_GET_LE16(pos);		pos += 2;		left -= 2;		if (left < (int) data->num_pmkid * PMKID_LEN) {			wpa_printf(MSG_DEBUG, "%s: PMKID underflow "				   "(num_pmkid=%lu left=%d)",				   __func__, (unsigned long) data->num_pmkid,				   left);			data->num_pmkid = 0;			return -9;		} else {			data->pmkid = pos;			pos += data->num_pmkid * PMKID_LEN;			left -= data->num_pmkid * PMKID_LEN;		}	}#ifdef CONFIG_IEEE80211W	if (left >= 4) {		data->mgmt_group_cipher = rsn_selector_to_bitfield(pos);		if (data->mgmt_group_cipher != WPA_CIPHER_AES_128_CMAC) {			wpa_printf(MSG_DEBUG, "%s: Unsupported management "				   "group cipher 0x%x", __func__,				   data->mgmt_group_cipher);			return -10;		}		pos += RSN_SELECTOR_LEN;		left -= RSN_SELECTOR_LEN;	}#endif /* CONFIG_IEEE80211W */	if (left > 0) {		wpa_printf(MSG_DEBUG, "%s: ie has %u trailing bytes - ignored",			   __func__, left);	}	return 0;#else /* CONFIG_NO_WPA2 */	return -1;#endif /* CONFIG_NO_WPA2 */}#ifdef CONFIG_IEEE80211R/** * wpa_derive_pmk_r0 - Derive PMK-R0 and PMKR0Name * * IEEE Std 802.11r-2008 - 8.5.1.5.3 */void wpa_derive_pmk_r0(const u8 *xxkey, size_t xxkey_len,		       const u8 *ssid, size_t ssid_len,		       const u8 *mdid, const u8 *r0kh_id, size_t r0kh_id_len,		       const u8 *s0kh_id, u8 *pmk_r0, u8 *pmk_r0_name){	u8 buf[1 + WPA_MAX_SSID_LEN + MOBILITY_DOMAIN_ID_LEN + 1 +	       FT_R0KH_ID_MAX_LEN + ETH_ALEN];	u8 *pos, r0_key_data[48], hash[32];	const u8 *addr[2];	size_t len[2];	/*	 * R0-Key-Data = KDF-384(XXKey, "FT-R0",	 *                       SSIDlength || SSID || MDID || R0KHlength ||	 *                       R0KH-ID || S0KH-ID)	 * XXKey is either the second 256 bits of MSK or PSK.	 * PMK-R0 = L(R0-Key-Data, 0, 256)	 * PMK-R0Name-Salt = L(R0-Key-Data, 256, 128)	 */	if (ssid_len > WPA_MAX_SSID_LEN || r0kh_id_len > FT_R0KH_ID_MAX_LEN)		return;	pos = buf;	*pos++ = ssid_len;	os_memcpy(pos, ssid, ssid_len);	pos += ssid_len;	os_memcpy(pos, mdid, MOBILITY_DOMAIN_ID_LEN);	pos += MOBILITY_DOMAIN_ID_LEN;	*pos++ = r0kh_id_len;	os_memcpy(pos, r0kh_id, r0kh_id_len);	pos += r0kh_id_len;	os_memcpy(pos, s0kh_id, ETH_ALEN);	pos += ETH_ALEN;	sha256_prf(xxkey, xxkey_len, "FT-R0", buf, pos - buf,		   r0_key_data, sizeof(r0_key_data));	os_memcpy(pmk_r0, r0_key_data, PMK_LEN);	/*	 * PMKR0Name = Truncate-128(SHA-256("FT-R0N" || PMK-R0Name-Salt)	 */	addr[0] = (const u8 *) "FT-R0N";	len[0] = 6;	addr[1] = r0_key_data + PMK_LEN;	len[1] = 16;	sha256_vector(2, addr, len, hash);	os_memcpy(pmk_r0_name, hash, WPA_PMK_NAME_LEN);}/** * wpa_derive_pmk_r1_name - Derive PMKR1Name * * IEEE Std 802.11r-2008 - 8.5.1.5.4 */void wpa_derive_pmk_r1_name(const u8 *pmk_r0_name, const u8 *r1kh_id,			    const u8 *s1kh_id, u8 *pmk_r1_name){	u8 hash[32];	const u8 *addr[4];	size_t len[4];	/*	 * PMKR1Name = Truncate-128(SHA-256("FT-R1N" || PMKR0Name ||	 *                                  R1KH-ID || S1KH-ID))	 */	addr[0] = (const u8 *) "FT-R1N";	len[0] = 6;	addr[1] = pmk_r0_name;	len[1] = WPA_PMK_NAME_LEN;	addr[2] = r1kh_id;	len[2] = FT_R1KH_ID_LEN;	addr[3] = s1kh_id;	len[3] = ETH_ALEN;	sha256_vector(4, addr, len, hash);	os_memcpy(pmk_r1_name, hash, WPA_PMK_NAME_LEN);}/** * wpa_derive_pmk_r1 - Derive PMK-R1 and PMKR1Name from PMK-R0 * * IEEE Std 802.11r-2008 - 8.5.1.5.4 */void wpa_derive_pmk_r1(const u8 *pmk_r0, const u8 *pmk_r0_name,		       const u8 *r1kh_id, const u8 *s1kh_id,		       u8 *pmk_r1, u8 *pmk_r1_name){	u8 buf[FT_R1KH_ID_LEN + ETH_ALEN];	u8 *pos;	/* PMK-R1 = KDF-256(PMK-R0, "FT-R1", R1KH-ID || S1KH-ID) */	pos = buf;	os_memcpy(pos, r1kh_id, FT_R1KH_ID_LEN);	pos += FT_R1KH_ID_LEN;	os_memcpy(pos, s1kh_id, ETH_ALEN);	pos += ETH_ALEN;	sha256_prf(pmk_r0, PMK_LEN, "FT-R1", buf, pos - buf, pmk_r1, PMK_LEN);	wpa_derive_pmk_r1_name(pmk_r0_name, r1kh_id, s1kh_id, pmk_r1_name);}/** * wpa_pmk_r1_to_ptk - Derive PTK and PTKName from PMK-R1 * * IEEE Std 802.11r-2008 - 8.5.1.5.5 */void wpa_pmk_r1_to_ptk(const u8 *pmk_r1, const u8 *snonce, const u8 *anonce,		       const u8 *sta_addr, const u8 *bssid,		       const u8 *pmk_r1_name,		       u8 *ptk, size_t ptk_len, u8 *ptk_name){	u8 buf[2 * WPA_NONCE_LEN + 2 * ETH_ALEN];	u8 *pos, hash[32];	const u8 *addr[6];	size_t len[6];	/*	 * PTK = KDF-PTKLen(PMK-R1, "FT-PTK", SNonce || ANonce ||	 *                  BSSID || STA-ADDR)	 */	pos = buf;	os_memcpy(pos, snonce, WPA_NONCE_LEN);	pos += WPA_NONCE_LEN;	os_memcpy(pos, anonce, WPA_NONCE_LEN);	pos += WPA_NONCE_LEN;	os_memcpy(pos, bssid, ETH_ALEN);	pos += ETH_ALEN;	os_memcpy(pos, sta_addr, ETH_ALEN);	pos += ETH_ALEN;	sha256_prf(pmk_r1, PMK_LEN, "FT-PTK", buf, pos - buf, ptk, ptk_len);	/*	 * PTKName = Truncate-128(SHA-256(PMKR1Name || "FT-PTKN" || SNonce ||	 *                                ANonce || BSSID || STA-ADDR))	 */	addr[0] = pmk_r1_name;	len[0] = WPA_PMK_NAME_LEN;	addr[1] = (const u8 *) "FT-PTKN";	len[1] = 7;	addr[2] = snonce;	len[2] = WPA_NONCE_LEN;	addr[3] = anonce;	len[3] = WPA_NONCE_LEN;	addr[4] = bssid;	len[4] = ETH_ALEN;	addr[5] = sta_addr;	len[5] = ETH_ALEN;	sha256_vector(6, addr, len, hash);	os_memcpy(ptk_name, hash, WPA_PMK_NAME_LEN);}#endif /* CONFIG_IEEE80211R */

⌨️ 快捷键说明

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