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; } }
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; }
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; }