diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-10-18 17:36:45 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-10-18 17:36:45 +0200 |
commit | 0a374c58a6859c962ca8d779490c379a643180a9 (patch) | |
tree | aa0c51f02944f1ab2912491f36b3f2f8881982c8 | |
parent | 0171e717155d196ce4da1673d61aa6db47dafe95 (diff) |
Trying to get server working
-rw-r--r-- | modules/io-tls/c++/tls.cpp | 0 | ||||
-rw-r--r-- | modules/io-tls/c++/tls.tmpl.hpp | 58 |
2 files changed, 49 insertions, 9 deletions
diff --git a/modules/io-tls/c++/tls.cpp b/modules/io-tls/c++/tls.cpp deleted file mode 100644 index e69de29..0000000 --- a/modules/io-tls/c++/tls.cpp +++ /dev/null diff --git a/modules/io-tls/c++/tls.tmpl.hpp b/modules/io-tls/c++/tls.tmpl.hpp index bc3d2d2..d76e482 100644 --- a/modules/io-tls/c++/tls.tmpl.hpp +++ b/modules/io-tls/c++/tls.tmpl.hpp @@ -139,15 +139,6 @@ public: conveyor<own<io_stream<net::Tls<T>>>> connect(network_address<net::Tls<T>>& address) override; }; -template<typename T> -conveyor<own<io_stream<net::Tls<T>>>> tls_server<T>::accept() { - SAW_ASSERT(internal_) { return conveyor<own<io_stream<net::Tls<T>>>>{fix_void<own<io_stream<net::Tls<T>>>>{nullptr}}; } - return internal_->accept().then([](own<io_stream<T>> stream) -> error_or<own<io_stream<net::Tls<T>>>> { - /// @todo handshake - return make_error<err::not_implemented>(); - // auto foo = heap<tls_io_stream<T>>(std::move(stream)); - }); -} namespace { /* @@ -210,6 +201,18 @@ template<typename T> error_or<own<server<net::Tls<T>>>> tls_network<T>::listen(network_address<net::Tls<T>>& address) { gnutls_certificate_credentials_t x509_cred; gnutls_certificate_allocate_credentials(&x509_cred); + + std::string_view KEYFILE = "key.pem"; + std::string_view CERTFILE = "cert.pem"; + std::string_view CAFILE = "/etc/ssl/certs/ca-certificates.crt"; + std::string_view CRLFILE = "crl.pem"; + + gnutls_certificate_set_x509_trust_file(x509_cred, CAFILE, GNUTLS_X509_FMT_PEM); + gnutls_certificate_set_x509_crl_file(x509_cred, CRLFILE, GNUTLS_X509_FMT_PEM); + gnutls_certificate_set_x509_key_file(x509_cred, CERTFILE, KEYFILE, GNUTLS_X509_FMT_PEM); + + gnutls_certificate_set_x509_ocsp_status_request_file(x509_cred, OCSP_STATUS_FILE, 0); + auto int_srv = internal_().listen(address.get_handle()); own<server<net::Tls<T>>> tls_srv = heap<tls_server<T>>(std::move(int_srv), x509_cred); @@ -217,6 +220,43 @@ error_or<own<server<net::Tls<T>>>> tls_network<T>::listen(network_address<net::T } template<typename T> +conveyor<own<io_stream<net::Tls<T>>>> tls_server<T>::accept() { + SAW_ASSERT(internal_) { return conveyor<own<io_stream<net::Tls<T>>>>{fix_void<own<io_stream<net::Tls<T>>>>{nullptr}}; } + + auto caf = new_conveyor_and_feeder<own<io_stream<net::Tls<T>>>>(); + own<tls_client_stream_helper<T>> helper = heap<tls_client_stream_helper<T>>(std::move(caf.feeder)); + tls_client_stream_helper<T>* hlp_ptr = helper.get(); + + auto prim_conv = internal_->accept().then([&](own<io_stream<T>> stream) -> error_or<void> { + io_stream<T>* inner_stream = stream.get(); + auto tls_stream = heap<tls_io_stream<T>>(std::move(stream)); + + auto &session = tls_stream->session(); + + gnutls_init(&session, GNUTLS_SERVER); + gnutls_certificate_server_set_request(session, GNUTLS_CERT_IGNORE); + gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred_); + gnutls_set_default_priority(session); + + gnutls_transport_set_ptr(session, reinterpret_cast<gnutls_transport_ptr_t>(inner_stream)); + gnutls_transport_set_push_function(session, forst_tls_push_func<T>); + gnutls_transport_set_pull_function(session, forst_tls_pull_func<T>); + + // gnutls_handshake_set_timeout(session, GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT); + + hlp_ptr->stream = std::move(tls_stream); + hlp_ptr->setupTurn(); + hlp_ptr->turn(); + + return void_t{}; + }); + + helper->connection_sink = prim_conv.sink(); + + return caf.conveyor.attach(std::move(helper)); +} + +template<typename T> conveyor<own<io_stream<net::Tls<T>>>> tls_network<T>::connect(network_address<net::Tls<T>>& address) { // Helper setups auto caf = new_conveyor_and_feeder<own<io_stream<net::Tls<T>>>>(); |