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

📄 tlsv1_server_write.c

📁 最新的Host AP 新添加了许多pcmcia 的驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
	WPA_PUT_BE16(pos, conn->cred->dh_g_len);	pos += 2;	os_memcpy(pos, conn->cred->dh_g, conn->cred->dh_g_len);	pos += conn->cred->dh_g_len;	/* dh_Ys */	if (pos + 2 + dh_ys_len > end) {		wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space for "			   "dh_Ys");		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,				   TLS_ALERT_INTERNAL_ERROR);		os_free(dh_ys);		return -1;	}	WPA_PUT_BE16(pos, dh_ys_len);	pos += 2;	os_memcpy(pos, dh_ys, dh_ys_len);	pos += dh_ys_len;	os_free(dh_ys);	WPA_PUT_BE24(hs_length, pos - hs_length - 3);	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,			      rhdr, end - rhdr, pos - hs_start, &rlen) < 0) {		wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,				   TLS_ALERT_INTERNAL_ERROR);		return -1;	}	pos = rhdr + rlen;	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);	*msgpos = pos;	return 0;#else /* EAP_FAST */	return -1;#endif /* EAP_FAST */}static int tls_write_server_certificate_request(struct tlsv1_server *conn,						u8 **msgpos, u8 *end){	u8 *pos, *rhdr, *hs_start, *hs_length;	size_t rlen;	if (!conn->verify_peer) {		wpa_printf(MSG_DEBUG, "TLSv1: No CertificateRequest needed");		return 0;	}	pos = *msgpos;	wpa_printf(MSG_DEBUG, "TLSv1: Send CertificateRequest");	rhdr = pos;	pos += TLS_RECORD_HEADER_LEN;	/* opaque fragment[TLSPlaintext.length] */	/* Handshake */	hs_start = pos;	/* HandshakeType msg_type */	*pos++ = TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST;	/* uint24 length (to be filled) */	hs_length = pos;	pos += 3;	/* body - CertificateRequest */	/*	 * enum {	 *   rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4),	 *   (255)	 * } ClientCertificateType;	 * ClientCertificateType certificate_types<1..2^8-1>	 */	*pos++ = 1;	*pos++ = 1; /* rsa_sign */	/*	 * opaque DistinguishedName<1..2^16-1>	 * DistinguishedName certificate_authorities<3..2^16-1>	 */	/* TODO: add support for listing DNs for trusted CAs */	WPA_PUT_BE16(pos, 0);	pos += 2;	WPA_PUT_BE24(hs_length, pos - hs_length - 3);	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,			      rhdr, end - rhdr, pos - hs_start, &rlen) < 0) {		wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,				   TLS_ALERT_INTERNAL_ERROR);		return -1;	}	pos = rhdr + rlen;	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);	*msgpos = pos;	return 0;}static int tls_write_server_hello_done(struct tlsv1_server *conn,				       u8 **msgpos, u8 *end){	u8 *pos, *rhdr, *hs_start, *hs_length;	size_t rlen;	pos = *msgpos;	wpa_printf(MSG_DEBUG, "TLSv1: Send ServerHelloDone");	rhdr = pos;	pos += TLS_RECORD_HEADER_LEN;	/* opaque fragment[TLSPlaintext.length] */	/* Handshake */	hs_start = pos;	/* HandshakeType msg_type */	*pos++ = TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE;	/* uint24 length (to be filled) */	hs_length = pos;	pos += 3;	/* body - ServerHelloDone (empty) */	WPA_PUT_BE24(hs_length, pos - hs_length - 3);	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,			      rhdr, end - rhdr, pos - hs_start, &rlen) < 0) {		wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,				   TLS_ALERT_INTERNAL_ERROR);		return -1;	}	pos = rhdr + rlen;	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);	*msgpos = pos;	return 0;}static int tls_write_server_change_cipher_spec(struct tlsv1_server *conn,					       u8 **msgpos, u8 *end){	u8 *pos, *rhdr;	size_t rlen;	pos = *msgpos;	wpa_printf(MSG_DEBUG, "TLSv1: Send ChangeCipherSpec");	rhdr = pos;	pos += TLS_RECORD_HEADER_LEN;	*pos = TLS_CHANGE_CIPHER_SPEC;	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC,			      rhdr, end - rhdr, 1, &rlen) < 0) {		wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,				   TLS_ALERT_INTERNAL_ERROR);		return -1;	}	if (tlsv1_record_change_write_cipher(&conn->rl) < 0) {		wpa_printf(MSG_DEBUG, "TLSv1: Failed to set write cipher for "			   "record layer");		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,				   TLS_ALERT_INTERNAL_ERROR);		return -1;	}	*msgpos = rhdr + rlen;	return 0;}static int tls_write_server_finished(struct tlsv1_server *conn,				     u8 **msgpos, u8 *end){	u8 *pos, *rhdr, *hs_start, *hs_length;	size_t rlen, hlen;	u8 verify_data[TLS_VERIFY_DATA_LEN];	u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];	pos = *msgpos;	wpa_printf(MSG_DEBUG, "TLSv1: Send Finished");	/* Encrypted Handshake Message: Finished */	hlen = MD5_MAC_LEN;	if (conn->verify.md5_server == NULL ||	    crypto_hash_finish(conn->verify.md5_server, hash, &hlen) < 0) {		tlsv1_server_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;		tlsv1_server_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 generate verify_data");		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,				   TLS_ALERT_INTERNAL_ERROR);		return -1;	}	wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)",			verify_data, TLS_VERIFY_DATA_LEN);	rhdr = pos;	pos += TLS_RECORD_HEADER_LEN;	/* Handshake */	hs_start = pos;	/* HandshakeType msg_type */	*pos++ = TLS_HANDSHAKE_TYPE_FINISHED;	/* uint24 length (to be filled) */	hs_length = pos;	pos += 3;	os_memcpy(pos, verify_data, TLS_VERIFY_DATA_LEN);	pos += TLS_VERIFY_DATA_LEN;	WPA_PUT_BE24(hs_length, pos - hs_length - 3);	tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);	if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,			      rhdr, end - rhdr, pos - hs_start, &rlen) < 0) {		wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");		tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,				   TLS_ALERT_INTERNAL_ERROR);		return -1;	}	pos = rhdr + rlen;	*msgpos = pos;	return 0;}static u8 * tls_send_server_hello(struct tlsv1_server *conn, size_t *out_len){	u8 *msg, *end, *pos;	size_t msglen;	*out_len = 0;	msglen = 1000 + tls_server_cert_chain_der_len(conn);	msg = os_malloc(msglen);	if (msg == NULL)		return NULL;	pos = msg;	end = msg + msglen;	if (tls_write_server_hello(conn, &pos, end) < 0) {		os_free(msg);		return NULL;	}	if (conn->use_session_ticket) {		/* Abbreviated handshake using session ticket; RFC 4507 */		if (tls_write_server_change_cipher_spec(conn, &pos, end) < 0 ||		    tls_write_server_finished(conn, &pos, end) < 0) {			os_free(msg);			return NULL;		}		*out_len = pos - msg;		conn->state = CHANGE_CIPHER_SPEC;		return msg;	}	/* Full handshake */	if (tls_write_server_certificate(conn, &pos, end) < 0 ||	    tls_write_server_key_exchange(conn, &pos, end) < 0 ||	    tls_write_server_certificate_request(conn, &pos, end) < 0 ||	    tls_write_server_hello_done(conn, &pos, end) < 0) {		os_free(msg);		return NULL;	}	*out_len = pos - msg;	conn->state = CLIENT_CERTIFICATE;	return msg;}static u8 * tls_send_change_cipher_spec(struct tlsv1_server *conn,					size_t *out_len){	u8 *msg, *end, *pos;	*out_len = 0;	msg = os_malloc(1000);	if (msg == NULL)		return NULL;	pos = msg;	end = msg + 1000;	if (tls_write_server_change_cipher_spec(conn, &pos, end) < 0 ||	    tls_write_server_finished(conn, &pos, end) < 0) {		os_free(msg);		return NULL;	}	*out_len = pos - msg;	wpa_printf(MSG_DEBUG, "TLSv1: Handshake completed successfully");	conn->state = ESTABLISHED;	return msg;}u8 * tlsv1_server_handshake_write(struct tlsv1_server *conn, size_t *out_len){	switch (conn->state) {	case SERVER_HELLO:		return tls_send_server_hello(conn, out_len);	case SERVER_CHANGE_CIPHER_SPEC:		return tls_send_change_cipher_spec(conn, out_len);	default:		if (conn->state == ESTABLISHED && conn->use_session_ticket) {			/* Abbreviated handshake was already completed. */			return NULL;		}		wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d while "			   "generating reply", conn->state);		return NULL;	}}u8 * tlsv1_server_send_alert(struct tlsv1_server *conn, u8 level,			     u8 description, size_t *out_len){	u8 *alert, *pos, *length;	wpa_printf(MSG_DEBUG, "TLSv1: Send Alert(%d:%d)", level, description);	*out_len = 0;	alert = os_malloc(10);	if (alert == NULL)		return NULL;	pos = alert;	/* TLSPlaintext */	/* ContentType type */	*pos++ = TLS_CONTENT_TYPE_ALERT;	/* ProtocolVersion version */	WPA_PUT_BE16(pos, TLS_VERSION);	pos += 2;	/* uint16 length (to be filled) */	length = pos;	pos += 2;	/* opaque fragment[TLSPlaintext.length] */	/* Alert */	/* AlertLevel level */	*pos++ = level;	/* AlertDescription description */	*pos++ = description;	WPA_PUT_BE16(length, pos - length - 2);	*out_len = pos - alert;	return alert;}

⌨️ 快捷键说明

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