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

📄 eap_ttls.c

📁 最新的Host AP 新添加了许多pcmcia 的驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
	eap_ttlsv1_phase2_eap_finish(sm, data, ret);	return 0;}static int eap_ttls_phase2_request_eap_method(struct eap_sm *sm,					      struct eap_ttls_data *data,					      struct eap_method_ret *ret,					      struct eap_hdr *hdr, size_t len,					      u8 method, struct wpabuf **resp){#ifdef EAP_TNC	if (data->tnc_started && data->phase2_method &&	    data->phase2_priv && method == EAP_TYPE_TNC &&	    data->phase2_eap_type.method == EAP_TYPE_TNC)		return eap_ttls_phase2_eap_process(sm, data, ret, hdr, len,						   resp);	if (data->ready_for_tnc && !data->tnc_started &&	    method == EAP_TYPE_TNC) {		wpa_printf(MSG_DEBUG, "EAP-TTLS: Start TNC after completed "			   "EAP method");		data->tnc_started = 1;	}	if (data->tnc_started) {		if (data->phase2_eap_type.vendor != EAP_VENDOR_IETF ||		    data->phase2_eap_type.method == EAP_TYPE_TNC) {			wpa_printf(MSG_DEBUG, "EAP-TTLS: Unexpected EAP "				   "type %d for TNC", method);			return -1;		}		data->phase2_eap_type.vendor = EAP_VENDOR_IETF;		data->phase2_eap_type.method = method;		wpa_printf(MSG_DEBUG, "EAP-TTLS: Selected "			   "Phase 2 EAP vendor %d method %d (TNC)",			   data->phase2_eap_type.vendor,			   data->phase2_eap_type.method);		if (data->phase2_type == EAP_TTLS_PHASE2_EAP)			eap_ttls_phase2_eap_deinit(sm, data);	}#endif /* EAP_TNC */	if (data->phase2_eap_type.vendor == EAP_VENDOR_IETF &&	    data->phase2_eap_type.method == EAP_TYPE_NONE)		eap_ttls_phase2_select_eap_method(data, method);	if (method != data->phase2_eap_type.method || method == EAP_TYPE_NONE)	{		if (eap_peer_tls_phase2_nak(data->phase2_eap_types,					    data->num_phase2_eap_types,					    hdr, resp))			return -1;		return 0;	}	if (data->phase2_priv == NULL) {		data->phase2_method = eap_peer_get_eap_method(			EAP_VENDOR_IETF, method);		if (data->phase2_method) {			sm->init_phase2 = 1;			data->phase2_priv = data->phase2_method->init(sm);			sm->init_phase2 = 0;		}	}	if (data->phase2_priv == NULL || data->phase2_method == NULL) {		wpa_printf(MSG_INFO, "EAP-TTLS: failed to initialize "			   "Phase 2 EAP method %d", method);		return -1;	}	return eap_ttls_phase2_eap_process(sm, data, ret, hdr, len, resp);}static int eap_ttls_phase2_request_eap(struct eap_sm *sm,				       struct eap_ttls_data *data,				       struct eap_method_ret *ret,				       struct eap_hdr *hdr,				       struct wpabuf **resp){	size_t len = be_to_host16(hdr->length);	u8 *pos;	struct eap_peer_config *config = eap_get_config(sm);	if (len <= sizeof(struct eap_hdr)) {		wpa_printf(MSG_INFO, "EAP-TTLS: too short "			   "Phase 2 request (len=%lu)", (unsigned long) len);		return -1;	}	pos = (u8 *) (hdr + 1);	wpa_printf(MSG_DEBUG, "EAP-TTLS: Phase 2 EAP Request: type=%d", *pos);	switch (*pos) {	case EAP_TYPE_IDENTITY:		*resp = eap_sm_buildIdentity(sm, hdr->identifier, 1);		break;	default:		if (eap_ttls_phase2_request_eap_method(sm, data, ret, hdr, len,						       *pos, resp) < 0)			return -1;		break;	}	if (*resp == NULL &&	    (config->pending_req_identity || config->pending_req_password ||	     config->pending_req_otp)) {		return 0;	}	if (*resp == NULL)		return -1;	wpa_hexdump_buf(MSG_DEBUG, "EAP-TTLS: AVP encapsulate EAP Response",			*resp);	return eap_ttls_avp_encapsulate(resp, RADIUS_ATTR_EAP_MESSAGE, 1);}static void eap_ttlsv1_permute_inner(struct eap_sm *sm,				     struct eap_ttls_data *data){#if EAP_TTLS_VERSION > 0	u8 session_key[2 * MSCHAPV2_KEY_LEN];	if (data->ttls_version == 0)		return;	get_asymetric_start_key(data->master_key, session_key,				MSCHAPV2_KEY_LEN, 0, 0);	get_asymetric_start_key(data->master_key,				session_key + MSCHAPV2_KEY_LEN,				MSCHAPV2_KEY_LEN, 1, 0);	eap_ttls_ia_permute_inner_secret(sm, data, session_key,					 sizeof(session_key));#endif /* EAP_TTLS_VERSION */}static int eap_ttls_phase2_request_mschapv2(struct eap_sm *sm,					    struct eap_ttls_data *data,					    struct eap_method_ret *ret,					    struct wpabuf **resp){	struct wpabuf *msg;	u8 *buf, *pos, *challenge, *peer_challenge;	const u8 *identity, *password;	size_t identity_len, password_len;	int pwhash;	wpa_printf(MSG_DEBUG, "EAP-TTLS: Phase 2 MSCHAPV2 Request");	identity = eap_get_config_identity(sm, &identity_len);	password = eap_get_config_password2(sm, &password_len, &pwhash);	if (identity == NULL || password == NULL)		return -1;	msg = wpabuf_alloc(identity_len + 1000);	if (msg == NULL) {		wpa_printf(MSG_ERROR,			   "EAP-TTLS/MSCHAPV2: Failed to allocate memory");		return -1;	}	pos = buf = wpabuf_mhead(msg);	/* User-Name */	pos = eap_ttls_avp_add(buf, pos, RADIUS_ATTR_USER_NAME, 0, 1,			       identity, identity_len);	/* MS-CHAP-Challenge */	challenge = eap_ttls_implicit_challenge(		sm, data, EAP_TTLS_MSCHAPV2_CHALLENGE_LEN + 1);	if (challenge == NULL) {		wpabuf_free(msg);		wpa_printf(MSG_ERROR, "EAP-TTLS/MSCHAPV2: Failed to derive "			   "implicit challenge");		return -1;	}	peer_challenge = challenge + 1 + EAP_TTLS_MSCHAPV2_CHALLENGE_LEN;	pos = eap_ttls_avp_add(buf, pos, RADIUS_ATTR_MS_CHAP_CHALLENGE,			       RADIUS_VENDOR_ID_MICROSOFT, 1,			       challenge, EAP_TTLS_MSCHAPV2_CHALLENGE_LEN);	/* MS-CHAP2-Response */	pos = eap_ttls_avp_hdr(pos, RADIUS_ATTR_MS_CHAP2_RESPONSE,			       RADIUS_VENDOR_ID_MICROSOFT, 1,			       EAP_TTLS_MSCHAPV2_RESPONSE_LEN);	data->ident = challenge[EAP_TTLS_MSCHAPV2_CHALLENGE_LEN];	*pos++ = data->ident;	*pos++ = 0; /* Flags */	os_memcpy(pos, peer_challenge, EAP_TTLS_MSCHAPV2_CHALLENGE_LEN);	pos += EAP_TTLS_MSCHAPV2_CHALLENGE_LEN;	os_memset(pos, 0, 8); /* Reserved, must be zero */	pos += 8;	mschapv2_derive_response(identity, identity_len, password,				 password_len, pwhash, challenge,				 peer_challenge, pos, data->auth_response,				 data->master_key);	data->auth_response_valid = 1;	eap_ttlsv1_permute_inner(sm, data);	pos += 24;	os_free(challenge);	AVP_PAD(buf, pos);	wpabuf_put(msg, pos - buf);	*resp = msg;	if (sm->workaround && data->ttls_version == 0) {		/* At least FreeRADIUS seems to be terminating		 * EAP-TTLS/MSHCAPV2 without the expected MS-CHAP-v2 Success		 * packet. */		wpa_printf(MSG_DEBUG, "EAP-TTLS/MSCHAPV2: EAP workaround - "			   "allow success without tunneled response");		ret->methodState = METHOD_MAY_CONT;		ret->decision = DECISION_COND_SUCC;	}	return 0;}static int eap_ttls_phase2_request_mschap(struct eap_sm *sm,					  struct eap_ttls_data *data,					  struct eap_method_ret *ret,					  struct wpabuf **resp){	struct wpabuf *msg;	u8 *buf, *pos, *challenge;	const u8 *identity, *password;	size_t identity_len, password_len;	int pwhash;	wpa_printf(MSG_DEBUG, "EAP-TTLS: Phase 2 MSCHAP Request");	identity = eap_get_config_identity(sm, &identity_len);	password = eap_get_config_password2(sm, &password_len, &pwhash);	if (identity == NULL || password == NULL)		return -1;	msg = wpabuf_alloc(identity_len + 1000);	if (msg == NULL) {		wpa_printf(MSG_ERROR,			   "EAP-TTLS/MSCHAP: Failed to allocate memory");		return -1;	}	pos = buf = wpabuf_mhead(msg);	/* User-Name */	pos = eap_ttls_avp_add(buf, pos, RADIUS_ATTR_USER_NAME, 0, 1,			       identity, identity_len);	/* MS-CHAP-Challenge */	challenge = eap_ttls_implicit_challenge(		sm, data, EAP_TTLS_MSCHAP_CHALLENGE_LEN + 1);	if (challenge == NULL) {		wpabuf_free(msg);		wpa_printf(MSG_ERROR, "EAP-TTLS/MSCHAP: Failed to derive "			   "implicit challenge");		return -1;	}	pos = eap_ttls_avp_add(buf, pos, RADIUS_ATTR_MS_CHAP_CHALLENGE,			       RADIUS_VENDOR_ID_MICROSOFT, 1,			       challenge, EAP_TTLS_MSCHAP_CHALLENGE_LEN);	/* MS-CHAP-Response */	pos = eap_ttls_avp_hdr(pos, RADIUS_ATTR_MS_CHAP_RESPONSE,			       RADIUS_VENDOR_ID_MICROSOFT, 1,			       EAP_TTLS_MSCHAP_RESPONSE_LEN);	data->ident = challenge[EAP_TTLS_MSCHAP_CHALLENGE_LEN];	*pos++ = data->ident;	*pos++ = 1; /* Flags: Use NT style passwords */	os_memset(pos, 0, 24); /* LM-Response */	pos += 24;	if (pwhash) {		challenge_response(challenge, password, pos); /* NT-Response */		wpa_hexdump_key(MSG_DEBUG, "EAP-TTLS: MSCHAP password hash",				password, 16);	} else {		nt_challenge_response(challenge, password, password_len,				      pos); /* NT-Response */		wpa_hexdump_ascii_key(MSG_DEBUG, "EAP-TTLS: MSCHAP password",				      password, password_len);	}	wpa_hexdump(MSG_DEBUG, "EAP-TTLS: MSCHAP implicit challenge",		    challenge, EAP_TTLS_MSCHAP_CHALLENGE_LEN);	wpa_hexdump(MSG_DEBUG, "EAP-TTLS: MSCHAP response", pos, 24);	pos += 24;	os_free(challenge);	AVP_PAD(buf, pos);	wpabuf_put(msg, pos - buf);	*resp = msg;	if (data->ttls_version > 0) {		/* EAP-TTLSv1 uses TLS/IA FinalPhaseFinished to report success,		 * so do not allow connection to be terminated yet. */		ret->methodState = METHOD_CONT;		ret->decision = DECISION_COND_SUCC;	} else {		/* EAP-TTLS/MSCHAP does not provide tunneled success		 * notification, so assume that Phase2 succeeds. */		ret->methodState = METHOD_DONE;		ret->decision = DECISION_COND_SUCC;	}	return 0;}static int eap_ttls_phase2_request_pap(struct eap_sm *sm,				       struct eap_ttls_data *data,				       struct eap_method_ret *ret,				       struct wpabuf **resp){	struct wpabuf *msg;	u8 *buf, *pos;	size_t pad;	const u8 *identity, *password;	size_t identity_len, password_len;	wpa_printf(MSG_DEBUG, "EAP-TTLS: Phase 2 PAP Request");	identity = eap_get_config_identity(sm, &identity_len);	password = eap_get_config_password(sm, &password_len);	if (identity == NULL || password == NULL)		return -1;	msg = wpabuf_alloc(identity_len + password_len + 100);	if (msg == NULL) {		wpa_printf(MSG_ERROR,			   "EAP-TTLS/PAP: Failed to allocate memory");		return -1;	}	pos = buf = wpabuf_mhead(msg);	/* User-Name */	pos = eap_ttls_avp_add(buf, pos, RADIUS_ATTR_USER_NAME, 0, 1,			       identity, identity_len);	/* User-Password; in RADIUS, this is encrypted, but EAP-TTLS encrypts	 * the data, so no separate encryption is used in the AVP itself.	 * However, the password is padded to obfuscate its length. */	pad = (16 - (password_len & 15)) & 15;	pos = eap_ttls_avp_hdr(pos, RADIUS_ATTR_USER_PASSWORD, 0, 1,			       password_len + pad);	os_memcpy(pos, password, password_len);	pos += password_len;	os_memset(pos, 0, pad);	pos += pad;	AVP_PAD(buf, pos);	wpabuf_put(msg, pos - buf);	*resp = msg;	if (data->ttls_version > 0) {		/* EAP-TTLSv1 uses TLS/IA FinalPhaseFinished to report success,		 * so do not allow connection to be terminated yet. */		ret->methodState = METHOD_CONT;		ret->decision = DECISION_COND_SUCC;	} else {		/* EAP-TTLS/PAP does not provide tunneled success notification,		 * so assume that Phase2 succeeds. */		ret->methodState = METHOD_DONE;		ret->decision = DECISION_COND_SUCC;	}	return 0;}static int eap_ttls_phase2_request_chap(struct eap_sm *sm,					struct eap_ttls_data *data,					struct eap_method_ret *ret,					struct wpabuf **resp){	struct wpabuf *msg;	u8 *buf, *pos, *challenge;	const u8 *identity, *password;	size_t identity_len, password_len;	wpa_printf(MSG_DEBUG, "EAP-TTLS: Phase 2 CHAP Request");	identity = eap_get_config_identity(sm, &identity_len);	password = eap_get_config_password(sm, &password_len);	if (identity == NULL || password == NULL)		return -1;	msg = wpabuf_alloc(identity_len + 1000);	if (msg == NULL) {		wpa_printf(MSG_ERROR,			   "EAP-TTLS/CHAP: Failed to allocate memory");		return -1;	}	pos = buf = wpabuf_mhead(msg);	/* User-Name */	pos = eap_ttls_avp_add(buf, pos, RADIUS_ATTR_USER_NAME, 0, 1,			       identity, identity_len);	/* CHAP-Challenge */	challenge = eap_ttls_implicit_challenge(		sm, data, EAP_TTLS_CHAP_CHALLENGE_LEN + 1);	if (challenge == NULL) {		wpabuf_free(msg);		wpa_printf(MSG_ERROR, "EAP-TTLS/CHAP: Failed to derive "			   "implicit challenge");		return -1;	}	pos = eap_ttls_avp_add(buf, pos, RADIUS_ATTR_CHAP_CHALLENGE, 0, 1,			       challenge, EAP_TTLS_CHAP_CHALLENGE_LEN);	/* CHAP-Password */	pos = eap_ttls_avp_hdr(pos, RADIUS_ATTR_CHAP_PASSWORD, 0, 1,			       1 + EAP_TTLS_CHAP_PASSWORD_LEN);	data->ident = challenge[EAP_TTLS_CHAP_CHALLENGE_LEN];	*pos++ = data->ident;	/* MD5(Ident + Password + Challenge) */	chap_md5(data->ident, password, password_len, challenge,		 EAP_TTLS_CHAP_CHALLENGE_LEN, pos);	wpa_hexdump_ascii(MSG_DEBUG, "EAP-TTLS: CHAP username",			  identity, identity_len);	wpa_hexdump_ascii_key(MSG_DEBUG, "EAP-TTLS: CHAP password",			      password, password_len);	wpa_hexdump(MSG_DEBUG, "EAP-TTLS: CHAP implicit challenge",		    challenge, EAP_TTLS_CHAP_CHALLENGE_LEN);	wpa_hexdump(MSG_DEBUG, "EAP-TTLS: CHAP password",		    pos, EAP_TTLS_CHAP_PASSWORD_LEN);	pos += EAP_TTLS_CHAP_PASSWORD_LEN;	os_free(challenge);	AVP_PAD(buf, pos);	wpabuf_put(msg, pos - buf);	*resp = msg;	if (data->ttls_version > 0) {		/* EAP-TTLSv1 uses TLS/IA FinalPhaseFinished to report success,		 * so do not allow connection to be terminated yet. */		ret->methodState = METHOD_CONT;		ret->decision = DECISION_COND_SUCC;	} else {		/* EAP-TTLS/CHAP does not provide tunneled success		 * notification, so assume that Phase2 succeeds. */		ret->methodState = METHOD_DONE;		ret->decision = DECISION_COND_SUCC;	}	return 0;}static int eap_ttls_phase2_request(struct eap_sm *sm,				   struct eap_ttls_data *data,				   struct eap_method_ret *ret,				   struct eap_hdr *hdr,				   struct wpabuf **resp){	int res = 0;	size_t len;	enum phase2_types phase2_type = data->phase2_type;#ifdef EAP_TNC	if (data->tnc_started) {		wpa_printf(MSG_DEBUG, "EAP-TTLS: Processing TNC");		phase2_type = EAP_TTLS_PHASE2_EAP;	}#endif /* EAP_TNC */	if (phase2_type == EAP_TTLS_PHASE2_MSCHAPV2 ||	    phase2_type == EAP_TTLS_PHASE2_MSCHAP ||	    phase2_type == EAP_TTLS_PHASE2_PAP ||	    phase2_type == EAP_TTLS_PHASE2_CHAP) {		if (eap_get_config_identity(sm, &len) == NULL) {			wpa_printf(MSG_INFO,				   "EAP-TTLS: Identity not configured");			eap_sm_request_identity(sm);			if (eap_get_config_password(sm, &len) == NULL)				eap_sm_request_password(sm);			return 0;		}		if (eap_get_config_password(sm, &len) == NULL) {			wpa_printf(MSG_INFO,				   "EAP-TTLS: Password not configured");			eap_sm_request_password(sm);			return 0;		}	}

⌨️ 快捷键说明

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