예제 #1
0
secure_session_t* secure_session_create(const void *id, size_t id_length, const void *sign_key, size_t sign_key_length, const secure_session_user_callbacks_t *user_callbacks)
{
	secure_session_t *ctx = calloc(sizeof(secure_session_t),1);

	if (!ctx)
	{
		return NULL;
	}

	memset(ctx, 0, sizeof(secure_session_t));

	if (THEMIS_SUCCESS == secure_session_init(ctx, id, id_length, sign_key, sign_key_length, user_callbacks))
	{
		return ctx;
	}
	else
	{
		free(ctx);
		return NULL;
	}
}
예제 #2
0
파일: client.c 프로젝트: Safe3/themis
void* run_client(void *arg)
{
	struct sockaddr_un addr = {0};
	themis_status_t status;
	int count = 10;
	ssize_t bytes_sent;

	addr.sun_family = AF_UNIX;
	memcpy(addr.sun_path, SOCKET_NAME, strlen(SOCKET_NAME) + 1);

	client.sock = socket(AF_UNIX, SOCK_STREAM, 0);
	if (-1 == client.sock)
	{
		return NULL;
	}

	//unlink(SOCKET_NAME);

	status = secure_session_init(&(client.ctx), CLIENT_ID, strlen(CLIENT_ID), client_priv, sizeof(client_priv), &clb);
	if (HERMES_SUCCESS != status)
	{
		return NULL;
	}

	if (-1 == connect(client.sock, (const struct sockaddr *)&addr, sizeof(addr)))
	{
		return NULL;
	}

	status = secure_session_connect(&(client.ctx));
	if (HERMES_SUCCESS != status)
	{
		return NULL;
	}

	while (count)
	{
		uint8_t buffer[BUF_SIZE];
		ssize_t bytes_received;
		const char *message = "This is a test message";

		bytes_sent = secure_session_send(&(client.ctx), message, strlen(message));
		if (bytes_sent < 0)
		{
			/* Some error, log and continue */
			printf("client send %d %d\n", __LINE__, (int)bytes_sent);
		}

		/* Wait for response */
		bytes_received = secure_session_receive(&(client.ctx), buffer, sizeof(buffer));
		if (bytes_received < 0)
		{
			/* Some error, log and continue */
			printf("client receive %d %d\n", __LINE__, (int)bytes_received);
			continue;
		}

		if (bytes_received > 0)
		{
			if (!memcmp(message, buffer, strlen(message)))
			{
				puts("client receive valid response");
			}
			count--;
		}
	}

	/* send "finish" message to server */
	bytes_sent = secure_session_send(&(client.ctx), "finish", strlen("finish"));
	if (bytes_sent < 0)
	{
		/* Some error, log and continue */
		printf("client send %d %d\n", __LINE__, (int)bytes_sent);
	}

	close(client.sock);
	return NULL;
}
예제 #3
0
파일: server.c 프로젝트: Safe3/themis
void* run_server(void *arg)
{
	struct sockaddr_un addr = {0};
	themis_status_t status;

	addr.sun_family = AF_UNIX;
	memcpy(addr.sun_path, SOCKET_NAME, strlen(SOCKET_NAME) + 1);

	server.listen_socket = socket(AF_UNIX, SOCK_STREAM, 0);
	if (-1 == server.listen_socket)
	{
		return NULL;
	}

	//unlink(SOCKET_NAME);

	if (-1 == bind(server.listen_socket, (const struct sockaddr *)&addr, sizeof(addr)))
	{
		close(server.listen_socket);
		return NULL;
	}

	if (-1 == listen(server.listen_socket, 5))
	{
		close(server.listen_socket);
		return NULL;
	}

	status = secure_session_init(&(server.ctx), SERVER_ID, strlen(SERVER_ID), server_priv, sizeof(server_priv), &clb);
	if (HERMES_SUCCESS != status)
	{
		return NULL;
	}

	server.client_socket = accept(server.listen_socket, NULL, NULL);
	if (-1 == server.client_socket)
	{
		close(server.listen_socket);
		return NULL;
	}

	while (1)
	{
		uint8_t buffer[BUF_SIZE];
		ssize_t bytes_received = secure_session_receive(&(server.ctx), buffer, sizeof(buffer));
		ssize_t bytes_sent;

		if (bytes_received < 0)
		{
			/* Some error, log and continue */
			printf("server receive %d %d\n", __LINE__, (int)bytes_received);
			continue;
		}

		if (bytes_received > 0)
		{
			/* If we received "finish", then client disconnected */

			if (!memcmp(buffer, "finish", bytes_received < strlen("finish") ? bytes_received : strlen("finish")))
			{
				puts("server receive finish");
				break;
			}

			/* For other messages, just echo them back */
			bytes_sent = secure_session_send(&(server.ctx), buffer, bytes_received);
			if (bytes_sent < 0)
			{
				/* Some error, log and continue */
				printf("server send %d %d\n", __LINE__, (int)bytes_sent);
			}
		}
	}

	close(server.client_socket);
	close(server.listen_socket);

	return NULL;
}