diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..20bdd9c --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +CFLAGS=-march=native -O2 +LDLIBS=-lsodium + +test: + +.PHONY: clean +clean: + rm -f test diff --git a/test.c b/test.c new file mode 100644 index 0000000..56d92e8 --- /dev/null +++ b/test.c @@ -0,0 +1,124 @@ +#include "mud.c" +#include "aegis256/aegis256.c" + +#include +#include + +int +main(int argc, char **argv) +{ + if (argc > 2) + return -1; + + int client = argc == 2; + + struct sockaddr_in local = { + .sin_family = AF_INET, + .sin_port = htons(client + 20000), + .sin_addr = { + .s_addr = htonl(INADDR_LOOPBACK), + }, + }; + + struct mud *mud = mud_create((struct sockaddr *)&local); + + if (!mud) { + perror("mud_create"); + return -1; + } + + unsigned char key[] = "0123456789ABCDEF0123456789ABCDEF"; + + if (mud_set_key(mud, key, sizeof(key))) { + perror("mud_set_key"); + return -1; + } + + // client is little harder to setup + if (client) { + struct sockaddr_in remote = { + .sin_family = AF_INET, + .sin_port = htons(20000), + .sin_addr = { + .s_addr = htonl(INADDR_LOOPBACK), + }, + }; + + // we are going to connect to remote... + if (mud_peer(mud, (struct sockaddr *)&remote)) { + perror("mud_peer"); + return -1; + } + + // ...from loopback at 1MBps (not 1Mbps) + if (mud_set_state(mud, (struct sockaddr *)&local, + MUD_UP, 1000 * 1000, 1000 * 1000)) { + perror("mud_set_state"); + return -1; + } + } + + unsigned char buf[1500]; + + for (;;) { + // mandatory, mud have lot of work to do. + if (mud_send_wait(mud)) + usleep(100000); // don't use all the cpu + + if (client) { + // when there is data, mud_recv() is mandatory + struct pollfd pollfd = { + .fd = mud_get_fd(mud), + .events = POLLIN, + }; + + switch (poll(&pollfd, 1, 0)) { + case -1: + perror("poll"); + return -1; + case 1: + if (mud_recv(mud, buf, sizeof(buf)) == -1) { + perror("mud_recv"); + return -1; + } + } + + size_t len = strlen(argv[1]); + + // we can safely call mud_send() + // even if the link is not ready + int r = mud_send(mud, argv[1], len, 0); + + if (r == -1) { + if (errno == EAGAIN) + continue; + + perror("mud_send"); + return -1; + } + + // we sent everything, bye :) + if ((size_t)r == len) + break; + } else { + int r = mud_recv(mud, buf, sizeof(buf)); + + if (r == -1) { + if (errno == EAGAIN) + continue; + + perror("mud_recv"); + return -1; + } + + if (r) { + buf[r] = 0; + printf("%s\n", buf); + } + } + } + + mud_delete(mud); + + return 0; +}