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

📄 tlsv1_client.c

📁 WLAN无线网络管理的最新程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	end = pos + len;	if (end - pos < 3) {		wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate "			   "(left=%lu)", (unsigned long) left);		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);		return -1;	}	list_len = WPA_GET_BE24(pos);	pos += 3;	if ((size_t) (end - pos) != list_len) {		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate_list "			   "length (len=%lu left=%lu)",			   (unsigned long) list_len,			   (unsigned long) (end - pos));		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);		return -1;	}	idx = 0;	while (pos < end) {		if (end - pos < 3) {			wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "				   "certificate_list");			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,				  TLS_ALERT_DECODE_ERROR);			x509_certificate_chain_free(chain);			return -1;		}		cert_len = WPA_GET_BE24(pos);		pos += 3;		if ((size_t) (end - pos) < cert_len) {			wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate "				   "length (len=%lu left=%lu)",				   (unsigned long) cert_len,				   (unsigned long) (end - pos));			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,				  TLS_ALERT_DECODE_ERROR);			x509_certificate_chain_free(chain);			return -1;		}		wpa_printf(MSG_DEBUG, "TLSv1: Certificate %lu (len %lu)",			   (unsigned long) idx, (unsigned long) cert_len);		if (idx == 0) {			crypto_public_key_free(conn->server_rsa_key);			if (tls_parse_cert(pos, cert_len,					   &conn->server_rsa_key)) {				wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "					   "the certificate");				tls_alert(conn, TLS_ALERT_LEVEL_FATAL,					  TLS_ALERT_BAD_CERTIFICATE);				x509_certificate_chain_free(chain);				return -1;			}		}		cert = x509_certificate_parse(pos, cert_len);		if (cert == NULL) {			wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "				   "the certificate");			tls_alert(conn, TLS_ALERT_LEVEL_FATAL,				  TLS_ALERT_BAD_CERTIFICATE);			x509_certificate_chain_free(chain);			return -1;		}		if (last == NULL)			chain = cert;		else			last->next = cert;		last = cert;		idx++;		pos += cert_len;	}	if (x509_certificate_chain_validate(conn->trusted_certs, chain,					    &reason) < 0) {		int tls_reason;		wpa_printf(MSG_DEBUG, "TLSv1: Server certificate chain "			   "validation failed (reason=%d)", reason);		switch (reason) {		case X509_VALIDATE_BAD_CERTIFICATE:			tls_reason = TLS_ALERT_BAD_CERTIFICATE;			break;		case X509_VALIDATE_UNSUPPORTED_CERTIFICATE:			tls_reason = TLS_ALERT_UNSUPPORTED_CERTIFICATE;			break;		case X509_VALIDATE_CERTIFICATE_REVOKED:			tls_reason = TLS_ALERT_CERTIFICATE_REVOKED;			break;		case X509_VALIDATE_CERTIFICATE_EXPIRED:			tls_reason = TLS_ALERT_CERTIFICATE_EXPIRED;			break;		case X509_VALIDATE_CERTIFICATE_UNKNOWN:			tls_reason = TLS_ALERT_CERTIFICATE_UNKNOWN;			break;		case X509_VALIDATE_UNKNOWN_CA:			tls_reason = TLS_ALERT_UNKNOWN_CA;			break;		default:			tls_reason = TLS_ALERT_BAD_CERTIFICATE;			break;		}		tls_alert(conn, TLS_ALERT_LEVEL_FATAL, tls_reason);		x509_certificate_chain_free(chain);		return -1;	}	x509_certificate_chain_free(chain);	*in_len = end - in_data;	conn->state = SERVER_KEY_EXCHANGE;	return 0;}static void tlsv1_client_free_dh(struct tlsv1_client *conn){	os_free(conn->dh_p);	os_free(conn->dh_g);	os_free(conn->dh_ys);	conn->dh_p = conn->dh_g = conn->dh_ys = NULL;}static int tlsv1_process_diffie_hellman(struct tlsv1_client *conn,					const u8 *buf, size_t len){	const u8 *pos, *end;	tlsv1_client_free_dh(conn);	pos = buf;	end = buf + len;	if (end - pos < 3)		goto fail;	conn->dh_p_len = WPA_GET_BE16(pos);	pos += 2;	if (conn->dh_p_len == 0 || end - pos < (int) conn->dh_p_len)		goto fail;	conn->dh_p = os_malloc(conn->dh_p_len);	if (conn->dh_p == NULL)		goto fail;	os_memcpy(conn->dh_p, pos, conn->dh_p_len);	pos += conn->dh_p_len;	wpa_hexdump(MSG_DEBUG, "TLSv1: DH p (prime)",		    conn->dh_p, conn->dh_p_len);	if (end - pos < 3)		goto fail;	conn->dh_g_len = WPA_GET_BE16(pos);	pos += 2;	if (conn->dh_g_len == 0 || end - pos < (int) conn->dh_g_len)		goto fail;	conn->dh_g = os_malloc(conn->dh_g_len);	if (conn->dh_g == NULL)		goto fail;	os_memcpy(conn->dh_g, pos, conn->dh_g_len);	pos += conn->dh_g_len;	wpa_hexdump(MSG_DEBUG, "TLSv1: DH g (generator)",		    conn->dh_g, conn->dh_g_len);	if (conn->dh_g_len == 1 && conn->dh_g[0] < 2)		goto fail;	if (end - pos < 3)		goto fail;	conn->dh_ys_len = WPA_GET_BE16(pos);	pos += 2;	if (conn->dh_ys_len == 0 || end - pos < (int) conn->dh_ys_len)		goto fail;	conn->dh_ys = os_malloc(conn->dh_ys_len);	if (conn->dh_ys == NULL)		goto fail;	os_memcpy(conn->dh_ys, pos, conn->dh_ys_len);	pos += conn->dh_ys_len;	wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)",		    conn->dh_ys, conn->dh_ys_len);	return 0;fail:	tlsv1_client_free_dh(conn);	return -1;}static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct,					   const u8 *in_data, size_t *in_len){	const u8 *pos, *end;	size_t left, len;	u8 type;	const struct tls_cipher_suite *suite;	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 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)) {		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);		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)",

⌨️ 快捷键说明

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