From 6107a37ae0f8ad89ab6d2d36f93cc0d47f8bb47a Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sun, 29 Sep 2024 18:26:07 -0400 Subject: project: Move server/client code into library Signed-off-by: Ian Moffett --- client/main.c | 190 +++++++--------------------------------------------------- 1 file changed, 21 insertions(+), 169 deletions(-) (limited to 'client/main.c') diff --git a/client/main.c b/client/main.c index 6bc5a5e..0f87639 100644 --- a/client/main.c +++ b/client/main.c @@ -27,186 +27,38 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include -#include -#include -#include -#include +#include #include -#include -#include -#include #define CENTRAL_SERVER "149.248.6.149" -#define OSTP_PORT 5352 +// #define CENTRAL_SERVER "127.0.0.1" -static const char *pap_codestr[] = { - [PAP_SUCCESS] = "success", - [PAP_BAD_SPW] = "bad SPW", - [PAP_BAD_PERMS] = "insufficient permissions", - [PAP_RESOURCE] = "server out of resources" -}; - -static void -log_pubkey(uint8_t pubkey[]) +int +main(int argc, char **argv) { - for (size_t i = 0; i < 32; ++i) { - printf("%02X ", pubkey[i] & 0xFF); - if (i != 0 && i % 4 == 0) { - printf("\n"); - } + char buf[] = "Hello, World!\n"; + char recv_buf[4096]; + struct ostp_session s; + int err; + + if ((err = session_new(CENTRAL_SERVER, &s)) < 0) { + fprintf(stderr, "Failed to create new session!\n"); + return err; } - printf("\n"); -} - -static int -negotiate_spw(int sockfd, const unsigned char *session_key) -{ - struct aes_message am; - struct msg_frame msg_frame; - struct pap pap; - unsigned char *tmp; - int error; - - /* Create a PAP and encrypt it */ - pap.spw = 0x8000; - pap.code = 0; - - while (1) { - if ((error = send_frame(sockfd, &pap, sizeof(pap), session_key)) < 0) { - return error; - } - - /* Receive the PAP the server replies with */ - if ((error = recv_frame(sockfd, sizeof(pap), session_key, &pap)) < 0) { - return error; - } - /* - * If the server echos our PAP with code 0 then it has - * applied our session parameters! However, there is - * a chance arbitration will be needed and we need - * to look out for that too... - */ - if (pap.code == 0) { - printf("** Negotiation success\n"); - break; + if (argc >= 2) { + if (session_send(buf, sizeof(buf), &s) < 0) { + fprintf(stderr, "Failed to send data to server!\n"); + return -1; } - - printf("** Arbitration needed, server says: %s\n", pap_codestr[pap.code]); - printf("** Server proposes SPW of 0x%0X, accepting\n", pap.spw); - pap.spw |= PAP_SPW_QSR; - pap.code = 0; - } - - return 0; -} - -static void -recv_motd(int sockfd, const unsigned char *session_key) -{ - char buf[4096]; - int len; - - /* Receive the PAP the server replies with */ - if ((len = recv_frame(sockfd, sizeof(buf), session_key, buf)) < 0) { - printf("Failed to recv MOTD...\n"); - return; - } - - buf[len] = '\0'; - printf("%s\n", buf); -} - -static int -request_session(void) -{ - struct sockaddr_in addr; - struct session_request stp_sq; - struct x25519_keypair keypair; - unsigned char serv_pubkey[32]; - unsigned char *session_key; - int error, sockfd; - - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = inet_addr(CENTRAL_SERVER); - addr.sin_port = htons(OSTP_PORT); - - sockfd = socket(AF_INET, SOCK_STREAM, 0); - if (sockfd < 0) { - return sockfd; - } - - error = connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)); - if (error < 0) { - printf("Failed to connect!\n"); - close(sockfd); - return error; - } - - printf("Generating keys...\n"); - - /* Generate an ephemeral keypair */ - if ((error = gen_x25519_keypair(&keypair)) < 0) { - printf("Key generation failed!\n"); - close(sockfd); - return error; - } - - /* - * Setup the session request and add our public - * key to it. - * - * TODO: Use the 'U' bit in options. - */ - memset(stp_sq.hash, 0, sizeof(stp_sq.hash)); - stp_sq.options = 0; - memcpy(stp_sq.pubkey, keypair.pubkey, sizeof(stp_sq.pubkey)); - log_pubkey(keypair.pubkey); - - printf("Sending session request...\n"); - error = send(sockfd, &stp_sq, sizeof(stp_sq), 0); - if (error < 0) { - perror("Failed to send session request"); - close(sockfd); - return error; - } - - error = recv(sockfd, serv_pubkey, sizeof(serv_pubkey), 0); - if (error < 0) { - perror("Failed to get public key from peer\n"); - close(sockfd); - return error; } - if (error == 0) { - printf("Connection closed by peer\n"); - close(sockfd); - return 0; + if (session_recv(recv_buf, sizeof(recv_buf), &s) < 0) { + fprintf(stderr, "Failed to recv data from server!\n"); + return -1; } - printf("Got public key from server\n"); - log_pubkey(serv_pubkey); - - printf("Deriving session key...\n"); - gen_session_key(keypair.privkey, serv_pubkey, &session_key); - - /* Send server SPW bits */ - if ((error = negotiate_spw(sockfd, session_key)) < 0) { - printf("Session Parameter Negotiation failed\n"); - free_session_key(session_key); - close(sockfd); - return error; - } - - recv_motd(sockfd, session_key); - free_session_key(session_key); - close(sockfd); + printf("%s\n", recv_buf); + session_close(&s); return 0; } - -int -main(void) -{ - return request_session(); -} -- cgit v1.2.3