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

📄 events.c

📁 WPA在Linux下实现的原代码 WPA在Linux下实现的原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * WPA Supplicant - Driver event processing * Copyright (c) 2003-2006, 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 <stdlib.h>#include <stdio.h>#include <string.h>#include <unistd.h>#include <time.h>#include "common.h"#include "eapol_sm.h"#include "wpa.h"#include "eloop.h"#include "wpa_supplicant.h"#include "config.h"#include "l2_packet.h"#include "wpa_supplicant_i.h"#include "pcsc_funcs.h"#include "preauth.h"#include "wpa_ctrl.h"#include "eap.h"static int wpa_supplicant_select_config(struct wpa_supplicant *wpa_s){	struct wpa_ssid *ssid;	if (wpa_s->conf->ap_scan == 1 && wpa_s->current_ssid)		return 0;	ssid = wpa_supplicant_get_ssid(wpa_s);	if (ssid == NULL) {		wpa_printf(MSG_INFO, "No network configuration found for the "			   "current AP");		return -1;	}	if (ssid->disabled) {		wpa_printf(MSG_DEBUG, "Selected network is disabled");		return -1;	}	wpa_printf(MSG_DEBUG, "Network configuration found for the current "		   "AP");	if (ssid->key_mgmt & (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_IEEE8021X |			      WPA_KEY_MGMT_WPA_NONE)) {		u8 wpa_ie[80];		size_t wpa_ie_len = sizeof(wpa_ie);		wpa_supplicant_set_suites(wpa_s, NULL, ssid,					  wpa_ie, &wpa_ie_len);	} else {		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);	}	if (wpa_s->current_ssid && wpa_s->current_ssid != ssid)		eapol_sm_invalidate_cached_session(wpa_s->eapol);	wpa_s->current_ssid = ssid;	wpa_sm_set_config(wpa_s->wpa, wpa_s->current_ssid);	wpa_supplicant_initiate_eapol(wpa_s);	return 0;}static void wpa_supplicant_stop_countermeasures(void *eloop_ctx,						void *sock_ctx){	struct wpa_supplicant *wpa_s = eloop_ctx;	if (wpa_s->countermeasures) {		wpa_s->countermeasures = 0;		wpa_drv_set_countermeasures(wpa_s, 0);		wpa_msg(wpa_s, MSG_INFO, "WPA: TKIP countermeasures stopped");		wpa_supplicant_req_scan(wpa_s, 0, 0);	}}static void wpa_supplicant_mark_disassoc(struct wpa_supplicant *wpa_s){	wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);	memset(wpa_s->bssid, 0, ETH_ALEN);	eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);	eapol_sm_notify_portValid(wpa_s->eapol, FALSE);	if (wpa_s->key_mgmt == WPA_KEY_MGMT_PSK)		eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);}static void wpa_find_assoc_pmkid(struct wpa_supplicant *wpa_s){	struct wpa_ie_data ie;	int i, pmksa_set = -1;	if (wpa_sm_parse_own_wpa_ie(wpa_s->wpa, &ie) < 0 ||	    ie.pmkid == NULL)		return;	for (i = 0; i < ie.num_pmkid; i++) {		pmksa_set = pmksa_cache_set_current(wpa_s->wpa,						    ie.pmkid + i * PMKID_LEN,						    NULL, NULL, 0);		if (pmksa_set == 0) {			eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);			break;		}	}	wpa_printf(MSG_DEBUG, "RSN: PMKID from assoc IE %sfound from PMKSA "		   "cache", pmksa_set == 0 ? "" : "not ");}static void wpa_supplicant_event_pmkid_candidate(struct wpa_supplicant *wpa_s,						 union wpa_event_data *data){	if (data == NULL) {		wpa_printf(MSG_DEBUG, "RSN: No data in PMKID candidate event");		return;	}	wpa_printf(MSG_DEBUG, "RSN: PMKID candidate event - bssid=" MACSTR		   " index=%d preauth=%d",		   MAC2STR(data->pmkid_candidate.bssid),		   data->pmkid_candidate.index,		   data->pmkid_candidate.preauth);	pmksa_candidate_add(wpa_s->wpa, data->pmkid_candidate.bssid,			    data->pmkid_candidate.index,			    data->pmkid_candidate.preauth);}static int wpa_supplicant_dynamic_keys(struct wpa_supplicant *wpa_s){	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||	    wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)		return 0;	if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA &&	    wpa_s->current_ssid &&	    !(wpa_s->current_ssid->eapol_flags &	      (EAPOL_FLAG_REQUIRE_KEY_UNICAST |	       EAPOL_FLAG_REQUIRE_KEY_BROADCAST))) {		/* IEEE 802.1X, but not using dynamic WEP keys (i.e., either		 * plaintext or static WEP keys). */		return 0;	}	return 1;}/** * wpa_supplicant_scard_init - Initialize SIM/USIM access with PC/SC * @wpa_s: pointer to wpa_supplicant data * @ssid: Configuration data for the network * Returns: 0 on success, -1 on failure * * This function is called when starting authentication with a network that is * configured to use PC/SC for SIM/USIM access (EAP-SIM or EAP-AKA). */int wpa_supplicant_scard_init(struct wpa_supplicant *wpa_s,			      struct wpa_ssid *ssid){	int aka = 0, sim = 0, type;	if (ssid->pcsc == NULL || wpa_s->scard != NULL)		return 0;	if (ssid->eap_methods == NULL) {		sim = 1;		aka = 1;	} else {		u8 *eap = ssid->eap_methods;		while (*eap != EAP_TYPE_NONE) {			if (*eap == EAP_TYPE_SIM)				sim = 1;			else if (*eap == EAP_TYPE_AKA)				aka = 1;			eap++;		}	}#ifndef EAP_SIM	sim = 0;#endif /* EAP_SIM */#ifndef EAP_AKA	aka = 0;#endif /* EAP_AKA */	if (!sim && !aka) {		wpa_printf(MSG_DEBUG, "Selected network is configured to use "			   "SIM, but neither EAP-SIM nor EAP-AKA are enabled");		return 0;	}	wpa_printf(MSG_DEBUG, "Selected network is configured to use SIM "		   "(sim=%d aka=%d) - initialize PCSC", sim, aka);	if (sim && aka)		type = SCARD_TRY_BOTH;	else if (aka)		type = SCARD_USIM_ONLY;	else		type = SCARD_GSM_SIM_ONLY;	wpa_s->scard = scard_init(type);	if (wpa_s->scard == NULL) {		wpa_printf(MSG_WARNING, "Failed to initialize SIM "			   "(pcsc-lite)");		return -1;	}	wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);	eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);	return 0;}static int wpa_supplicant_match_privacy(struct wpa_scan_result *bss,					struct wpa_ssid *ssid){	int i, privacy = 0;	for (i = 0; i < NUM_WEP_KEYS; i++) {		if (ssid->wep_key_len[i]) {			privacy = 1;			break;		}	}	if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) &&	    ssid->eapol_flags & (EAPOL_FLAG_REQUIRE_KEY_UNICAST |				 EAPOL_FLAG_REQUIRE_KEY_BROADCAST))		privacy = 1;	if (bss->caps & IEEE80211_CAP_PRIVACY)		return privacy;	return !privacy;}static int wpa_supplicant_ssid_bss_match(struct wpa_ssid *ssid,					 struct wpa_scan_result *bss){	struct wpa_ie_data ie;	int proto_match = 0;	while ((ssid->proto & WPA_PROTO_RSN) && bss->rsn_ie_len > 0) {		proto_match++;		if (wpa_parse_wpa_ie(bss->rsn_ie, bss->rsn_ie_len, &ie)) {			wpa_printf(MSG_DEBUG, "   skip RSN IE - parse failed");			break;		}		if (!(ie.proto & ssid->proto)) {			wpa_printf(MSG_DEBUG, "   skip RSN IE - proto "				   "mismatch");			break;		}		if (!(ie.pairwise_cipher & ssid->pairwise_cipher)) {			wpa_printf(MSG_DEBUG, "   skip RSN IE - PTK cipher "				   "mismatch");			break;		}		if (!(ie.group_cipher & ssid->group_cipher)) {			wpa_printf(MSG_DEBUG, "   skip RSN IE - GTK cipher "				   "mismatch");			break;		}		if (!(ie.key_mgmt & ssid->key_mgmt)) {			wpa_printf(MSG_DEBUG, "   skip RSN IE - key mgmt "				   "mismatch");			break;		}		wpa_printf(MSG_DEBUG, "   selected based on RSN IE");		return 1;	}	while ((ssid->proto & WPA_PROTO_WPA) && bss->wpa_ie_len > 0) {		proto_match++;		if (wpa_parse_wpa_ie(bss->wpa_ie, bss->wpa_ie_len, &ie)) {			wpa_printf(MSG_DEBUG, "   skip WPA IE - parse failed");			break;		}		if (!(ie.proto & ssid->proto)) {			wpa_printf(MSG_DEBUG, "   skip WPA IE - proto "				   "mismatch");			break;		}		if (!(ie.pairwise_cipher & ssid->pairwise_cipher)) {			wpa_printf(MSG_DEBUG, "   skip WPA IE - PTK cipher "				   "mismatch");			break;		}		if (!(ie.group_cipher & ssid->group_cipher)) {			wpa_printf(MSG_DEBUG, "   skip WPA IE - GTK cipher "				   "mismatch");			break;		}		if (!(ie.key_mgmt & ssid->key_mgmt)) {			wpa_printf(MSG_DEBUG, "   skip WPA IE - key mgmt "				   "mismatch");			break;		}		wpa_printf(MSG_DEBUG, "   selected based on WPA IE");		return 1;	}	if (proto_match == 0)		wpa_printf(MSG_DEBUG, "   skip - no WPA/RSN proto match");	return 0;}static struct wpa_scan_result *wpa_supplicant_select_bss(struct wpa_supplicant *wpa_s, struct wpa_ssid *group,			  struct wpa_scan_result *results, int num,			  struct wpa_ssid **selected_ssid){	struct wpa_ssid *ssid;	struct wpa_scan_result *bss, *selected = NULL;	int i;	struct wpa_blacklist *e;	wpa_printf(MSG_DEBUG, "Selecting BSS from priority group %d",		   group->priority);	bss = NULL;	ssid = NULL;	/* First, try to find WPA-enabled AP */	for (i = 0; i < num && !selected; i++) {		bss = &results[i];		wpa_printf(MSG_DEBUG, "%d: " MACSTR " ssid='%s' "			   "wpa_ie_len=%lu rsn_ie_len=%lu caps=0x%x",			   i, MAC2STR(bss->bssid),			   wpa_ssid_txt(bss->ssid, bss->ssid_len),			   (unsigned long) bss->wpa_ie_len,			   (unsigned long) bss->rsn_ie_len, bss->caps);		if ((e = wpa_blacklist_get(wpa_s, bss->bssid)) &&		    e->count > 1) {			wpa_printf(MSG_DEBUG, "   skip - blacklisted");			continue;		}		if (bss->wpa_ie_len == 0 && bss->rsn_ie_len == 0) {			wpa_printf(MSG_DEBUG, "   skip - no WPA/RSN IE");			continue;		}		for (ssid = group; ssid; ssid = ssid->pnext) {			if (ssid->disabled)				continue;			if (bss->ssid_len != ssid->ssid_len ||			    memcmp(bss->ssid, ssid->ssid,				   bss->ssid_len) != 0) {				wpa_printf(MSG_DEBUG, "   skip - "					   "SSID mismatch");				continue;			}			if (ssid->bssid_set &&			    memcmp(bss->bssid, ssid->bssid, ETH_ALEN) != 0) {				wpa_printf(MSG_DEBUG, "   skip - "					   "BSSID mismatch");

⌨️ 快捷键说明

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