summaryrefslogtreecommitdiff
path: root/tls.c
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2023-05-03 22:57:53 -0400
committerTest_User <hax@andrewyu.org>2023-05-03 22:57:53 -0400
commite4b5445b3ca844e568a84abbf931a026a6ca6226 (patch)
tree9d9d615406c5a91036ebcd5b23bd8af30d3e8f3d /tls.c
parentec8b1682e86535333c34966f6aafee349e609641 (diff)
downloadcoupserv-e4b5445b3ca844e568a84abbf931a026a6ca6226.tar.gz
coupserv-e4b5445b3ca844e568a84abbf931a026a6ca6226.zip
C HaxServ
Diffstat (limited to 'tls.c')
-rw-r--r--tls.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/tls.c b/tls.c
new file mode 100644
index 0000000..aeb83fb
--- /dev/null
+++ b/tls.c
@@ -0,0 +1,66 @@
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+#include <openssl/x509v3.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <arpa/inet.h>
+
+#include "network.h"
+#include "config.h"
+#include "types.h"
+
+SSL *ssl;
+SSL_CTX *ctx;
+int fd;
+
+int connect_tls(void) {
+ // TODO: free used things on failure
+
+ SSL_library_init();
+ SSL_load_error_strings();
+
+ const SSL_METHOD *method = TLS_client_method();
+ if (method == NULL)
+ return 1;
+
+ ctx = SSL_CTX_new(method);
+ if (ctx == NULL)
+ return 2;
+
+ SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION);
+
+ int success = SSL_CTX_load_verify_locations(ctx, X509_get_default_cert_file(), NULL);
+ success |= SSL_CTX_load_verify_locations(ctx, NULL, X509_get_default_cert_dir());
+ if (!success)
+ return 3;
+
+ fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (fd == -1)
+ return 4;
+
+ ssl = SSL_new(ctx);
+ if (ssl == NULL)
+ return 5;
+
+ X509_VERIFY_PARAM *param = SSL_get0_param(ssl);
+ X509_VERIFY_PARAM_set_hostflags(param, X509_CHECK_FLAG_NO_WILDCARDS);
+ if (!X509_VERIFY_PARAM_set1_host(param, address.data, address.len))
+ return 6;
+
+ SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
+
+ struct sockaddr sockaddr;
+ resolve(address.data, port.data, &sockaddr);
+ int ret = connect(fd, &sockaddr, sizeof(sockaddr));
+ if (ret != 0)
+ return 7;
+
+ if (SSL_set_fd(ssl, fd) != 1)
+ return 8;
+
+ ret = SSL_connect(ssl);
+ if (ret != 1)
+ return 9;
+
+ return 0;
+}