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

📄 eap_sim.c

📁 最新的Host AP 新添加了许多pcmcia 的驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
			eap_sim_clear_identities(data, CLEAR_PSEUDONYM |						 CLEAR_REAUTH_ID);		}	}	if (id_req != NO_ID_REQ)		eap_sim_clear_identities(data, CLEAR_EAP_ID);	wpa_printf(MSG_DEBUG, "Generating EAP-SIM Start (id=%d)", id);	msg = eap_sim_msg_init(EAP_CODE_RESPONSE, id,			       EAP_TYPE_SIM, EAP_SIM_SUBTYPE_START);	if (!data->reauth) {		wpa_hexdump(MSG_DEBUG, "   AT_NONCE_MT",			    data->nonce_mt, EAP_SIM_NONCE_MT_LEN);		eap_sim_msg_add(msg, EAP_SIM_AT_NONCE_MT, 0,				data->nonce_mt, EAP_SIM_NONCE_MT_LEN);		wpa_printf(MSG_DEBUG, "   AT_SELECTED_VERSION %d",			   data->selected_version);		eap_sim_msg_add(msg, EAP_SIM_AT_SELECTED_VERSION,				data->selected_version, NULL, 0);	}	if (identity) {		wpa_hexdump_ascii(MSG_DEBUG, "   AT_IDENTITY",				  identity, identity_len);		eap_sim_msg_add(msg, EAP_SIM_AT_IDENTITY, identity_len,				identity, identity_len);	}	return eap_sim_msg_finish(msg, NULL, NULL, 0);}static struct wpabuf * eap_sim_response_challenge(struct eap_sim_data *data,						  u8 id){	struct eap_sim_msg *msg;	wpa_printf(MSG_DEBUG, "Generating EAP-SIM Challenge (id=%d)", id);	msg = eap_sim_msg_init(EAP_CODE_RESPONSE, id, EAP_TYPE_SIM,			       EAP_SIM_SUBTYPE_CHALLENGE);	if (data->use_result_ind) {		wpa_printf(MSG_DEBUG, "   AT_RESULT_IND");		eap_sim_msg_add(msg, EAP_SIM_AT_RESULT_IND, 0, NULL, 0);	}	wpa_printf(MSG_DEBUG, "   AT_MAC");	eap_sim_msg_add_mac(msg, EAP_SIM_AT_MAC);	return eap_sim_msg_finish(msg, data->k_aut, (u8 *) data->sres,				  data->num_chal * EAP_SIM_SRES_LEN);}static struct wpabuf * eap_sim_response_reauth(struct eap_sim_data *data,					       u8 id, int counter_too_small){	struct eap_sim_msg *msg;	unsigned int counter;	wpa_printf(MSG_DEBUG, "Generating EAP-SIM Reauthentication (id=%d)",		   id);	msg = eap_sim_msg_init(EAP_CODE_RESPONSE, id, EAP_TYPE_SIM,			       EAP_SIM_SUBTYPE_REAUTHENTICATION);	wpa_printf(MSG_DEBUG, "   AT_IV");	wpa_printf(MSG_DEBUG, "   AT_ENCR_DATA");	eap_sim_msg_add_encr_start(msg, EAP_SIM_AT_IV, EAP_SIM_AT_ENCR_DATA);	if (counter_too_small) {		wpa_printf(MSG_DEBUG, "   *AT_COUNTER_TOO_SMALL");		eap_sim_msg_add(msg, EAP_SIM_AT_COUNTER_TOO_SMALL, 0, NULL, 0);		counter = data->counter_too_small;	} else		counter = data->counter;	wpa_printf(MSG_DEBUG, "   *AT_COUNTER %d", counter);	eap_sim_msg_add(msg, EAP_SIM_AT_COUNTER, counter, NULL, 0);	if (eap_sim_msg_add_encr_end(msg, data->k_encr, EAP_SIM_AT_PADDING)) {		wpa_printf(MSG_WARNING, "EAP-SIM: Failed to encrypt "			   "AT_ENCR_DATA");		eap_sim_msg_free(msg);		return NULL;	}	if (data->use_result_ind) {		wpa_printf(MSG_DEBUG, "   AT_RESULT_IND");		eap_sim_msg_add(msg, EAP_SIM_AT_RESULT_IND, 0, NULL, 0);	}	wpa_printf(MSG_DEBUG, "   AT_MAC");	eap_sim_msg_add_mac(msg, EAP_SIM_AT_MAC);	return eap_sim_msg_finish(msg, data->k_aut, data->nonce_s,				  EAP_SIM_NONCE_S_LEN);}static struct wpabuf * eap_sim_response_notification(struct eap_sim_data *data,						     u8 id, u16 notification){	struct eap_sim_msg *msg;	u8 *k_aut = (notification & 0x4000) == 0 ? data->k_aut : NULL;	wpa_printf(MSG_DEBUG, "Generating EAP-SIM Notification (id=%d)", id);	msg = eap_sim_msg_init(EAP_CODE_RESPONSE, id,			       EAP_TYPE_SIM, EAP_SIM_SUBTYPE_NOTIFICATION);	wpa_printf(MSG_DEBUG, "   AT_NOTIFICATION");	eap_sim_msg_add(msg, EAP_SIM_AT_NOTIFICATION, notification, NULL, 0);	if (k_aut && data->reauth) {		wpa_printf(MSG_DEBUG, "   AT_IV");		wpa_printf(MSG_DEBUG, "   AT_ENCR_DATA");		eap_sim_msg_add_encr_start(msg, EAP_SIM_AT_IV,					   EAP_SIM_AT_ENCR_DATA);		wpa_printf(MSG_DEBUG, "   *AT_COUNTER %d", data->counter);		eap_sim_msg_add(msg, EAP_SIM_AT_COUNTER, data->counter,				NULL, 0);		if (eap_sim_msg_add_encr_end(msg, data->k_encr,					     EAP_SIM_AT_PADDING)) {			wpa_printf(MSG_WARNING, "EAP-SIM: Failed to encrypt "				   "AT_ENCR_DATA");			eap_sim_msg_free(msg);			return NULL;		}	}	if (k_aut) {		wpa_printf(MSG_DEBUG, "   AT_MAC");		eap_sim_msg_add_mac(msg, EAP_SIM_AT_MAC);	}	return eap_sim_msg_finish(msg, k_aut, (u8 *) "", 0);}static struct wpabuf * eap_sim_process_start(struct eap_sm *sm,					     struct eap_sim_data *data, u8 id,					     struct eap_sim_attrs *attr){	int selected_version = -1, id_error;	size_t i;	u8 *pos;	wpa_printf(MSG_DEBUG, "EAP-SIM: subtype Start");	if (attr->version_list == NULL) {		wpa_printf(MSG_INFO, "EAP-SIM: No AT_VERSION_LIST in "			   "SIM/Start");		return eap_sim_client_error(data, id,					    EAP_SIM_UNSUPPORTED_VERSION);	}	os_free(data->ver_list);	data->ver_list = os_malloc(attr->version_list_len);	if (data->ver_list == NULL) {		wpa_printf(MSG_DEBUG, "EAP-SIM: Failed to allocate "			   "memory for version list");		return eap_sim_client_error(data, id,					    EAP_SIM_UNABLE_TO_PROCESS_PACKET);	}	os_memcpy(data->ver_list, attr->version_list, attr->version_list_len);	data->ver_list_len = attr->version_list_len;	pos = data->ver_list;	for (i = 0; i < data->ver_list_len / 2; i++) {		int ver = pos[0] * 256 + pos[1];		pos += 2;		if (eap_sim_supported_ver(ver)) {			selected_version = ver;			break;		}	}	if (selected_version < 0) {		wpa_printf(MSG_INFO, "EAP-SIM: Could not find a supported "			   "version");		return eap_sim_client_error(data, id,					    EAP_SIM_UNSUPPORTED_VERSION);	}	wpa_printf(MSG_DEBUG, "EAP-SIM: Selected Version %d",		   selected_version);	data->selected_version = selected_version;	id_error = 0;	switch (attr->id_req) {	case NO_ID_REQ:		break;	case ANY_ID:		if (data->num_id_req > 0)			id_error++;		data->num_id_req++;		break;	case FULLAUTH_ID:		if (data->num_id_req > 1)			id_error++;		data->num_id_req++;		break;	case PERMANENT_ID:		if (data->num_id_req > 2)			id_error++;		data->num_id_req++;		break;	}	if (id_error) {		wpa_printf(MSG_INFO, "EAP-SIM: Too many ID requests "			   "used within one authentication");		return eap_sim_client_error(data, id,					    EAP_SIM_UNABLE_TO_PROCESS_PACKET);	}	return eap_sim_response_start(sm, data, id, attr->id_req);}static struct wpabuf * eap_sim_process_challenge(struct eap_sm *sm,						 struct eap_sim_data *data,						 u8 id,						 const struct wpabuf *reqData,						 struct eap_sim_attrs *attr){	const u8 *identity;	size_t identity_len;	struct eap_sim_attrs eattr;	wpa_printf(MSG_DEBUG, "EAP-SIM: subtype Challenge");	data->reauth = 0;	if (!attr->mac || !attr->rand) {		wpa_printf(MSG_WARNING, "EAP-SIM: Challenge message "			   "did not include%s%s",			   !attr->mac ? " AT_MAC" : "",			   !attr->rand ? " AT_RAND" : "");		return eap_sim_client_error(data, id,					    EAP_SIM_UNABLE_TO_PROCESS_PACKET);	}	wpa_printf(MSG_DEBUG, "EAP-SIM: %lu challenges",		   (unsigned long) attr->num_chal);	if (attr->num_chal < data->min_num_chal) {		wpa_printf(MSG_INFO, "EAP-SIM: Insufficient number of "			   "challenges (%lu)", (unsigned long) attr->num_chal);		return eap_sim_client_error(data, id,					    EAP_SIM_INSUFFICIENT_NUM_OF_CHAL);	}	if (attr->num_chal > 3) {		wpa_printf(MSG_INFO, "EAP-SIM: Too many challenges "			   "(%lu)", (unsigned long) attr->num_chal);		return eap_sim_client_error(data, id,					    EAP_SIM_UNABLE_TO_PROCESS_PACKET);	}	/* Verify that RANDs are different */	if (os_memcmp(attr->rand, attr->rand + GSM_RAND_LEN,		   GSM_RAND_LEN) == 0 ||	    (attr->num_chal > 2 &&	     (os_memcmp(attr->rand, attr->rand + 2 * GSM_RAND_LEN,			GSM_RAND_LEN) == 0 ||	      os_memcmp(attr->rand + GSM_RAND_LEN,			attr->rand + 2 * GSM_RAND_LEN,			GSM_RAND_LEN) == 0))) {		wpa_printf(MSG_INFO, "EAP-SIM: Same RAND used multiple times");		return eap_sim_client_error(data, id,					    EAP_SIM_RAND_NOT_FRESH);	}	os_memcpy(data->rand, attr->rand, attr->num_chal * GSM_RAND_LEN);	data->num_chal = attr->num_chal;			if (eap_sim_gsm_auth(sm, data)) {		wpa_printf(MSG_WARNING, "EAP-SIM: GSM authentication failed");		return eap_sim_client_error(data, id,					    EAP_SIM_UNABLE_TO_PROCESS_PACKET);	}	if (data->last_eap_identity) {		identity = data->last_eap_identity;		identity_len = data->last_eap_identity_len;	} else if (data->pseudonym) {		identity = data->pseudonym;		identity_len = data->pseudonym_len;	} else		identity = eap_get_config_identity(sm, &identity_len);	wpa_hexdump_ascii(MSG_DEBUG, "EAP-SIM: Selected identity for MK "			  "derivation", identity, identity_len);	eap_sim_derive_mk(identity, identity_len, data->nonce_mt,			  data->selected_version, data->ver_list,			  data->ver_list_len, data->num_chal,			  (const u8 *) data->kc, data->mk);	eap_sim_derive_keys(data->mk, data->k_encr, data->k_aut, data->msk,			    data->emsk);	if (eap_sim_verify_mac(data->k_aut, reqData, attr->mac, data->nonce_mt,			       EAP_SIM_NONCE_MT_LEN)) {		wpa_printf(MSG_WARNING, "EAP-SIM: Challenge message "			   "used invalid AT_MAC");		return eap_sim_client_error(data, id,					    EAP_SIM_UNABLE_TO_PROCESS_PACKET);	}	/* Old reauthentication and pseudonym identities must not be used	 * anymore. In other words, if no new identities are received, full	 * authentication will be used on next reauthentication. */	eap_sim_clear_identities(data, CLEAR_PSEUDONYM | CLEAR_REAUTH_ID |				 CLEAR_EAP_ID);	if (attr->encr_data) {		u8 *decrypted;		decrypted = eap_sim_parse_encr(data->k_encr, attr->encr_data,					       attr->encr_data_len, attr->iv,					       &eattr, 0);		if (decrypted == NULL) {			return eap_sim_client_error(				data, id, EAP_SIM_UNABLE_TO_PROCESS_PACKET);		}		eap_sim_learn_ids(data, &eattr);		os_free(decrypted);	}	if (data->result_ind && attr->result_ind)		data->use_result_ind = 1;	if (data->state != FAILURE && data->state != RESULT_FAILURE) {		eap_sim_state(data, data->use_result_ind ?			      RESULT_SUCCESS : SUCCESS);	}	data->num_id_req = 0;	data->num_notification = 0;	/* RFC 4186 specifies that counter is initialized to one after	 * fullauth, but initializing it to zero makes it easier to implement	 * reauth verification. */	data->counter = 0;	return eap_sim_response_challenge(data, id);}static int eap_sim_process_notification_reauth(struct eap_sim_data *data,					       struct eap_sim_attrs *attr){	struct eap_sim_attrs eattr;	u8 *decrypted;	if (attr->encr_data == NULL || attr->iv == NULL) {		wpa_printf(MSG_WARNING, "EAP-SIM: Notification message after "			   "reauth did not include encrypted data");		return -1;	}	decrypted = eap_sim_parse_encr(data->k_encr, attr->encr_data,				       attr->encr_data_len, attr->iv, &eattr,				       0);	if (decrypted == NULL) {		wpa_printf(MSG_WARNING, "EAP-SIM: Failed to parse encrypted "			   "data from notification message");		return -1;	}	if (eattr.counter < 0 || (size_t) eattr.counter != data->counter) {		wpa_printf(MSG_WARNING, "EAP-SIM: Counter in notification "			   "message does not match with counter in reauth "			   "message");		os_free(decrypted);		return -1;	}	os_free(decrypted);	return 0;}static int eap_sim_process_notification_auth(struct eap_sim_data *data,					     const struct wpabuf *reqData,					     struct eap_sim_attrs *attr){	if (attr->mac == NULL) {		wpa_printf(MSG_INFO, "EAP-SIM: no AT_MAC in after_auth "			   "Notification message");		return -1;	}	if (eap_sim_verify_mac(data->k_aut, reqData, attr->mac, (u8 *) "", 0))	{		wpa_printf(MSG_WARNING, "EAP-SIM: Notification message "

⌨️ 快捷键说明

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