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::function<bool(bool, verify_context&)> verify_callback; 72   std::function<bool(bool, verify_context&)> verify_callback;
73   73  
74   // SNI (Server Name Indication) 74   // SNI (Server Name Indication)
75   75  
76   std::function<bool(std::string_view)> servername_callback; 76   std::function<bool(std::string_view)> servername_callback;
77   77  
78   // Revocation 78   // Revocation
79   79  
80   std::vector<std::string> crls; 80   std::vector<std::string> crls;
81   tls_revocation_policy revocation = tls_revocation_policy::disabled; 81   tls_revocation_policy revocation = tls_revocation_policy::disabled;
82   82  
83   // Password 83   // Password
84   84  
85   std::function<std::string(std::size_t, tls_password_purpose)> 85   std::function<std::string(std::size_t, tls_password_purpose)>
86   password_callback; 86   password_callback;
87   87  
88   // Cached native contexts (intrusive list) 88   // Cached native contexts (intrusive list)
89   89  
90   mutable std::mutex native_contexts_mutex_; 90   mutable std::mutex native_contexts_mutex_;
91   mutable native_context_base* native_contexts_ = nullptr; 91   mutable native_context_base* native_contexts_ = nullptr;
92   92  
93   /** Find or insert a cached native context. 93   /** Find or insert a cached native context.
94   94  
95   @param service The unique key for the backend. 95   @param service The unique key for the backend.
96   @param create Factory function called if not found. 96   @param create Factory function called if not found.
97   97  
98   @return Pointer to the cached native context. 98   @return Pointer to the cached native context.
99   */ 99   */
100   template<typename Factory> 100   template<typename Factory>
101   native_context_base* find(void const* service, Factory&& create) const 101   native_context_base* find(void const* service, Factory&& create) const
102   { 102   {
103   std::lock_guard<std::mutex> lock(native_contexts_mutex_); 103   std::lock_guard<std::mutex> lock(native_contexts_mutex_);
104   104  
105   for (auto* p = native_contexts_; p; p = p->next_) 105   for (auto* p = native_contexts_; p; p = p->next_)
106   if (p->service_ == service) 106   if (p->service_ == service)
107   return p; 107   return p;
108   108  
109   // Not found - create and prepend 109   // Not found - create and prepend
110   auto* ctx = create(); 110   auto* ctx = create();
111   ctx->service_ = service; 111   ctx->service_ = service;
112   ctx->next_ = native_contexts_; 112   ctx->next_ = native_contexts_;
113   native_contexts_ = ctx; 113   native_contexts_ = ctx;
114   return ctx; 114   return ctx;
115   } 115   }
116   116  
HITCBC 117   31 ~tls_context_data() 117   51 ~tls_context_data()
118   { 118   {
119   // Clean up cached native contexts (no lock needed - destructor) 119   // Clean up cached native contexts (no lock needed - destructor)
HITCBC 120   31 while (native_contexts_) 120   51 while (native_contexts_)
121   { 121   {
MISUBC 122   auto* next = native_contexts_->next_; 122   auto* next = native_contexts_->next_;
MISUBC 123   delete native_contexts_; 123   delete native_contexts_;
MISUBC 124   native_contexts_ = next; 124   native_contexts_ = next;
125   } 125   }
HITCBC 126   31 } 126   51 }
127   }; 127   };
128   128  
129   } // namespace detail 129   } // namespace detail
130   130  
131   /** Implementation of tls_context. 131   /** Implementation of tls_context.
132   132  
133   Contains all portable TLS configuration data plus 133   Contains all portable TLS configuration data plus
134   cached native SSL contexts as an intrusive list. 134   cached native SSL contexts as an intrusive list.
135   */ 135   */
136   struct tls_context::impl : detail::tls_context_data 136   struct tls_context::impl : detail::tls_context_data
137   {}; 137   {};
138   138  
139   namespace detail { 139   namespace detail {
140   140  
141   /** Return the TLS context data. 141   /** Return the TLS context data.
142   142  
143   Provides read-only access to the portable configuration 143   Provides read-only access to the portable configuration
144   stored in the context. 144   stored in the context.
145   145  
146   @param ctx The TLS context. 146   @param ctx The TLS context.
147   147  
148   @return Reference to the context implementation. 148   @return Reference to the context implementation.
149   */ 149   */
150   inline tls_context_data const& 150   inline tls_context_data const&
HITCBC 151   33 get_tls_context_data(tls_context const& ctx) noexcept 151   33 get_tls_context_data(tls_context const& ctx) noexcept
152   { 152   {
HITCBC 153   33 return *ctx.impl_; 153   33 return *ctx.impl_;
154   } 154   }
155   155  
156   } // namespace detail 156   } // namespace detail
157   157  
158   } // namespace boost::corosio 158   } // namespace boost::corosio
159   159  
160   #endif 160   #endif