62.50% Lines (5/8) 100.00% Functions (2/2)
TLA Baseline Branch
Line Hits Code Line Hits Code
1   // 1   //
2   // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com) 2   // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com)
3   // Copyright (c) 2026 Michael Vandeberg 3   // Copyright (c) 2026 Michael Vandeberg
4   // 4   //
5   // Distributed under the Boost Software License, Version 1.0. (See accompanying 5   // Distributed under the Boost Software License, Version 1.0. (See accompanying
6   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7   // 7   //
8   // Official repository: https://github.com/cppalliance/corosio 8   // Official repository: https://github.com/cppalliance/corosio
9   // 9   //
10   10  
11   #ifndef SRC_TLS_DETAIL_CONTEXT_IMPL_HPP 11   #ifndef SRC_TLS_DETAIL_CONTEXT_IMPL_HPP
12   #define SRC_TLS_DETAIL_CONTEXT_IMPL_HPP 12   #define SRC_TLS_DETAIL_CONTEXT_IMPL_HPP
13   13  
14   #include <boost/corosio/tls_context.hpp> 14   #include <boost/corosio/tls_context.hpp>
15   15  
16   #include <functional> 16   #include <functional>
17   #include <mutex> 17   #include <mutex>
18   #include <string> 18   #include <string>
19   #include <vector> 19   #include <vector>
20   20  
21   namespace boost::corosio { 21   namespace boost::corosio {
22   22  
23   namespace detail { 23   namespace detail {
24   24  
25   /** Abstract base for cached native SSL contexts. 25   /** Abstract base for cached native SSL contexts.
26   26  
27   Stored in context::impl as an intrusive linked list. 27   Stored in context::impl as an intrusive linked list.
28   Each TLS backend derives from this to cache its native 28   Each TLS backend derives from this to cache its native
29   context handle ( WOLFSSL_CTX*, SSL_CTX*, etc. ). 29   context handle ( WOLFSSL_CTX*, SSL_CTX*, etc. ).
30   */ 30   */
31   class native_context_base 31   class native_context_base
32   { 32   {
33   public: 33   public:
34   native_context_base* next_ = nullptr; 34   native_context_base* next_ = nullptr;
35   void const* service_ = nullptr; 35   void const* service_ = nullptr;
36   36  
37   virtual ~native_context_base() = default; 37   virtual ~native_context_base() = default;
38   }; 38   };
39   39  
40   struct tls_context_data 40   struct tls_context_data
41   { 41   {
42   // Credentials 42   // Credentials
43   43  
44   std::string entity_certificate; 44   std::string entity_certificate;
45   tls_file_format entity_cert_format = tls_file_format::pem; 45   tls_file_format entity_cert_format = tls_file_format::pem;
46   std::string certificate_chain; 46   std::string certificate_chain;
47   std::string private_key; 47   std::string private_key;
48   tls_file_format private_key_format = tls_file_format::pem; 48   tls_file_format private_key_format = tls_file_format::pem;
49   49  
50   // PKCS#12 bundle (decoded by the backend into cert/key/chain). 50   // PKCS#12 bundle (decoded by the backend into cert/key/chain).
51   std::string pkcs12_data; 51   std::string pkcs12_data;
52   std::string pkcs12_password; 52   std::string pkcs12_password;
53   53  
54   // Trust anchors 54   // Trust anchors
55   55  
56   std::vector<std::string> ca_certificates; 56   std::vector<std::string> ca_certificates;
57   std::vector<std::string> verify_paths; 57   std::vector<std::string> verify_paths;
58   bool use_default_verify_paths = false; 58   bool use_default_verify_paths = false;
59   59  
60   // Protocol settings 60   // Protocol settings
61   61  
62   tls_version min_version = tls_version::tls_1_2; 62   tls_version min_version = tls_version::tls_1_2;
63   tls_version max_version = tls_version::tls_1_3; 63   tls_version max_version = tls_version::tls_1_3;
64   std::string ciphersuites; // TLS 1.2 and below (cipher list) 64   std::string ciphersuites; // TLS 1.2 and below (cipher list)
65   std::string ciphersuites_tls13; // TLS 1.3 ciphersuites 65   std::string ciphersuites_tls13; // TLS 1.3 ciphersuites
66   std::vector<std::string> alpn_protocols; 66   std::vector<std::string> alpn_protocols;
67   67  
68   // Verification 68   // Verification
69   69  
70   tls_verify_mode verification_mode = tls_verify_mode::none; 70   tls_verify_mode verification_mode = tls_verify_mode::none;
71   int verify_depth = 100; 71   int verify_depth = 100;
72   std::string hostname; 72   std::string hostname;
73   std::function<bool(bool, verify_context&)> verify_callback; 73   std::function<bool(bool, verify_context&)> verify_callback;
74   74  
75   // SNI (Server Name Indication) 75   // SNI (Server Name Indication)
76   76  
77   std::function<bool(std::string_view)> servername_callback; 77   std::function<bool(std::string_view)> servername_callback;
78   78  
79   // Revocation 79   // Revocation
80   80  
81   std::vector<std::string> crls; 81   std::vector<std::string> crls;
82   tls_revocation_policy revocation = tls_revocation_policy::disabled; 82   tls_revocation_policy revocation = tls_revocation_policy::disabled;
83   83  
84   // Password 84   // Password
85   85  
86   std::function<std::string(std::size_t, tls_password_purpose)> 86   std::function<std::string(std::size_t, tls_password_purpose)>
87   password_callback; 87   password_callback;
88   88  
89   // Cached native contexts (intrusive list) 89   // Cached native contexts (intrusive list)
90   90  
91   mutable std::mutex native_contexts_mutex_; 91   mutable std::mutex native_contexts_mutex_;
92   mutable native_context_base* native_contexts_ = nullptr; 92   mutable native_context_base* native_contexts_ = nullptr;
93   93  
94   /** Find or insert a cached native context. 94   /** Find or insert a cached native context.
95   95  
96   @param service The unique key for the backend. 96   @param service The unique key for the backend.
97   @param create Factory function called if not found. 97   @param create Factory function called if not found.
98   98  
99   @return Pointer to the cached native context. 99   @return Pointer to the cached native context.
100   */ 100   */
101   template<typename Factory> 101   template<typename Factory>
102   native_context_base* find(void const* service, Factory&& create) const 102   native_context_base* find(void const* service, Factory&& create) const
103   { 103   {
104   std::lock_guard<std::mutex> lock(native_contexts_mutex_); 104   std::lock_guard<std::mutex> lock(native_contexts_mutex_);
105   105  
106   for (auto* p = native_contexts_; p; p = p->next_) 106   for (auto* p = native_contexts_; p; p = p->next_)
107   if (p->service_ == service) 107   if (p->service_ == service)
108   return p; 108   return p;
109   109  
110   // Not found - create and prepend 110   // Not found - create and prepend
111   auto* ctx = create(); 111   auto* ctx = create();
112   ctx->service_ = service; 112   ctx->service_ = service;
113   ctx->next_ = native_contexts_; 113   ctx->next_ = native_contexts_;
114   native_contexts_ = ctx; 114   native_contexts_ = ctx;
115   return ctx; 115   return ctx;
116   } 116   }
117   117  
HITCBC 118   32 ~tls_context_data() 118   32 ~tls_context_data()
119   { 119   {
120   // Clean up cached native contexts (no lock needed - destructor) 120   // Clean up cached native contexts (no lock needed - destructor)
HITCBC 121   32 while (native_contexts_) 121   32 while (native_contexts_)
122   { 122   {
MISUBC 123   auto* next = native_contexts_->next_; 123   auto* next = native_contexts_->next_;
MISUBC 124   delete native_contexts_; 124   delete native_contexts_;
MISUBC 125   native_contexts_ = next; 125   native_contexts_ = next;
126   } 126   }
HITCBC 127   32 } 127   32 }
128   }; 128   };
129   129  
130   } // namespace detail 130   } // namespace detail
131   131  
132   /** Implementation of tls_context. 132   /** Implementation of tls_context.
133   133  
134   Contains all portable TLS configuration data plus 134   Contains all portable TLS configuration data plus
135   cached native SSL contexts as an intrusive list. 135   cached native SSL contexts as an intrusive list.
136   */ 136   */
137   struct tls_context::impl : detail::tls_context_data 137   struct tls_context::impl : detail::tls_context_data
138   {}; 138   {};
139   139  
140   namespace detail { 140   namespace detail {
141   141  
142   /** Return the TLS context data. 142   /** Return the TLS context data.
143   143  
144   Provides read-only access to the portable configuration 144   Provides read-only access to the portable configuration
145   stored in the context. 145   stored in the context.
146   146  
147   @param ctx The TLS context. 147   @param ctx The TLS context.
148   148  
149   @return Reference to the context implementation. 149   @return Reference to the context implementation.
150   */ 150   */
151   inline tls_context_data const& 151   inline tls_context_data const&
HITCBC 152   36 get_tls_context_data(tls_context const& ctx) noexcept 152   36 get_tls_context_data(tls_context const& ctx) noexcept
153   { 153   {
HITCBC 154   36 return *ctx.impl_; 154   36 return *ctx.impl_;
155   } 155   }
156   156  
157   } // namespace detail 157   } // namespace detail
158   158  
159   } // namespace boost::corosio 159   } // namespace boost::corosio
160   160  
161   #endif 161   #endif