static void server_function(void)
{
    uint8_t recv_buf[2048];
    ssize_t bytes_received;

    if (current_length > 0) {
        bytes_received = secure_session_receive((server.session), recv_buf, sizeof(recv_buf));
    } else {
        /* Nothing to receive. Do nothing */
        return;
    }

    if (bytes_received < 0) {
        testsuite_fail_if(bytes_received, "secure_session_receive failed");
        return;
    }

    size_t remote_id_length = 0;
    if (THEMIS_BUFFER_TOO_SMALL
        != secure_session_get_remote_id(server.session, NULL, &remote_id_length)) {
        testsuite_fail_if(true, "remote id getting failed (length_determination)");
        return;
    }
    uint8_t* remote_id = malloc(remote_id_length);
    assert(remote_id);
    if (THEMIS_SUCCESS != secure_session_get_remote_id(server.session, remote_id, &remote_id_length)) {
        testsuite_fail_if(true, "remote id getting failed");
        free(remote_id);
        return;
    }
    testsuite_fail_unless(remote_id_length == strlen(client.id)
                              && 0 == memcmp(remote_id, client.id, strlen(client.id)),
                          "secure_session remote id getting");
    free(remote_id);

    if (0 == bytes_received) {
        /* This was a key agreement packet. Nothing to do */
        return;
    }

    if (bytes_received > 0) {
        /* We received some data. Echo it back to the client. */
        ssize_t bytes_sent = secure_session_send((server.session), recv_buf, (size_t)bytes_received);

        if (bytes_sent == bytes_received) {
            /* Check whether data was indeed encrypted (it should not be the same as in
             * data_to_send) */
            testsuite_fail_if(((size_t)bytes_sent == current_length)
                                  || (!memcmp(recv_buf, shared_mem, bytes_sent)),
                              "secure_session server message wrap");
        } else {
            testsuite_fail_if(true, "secure_session_send failed");
        }
    }
}
Example #2
0
    void send(const data_t& data){
      ssize_t send_size=secure_session_send(_session, &data[0], data.size());
      if(send_size<=0)
	throw themispp::exception_t("Secure Session failed sending");
    }
Example #3
0
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;
}
Example #4
0
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;
}
static int client_function(void)
{
    static bool connected = false;
    themis_status_t res;
    uint8_t recv_buf[2048];
    ssize_t bytes_received;
    ssize_t bytes_sent;

    /* Client is not connected yet. Initiate key agreement */
    if (!connected) {
        res = secure_session_connect((client.session));
        if (THEMIS_SUCCESS == res) {
            connected = true;
            return TEST_CONTINUE;
        }

        testsuite_fail_if(res, "secure_session_connect failed");
        return TEST_STOP_ERROR;
    }
    if (secure_session_is_established(client.session)) {
        size_t remote_id_length = 0;
        if (THEMIS_BUFFER_TOO_SMALL
            != secure_session_get_remote_id(client.session, NULL, &remote_id_length)) {
            testsuite_fail_if(true, "remote id getting failed (length_determination)");
            return TEST_STOP_ERROR;
        }
        uint8_t* remote_id = malloc(remote_id_length);
        assert(remote_id);
        if (THEMIS_SUCCESS
            != secure_session_get_remote_id(client.session, remote_id, &remote_id_length)) {
            testsuite_fail_if(true, "remote id getting failed");
            free(remote_id);
            return TEST_STOP_ERROR;
        }
        testsuite_fail_unless(remote_id_length == strlen(server.id)
                                  && 0 == memcmp(remote_id, server.id, strlen(server.id)),
                              "secure_session remote id getting");
        free(remote_id);

        static int messages_to_send = MESSAGES_TO_SEND;

        /* Connection is already established. */
        static uint8_t data_to_send[MAX_MESSAGE_SIZE];
        static size_t length_to_send;

        /* If there is anything to receive, receive it */
        if (current_length) {
            bytes_received = secure_session_receive(client.session, recv_buf, sizeof(recv_buf));
            if (bytes_received > 0) {
                /* The server should echo our previously sent data */
                testsuite_fail_unless((length_to_send == (size_t)bytes_received)
                                          && (!memcmp(recv_buf, data_to_send, bytes_received)),
                                      "secure_session message send/receive");
                messages_to_send--;

                if (!messages_to_send) {
                    return TEST_STOP_SUCCESS;
                }
            } else {
                /* We shoud receive something. */
                testsuite_fail_if(bytes_received, "secure_session_receive failed");
                return TEST_STOP_ERROR;
            }
        }

        length_to_send = rand_int(MAX_MESSAGE_SIZE);

        if (THEMIS_SUCCESS != soter_rand(data_to_send, length_to_send)) {
            testsuite_fail_if(true, "soter_rand failed");
            return TEST_STOP_ERROR;
        }

        bytes_sent = secure_session_send((client.session), data_to_send, length_to_send);
        if (bytes_sent > 0) {
            /* Check whether data was indeed encrypted (it should not be the same as in
             * data_to_send) */
            testsuite_fail_if((length_to_send == current_length)
                                  || (!memcmp(data_to_send, shared_mem, length_to_send)),
                              "secure_session client message wrap");
            return TEST_CONTINUE;
        }

        testsuite_fail_if(true, "secure_session_send failed");
        return TEST_STOP_ERROR;
    }
    /* Connection is not established. We should receive some key agreement data. */

    bytes_received = secure_session_receive((client.session), recv_buf, sizeof(recv_buf));
    /* When key agreement data is received and processed client gets 0 in return value (no data
     * for client is received) */
    if (bytes_received) {
        testsuite_fail_if(bytes_received, "secure_session_receive failed");
        return TEST_STOP_ERROR;
    }

    if (secure_session_is_established((client.session))) {
        /* Negotiation completed. Clear the shared memory. */
        current_length = 0;
    }

    return TEST_CONTINUE;
}