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

📄 peerkey.c

📁 最新的Host AP 新添加了许多pcmcia 的驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
	/* RSN: msg 2/4 should contain SMKID for the selected SMK and RSN IE	 * from the peer. It may also include Lifetime KDE. */	keydata = (const u8 *) (key + 1);	len = WPA_GET_BE16(key->key_data_length);	wpa_hexdump(MSG_DEBUG, "RSN: msg 2/4 key data", keydata, len);	if (wpa_supplicant_parse_ies(keydata, len, &kde) < 0 ||	    kde.pmkid == NULL || kde.rsn_ie == NULL) {		wpa_printf(MSG_DEBUG, "RSN: No SMKID or RSN IE in STK 2/4");		return;	}	if (os_memcmp(kde.pmkid, peerkey->smkid, PMKID_LEN) != 0) {		wpa_hexdump(MSG_DEBUG, "RSN: Unknown SMKID in STK 2/4",			    kde.pmkid, PMKID_LEN);		return;	}	if (kde.rsn_ie_len != peerkey->rsnie_p_len ||	    os_memcmp(kde.rsn_ie, peerkey->rsnie_p, kde.rsn_ie_len) != 0) {		wpa_printf(MSG_INFO, "RSN: Peer RSN IE in SMK and STK "			   "handshakes did not match");		wpa_hexdump(MSG_DEBUG, "RSN: Peer RSN IE in SMK handshake",			    peerkey->rsnie_p, peerkey->rsnie_p_len);		wpa_hexdump(MSG_DEBUG, "RSN: Peer RSN IE in STK handshake",			    kde.rsn_ie, kde.rsn_ie_len);		return;	}	wpa_supplicant_update_smk_lifetime(sm, peerkey, &kde);	wpa_supplicant_send_stk_3_of_4(sm, peerkey);	os_memcpy(peerkey->pnonce, key->key_nonce, WPA_NONCE_LEN);}static void wpa_supplicant_process_stk_3_of_4(struct wpa_sm *sm,					      struct wpa_peerkey *peerkey,					      const struct wpa_eapol_key *key,					      u16 ver){	struct wpa_eapol_ie_parse kde;	const u8 *keydata;	size_t len, key_len;	const u8 *_key;	u8 key_buf[32], rsc[6];	wpa_printf(MSG_DEBUG, "RSN: RX message 3 of STK 4-Way Handshake from "		   MACSTR " (ver=%d)", MAC2STR(peerkey->addr), ver);	os_memset(&kde, 0, sizeof(kde));	/* RSN: msg 3/4 should contain Initiator RSN IE. It may also include	 * Lifetime KDE. */	keydata = (const u8 *) (key + 1);	len = WPA_GET_BE16(key->key_data_length);	wpa_hexdump(MSG_DEBUG, "RSN: msg 3/4 key data", keydata, len);	if (wpa_supplicant_parse_ies(keydata, len, &kde) < 0) {		wpa_printf(MSG_DEBUG, "RSN: Failed to parse key data in "			   "STK 3/4");		return;	}	if (kde.rsn_ie_len != peerkey->rsnie_i_len ||	    os_memcmp(kde.rsn_ie, peerkey->rsnie_i, kde.rsn_ie_len) != 0) {		wpa_printf(MSG_INFO, "RSN: Initiator RSN IE in SMK and STK "			   "handshakes did not match");		wpa_hexdump(MSG_DEBUG, "RSN: Initiator RSN IE in SMK "			    "handshake",			    peerkey->rsnie_i, peerkey->rsnie_i_len);		wpa_hexdump(MSG_DEBUG, "RSN: Initiator RSN IE in STK "			    "handshake",			    kde.rsn_ie, kde.rsn_ie_len);		return;	}	if (os_memcmp(peerkey->inonce, key->key_nonce, WPA_NONCE_LEN) != 0) {		wpa_printf(MSG_WARNING, "RSN: INonce from message 1 of STK "			   "4-Way Handshake differs from 3 of STK 4-Way "			   "Handshake - drop packet (src=" MACSTR ")",			   MAC2STR(peerkey->addr));		return;	}	wpa_supplicant_update_smk_lifetime(sm, peerkey, &kde);	if (wpa_supplicant_send_4_of_4(sm, peerkey->addr, key, ver,				       WPA_GET_BE16(key->key_info),				       NULL, 0, &peerkey->stk))		return;	_key = (u8 *) peerkey->stk.tk1;	if (peerkey->cipher == WPA_CIPHER_TKIP) {		/* Swap Tx/Rx keys for Michael MIC */		os_memcpy(key_buf, _key, 16);		os_memcpy(key_buf + 16, peerkey->stk.u.auth.rx_mic_key, 8);		os_memcpy(key_buf + 24, peerkey->stk.u.auth.tx_mic_key, 8);		_key = key_buf;		key_len = 32;	} else		key_len = 16;	os_memset(rsc, 0, 6);	if (wpa_sm_set_key(sm, peerkey->cipher, peerkey->addr, 0, 1,			   rsc, sizeof(rsc), _key, key_len) < 0) {		wpa_printf(MSG_WARNING, "RSN: Failed to set STK to the "			   "driver.");		return;	}}static void wpa_supplicant_process_stk_4_of_4(struct wpa_sm *sm,					      struct wpa_peerkey *peerkey,					      const struct wpa_eapol_key *key,					      u16 ver){	u8 rsc[6];	wpa_printf(MSG_DEBUG, "RSN: RX message 4 of STK 4-Way Handshake from "		   MACSTR " (ver=%d)", MAC2STR(peerkey->addr), ver);	os_memset(rsc, 0, 6);	if (wpa_sm_set_key(sm, peerkey->cipher, peerkey->addr, 0, 1,			   rsc, sizeof(rsc), (u8 *) peerkey->stk.tk1,			   peerkey->cipher == WPA_CIPHER_TKIP ? 32 : 16) < 0) {		wpa_printf(MSG_WARNING, "RSN: Failed to set STK to the "			   "driver.");		return;	}}/** * peerkey_verify_eapol_key_mic - Verify PeerKey MIC * @sm: Pointer to WPA state machine data from wpa_sm_init() * @peerkey: Pointer to the PeerKey data for the peer * @key: Pointer to the EAPOL-Key frame header * @ver: Version bits from EAPOL-Key Key Info * @buf: Pointer to the beginning of EAPOL-Key frame * @len: Length of the EAPOL-Key frame * Returns: 0 on success, -1 on failure */int peerkey_verify_eapol_key_mic(struct wpa_sm *sm,				 struct wpa_peerkey *peerkey,				 struct wpa_eapol_key *key, u16 ver,				 const u8 *buf, size_t len){	u8 mic[16];	int ok = 0;	if (peerkey->initiator && !peerkey->stk_set) {		wpa_pmk_to_ptk(peerkey->smk, PMK_LEN, "Peer key expansion",			       sm->own_addr, peerkey->addr,			       peerkey->inonce, key->key_nonce,			       (u8 *) &peerkey->stk, sizeof(peerkey->stk),			       peerkey->use_sha256);		peerkey->stk_set = 1;	}	os_memcpy(mic, key->key_mic, 16);	if (peerkey->tstk_set) {		os_memset(key->key_mic, 0, 16);		wpa_eapol_key_mic(peerkey->tstk.kck, ver, buf, len,				  key->key_mic);		if (os_memcmp(mic, key->key_mic, 16) != 0) {			wpa_printf(MSG_WARNING, "RSN: Invalid EAPOL-Key MIC "				   "when using TSTK - ignoring TSTK");		} else {			ok = 1;			peerkey->tstk_set = 0;			peerkey->stk_set = 1;			os_memcpy(&peerkey->stk, &peerkey->tstk,				  sizeof(peerkey->stk));		}	}	if (!ok && peerkey->stk_set) {		os_memset(key->key_mic, 0, 16);		wpa_eapol_key_mic(peerkey->stk.kck, ver, buf, len,				  key->key_mic);		if (os_memcmp(mic, key->key_mic, 16) != 0) {			wpa_printf(MSG_WARNING, "RSN: Invalid EAPOL-Key MIC "				   "- dropping packet");			return -1;		}		ok = 1;	}	if (!ok) {		wpa_printf(MSG_WARNING, "RSN: Could not verify EAPOL-Key MIC "			   "- dropping packet");		return -1;	}	os_memcpy(peerkey->replay_counter, key->replay_counter,		  WPA_REPLAY_COUNTER_LEN);	peerkey->replay_counter_set = 1;	return 0;}/** * wpa_sm_stkstart - Send EAPOL-Key Request for STK handshake (STK M1) * @sm: Pointer to WPA state machine data from wpa_sm_init() * @peer: MAC address of the peer STA * Returns: 0 on success, or -1 on failure * * Send an EAPOL-Key Request to the current authenticator to start STK * handshake with the peer. */int wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer){	size_t rlen, kde_len;	struct wpa_eapol_key *req;	int key_info, ver;	u8 bssid[ETH_ALEN], *rbuf, *pos, *count_pos;	u16 count;	struct rsn_ie_hdr *hdr;	struct wpa_peerkey *peerkey;	struct wpa_ie_data ie;	if (sm->proto != WPA_PROTO_RSN || !sm->ptk_set || !sm->peerkey_enabled)		return -1;	if (sm->ap_rsn_ie &&	    wpa_parse_wpa_ie_rsn(sm->ap_rsn_ie, sm->ap_rsn_ie_len, &ie) == 0 &&	    !(ie.capabilities & WPA_CAPABILITY_PEERKEY_ENABLED)) {		wpa_printf(MSG_DEBUG, "RSN: Current AP does not support STK");		return -1;	}	if (sm->pairwise_cipher == WPA_CIPHER_CCMP)		ver = WPA_KEY_INFO_TYPE_HMAC_SHA1_AES;	else		ver = WPA_KEY_INFO_TYPE_HMAC_MD5_RC4;	if (wpa_sm_get_bssid(sm, bssid) < 0) {		wpa_printf(MSG_WARNING, "Failed to read BSSID for EAPOL-Key "			   "SMK M1");		return -1;	}	/* TODO: find existing entry and if found, use that instead of adding	 * a new one */	peerkey = os_zalloc(sizeof(*peerkey));	if (peerkey == NULL)		return -1;	peerkey->initiator = 1;	os_memcpy(peerkey->addr, peer, ETH_ALEN);#ifdef CONFIG_IEEE80211W	if (wpa_key_mgmt_sha256(sm->key_mgmt))		peerkey->use_sha256 = 1;#endif /* CONFIG_IEEE80211W */	/* SMK M1:	 * EAPOL-Key(S=1, M=1, A=0, I=0, K=0, SM=1, KeyRSC=0, Nonce=INonce,	 *           MIC=MIC, DataKDs=(RSNIE_I, MAC_P KDE))	 */	hdr = (struct rsn_ie_hdr *) peerkey->rsnie_i;	hdr->elem_id = WLAN_EID_RSN;	WPA_PUT_LE16(hdr->version, RSN_VERSION);	pos = (u8 *) (hdr + 1);	/* Group Suite can be anything for SMK RSN IE; receiver will just	 * ignore it. */	RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP);	pos += RSN_SELECTOR_LEN;	count_pos = pos;	pos += 2;	count = 0;	if (sm->allowed_pairwise_cipher & WPA_CIPHER_CCMP) {		RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP);		pos += RSN_SELECTOR_LEN;		count++;	}	if (sm->allowed_pairwise_cipher & WPA_CIPHER_TKIP) {		RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_TKIP);		pos += RSN_SELECTOR_LEN;		count++;	}	WPA_PUT_LE16(count_pos, count);	hdr->len = (pos - peerkey->rsnie_i) - 2;	peerkey->rsnie_i_len = pos - peerkey->rsnie_i;	wpa_hexdump(MSG_DEBUG, "WPA: RSN IE for SMK handshake",		    peerkey->rsnie_i, peerkey->rsnie_i_len);	kde_len = peerkey->rsnie_i_len + 2 + RSN_SELECTOR_LEN + ETH_ALEN;	rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY, NULL,				  sizeof(*req) + kde_len, &rlen,				  (void *) &req);	if (rbuf == NULL) {		wpa_supplicant_peerkey_free(sm, peerkey);		return -1;	}	req->type = EAPOL_KEY_TYPE_RSN;	key_info = WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_MIC |		WPA_KEY_INFO_SECURE | WPA_KEY_INFO_REQUEST | ver;	WPA_PUT_BE16(req->key_info, key_info);	WPA_PUT_BE16(req->key_length, 0);	os_memcpy(req->replay_counter, sm->request_counter,		  WPA_REPLAY_COUNTER_LEN);	inc_byte_array(sm->request_counter, WPA_REPLAY_COUNTER_LEN);	if (os_get_random(peerkey->inonce, WPA_NONCE_LEN)) {		wpa_msg(sm->ctx->ctx, MSG_WARNING,			"WPA: Failed to get random data for INonce");		os_free(rbuf);		wpa_supplicant_peerkey_free(sm, peerkey);		return -1;	}	os_memcpy(req->key_nonce, peerkey->inonce, WPA_NONCE_LEN);	wpa_hexdump(MSG_DEBUG, "WPA: INonce for SMK handshake",		    req->key_nonce, WPA_NONCE_LEN);	WPA_PUT_BE16(req->key_data_length, (u16) kde_len);	pos = (u8 *) (req + 1);	/* Initiator RSN IE */	pos = wpa_add_ie(pos, peerkey->rsnie_i, peerkey->rsnie_i_len);	/* Peer MAC address KDE */	wpa_add_kde(pos, RSN_KEY_DATA_MAC_ADDR, peer, ETH_ALEN);	wpa_printf(MSG_INFO, "RSN: Sending EAPOL-Key SMK M1 Request (peer "		   MACSTR ")", MAC2STR(peer));	wpa_eapol_key_send(sm, sm->ptk.kck, ver, bssid, ETH_P_EAPOL,			   rbuf, rlen, req->key_mic);	peerkey->next = sm->peerkey;	sm->peerkey = peerkey;	return 0;}/** * peerkey_deinit - Free PeerKey values * @sm: Pointer to WPA state machine data from wpa_sm_init() */void peerkey_deinit(struct wpa_sm *sm){	struct wpa_peerkey *prev, *peerkey = sm->peerkey;	while (peerkey) {		prev = peerkey;		peerkey = peerkey->next;		os_free(prev);	}}void peerkey_rx_eapol_4way(struct wpa_sm *sm, struct wpa_peerkey *peerkey,			   struct wpa_eapol_key *key, u16 key_info, u16 ver){	if ((key_info & (WPA_KEY_INFO_MIC | WPA_KEY_INFO_ACK)) ==	    (WPA_KEY_INFO_MIC | WPA_KEY_INFO_ACK)) {		/* 3/4 STK 4-Way Handshake */		wpa_supplicant_process_stk_3_of_4(sm, peerkey, key, ver);	} else if (key_info & WPA_KEY_INFO_ACK) {		/* 1/4 STK 4-Way Handshake */		wpa_supplicant_process_stk_1_of_4(sm, peerkey, key, ver);	} else if (key_info & WPA_KEY_INFO_SECURE) {		/* 4/4 STK 4-Way Handshake */		wpa_supplicant_process_stk_4_of_4(sm, peerkey, key, ver);	} else {		/* 2/4 STK 4-Way Handshake */		wpa_supplicant_process_stk_2_of_4(sm, peerkey, key, ver);	}}void peerkey_rx_eapol_smk(struct wpa_sm *sm, const u8 *src_addr,			  struct wpa_eapol_key *key, size_t extra_len,			  u16 key_info, u16 ver){	if (key_info & WPA_KEY_INFO_ERROR) {		/* SMK Error */		wpa_supplicant_process_smk_error(sm, src_addr, key, extra_len);	} else if (key_info & WPA_KEY_INFO_ACK) {		/* SMK M2 */		wpa_supplicant_process_smk_m2(sm, src_addr, key, extra_len,					      ver);	} else {		/* SMK M4 or M5 */		wpa_supplicant_process_smk_m45(sm, src_addr, key, extra_len,					       ver);	}}#endif /* CONFIG_PEERKEY */

⌨️ 快捷键说明

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