diff options
author | Ian Moffett <ian@osmora.org> | 2024-09-24 02:27:44 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2024-09-24 02:27:44 -0400 |
commit | 7e5e0f49dcb6ba416da5fc9e536109c04f338f95 (patch) | |
tree | 5853085d1db6ab1325275d94dc25b216b3a0f1c1 /client/main.c |
Initial commit
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'client/main.c')
-rw-r--r-- | client/main.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/client/main.c b/client/main.c new file mode 100644 index 0000000..1551065 --- /dev/null +++ b/client/main.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <net/stpsession.h> +#include <crypto/ecdh.h> +#include <arpa/inet.h> +#include <stdio.h> +#include <stdint.h> +#include <unistd.h> +#include <string.h> + +#define CENTRAL_SERVER "149.248.6.149" +#define OSTP_PORT 5352 + +static void +log_pubkey(unsigned char *pubkey) +{ + for (size_t i = 0; i < 32; ++i) { + printf("%02X ", pubkey[i] & 0xFF); + if (i != 0 && i % 4 == 0) { + printf("\n"); + } + } + printf("\n"); +} + +static int +request_session(void) +{ + struct sockaddr_in addr; + struct session_request stp_sq; + struct x25519_keypair keypair; + 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"); + send(sockfd, &stp_sq, sizeof(stp_sq), 0); + close(sockfd); + return 0; +} + +int +main(void) +{ + return request_session(); +} |