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

📄 tls.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	tls->output_pending = (ret < blob->length);	return NT_STATUS_OK;}/*  initialise global tls state*/struct tls_params *tls_initialise(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx){	struct tls_params *params;	int ret;	TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);	const char *keyfile = private_path(tmp_ctx, lp_ctx, lp_tls_keyfile(lp_ctx));	const char *certfile = private_path(tmp_ctx, lp_ctx, lp_tls_certfile(lp_ctx));	const char *cafile = private_path(tmp_ctx, lp_ctx, lp_tls_cafile(lp_ctx));	const char *crlfile = private_path(tmp_ctx, lp_ctx, lp_tls_crlfile(lp_ctx));	const char *dhpfile = private_path(tmp_ctx, lp_ctx, lp_tls_dhpfile(lp_ctx));	void tls_cert_generate(TALLOC_CTX *, const char *, const char *, const char *);	params = talloc(mem_ctx, struct tls_params);	if (params == NULL) {		talloc_free(tmp_ctx);		return NULL;	}	if (!lp_tls_enabled(lp_ctx) || keyfile == NULL || *keyfile == 0) {		params->tls_enabled = false;		talloc_free(tmp_ctx);		return params;	}	if (!file_exist(cafile)) {		tls_cert_generate(params, keyfile, certfile, cafile);	}	ret = gnutls_global_init();	if (ret < 0) goto init_failed;	gnutls_certificate_allocate_credentials(&params->x509_cred);	if (ret < 0) goto init_failed;	if (cafile && *cafile) {		ret = gnutls_certificate_set_x509_trust_file(params->x509_cred, cafile, 							     GNUTLS_X509_FMT_PEM);			if (ret < 0) {			DEBUG(0,("TLS failed to initialise cafile %s\n", cafile));			goto init_failed;		}	}	if (crlfile && *crlfile) {		ret = gnutls_certificate_set_x509_crl_file(params->x509_cred, 							   crlfile, 							   GNUTLS_X509_FMT_PEM);		if (ret < 0) {			DEBUG(0,("TLS failed to initialise crlfile %s\n", crlfile));			goto init_failed;		}	}		ret = gnutls_certificate_set_x509_key_file(params->x509_cred, 						   certfile, keyfile,						   GNUTLS_X509_FMT_PEM);	if (ret < 0) {		DEBUG(0,("TLS failed to initialise certfile %s and keyfile %s\n", 			 certfile, keyfile));		goto init_failed;	}			ret = gnutls_dh_params_init(&params->dh_params);	if (ret < 0) goto init_failed;	if (dhpfile && *dhpfile) {		gnutls_datum_t dhparms;		size_t size;		dhparms.data = (uint8_t *)file_load(dhpfile, &size, mem_ctx);		if (!dhparms.data) {			DEBUG(0,("Failed to read DH Parms from %s\n", dhpfile));			goto init_failed;		}		dhparms.size = size;					ret = gnutls_dh_params_import_pkcs3(params->dh_params, &dhparms, GNUTLS_X509_FMT_PEM);		if (ret < 0) goto init_failed;	} else {		ret = gnutls_dh_params_generate2(params->dh_params, DH_BITS);		if (ret < 0) goto init_failed;	}			gnutls_certificate_set_dh_params(params->x509_cred, params->dh_params);	params->tls_enabled = true;	talloc_free(tmp_ctx);	return params;init_failed:	DEBUG(0,("GNUTLS failed to initialise - %s\n", gnutls_strerror(ret)));	params->tls_enabled = false;	talloc_free(tmp_ctx);	return params;}/*  setup for a new connection*/struct socket_context *tls_init_server(struct tls_params *params, 				       struct socket_context *socket,				       struct fd_event *fde, 				       const char *plain_chars){	struct tls_context *tls;	int ret;	struct socket_context *new_sock;	NTSTATUS nt_status;		nt_status = socket_create_with_ops(socket, &tls_socket_ops, &new_sock, 					   SOCKET_TYPE_STREAM, 					   socket->flags | SOCKET_FLAG_ENCRYPT);	if (!NT_STATUS_IS_OK(nt_status)) {		return NULL;	}	tls = talloc(new_sock, struct tls_context);	if (tls == NULL) {		return NULL;	}	tls->socket          = socket;	tls->fde             = fde;	if (talloc_reference(tls, fde) == NULL) {		talloc_free(new_sock);		return NULL;	}	if (talloc_reference(tls, socket) == NULL) {		talloc_free(new_sock);		return NULL;	}	new_sock->private_data    = tls;	if (!params->tls_enabled) {		talloc_free(new_sock);		return NULL;	}	TLSCHECK(gnutls_init(&tls->session, GNUTLS_SERVER));	talloc_set_destructor(tls, tls_destructor);	TLSCHECK(gnutls_set_default_priority(tls->session));	TLSCHECK(gnutls_credentials_set(tls->session, GNUTLS_CRD_CERTIFICATE, 					params->x509_cred));	gnutls_certificate_server_set_request(tls->session, GNUTLS_CERT_REQUEST);	gnutls_dh_set_prime_bits(tls->session, DH_BITS);	gnutls_transport_set_ptr(tls->session, (gnutls_transport_ptr)tls);	gnutls_transport_set_pull_function(tls->session, (gnutls_pull_func)tls_pull);	gnutls_transport_set_push_function(tls->session, (gnutls_push_func)tls_push);	gnutls_transport_set_lowat(tls->session, 0);	tls->plain_chars = plain_chars;	if (plain_chars) {		tls->tls_detect = true;	} else {		tls->tls_detect = false;	}	tls->output_pending  = false;	tls->done_handshake  = false;	tls->have_first_byte = false;	tls->tls_enabled     = true;	tls->interrupted     = false;		new_sock->state = SOCKET_STATE_SERVER_CONNECTED;	return new_sock;failed:	DEBUG(0,("TLS init connection failed - %s\n", gnutls_strerror(ret)));	talloc_free(new_sock);	return NULL;}/*  setup for a new client connection*/struct socket_context *tls_init_client(struct socket_context *socket,				       struct fd_event *fde,				       const char *ca_path){	struct tls_context *tls;	int ret = 0;	const int cert_type_priority[] = { GNUTLS_CRT_X509, GNUTLS_CRT_OPENPGP, 0 };	char *cafile;	struct socket_context *new_sock;	NTSTATUS nt_status;		nt_status = socket_create_with_ops(socket, &tls_socket_ops, &new_sock, 					   SOCKET_TYPE_STREAM, 					   socket->flags | SOCKET_FLAG_ENCRYPT);	if (!NT_STATUS_IS_OK(nt_status)) {		return NULL;	}	tls = talloc(new_sock, struct tls_context);	if (tls == NULL) return NULL;	tls->socket          = socket;	tls->fde             = fde;	if (talloc_reference(tls, fde) == NULL) {		return NULL;	}	if (talloc_reference(tls, socket) == NULL) {		return NULL;	}	new_sock->private_data    = tls;	gnutls_global_init();	gnutls_certificate_allocate_credentials(&tls->xcred);	gnutls_certificate_set_x509_trust_file(tls->xcred, cafile, GNUTLS_X509_FMT_PEM);	TLSCHECK(gnutls_init(&tls->session, GNUTLS_CLIENT));	TLSCHECK(gnutls_set_default_priority(tls->session));	gnutls_certificate_type_set_priority(tls->session, cert_type_priority);	TLSCHECK(gnutls_credentials_set(tls->session, GNUTLS_CRD_CERTIFICATE, tls->xcred));	talloc_set_destructor(tls, tls_destructor);	gnutls_transport_set_ptr(tls->session, (gnutls_transport_ptr)tls);	gnutls_transport_set_pull_function(tls->session, (gnutls_pull_func)tls_pull);	gnutls_transport_set_push_function(tls->session, (gnutls_push_func)tls_push);	gnutls_transport_set_lowat(tls->session, 0);	tls->tls_detect = false;	tls->output_pending  = false;	tls->done_handshake  = false;	tls->have_first_byte = false;	tls->tls_enabled     = true;	tls->interrupted     = false;		new_sock->state = SOCKET_STATE_CLIENT_CONNECTED;	return new_sock;failed:	DEBUG(0,("TLS init connection failed - %s\n", gnutls_strerror(ret)));	tls->tls_enabled = false;	return new_sock;}static NTSTATUS tls_socket_set_option(struct socket_context *sock, const char *option, const char *val){	set_socket_options(socket_get_fd(sock), option);	return NT_STATUS_OK;}static char *tls_socket_get_peer_name(struct socket_context *sock, TALLOC_CTX *mem_ctx){	struct tls_context *tls = talloc_get_type(sock->private_data, struct tls_context);	return socket_get_peer_name(tls->socket, mem_ctx);}static struct socket_address *tls_socket_get_peer_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx){	struct tls_context *tls = talloc_get_type(sock->private_data, struct tls_context);	return socket_get_peer_addr(tls->socket, mem_ctx);}static struct socket_address *tls_socket_get_my_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx){	struct tls_context *tls = talloc_get_type(sock->private_data, struct tls_context);	return socket_get_my_addr(tls->socket, mem_ctx);}static int tls_socket_get_fd(struct socket_context *sock){	struct tls_context *tls = talloc_get_type(sock->private_data, struct tls_context);	return socket_get_fd(tls->socket);}static const struct socket_ops tls_socket_ops = {	.name			= "tls",	.fn_init		= tls_socket_init,	.fn_recv		= tls_socket_recv,	.fn_send		= tls_socket_send,	.fn_pending		= tls_socket_pending,	.fn_set_option		= tls_socket_set_option,	.fn_get_peer_name	= tls_socket_get_peer_name,	.fn_get_peer_addr	= tls_socket_get_peer_addr,	.fn_get_my_addr		= tls_socket_get_my_addr,	.fn_get_fd		= tls_socket_get_fd};bool tls_support(struct tls_params *params){	return params->tls_enabled;}#else/* for systems without tls we just fail the operations, and the caller * will retain the original socket */struct tls_params *tls_initialise(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx){	return talloc_new(mem_ctx);}/*  setup for a new connection*/struct socket_context *tls_init_server(struct tls_params *params, 				    struct socket_context *socket,				    struct fd_event *fde, 				    const char *plain_chars){	return NULL;}/*  setup for a new client connection*/struct socket_context *tls_init_client(struct socket_context *socket,				       struct fd_event *fde,				       const char *ca_path){	return NULL;}bool tls_support(struct tls_params *params){	return false;}#endif

⌨️ 快捷键说明

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