tlsrp

A simple TLS reverse proxy
git clone git://nihaljere.xyz/tlsrp
Log | Files | Refs

commit 9e2eaf29c6ed24644e5934278cde6d61caa18ffe
parent 492c0cd761595041b13694e8d51819b9a5126bbb
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Sat,  2 May 2020 18:36:37 -0500

added (probably broken) tls

Diffstat:
Mtlsrp.c | 91++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
1 file changed, 62 insertions(+), 29 deletions(-)

diff --git a/tlsrp.c b/tlsrp.c @@ -12,6 +12,7 @@ #include <netinet/ip.h> #include <arpa/inet.h> #include <poll.h> +#include <libressl/tls.h> #include "util.h" @@ -128,8 +129,19 @@ static void dowrite(int fd, char* buf, size_t towrite) { } } +static void dotlswrite(struct tls *tlss, char* buf, size_t towrite) { + ssize_t written = 0; + while (towrite > 0) { + written = tls_write(tlss, buf, towrite); + if (written == -1) + die("failed to write:"); + towrite -= written; + buf += written; + } +} + static int -serve(int serverfd, int clientfd) +serve(int serverfd, int clientfd, struct tls *clientconn) { struct pollfd pfd[] = { {serverfd, POLLIN | POLLOUT, 0}, @@ -146,7 +158,7 @@ serve(int serverfd, int clientfd) return -1; if ((pfd[CLIENT].revents & POLLIN)) { - clicount = read(clientfd, clibuf, BUF_SIZE); + clicount = tls_read(clientconn, clibuf, BUF_SIZE); if (clicount == -1) { die("client read failed:"); return -2; @@ -167,7 +179,7 @@ serve(int serverfd, int clientfd) } if ((pfd[CLIENT].revents & POLLOUT) && sercount > 0) { - dowrite(clientfd, serbuf, sercount); + dotlswrite(clientconn, serbuf, sercount); sercount = 0; } @@ -184,10 +196,11 @@ serve(int serverfd, int clientfd) int main(int argc, char* argv[]) { - int to_server = 0, to_client = 0; + int serverfd = 0, clientfd = 0, bindfd = 0; struct sockaddr_storage client_sa, server_sa = {0}; + struct tls_config *config; + struct tls *tls_client, *conn; socklen_t client_sa_len = 0; - int serverfd, bindfd; char *usock = NULL, *host = NULL, *backport = NULL, @@ -213,6 +226,38 @@ main(int argc, char* argv[]) if (usock && (host || backport)) die("cannot use both unix and network socket"); + if ((config = tls_config_new()) == NULL) { + die("failed to get tls config:"); + } + + if (tls_config_set_ca_file(config, "~/projects/libtls/CA/root.pem") == -1) { + tls_config_free(config); + die("failed to load ca file:"); + } + + if (tls_config_set_cert_file(config, "~/projects/libtls/CA/server.crt") == -1) { + tls_config_free(config); + die("failed to load cert file:"); + } + + if (tls_config_set_key_file(config, "~/projects/libtls/CA/server.key") == -1) { + tls_config_free(config); + die("failed to load key file:"); + } + + if ((tls_client = tls_server()) == NULL) { + tls_config_free(config); + die("failed to create server context:"); + } + + if ((tls_configure(tls_client, config)) == -1) { + tls_config_free(config); + tls_free(tls_client); + die("failed to configure server:"); + } + + tls_config_free(config); + bindfd = dobind(NULL, frontport); if (listen(bindfd, BACKLOG) == -1) { @@ -220,11 +265,10 @@ main(int argc, char* argv[]) die("could not start listen:"); } - pid_t pid; while (1) { - if ((to_client = accept(bindfd, (struct sockaddr*) &client_sa, + if ((clientfd = accept(bindfd, (struct sockaddr*) &client_sa, &client_sa_len)) == -1) { warn("could not accept connection:"); } @@ -234,34 +278,23 @@ main(int argc, char* argv[]) warn("fork:"); case 0: if (usock) - to_server = dounixconnect(usock); + serverfd = dounixconnect(usock); else - to_server = donetworkconnect(host, backport); + serverfd = donetworkconnect(host, backport); + + tls_accept_socket(tls_client, &conn, clientfd); - if (to_server) - serve(to_server, to_client); - close(to_server); - close(to_client); + if (serverfd) + serve(serverfd, clientfd, conn); + + tls_close(conn); + close(serverfd); + close(clientfd); close(bindfd); exit(0); - break; default: - close(to_client); + close(clientfd); } } - - // TODO Initialize - // - validate addresses - // - create sockets - // - bind - // - listen - // TODO Serve - // - fork - // - accept connect - // - serve - // - close - // TODO Shutdown - // - close sockets - // - unlink }