src/corosio/src/tls/context.cpp

0.0% Lines (0/113) 0.0% Functions (0/27)
src/corosio/src/tls/context.cpp
Line Hits Source Code
1 //
2 // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com)
3 // Copyright (c) 2026 Steve Gerbino
4 //
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)
7 //
8 // Official repository: https://github.com/cppalliance/corosio
9 //
10
11 #include <boost/corosio/tls_context.hpp>
12 #include "detail/context_impl.hpp"
13
14 #include <cerrno>
15 #include <fstream>
16 #include <sstream>
17
18 namespace boost::corosio {
19
20
21 ✗ tls_context::tls_context() : impl_(std::make_shared<impl>()) {}
22
23 //
24 // Credential Loading
25 //
26
27 std::error_code
28 ✗ tls_context::use_certificate(
29 std::string_view certificate, tls_file_format format)
30 {
31 ✗ impl_->entity_certificate = std::string(certificate);
32 ✗ impl_->entity_cert_format = format;
33 ✗ return {};
34 }
35
36 std::error_code
37 ✗ tls_context::use_certificate_file(
38 std::string_view filename, tls_file_format format)
39 {
40 ✗ std::ifstream file(std::string(filename), std::ios::binary);
41 ✗ if (!file)
42 ✗ return std::error_code(ENOENT, std::generic_category());
43
44 ✗ std::ostringstream ss;
45 ✗ ss << file.rdbuf();
46 ✗ impl_->entity_certificate = ss.str();
47 ✗ impl_->entity_cert_format = format;
48 ✗ return {};
49 ✗ }
50
51 std::error_code
52 ✗ tls_context::use_certificate_chain(std::string_view chain)
53 {
54 ✗ impl_->certificate_chain = std::string(chain);
55 ✗ return {};
56 }
57
58 std::error_code
59 ✗ tls_context::use_certificate_chain_file(std::string_view filename)
60 {
61 ✗ std::ifstream file(std::string(filename), std::ios::binary);
62 ✗ if (!file)
63 ✗ return std::error_code(ENOENT, std::generic_category());
64
65 ✗ std::ostringstream ss;
66 ✗ ss << file.rdbuf();
67 ✗ impl_->certificate_chain = ss.str();
68 ✗ return {};
69 ✗ }
70
71 std::error_code
72 ✗ tls_context::use_private_key(
73 std::string_view private_key, tls_file_format format)
74 {
75 ✗ impl_->private_key = std::string(private_key);
76 ✗ impl_->private_key_format = format;
77 ✗ return {};
78 }
79
80 std::error_code
81 ✗ tls_context::use_private_key_file(
82 std::string_view filename, tls_file_format format)
83 {
84 ✗ std::ifstream file(std::string(filename), std::ios::binary);
85 ✗ if (!file)
86 ✗ return std::error_code(ENOENT, std::generic_category());
87
88 ✗ std::ostringstream ss;
89 ✗ ss << file.rdbuf();
90 ✗ impl_->private_key = ss.str();
91 ✗ impl_->private_key_format = format;
92 ✗ return {};
93 ✗ }
94
95 std::error_code
96 ✗ tls_context::use_pkcs12(
97 std::string_view /*data*/, std::string_view /*passphrase*/)
98 {
99 // TODO: Implement PKCS#12 parsing
100 ✗ return std::make_error_code(std::errc::function_not_supported);
101 }
102
103 std::error_code
104 ✗ tls_context::use_pkcs12_file(
105 std::string_view /*filename*/, std::string_view /*passphrase*/)
106 {
107 // TODO: Implement PKCS#12 file loading
108 ✗ return std::make_error_code(std::errc::function_not_supported);
109 }
110
111 //
112 // Trust Anchors
113 //
114
115 std::error_code
116 ✗ tls_context::add_certificate_authority(std::string_view ca)
117 {
118 ✗ impl_->ca_certificates.emplace_back(ca);
119 ✗ return {};
120 }
121
122 std::error_code
123 ✗ tls_context::load_verify_file(std::string_view filename)
124 {
125 ✗ std::ifstream file(std::string(filename), std::ios::binary);
126 ✗ if (!file)
127 ✗ return std::error_code(ENOENT, std::generic_category());
128
129 ✗ std::ostringstream ss;
130 ✗ ss << file.rdbuf();
131 ✗ impl_->ca_certificates.push_back(ss.str());
132 ✗ return {};
133 ✗ }
134
135 std::error_code
136 ✗ tls_context::add_verify_path(std::string_view path)
137 {
138 ✗ impl_->verify_paths.emplace_back(path);
139 ✗ return {};
140 }
141
142 std::error_code
143 ✗ tls_context::set_default_verify_paths()
144 {
145 ✗ impl_->use_default_verify_paths = true;
146 ✗ return {};
147 }
148
149 //
150 // Protocol Configuration
151 //
152
153 std::error_code
154 ✗ tls_context::set_min_protocol_version(tls_version v)
155 {
156 ✗ impl_->min_version = v;
157 ✗ return {};
158 }
159
160 std::error_code
161 ✗ tls_context::set_max_protocol_version(tls_version v)
162 {
163 ✗ impl_->max_version = v;
164 ✗ return {};
165 }
166
167 std::error_code
168 ✗ tls_context::set_ciphersuites(std::string_view ciphers)
169 {
170 ✗ impl_->ciphersuites = std::string(ciphers);
171 ✗ return {};
172 }
173
174 std::error_code
175 ✗ tls_context::set_alpn(std::initializer_list<std::string_view> protocols)
176 {
177 ✗ impl_->alpn_protocols.clear();
178 ✗ for (auto const& p : protocols)
179 ✗ impl_->alpn_protocols.emplace_back(p);
180 ✗ return {};
181 }
182
183 //
184 // Certificate Verification
185 //
186
187 std::error_code
188 ✗ tls_context::set_verify_mode(tls_verify_mode mode)
189 {
190 ✗ impl_->verification_mode = mode;
191 ✗ return {};
192 }
193
194 std::error_code
195 ✗ tls_context::set_verify_depth(int depth)
196 {
197 ✗ impl_->verify_depth = depth;
198 ✗ return {};
199 }
200
201 void
202 ✗ tls_context::set_hostname(std::string_view hostname)
203 {
204 ✗ impl_->hostname = std::string(hostname);
205 ✗ }
206
207 void
208 ✗ tls_context::set_servername_callback_impl(
209 std::function<bool(std::string_view)> callback)
210 {
211 ✗ impl_->servername_callback = std::move(callback);
212 ✗ }
213
214 void
215 ✗ tls_context::set_password_callback_impl(
216 std::function<std::string(std::size_t, tls_password_purpose)> callback)
217 {
218 ✗ impl_->password_callback = std::move(callback);
219 ✗ }
220
221 //
222 // Revocation Checking
223 //
224
225 std::error_code
226 ✗ tls_context::add_crl(std::string_view crl)
227 {
228 ✗ impl_->crls.emplace_back(crl);
229 ✗ return {};
230 }
231
232 std::error_code
233 ✗ tls_context::add_crl_file(std::string_view filename)
234 {
235 ✗ std::ifstream file(std::string(filename), std::ios::binary);
236 ✗ if (!file)
237 ✗ return std::error_code(ENOENT, std::generic_category());
238
239 ✗ std::ostringstream ss;
240 ✗ ss << file.rdbuf();
241 ✗ impl_->crls.push_back(ss.str());
242 ✗ return {};
243 ✗ }
244
245 std::error_code
246 ✗ tls_context::set_ocsp_staple(std::string_view response)
247 {
248 ✗ impl_->ocsp_staple = std::string(response);
249 ✗ return {};
250 }
251
252 void
253 ✗ tls_context::set_require_ocsp_staple(bool require)
254 {
255 ✗ impl_->require_ocsp_staple = require;
256 ✗ }
257
258 void
259 ✗ tls_context::set_revocation_policy(tls_revocation_policy policy)
260 {
261 ✗ impl_->revocation = policy;
262 ✗ }
263
264 } // namespace boost::corosio
265