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

📄 wpa_common.c

📁 最新的Host AP 新添加了许多pcmcia 的驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * WPA/RSN - Shared functions for supplicant and authenticator * Copyright (c) 2002-2008, Jouni Malinen <j@w1.fi> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Alternatively, this software may be distributed under the terms of BSD * license. * * See README and COPYING for more details. */#include "includes.h"#include "common.h"#include "md5.h"#include "sha1.h"#include "sha256.h"#include "aes_wrap.h"#include "crypto.h"#include "ieee802_11_defs.h"#include "defs.h"#include "wpa_common.h"/** * wpa_eapol_key_mic - Calculate EAPOL-Key MIC * @key: EAPOL-Key Key Confirmation Key (KCK) * @ver: Key descriptor version (WPA_KEY_INFO_TYPE_*) * @buf: Pointer to the beginning of the EAPOL header (version field) * @len: Length of the EAPOL frame (from EAPOL header to the end of the frame) * @mic: Pointer to the buffer to which the EAPOL-Key MIC is written * Returns: 0 on success, -1 on failure * * Calculate EAPOL-Key MIC for an EAPOL-Key packet. The EAPOL-Key MIC field has * to be cleared (all zeroes) when calling this function. * * Note: 'IEEE Std 802.11i-2004 - 8.5.2 EAPOL-Key frames' has an error in the * description of the Key MIC calculation. It includes packet data from the * beginning of the EAPOL-Key header, not EAPOL header. This incorrect change * happened during final editing of the standard and the correct behavior is * defined in the last draft (IEEE 802.11i/D10). */int wpa_eapol_key_mic(const u8 *key, int ver, const u8 *buf, size_t len,		      u8 *mic){	u8 hash[SHA1_MAC_LEN];	switch (ver) {	case WPA_KEY_INFO_TYPE_HMAC_MD5_RC4:		hmac_md5(key, 16, buf, len, mic);		break;	case WPA_KEY_INFO_TYPE_HMAC_SHA1_AES:		hmac_sha1(key, 16, buf, len, hash);		os_memcpy(mic, hash, MD5_MAC_LEN);		break;#if defined(CONFIG_IEEE80211R) || defined(CONFIG_IEEE80211W)	case WPA_KEY_INFO_TYPE_AES_128_CMAC:		return omac1_aes_128(key, buf, len, mic);#endif /* CONFIG_IEEE80211R || CONFIG_IEEE80211W */	default:		return -1;	}	return 0;}/** * wpa_pmk_to_ptk - Calculate PTK from PMK, addresses, and nonces * @pmk: Pairwise master key * @pmk_len: Length of PMK * @label: Label to use in derivation * @addr1: AA or SA * @addr2: SA or AA * @nonce1: ANonce or SNonce * @nonce2: SNonce or ANonce * @ptk: Buffer for pairwise transient key * @ptk_len: Length of PTK * @use_sha256: Whether to use SHA256-based KDF * * IEEE Std 802.11i-2004 - 8.5.1.2 Pairwise key hierarchy * PTK = PRF-X(PMK, "Pairwise key expansion", *             Min(AA, SA) || Max(AA, SA) || *             Min(ANonce, SNonce) || Max(ANonce, SNonce)) * * STK = PRF-X(SMK, "Peer key expansion", *             Min(MAC_I, MAC_P) || Max(MAC_I, MAC_P) || *             Min(INonce, PNonce) || Max(INonce, PNonce)) */void wpa_pmk_to_ptk(const u8 *pmk, size_t pmk_len, const char *label,		    const u8 *addr1, const u8 *addr2,		    const u8 *nonce1, const u8 *nonce2,		    u8 *ptk, size_t ptk_len, int use_sha256){	u8 data[2 * ETH_ALEN + 2 * WPA_NONCE_LEN];	if (os_memcmp(addr1, addr2, ETH_ALEN) < 0) {		os_memcpy(data, addr1, ETH_ALEN);		os_memcpy(data + ETH_ALEN, addr2, ETH_ALEN);	} else {		os_memcpy(data, addr2, ETH_ALEN);		os_memcpy(data + ETH_ALEN, addr1, ETH_ALEN);	}	if (os_memcmp(nonce1, nonce2, WPA_NONCE_LEN) < 0) {		os_memcpy(data + 2 * ETH_ALEN, nonce1, WPA_NONCE_LEN);		os_memcpy(data + 2 * ETH_ALEN + WPA_NONCE_LEN, nonce2,			  WPA_NONCE_LEN);	} else {		os_memcpy(data + 2 * ETH_ALEN, nonce2, WPA_NONCE_LEN);		os_memcpy(data + 2 * ETH_ALEN + WPA_NONCE_LEN, nonce1,			  WPA_NONCE_LEN);	}#ifdef CONFIG_IEEE80211W	if (use_sha256)		sha256_prf(pmk, pmk_len, label, data, sizeof(data),			   ptk, ptk_len);	else#endif /* CONFIG_IEEE80211W */		sha1_prf(pmk, pmk_len, label, data, sizeof(data), ptk,			 ptk_len);	wpa_printf(MSG_DEBUG, "WPA: PTK derivation - A1=" MACSTR " A2=" MACSTR,		   MAC2STR(addr1), MAC2STR(addr2));	wpa_hexdump_key(MSG_DEBUG, "WPA: PMK", pmk, pmk_len);	wpa_hexdump_key(MSG_DEBUG, "WPA: PTK", ptk, ptk_len);}#ifdef CONFIG_IEEE80211Rint wpa_ft_mic(const u8 *kck, const u8 *sta_addr, const u8 *ap_addr,	       u8 transaction_seqnum, const u8 *mdie, size_t mdie_len,	       const u8 *ftie, size_t ftie_len,	       const u8 *rsnie, size_t rsnie_len,	       const u8 *ric, size_t ric_len, u8 *mic){	u8 *buf, *pos;	size_t buf_len;	buf_len = 2 * ETH_ALEN + 1 + mdie_len + ftie_len + rsnie_len + ric_len;	buf = os_malloc(buf_len);	if (buf == NULL)		return -1;	pos = buf;	os_memcpy(pos, sta_addr, ETH_ALEN);	pos += ETH_ALEN;	os_memcpy(pos, ap_addr, ETH_ALEN);	pos += ETH_ALEN;	*pos++ = transaction_seqnum;	if (rsnie) {		os_memcpy(pos, rsnie, rsnie_len);		pos += rsnie_len;	}	if (mdie) {		os_memcpy(pos, mdie, mdie_len);		pos += mdie_len;	}	if (ftie) {		struct rsn_ftie *_ftie;		os_memcpy(pos, ftie, ftie_len);		if (ftie_len < 2 + sizeof(*_ftie)) {			os_free(buf);			return -1;		}		_ftie = (struct rsn_ftie *) (pos + 2);		os_memset(_ftie->mic, 0, sizeof(_ftie->mic));		pos += ftie_len;	}	if (ric) {		os_memcpy(pos, ric, ric_len);		pos += ric_len;	}	wpa_hexdump(MSG_MSGDUMP, "FT: MIC data", buf, pos - buf);	if (omac1_aes_128(kck, buf, pos - buf, mic)) {		os_free(buf);		return -1;	}	os_free(buf);	return 0;}#endif /* CONFIG_IEEE80211R */#ifndef CONFIG_NO_WPA2static int rsn_selector_to_bitfield(const u8 *s){	if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_NONE)		return WPA_CIPHER_NONE;	if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_WEP40)		return WPA_CIPHER_WEP40;	if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_TKIP)		return WPA_CIPHER_TKIP;	if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_CCMP)		return WPA_CIPHER_CCMP;	if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_WEP104)		return WPA_CIPHER_WEP104;#ifdef CONFIG_IEEE80211W	if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_AES_128_CMAC)		return WPA_CIPHER_AES_128_CMAC;#endif /* CONFIG_IEEE80211W */	return 0;}static int rsn_key_mgmt_to_bitfield(const u8 *s){	if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_UNSPEC_802_1X)		return WPA_KEY_MGMT_IEEE8021X;	if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X)		return WPA_KEY_MGMT_PSK;#ifdef CONFIG_IEEE80211R	if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_802_1X)		return WPA_KEY_MGMT_FT_IEEE8021X;	if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_PSK)		return WPA_KEY_MGMT_FT_PSK;#endif /* CONFIG_IEEE80211R */#ifdef CONFIG_IEEE80211W	if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SHA256)		return WPA_KEY_MGMT_IEEE8021X_SHA256;	if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_PSK_SHA256)		return WPA_KEY_MGMT_PSK_SHA256;#endif /* CONFIG_IEEE80211W */	return 0;}#endif /* CONFIG_NO_WPA2 *//** * wpa_parse_wpa_ie_rsn - Parse RSN IE * @rsn_ie: Buffer containing RSN IE * @rsn_ie_len: RSN IE buffer length (including IE number and length octets) * @data: Pointer to structure that will be filled in with parsed data * Returns: 0 on success, <0 on failure */int wpa_parse_wpa_ie_rsn(const u8 *rsn_ie, size_t rsn_ie_len,			 struct wpa_ie_data *data){#ifndef CONFIG_NO_WPA2	const struct rsn_ie_hdr *hdr;	const u8 *pos;	int left;	int i, count;	os_memset(data, 0, sizeof(*data));	data->proto = WPA_PROTO_RSN;	data->pairwise_cipher = WPA_CIPHER_CCMP;	data->group_cipher = WPA_CIPHER_CCMP;	data->key_mgmt = WPA_KEY_MGMT_IEEE8021X;	data->capabilities = 0;	data->pmkid = NULL;	data->num_pmkid = 0;#ifdef CONFIG_IEEE80211W	data->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;#else /* CONFIG_IEEE80211W */	data->mgmt_group_cipher = 0;#endif /* CONFIG_IEEE80211W */	if (rsn_ie_len == 0) {		/* No RSN IE - fail silently */		return -1;	}	if (rsn_ie_len < sizeof(struct rsn_ie_hdr)) {		wpa_printf(MSG_DEBUG, "%s: ie len too short %lu",			   __func__, (unsigned long) rsn_ie_len);		return -1;	}	hdr = (const struct rsn_ie_hdr *) rsn_ie;	if (hdr->elem_id != WLAN_EID_RSN ||	    hdr->len != rsn_ie_len - 2 ||	    WPA_GET_LE16(hdr->version) != RSN_VERSION) {		wpa_printf(MSG_DEBUG, "%s: malformed ie or unknown version",			   __func__);		return -2;	}

⌨️ 快捷键说明

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