From d3ddf576bca950b9481c0b6e4c6b1d51da4f9621 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 5 Nov 2019 18:33:06 +0100 Subject: [PATCH] network protocol skeleton of issuer and member finished, missing verifier --- .idea/modules.xml | 2 +- CMakeLists.txt | 4 +- client.c | 92 +++++++++--------- client.h | 17 +--- common.h | 21 +++++ connection.c | 29 ------ connection.h | 26 ----- issuer.c | 235 ++++++++++++++++++++-------------------------- issuer.h | 16 ++++ member.c | 204 ++++++++++++++++++---------------------- member.h | 16 ++++ server.c | 114 ++++++++++++---------- server.h | 19 +--- verifier.c | 129 +++++++++++++++++++++++++ 14 files changed, 497 insertions(+), 427 deletions(-) create mode 100644 common.h delete mode 100644 connection.c delete mode 100644 connection.h create mode 100644 issuer.h create mode 100644 member.h create mode 100644 verifier.c diff --git a/.idea/modules.xml b/.idea/modules.xml index b72431c..1e93087 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index e79316e..7836cbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,12 +4,12 @@ project(ecdaa_issuer C) set(CMAKE_C_STANDARD 11) set(ECDAA_AMCL "/opt/amcl") -add_executable(ecdaa_issuer issuer.c connection.h connection.c server.h server.c) +add_executable(ecdaa_issuer issuer.c common.h server.h server.c) target_include_directories(ecdaa_issuer PUBLIC ${ECDAA_AMCL} ) target_link_libraries(ecdaa_issuer /usr/local/lib/libecdaa.so) -add_executable(ecdaa_member member.c connection.h connection.c client.h client.c server.h server.c) +add_executable(ecdaa_member member.c common.h client.h client.c server.h server.c issuer.h) target_include_directories(ecdaa_member PUBLIC ${ECDAA_AMCL} ) diff --git a/client.c b/client.c index a295e2c..c50b621 100644 --- a/client.c +++ b/client.c @@ -1,61 +1,67 @@ #include "client.h" -client_t* client_open(conn_handler handler) { +int client_open(char *servip, int16_t port) { struct sockaddr_in servaddr; - client_t *client = malloc(sizeof(client_t)); - if(NULL == handler) { - printf("client_open: received empty handler, stopping"); - return NULL; - } - if (NULL == client) { - printf("client_open: malloc failed"); - return NULL; - } - client->conn = connection_create(CONN_TYPE_CLIENT); - if (NULL == client->conn) { - free(client); - return NULL; - } - client->handler = handler; - client->conn->fd = socket(AF_INET, SOCK_STREAM, 0); - if (-1 == client->conn->fd) { - printf("client_listen: failed to create endpoint.\n"); - return NULL; - } - return client; -} + size_t servaddr_len = 0; + int connfd = 0; -int client_connect(client_t *client, char *ip_str, int16_t port) { - struct sockaddr_in servaddr; - unsigned int servaddr_len = 0; - - if(client == NULL) { + connfd = socket(AF_INET, SOCK_STREAM, 0); + if (-1 == connfd) { + printf("client_listen: failed to create endpoint.\n"); return -1; } + bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; - servaddr.sin_addr.s_addr = inet_addr(ip_str); + servaddr.sin_addr.s_addr = inet_addr(servip); servaddr.sin_port = htons(port); - servaddr_len = sizeof(servaddr); - if(0 >= connect(client->conn->fd, (const struct sockaddr *) &servaddr, servaddr_len)) { + if (0 != connect(connfd, (const struct sockaddr *) &servaddr, servaddr_len)) { printf("client_accept: connection to server failed\n"); + close(connfd); return -1; - } else { - client->handler(client->conn->fd); } - return 0; + return connfd; } -int client_close(client_t *client) { - int err = 0; - if (NULL == client) { - return 0; +int client_connect(conn_handler handler, char *servip, int16_t port) { + struct sockaddr_in servaddr; + unsigned int servaddr_len = 0; + int connfd = 0; + char buffer[MAX_BUFSIZE]; + int ret = 0; + int len = 0; + + connfd = client_open(servip, port); + if(0 >= connfd) { + return -1; + } + bzero(buffer, MAX_BUFSIZE); + for (ret = 0; 0 == ret;) { + ret = handler(buffer); + if(0 != ret) + break; + + if (0 >= write(connfd, buffer, sizeof(buffer))) { + printf("client_connect: cannot write to socket\n"); + ret = -1; + } + + bzero(buffer, MAX_BUFSIZE); + len = read(connfd, buffer, sizeof(buffer)); + if (0 > len) { + printf("client_connect: cannot read from socket\n"); + ret = -1; + } else if (0 == len) { + printf("client_connect: server closed connection\n"); + ret = 1; + } } - if (0 != connection_destroy(client->conn)) { - printf("client_close: closing socket failed\n"); - err = -1; + + if (0 != close(connfd)) { + printf("client_connect: failed to close server connection properly\n"); + ret = -1; } - free(client); - return err; + + return ret; } diff --git a/client.h b/client.h index 77ba2fb..03e2109 100644 --- a/client.h +++ b/client.h @@ -8,23 +8,10 @@ #include #include #include -#include #include -//#include #include -#include "connection.h" +#include "common.h" -#define MAX_BUFSIZE 1024 - -typedef struct client { - connection_t* conn; - conn_handler handler; -}client_t; - -client_t* client_open(conn_handler handler); - -int client_connect(client_t *client, char *ip_str, int16_t port); - -int client_close(client_t* client); +int client_connect(conn_handler handler, char *ip_str, int16_t port); #endif //ECDAA_ISSUER_CLIENT_H diff --git a/common.h b/common.h new file mode 100644 index 0000000..646bffb --- /dev/null +++ b/common.h @@ -0,0 +1,21 @@ +// +// Created by root on 10/30/19. +// + +#ifndef ECDAA_ISSUER_COMMON_H +#define ECDAA_ISSUER_COMMON_H + +#define ISSUERIP "127.0.0.1" +#define ISSUERPORT 6590 +#define MEMBERIP "127.0.0.1" +#define MEMBERPORT 6591 +#define VERIFIERIP "127.0.0.1" +#define VERIFIERPORT 6592 + +#define MAX_CLIENTS 10 +#define MAX_BUFSIZE 1024 + +typedef int (*conn_handler)(char* buffer); + + +#endif //ECDAA_ISSUER_COMMON_H diff --git a/connection.c b/connection.c deleted file mode 100644 index e599a45..0000000 --- a/connection.c +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include "connection.h" - -connection_t* connection_create(conntype_e type){ - connection_t* conn = malloc(sizeof(connection_t)); - if(NULL == conn) { - printf("connection_create: malloc failed\n"); - } else { - conn->type = type; - conn->fd = -1; - } - - return conn; -} - -int connection_destroy(connection_t* conn) { - int err = 0; - - if(NULL != conn) { - if(-1 != conn->fd) { - err = close(conn->fd); - if(-1 == err) { - printf("connection_destroy: close connection failed"); - } - } - free(conn); - } - return err; -} diff --git a/connection.h b/connection.h deleted file mode 100644 index c8bdc04..0000000 --- a/connection.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// Created by root on 10/30/19. -// - -#ifndef ECDAA_ISSUER_CONNECTION_H -#define ECDAA_ISSUER_CONNECTION_H - -#include -#include - -typedef enum conntype { - CONN_TYPE_SERVER, - CONN_TYPE_CLIENT -}conntype_e; - -typedef struct connection { - int fd; - conntype_e type; -} connection_t; - -typedef int (*conn_handler)(int fd); - -connection_t* connection_create(conntype_e type); -int connection_destroy(connection_t* conn); - -#endif //ECDAA_ISSUER_CONNECTION_H diff --git a/issuer.c b/issuer.c index 7baa22f..1219a12 100644 --- a/issuer.c +++ b/issuer.c @@ -1,156 +1,125 @@ -#include -#include -#include -#include "server.h" -#include "client.h" - -#define ISSUERIP "127.0.0.1" -#define ISSUERPORT 6590 -#define MEMBERIP "127.0.0.1" -#define MEMBERPORT 6591 -#define VERIFIERIP "127.0.0.1" -#define VERIFIERPORT 6592 - -typedef struct issuer { - struct ecdaa_issuer_public_key_FP256BN ipk; - struct ecdaa_issuer_secret_key_FP256BN isk; -} issuer_t; +#include "issuer.h" typedef enum issuer_state { ON, - SETUPDONE, JOINSTART, JOINPROCEED, - PUBLISH, READY } issuerstate_e; -int process_issuer(int connfd); +typedef struct issuer { + struct ecdaa_issuer_public_key_FP256BN ipk; + struct ecdaa_issuer_secret_key_FP256BN isk; + issuerstate_e state; +} issuer_t; + +issuer_t issuer; + int main() { int err = 0; - server_t *server; - - server = server_open(&process_issuer, ISSUERPORT); - if (NULL == server) { - printf("listen failed, closing...\n"); - } - for (; !err;) { - err = server_accept(server); - if (1 == err) { - printf("graceful shutdown...\n"); - } else if (err) { - printf("accept failed, closing...\n"); - } + if (2 != server_start(&process_issuer, ISSUERPORT)) { + printf("server failed\n"); } - printf("shut down server\n"); - server_close(server); return 0; } -int process_issuer(int connfd) { - char inbuf[MAX_BUFSIZE]; - char outbuf[MAX_BUFSIZE]; - int ret = 2; - issuerstate_e state = ON; +int process_issuer(char *buffer) { + ssize_t len = 0; + int ret = 0; - while (ret == 2) { - bzero(inbuf, MAX_BUFSIZE); - bzero(outbuf, MAX_BUFSIZE); + printf("> ISSUER: %s\n", buffer); - if (0 >= read(connfd, inbuf, sizeof(inbuf))) { - printf("process_member: cannot read from socket\n"); - ret = -1; + if (0 == strncasecmp("OK", buffer, 2)) { + switch (issuer.state) { + case JOINPROCEED: + issuer.state = READY; + break; + default: + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ERR\n", 4); + break; } - printf("> ISSUER: %s\n", inbuf); - - - if (0 == strncmp("OK", inbuf, 2)) { - switch (state) { - case SETUPDONE: - case JOINPROCEED: - case PUBLISH: - state = READY; - break; - default: - strncpy(outbuf, "ERR\n", 4); - break; - } - } else if (0 == strncmp("ERR", inbuf, 3)) { - switch (state) { - case SETUPDONE: - case JOINPROCEED: - case PUBLISH: - printf("command failed at client\n"); - state = READY; - break; - default: - printf("invalid instruction\n"); - strncpy(outbuf, "ERR\n", 4); - break; - } - } else if (0 == strncmp("SETUP", inbuf, 5)) { - switch (state) { - case ON: - printf("setup()\n"); - strncpy(outbuf, "SETUPDONE\n", 10); - state = SETUPDONE; - break; - default: - strncpy(outbuf, "ERR\n", 4); - break; - } - } else if (0 == strncmp("JOIN", inbuf, 4)) { - switch (state) { - case READY: - printf("join()\n"); - strncpy(outbuf, "JOINSTART\n", 10); - state = JOINSTART; - break; - default: - strncpy(outbuf, "ERR\n", 4); - break; - } - } else if (0 == strncmp("APPEND", inbuf, 6)) { - switch (state) { - case JOINSTART: - printf("append()\n"); - strncpy(outbuf, "JOINPROCEED\n", 12); - state = JOINPROCEED; - break; - default: - strncpy(outbuf, "ERR\n", 4); - break; - } - } else if (0 == strncmp("PUBLISH", inbuf, 7)) { - switch (state) { - case READY: - printf("publish()\n"); - strncpy(outbuf, "PUBLISH\n", 8); - state = PUBLISH; - break; - default: - strncpy(outbuf, "ERR\n", 4); - break; - } - } else if (0 == strncmp("EXIT", inbuf, 4)) { - printf("exit()\n"); - strncpy(outbuf, "OK\n", 3); - ret = 0; - } else if (0 == strncmp("SHUTDOWN", inbuf, 8)) { - strncpy(outbuf, "OK\n", 3); - ret = 1; - } else { - printf("error()\n"); - strncpy(outbuf, "ERR\n", 4); - ret = 0; + } else if (0 == strncasecmp("ERR", buffer, 3)) { + switch (issuer.state) { + case JOINPROCEED: + printf("command failed at client\n"); + issuer.state = READY; + break; + default: + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ERR\n", 4); + break; } - - printf("< ISSUER: %s\n", outbuf); - write(connfd, outbuf, sizeof(outbuf)); + } else if (0 == strncasecmp("SETUP", buffer, 5)) { + switch (issuer.state) { + case ON: + printf("setup()\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "SETUPDONE\n", 10); + issuer.state = READY; + break; + default: + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ERR\n", 4); + break; + } + } else if (0 == strncasecmp("JOIN", buffer, 4)) { + switch (issuer.state) { + case READY: + printf("join()\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "JOINSTART\n", 10); + issuer.state = JOINSTART; + break; + default: + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ERR\n", 4); + break; + } + } else if (0 == strncasecmp("APPEND", buffer, 6)) { + switch (issuer.state) { + case JOINSTART: + printf("append()\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "JOINPROCEED\n", 12); + issuer.state = READY; + break; + default: + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ERR\n", 4); + break; + } + } else if (0 == strncasecmp("PUBLISH", buffer, 7)) { + switch (issuer.state) { + case READY: + printf("publish()\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "PUBLISH\n", 8); + issuer.state = READY; + break; + default: + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ERR\n", 4); + break; + } + } else if (0 == strncasecmp("EXIT", buffer, 4)) { + printf("exit()\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "OK\n", 3); + ret = 1; + } else if (0 == strncasecmp("SHUTDOWN", buffer, 8)) { + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "OK\n", 3); + ret = 2; + } else { + printf("error()\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ERR\n", 4); + ret = 0; } - return - ret; + printf("< ISSUER: %s", buffer); + return ret; } diff --git a/issuer.h b/issuer.h new file mode 100644 index 0000000..fca10a3 --- /dev/null +++ b/issuer.h @@ -0,0 +1,16 @@ +// +// Created by root on 11/5/19. +// + +#ifndef ECDAA_ISSUER_ISSUER_H +#define ECDAA_ISSUER_ISSUER_H +#include +#include +#include +#include "server.h" +#include "client.h" +#include "common.h" + +int process_issuer(char *buffer); + +#endif //ECDAA_ISSUER_ISSUER_H diff --git a/member.c b/member.c index d157fff..1c69a3f 100644 --- a/member.c +++ b/member.c @@ -4,148 +4,126 @@ #include "client.h" #include "server.h" -#define ISSUERIP "127.0.0.1" -#define ISSUERPORT 6590 -#define MEMBERIP "127.0.0.1" -#define MEMBERPORT 6591 -#define VERIFIERIP "127.0.0.1" -#define VERIFIERPORT 6592 - - -typedef struct member { - struct ecdaa_member_public_key_FP256BN mpk; -} member_t; - typedef enum memberstate { ON, JOIN, APPEND, + JOINPROCEED, JOINED, ATTEST, - PUBLISH, - SHUTDOWN -}memberstate_t; + PUBLISH +} memberstate_e; + +typedef struct member { + struct ecdaa_member_public_key_FP256BN mpk; + struct ecdaa_member_public_key_FP256BN msk; + memberstate_e state; +} member_t; -int process_member(int connfd); -int member_join(int connfd); +member_t member; + +int process_member(char *buffer); + +int member_join(char* buffer); +int member_attest(char* buffer); +int member_publish(char* buffer); int main() { int err = 0; - server_t *server; - server = server_open(&process_member, MEMBERPORT); - if (NULL == server) { - printf("listen failed, closing...\n"); - } - - for (; !err;) { - err = server_accept(server); - if (1 == err) { - printf("graceful shutdown...\n"); - } else if (err) { - printf("accept failed, closing...\n"); - } + if (2 != server_start(&process_member, MEMBERPORT)) { + printf("server failed\n"); } - printf("shut down server\n"); - server_close(server); - - return 0; + return 0; } -int process_member(int connfd) { - char inbuf[MAX_BUFSIZE]; - char outbuf[MAX_BUFSIZE]; - int ret = 2; - - while (ret == 2) { - bzero(inbuf, MAX_BUFSIZE); - bzero(outbuf, MAX_BUFSIZE); +int process_member(char *buffer) { + int ret = 0; - if (0 >= read(connfd, inbuf, sizeof(inbuf))) { - printf("process_member: cannot read from socket\n"); - ret = -1; - } - printf("> MEMBER: %s\n", inbuf); + printf("> MEMBER: %s\n", buffer); - if (0 == strncmp("ATTEST", inbuf, 6)) { + if (0 == strncasecmp("ATTEST", buffer, 6)) { printf("attest()\n"); - strncpy(outbuf, "OK\n", 3); - } - else if (0 == strncmp("PUBLISH", inbuf, 7)) { + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ATTEST ", 7); + member_attest(buffer); + } else if (0 == strncasecmp("PUBLISH", buffer, 7)) { printf("publish()\n"); - strncpy(outbuf, "OK\n", 3); - } - else if (0 == strncmp("JOIN", inbuf, 4)) { + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "PUBLISH ", 8); + member_publish(buffer); + } else if (0 == strncasecmp("JOIN", buffer, 4)) { printf("join()\n"); - client_t *client; - client = client_open(&member_join); - if(0 != client_connect(client, ISSUERIP, ISSUERPORT)) { - strncpy(outbuf, "ERR\n", 4); - ret = -1; + member.state = JOIN; + ret = client_connect(&member_join, ISSUERIP, ISSUERPORT); + if (0 >= ret || JOINED != member.state) { + printf("process_member: issuer connection failed\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ERR\n", 4); } else { - if(0 != client_close(client)) { - strncpy(outbuf, "ERR\n", 4); - } - strncpy(outbuf, "OK\n", 3); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "OK\n", 3); } - } - else if (0 == strncmp("EXIT", inbuf, 4)) { - printf("exit()\n"); - strncpy(outbuf, "OK\n", 3); ret = 0; - } - else if (0 == strncmp("SHUTDOWN", inbuf, 8)) { - strncpy(outbuf, "OK\n", 3); + } else if (0 == strncasecmp("EXIT", buffer, 4)) { + printf("exit()\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "OK\n", 3); ret = 1; - } - else { + } else if (0 == strncasecmp("SHUTDOWN", buffer, 8)) { + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "OK\n", 3); + ret = 2; + } else { printf("error()\n"); - strncpy(outbuf, "ERR\n", 4); - ret = -1; + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ERR\n", 4); + ret = 0; } - printf("< MEMBER: %s\n", outbuf); - write(connfd, outbuf, sizeof(outbuf)); - } + printf("< MEMBER: %s\n", buffer); return ret; } -int member_join(int connfd) { - char inbuf[MAX_BUFSIZE]; - char outbuf[MAX_BUFSIZE]; - int n = 0; - memberstate_t state = JOIN; - - for (;;) { - switch(state) { - case JOIN: - strncpy(outbuf, "JOIN", 4); - state = APPEND; - break; - case APPEND: - if (0 == strncmp("JOINSTART", inbuf, 9)) { - strncpy(outbuf, "APPEND\n", 7); - state = JOINED; - } - break; - case JOINED: - if (0 == strncmp("JOINPROCEED", inbuf, 11)) { - strncpy(outbuf, "OK\n", 3); - return 0; - } - break; - default: - return -1; - } +int member_join(char *buffer) { + int ret = 0; + + printf("ISSUER > MEMBER: %s", buffer); + switch (member.state) { + case JOIN: + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "JOIN\n", 5); + member.state = APPEND; + break; + case APPEND: + if (0 == strncasecmp("JOINSTART", buffer, 9)) { + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "APPEND\n", 7); + member.state = JOINPROCEED; + } + break; + case JOINPROCEED: + if (0 == strncasecmp("JOINPROCEED", buffer, 11)) { + bzero(buffer, MAX_BUFSIZE); + member.state = JOINED; + ret = 1; + } + break; + default: + ret -1; + } + if(0 == ret) { + printf("ISSUER < MEMBER: %s", buffer); + } + return ret; +} - bzero(outbuf, MAX_BUFSIZE); - printf("ISSUER < MEMBER: %s\n", outbuf); - write(connfd, outbuf, sizeof(outbuf)); +int member_attest(char* buffer) { + strncat(buffer, "\n", 13); + return 0; +} - bzero(inbuf, MAX_BUFSIZE); - if (0 >= read(connfd, inbuf, sizeof(inbuf))) { - printf("process_issuer: cannot read from socket\n"); - return -1; - } - } +int member_publish(char* buffer) { + strncat(buffer, "\n", 12); + return 0; } \ No newline at end of file diff --git a/member.h b/member.h new file mode 100644 index 0000000..5c2e4e9 --- /dev/null +++ b/member.h @@ -0,0 +1,16 @@ +// +// Created by root on 11/5/19. +// + +#ifndef ECDAA_ISSUER_MEMBER_H +#define ECDAA_ISSUER_MEMBER_H +#include +#include +#include +#include "server.h" +#include "client.h" +#include "common.h" + +int process_member(char *buffer); + +#endif //ECDAA_ISSUER_ISSUER_H diff --git a/server.c b/server.c index 581838f..2d07c05 100644 --- a/server.c +++ b/server.c @@ -1,73 +1,85 @@ #include "server.h" -server_t *server_open(conn_handler handler, int16_t port) { +int server_open(int16_t port) { struct sockaddr_in servaddr; - server_t *server = malloc(sizeof(server_t)); - if(NULL == handler) { - printf("server_open: received empty handler, stopping"); - return NULL; - } - if (NULL == server) { - printf("server_open: malloc failed"); - return NULL; - } - server->conn = connection_create(CONN_TYPE_SERVER); - if (NULL == server->conn) { - free(server); - return NULL; - } - server->handler = handler; - server->conn->fd = socket(AF_INET, SOCK_STREAM, 0); - if (-1 == server->conn->fd) { - printf("server_listen: failed to create endpoint.\n"); - return NULL; + int connfd = 0; + + connfd = socket(AF_INET, SOCK_STREAM, 0); + if (-1 == connfd) { + printf("server_open: failed to create endpoint.\n"); + return -1; } servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(port); - if (0 != bind(server->conn->fd, (const struct sockaddr *) &servaddr, sizeof(servaddr))) { - printf("server_listen: failed to bind socket\n"); - return NULL; + if (0 != bind(connfd, (const struct sockaddr *) &servaddr, sizeof(servaddr))) { + printf("server_open: failed to bind socket\n"); + close(connfd); + return -1; } - return server; + return connfd; } -int server_accept(server_t *server) { +int server_start(conn_handler handler, int16_t port) { struct sockaddr_in client; unsigned int client_len = 0; - int connfd = -1; - int ret = 0; + int connfd = 0; + int clientfd = 0; + int len = 0; + int ret = 0; //<0 .. failure, 0 .. continue, 1 .. exit, 2 .. shutdown + char buffer[MAX_BUFSIZE]; - if (NULL == server || 0 != listen(server->conn->fd, MAX_CLIENTS)) { - printf("server_accept: listen failed\n"); + if(NULL == handler) { + printf("server_start: received empty handler, stopping\n"); return -1; } - printf("server_accept: listening\n"); - client_len = sizeof(client); - connfd = accept(server->conn->fd, (struct sockaddr *) &client, &client_len); - if(0 >= connfd) { - printf("server_accept: connection to client failed, "); + connfd = server_open(port); + if(-1 == connfd) { + printf("server_start: could not open port, stopping\n"); return -1; - } else { - ret = server->handler(connfd); - if(0 != close(connfd)) { - printf("server_accept: failed to close client connection properly"); - return -1; - } } - return ret; -} + if (0 != listen(connfd, MAX_CLIENTS)) { + printf("server_start: listen failed, stopping\n"); + return -1; + } + printf("server_start: listening\n"); + for(ret = 1; 1 == ret;) { + client_len = sizeof(client); + clientfd = accept(connfd, (struct sockaddr *) &client, &client_len); + if (0 >= clientfd) { + printf("server_start: connection to client failed\n"); + ret = -1; + } else { + for(ret = 0; 0 == ret;) { + bzero(buffer, MAX_BUFSIZE); + len = read(clientfd, buffer, sizeof(buffer)); + if (0 > len) { + printf("server_start: cannot read from socket\n"); + ret = -1; + } else if(0 == len) { + printf("server_start: client closed connection\n"); + ret = 1; + } else { + ret = handler(buffer); + } + + if (0 <= ret && 0 >= write(clientfd, buffer, sizeof(buffer))) { + printf("server_start: cannot write to socket\n"); + ret = -1; + } -int server_close(server_t *server) { - int err = 0; - if (NULL == server) { - return 0; + } + if (0 != close(clientfd)) { + printf("server_start: failed to close client connection properly\n"); + ret = -1; + } + } } - if (0 != connection_destroy(server->conn)) { - printf("server_close: closing socket failed\n"); - err = -1; + printf("server_start: closing connection\n"); + if (0 != close(connfd)) { + printf("server_start: failed to close server port properly\n"); + ret = -1; } - free(server); - return err; + return ret; } diff --git a/server.h b/server.h index 9da802a..d40477f 100644 --- a/server.h +++ b/server.h @@ -4,23 +4,14 @@ #ifndef ECDAA_ISSUER_SERVER_H #define ECDAA_ISSUER_SERVER_H +#include +#include +#include #include #include #include -#include "connection.h" +#include "common.h" -#define MAX_CLIENTS 10 -#define MAX_BUFSIZE 1024 - -typedef struct server { - connection_t* conn; - conn_handler handler; -}server_t; - -server_t *server_open(conn_handler handler, int16_t port); - -int server_accept(server_t *server); - -int server_close(server_t* server); +int server_start(conn_handler handler, int16_t port); #endif //ECDAA_ISSUER_SERVER_H diff --git a/verifier.c b/verifier.c new file mode 100644 index 0000000..1c69a3f --- /dev/null +++ b/verifier.c @@ -0,0 +1,129 @@ +#include +#include +#include +#include "client.h" +#include "server.h" + +typedef enum memberstate { + ON, + JOIN, + APPEND, + JOINPROCEED, + JOINED, + ATTEST, + PUBLISH +} memberstate_e; + +typedef struct member { + struct ecdaa_member_public_key_FP256BN mpk; + struct ecdaa_member_public_key_FP256BN msk; + memberstate_e state; +} member_t; + +member_t member; + +int process_member(char *buffer); + +int member_join(char* buffer); +int member_attest(char* buffer); +int member_publish(char* buffer); + +int main() { + int err = 0; + + if (2 != server_start(&process_member, MEMBERPORT)) { + printf("server failed\n"); + } + return 0; +} + +int process_member(char *buffer) { + int ret = 0; + + printf("> MEMBER: %s\n", buffer); + + if (0 == strncasecmp("ATTEST", buffer, 6)) { + printf("attest()\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ATTEST ", 7); + member_attest(buffer); + } else if (0 == strncasecmp("PUBLISH", buffer, 7)) { + printf("publish()\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "PUBLISH ", 8); + member_publish(buffer); + } else if (0 == strncasecmp("JOIN", buffer, 4)) { + printf("join()\n"); + member.state = JOIN; + ret = client_connect(&member_join, ISSUERIP, ISSUERPORT); + if (0 >= ret || JOINED != member.state) { + printf("process_member: issuer connection failed\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ERR\n", 4); + } else { + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "OK\n", 3); + } + ret = 0; + } else if (0 == strncasecmp("EXIT", buffer, 4)) { + printf("exit()\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "OK\n", 3); + ret = 1; + } else if (0 == strncasecmp("SHUTDOWN", buffer, 8)) { + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "OK\n", 3); + ret = 2; + } else { + printf("error()\n"); + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ERR\n", 4); + ret = 0; + } + + printf("< MEMBER: %s\n", buffer); + return ret; +} + +int member_join(char *buffer) { + int ret = 0; + + printf("ISSUER > MEMBER: %s", buffer); + switch (member.state) { + case JOIN: + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "JOIN\n", 5); + member.state = APPEND; + break; + case APPEND: + if (0 == strncasecmp("JOINSTART", buffer, 9)) { + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "APPEND\n", 7); + member.state = JOINPROCEED; + } + break; + case JOINPROCEED: + if (0 == strncasecmp("JOINPROCEED", buffer, 11)) { + bzero(buffer, MAX_BUFSIZE); + member.state = JOINED; + ret = 1; + } + break; + default: + ret -1; + } + if(0 == ret) { + printf("ISSUER < MEMBER: %s", buffer); + } + return ret; +} + +int member_attest(char* buffer) { + strncat(buffer, "\n", 13); + return 0; +} + +int member_publish(char* buffer) { + strncat(buffer, "\n", 12); + return 0; +} \ No newline at end of file