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

📄 tlsv1_client_read.c

📁 最新的Host AP 新添加了许多pcmcia 的驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	pos = in_data;	left = *in_len;	if (left < 4) {		wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerKeyExchange "			   "(Left=%lu)", (unsigned long) left);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);		return -1;	}	type = *pos++;	len = WPA_GET_BE24(pos);	pos += 3;	left -= 4;	if (len > left) {		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerKeyExchange "			   "length (len=%lu != left=%lu)",			   (unsigned long) len, (unsigned long) left);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);		return -1;	}	end = pos + len;	if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)		return tls_process_certificate_request(conn, ct, in_data,						       in_len);	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)		return tls_process_server_hello_done(conn, ct, in_data,						     in_len);	if (type != TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE) {		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "			   "message %d (expected ServerKeyExchange/"			   "CertificateRequest/ServerHelloDone)", type);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_UNEXPECTED_MESSAGE);		return -1;	}	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerKeyExchange");	if (!tls_server_key_exchange_allowed(conn->rl.cipher_suite)) {		wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not allowed "			   "with the selected cipher suite");		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_UNEXPECTED_MESSAGE);		return -1;	}	wpa_hexdump(MSG_DEBUG, "TLSv1: ServerKeyExchange", pos, len);	suite = tls_get_cipher_suite(conn->rl.cipher_suite);	if (suite && suite->key_exchange == TLS_KEY_X_DH_anon) {		if (tlsv1_process_diffie_hellman(conn, pos, len) < 0) {			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,				  TLS_ALERT_DECODE_ERROR);			return -1;		}	} else {		wpa_printf(MSG_DEBUG, "TLSv1: UnexpectedServerKeyExchange");		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_UNEXPECTED_MESSAGE);		return -1;	}	*in_len = end - in_data;	conn->state = SERVER_CERTIFICATE_REQUEST;	return 0;}static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct,					   const u8 *in_data, size_t *in_len){	const u8 *pos, *end;	size_t left, len;	u8 type;	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "			   "received content type 0x%x", ct);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_UNEXPECTED_MESSAGE);		return -1;	}	pos = in_data;	left = *in_len;	if (left < 4) {		wpa_printf(MSG_DEBUG, "TLSv1: Too short CertificateRequest "			   "(left=%lu)", (unsigned long) left);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);		return -1;	}	type = *pos++;	len = WPA_GET_BE24(pos);	pos += 3;	left -= 4;	if (len > left) {		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in CertificateRequest "			   "length (len=%lu != left=%lu)",			   (unsigned long) len, (unsigned long) left);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);		return -1;	}	end = pos + len;	if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)		return tls_process_server_hello_done(conn, ct, in_data,						     in_len);	if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) {		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "			   "message %d (expected CertificateRequest/"			   "ServerHelloDone)", type);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_UNEXPECTED_MESSAGE);		return -1;	}	wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateRequest");	conn->certificate_requested = 1;	*in_len = end - in_data;	conn->state = SERVER_HELLO_DONE;	return 0;}static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct,					 const u8 *in_data, size_t *in_len){	const u8 *pos, *end;	size_t left, len;	u8 type;	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {		wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "			   "received content type 0x%x", ct);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_UNEXPECTED_MESSAGE);		return -1;	}	pos = in_data;	left = *in_len;	if (left < 4) {		wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerHelloDone "			   "(left=%lu)", (unsigned long) left);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);		return -1;	}	type = *pos++;	len = WPA_GET_BE24(pos);	pos += 3;	left -= 4;	if (len > left) {		wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerHelloDone "			   "length (len=%lu != left=%lu)",			   (unsigned long) len, (unsigned long) left);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);		return -1;	}	end = pos + len;	if (type != TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) {		wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "			   "message %d (expected ServerHelloDone)", type);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_UNEXPECTED_MESSAGE);		return -1;	}	wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHelloDone");	*in_len = end - in_data;	conn->state = CLIENT_KEY_EXCHANGE;	return 0;}static int tls_process_server_change_cipher_spec(struct tlsv1_client *conn,						 u8 ct, const u8 *in_data,						 size_t *in_len){	const u8 *pos;	size_t left;	if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) {		wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "			   "received content type 0x%x", ct);		if (conn->use_session_ticket) {			int res;			wpa_printf(MSG_DEBUG, "TLSv1: Server may have "				   "rejected SessionTicket");			conn->use_session_ticket = 0;			/* Notify upper layers that SessionTicket failed */			res = conn->session_ticket_cb(				conn->session_ticket_cb_ctx, NULL, 0, NULL,				NULL, NULL);			if (res < 0) {				wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket "					   "callback indicated failure");				tls_alert(conn, TLS_ALERT_LEVEL_FATAL,					  TLS_ALERT_HANDSHAKE_FAILURE);				return -1;			}			conn->state = SERVER_CERTIFICATE;			return tls_process_certificate(conn, ct, in_data,						       in_len);		}		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_UNEXPECTED_MESSAGE);		return -1;	}	pos = in_data;	left = *in_len;	if (left < 1) {		wpa_printf(MSG_DEBUG, "TLSv1: Too short ChangeCipherSpec");		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);		return -1;	}	if (*pos != TLS_CHANGE_CIPHER_SPEC) {		wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "			   "received data 0x%x", *pos);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_UNEXPECTED_MESSAGE);		return -1;	}	wpa_printf(MSG_DEBUG, "TLSv1: Received ChangeCipherSpec");	if (tlsv1_record_change_read_cipher(&conn->rl) < 0) {		wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher "			   "for record layer");		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_INTERNAL_ERROR);		return -1;	}	*in_len = pos + 1 - in_data;	conn->state = SERVER_FINISHED;	return 0;}static int tls_process_server_finished(struct tlsv1_client *conn, u8 ct,				       const u8 *in_data, size_t *in_len){	const u8 *pos, *end;	size_t left, len, hlen;	u8 verify_data[TLS_VERIFY_DATA_LEN];	u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];	if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {		wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; "			   "received content type 0x%x", ct);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_UNEXPECTED_MESSAGE);		return -1;	}	pos = in_data;	left = *in_len;	if (left < 4) {		wpa_printf(MSG_DEBUG, "TLSv1: Too short record (left=%lu) for "			   "Finished",			   (unsigned long) left);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_DECODE_ERROR);		return -1;	}	if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) {		wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received "			   "type 0x%x", pos[0]);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_UNEXPECTED_MESSAGE);		return -1;	}	len = WPA_GET_BE24(pos + 1);	pos += 4;	left -= 4;	if (len > left) {		wpa_printf(MSG_DEBUG, "TLSv1: Too short buffer for Finished "			   "(len=%lu > left=%lu)",			   (unsigned long) len, (unsigned long) left);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_DECODE_ERROR);		return -1;	}	end = pos + len;	if (len != TLS_VERIFY_DATA_LEN) {		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected verify_data length "			   "in Finished: %lu (expected %d)",			   (unsigned long) len, TLS_VERIFY_DATA_LEN);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_DECODE_ERROR);		return -1;	}	wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished",		    pos, TLS_VERIFY_DATA_LEN);	hlen = MD5_MAC_LEN;	if (conn->verify.md5_server == NULL ||	    crypto_hash_finish(conn->verify.md5_server, hash, &hlen) < 0) {		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_INTERNAL_ERROR);		conn->verify.md5_server = NULL;		crypto_hash_finish(conn->verify.sha1_server, NULL, NULL);		conn->verify.sha1_server = NULL;		return -1;	}	conn->verify.md5_server = NULL;	hlen = SHA1_MAC_LEN;	if (conn->verify.sha1_server == NULL ||	    crypto_hash_finish(conn->verify.sha1_server, hash + MD5_MAC_LEN,			       &hlen) < 0) {		conn->verify.sha1_server = NULL;		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_INTERNAL_ERROR);		return -1;	}	conn->verify.sha1_server = NULL;	if (tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN,		    "server finished", hash, MD5_MAC_LEN + SHA1_MAC_LEN,		    verify_data, TLS_VERIFY_DATA_LEN)) {		wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data");		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_DECRYPT_ERROR);		return -1;	}	wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)",			verify_data, TLS_VERIFY_DATA_LEN);	if (os_memcmp(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) {		wpa_printf(MSG_INFO, "TLSv1: Mismatch in verify_data");		return -1;	}	wpa_printf(MSG_DEBUG, "TLSv1: Received Finished");	*in_len = end - in_data;	conn->state = (conn->session_resumed || conn->use_session_ticket) ?		CHANGE_CIPHER_SPEC : ACK_FINISHED;	return 0;}static int tls_process_application_data(struct tlsv1_client *conn, u8 ct,					const u8 *in_data, size_t *in_len,					u8 **out_data, size_t *out_len){	const u8 *pos;	size_t left;	if (ct != TLS_CONTENT_TYPE_APPLICATION_DATA) {		wpa_printf(MSG_DEBUG, "TLSv1: Expected Application Data; "			   "received content type 0x%x", ct);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL,			  TLS_ALERT_UNEXPECTED_MESSAGE);		return -1;	}	pos = in_data;	left = *in_len;	wpa_hexdump(MSG_DEBUG, "TLSv1: Application Data included in Handshake",		    pos, left);	*out_data = os_malloc(left);	if (*out_data) {		os_memcpy(*out_data, pos, left);		*out_len = left;	}	return 0;}int tlsv1_client_process_handshake(struct tlsv1_client *conn, u8 ct,				   const u8 *buf, size_t *len,				   u8 **out_data, size_t *out_len){	if (ct == TLS_CONTENT_TYPE_ALERT) {		if (*len < 2) {			wpa_printf(MSG_DEBUG, "TLSv1: Alert underflow");			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,				  TLS_ALERT_DECODE_ERROR);			return -1;		}		wpa_printf(MSG_DEBUG, "TLSv1: Received alert %d:%d",			   buf[0], buf[1]);		*len = 2;		conn->state = FAILED;		return -1;	}	if (ct == TLS_CONTENT_TYPE_HANDSHAKE && *len >= 4 &&	    buf[0] == TLS_HANDSHAKE_TYPE_HELLO_REQUEST) {		size_t hr_len = WPA_GET_BE24(buf + 1);		if (hr_len > *len - 4) {			wpa_printf(MSG_DEBUG, "TLSv1: HelloRequest underflow");			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,				  TLS_ALERT_DECODE_ERROR);			return -1;		}		wpa_printf(MSG_DEBUG, "TLSv1: Ignored HelloRequest");		*len = 4 + hr_len;		return 0;	}	switch (conn->state) {	case SERVER_HELLO:		if (tls_process_server_hello(conn, ct, buf, len))			return -1;		break;	case SERVER_CERTIFICATE:		if (tls_process_certificate(conn, ct, buf, len))			return -1;		break;	case SERVER_KEY_EXCHANGE:		if (tls_process_server_key_exchange(conn, ct, buf, len))			return -1;		break;	case SERVER_CERTIFICATE_REQUEST:		if (tls_process_certificate_request(conn, ct, buf, len))			return -1;		break;	case SERVER_HELLO_DONE:		if (tls_process_server_hello_done(conn, ct, buf, len))			return -1;		break;	case SERVER_CHANGE_CIPHER_SPEC:		if (tls_process_server_change_cipher_spec(conn, ct, buf, len))			return -1;		break;	case SERVER_FINISHED:		if (tls_process_server_finished(conn, ct, buf, len))			return -1;		break;	case ACK_FINISHED:		if (out_data &&		    tls_process_application_data(conn, ct, buf, len, out_data,						 out_len))			return -1;		break;	default:		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d "			   "while processing received message",			   conn->state);		return -1;	}	if (ct == TLS_CONTENT_TYPE_HANDSHAKE)		tls_verify_hash_add(&conn->verify, buf, *len);	return 0;}

⌨️ 快捷键说明

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