TLA Line data Source code
1 : //
2 : // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com)
3 : //
4 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 : //
7 : // Official repository: https://github.com/cppalliance/corosio
8 : //
9 :
10 : #ifndef BOOST_COROSIO_TLS_CONTEXT_HPP
11 : #define BOOST_COROSIO_TLS_CONTEXT_HPP
12 :
13 : #include <boost/corosio/detail/config.hpp>
14 :
15 : #include <functional>
16 : #include <system_error>
17 : #include <memory>
18 : #include <string_view>
19 :
20 : namespace boost::corosio {
21 :
22 : //
23 : // Enumerations
24 : //
25 :
26 : /** TLS handshake role.
27 :
28 : Specifies whether to perform the TLS handshake as a client or server.
29 :
30 : @see stream::handshake
31 : */
32 : enum class tls_role
33 : {
34 : /// Perform handshake as the connecting client.
35 : client,
36 :
37 : /// Perform handshake as the accepting server.
38 : server
39 : };
40 :
41 : /** TLS protocol version.
42 :
43 : Specifies the minimum or maximum TLS protocol version to use
44 : for connections. Only modern, secure versions are supported.
45 :
46 : @see tls_context::set_min_protocol_version
47 : @see tls_context::set_max_protocol_version
48 : */
49 : enum class tls_version
50 : {
51 : /// TLS 1.2 (RFC 5246).
52 : tls_1_2,
53 :
54 : /// TLS 1.3 (RFC 8446).
55 : tls_1_3
56 : };
57 :
58 : /** Certificate and key file format.
59 :
60 : Specifies the encoding format for certificate and key data.
61 :
62 : @see tls_context::use_certificate
63 : @see tls_context::use_private_key
64 : */
65 : enum class tls_file_format
66 : {
67 : /// PEM format (Base64-encoded with header/footer lines).
68 : pem,
69 :
70 : /// DER format (raw ASN.1 binary encoding).
71 : der
72 : };
73 :
74 : /** Peer certificate verification mode.
75 :
76 : Controls how the TLS implementation verifies the peer's
77 : certificate during the handshake.
78 :
79 : @see tls_context::set_verify_mode
80 : */
81 : enum class tls_verify_mode
82 : {
83 : /// Do not request or verify the peer certificate.
84 : none,
85 :
86 : /// Request and verify the peer certificate if presented.
87 : peer,
88 :
89 : /// Require and verify the peer certificate (fail if not presented).
90 : require_peer
91 : };
92 :
93 : /** Certificate revocation checking policy.
94 :
95 : Controls how certificate revocation status is checked during
96 : verification.
97 :
98 : @see tls_context::set_revocation_policy
99 : */
100 : enum class tls_revocation_policy
101 : {
102 : /// Do not check revocation status.
103 : disabled,
104 :
105 : /// Check revocation but allow connection if status is unknown.
106 : soft_fail,
107 :
108 : /// Require successful revocation check (fail if status is unknown).
109 : hard_fail
110 : };
111 :
112 : /** Purpose for password callback invocation.
113 :
114 : Indicates whether the password is needed for reading (decrypting)
115 : or writing (encrypting) key material.
116 :
117 : @see tls_context::set_password_callback
118 : */
119 : enum class tls_password_purpose
120 : {
121 : /// Password needed to decrypt/read protected key material.
122 : for_reading,
123 :
124 : /// Password needed to encrypt/write protected key material.
125 : for_writing
126 : };
127 :
128 : class tls_context;
129 :
130 : namespace detail {
131 : struct tls_context_data;
132 : tls_context_data const& get_tls_context_data(tls_context const&) noexcept;
133 : } // namespace detail
134 :
135 : /** A portable TLS context for certificate and settings storage.
136 :
137 : The `tls_context` class provides a backend-agnostic interface for
138 : configuring TLS connections. It stores credentials (certificates and
139 : private keys), trust anchors, protocol settings, and verification
140 : options that are used when establishing TLS connections.
141 :
142 : This class is a shared handle to an opaque implementation. Copies
143 : share the same underlying state. This allows contexts to be passed
144 : by value and shared across multiple TLS streams.
145 :
146 : This class abstracts the configuration phase of TLS across multiple
147 : backend implementations (OpenSSL, WolfSSL, mbedTLS, Schannel, etc.),
148 : allowing portable code that works regardless of which TLS library
149 : is linked.
150 :
151 : @par Modification After Stream Creation
152 :
153 : Modifying a context after a TLS stream has been created from it
154 : results in undefined behavior. The context's configuration is
155 : captured when the first stream is constructed, and subsequent
156 : modifications are not reflected in existing or new streams
157 : sharing the context.
158 :
159 : If different configurations are needed, create separate context
160 : objects.
161 :
162 : @par Thread Safety
163 :
164 : Distinct objects: Safe.
165 :
166 : Shared objects: Unsafe. A context must not be modified while
167 : any thread is creating streams from it.
168 :
169 : @par Example
170 : @code
171 : // Create a client context with system trust anchors
172 : corosio::tls_context ctx;
173 : ctx.set_default_verify_paths();
174 : ctx.set_verify_mode( corosio::tls_verify_mode::peer );
175 : ctx.set_hostname( "example.com" );
176 :
177 : // Use with a TLS stream
178 : corosio::openssl_stream secure( &sock, ctx );
179 : co_await secure.handshake( corosio::tls_stream::client );
180 : @endcode
181 :
182 : @see tls_role
183 : */
184 : #ifdef _MSC_VER
185 : #pragma warning(push)
186 : #pragma warning(disable : 4251) // shared_ptr needs dll-interface
187 : #endif
188 : class BOOST_COROSIO_DECL tls_context
189 : {
190 : struct impl;
191 : std::shared_ptr<impl> impl_;
192 :
193 : friend detail::tls_context_data const&
194 : detail::get_tls_context_data(tls_context const&) noexcept;
195 :
196 : public:
197 : /** Construct a default TLS context.
198 :
199 : Creates a context with default settings suitable for TLS 1.2
200 : and TLS 1.3 connections. No certificates or trust anchors are
201 : loaded; call the appropriate methods to configure credentials
202 : and verification.
203 :
204 : @par Example
205 : @code
206 : corosio::tls_context ctx;
207 : @endcode
208 : */
209 : tls_context();
210 :
211 : /** Copy constructor.
212 :
213 : Creates a new handle that shares ownership of the underlying
214 : TLS context state with `other`.
215 :
216 : @param other The context to copy from.
217 : */
218 HIT 1 : tls_context(tls_context const& other) = default;
219 :
220 : /** Copy assignment operator.
221 :
222 : Releases the current context's shared ownership and acquires
223 : shared ownership of `other`'s underlying state.
224 :
225 : @param other The context to copy from.
226 :
227 : @return Reference to this context.
228 : */
229 1 : tls_context& operator=(tls_context const& other) = default;
230 :
231 : /** Move constructor.
232 :
233 : Transfers ownership of the TLS context from another instance.
234 : After the move, `other` is in a valid but empty state.
235 :
236 : @param other The context to move from.
237 : */
238 1 : tls_context(tls_context&& other) noexcept = default;
239 :
240 : /** Move assignment operator.
241 :
242 : Releases the current context's shared ownership and transfers
243 : ownership from another instance. After the move, `other` is
244 : in a valid but empty state.
245 :
246 : @param other The context to move from.
247 :
248 : @return Reference to this context.
249 : */
250 1 : tls_context& operator=(tls_context&& other) noexcept = default;
251 :
252 : /** Destructor.
253 :
254 : Releases this handle's shared ownership of the underlying
255 : context. The context state is destroyed when the last handle
256 : is released.
257 : */
258 36 : ~tls_context() = default;
259 :
260 : //
261 : // Credential Loading
262 : //
263 :
264 : /** Load the entity certificate from a memory buffer.
265 :
266 : Sets the certificate that identifies this endpoint to the peer.
267 : For servers, this is the server certificate. For clients using
268 : mutual TLS, this is the client certificate.
269 :
270 : The certificate must match the private key loaded via
271 : `use_private_key()` or `use_private_key_file()`.
272 :
273 : @param certificate The certificate data.
274 :
275 : @param format The encoding format of the certificate data.
276 :
277 : @return Success, or an error if the certificate could not be parsed
278 : or is invalid.
279 :
280 : @see use_certificate_file
281 : @see use_private_key
282 : */
283 : std::error_code
284 : use_certificate(std::string_view certificate, tls_file_format format);
285 :
286 : /** Load the entity certificate from a file.
287 :
288 : Sets the certificate that identifies this endpoint to the peer.
289 : For servers, this is the server certificate. For clients using
290 : mutual TLS, this is the client certificate.
291 :
292 : @param filename Path to the certificate file.
293 :
294 : @param format The encoding format of the file.
295 :
296 : @return Success, or an error if the file could not be read or the
297 : certificate is invalid.
298 :
299 : @par Example
300 : @code
301 : ctx.use_certificate_file( "server.crt", tls_file_format::pem );
302 : @endcode
303 :
304 : @see use_certificate
305 : @see use_private_key_file
306 : */
307 : std::error_code
308 : use_certificate_file(std::string_view filename, tls_file_format format);
309 :
310 : /** Load a certificate chain from a memory buffer.
311 :
312 : Loads the entity certificate followed by intermediate CA certificates.
313 : The chain should be ordered from leaf to root (excluding the root).
314 : This is the typical format for PEM certificate bundles.
315 :
316 : @param chain The certificate chain data in PEM format (concatenated
317 : certificates).
318 :
319 : @return Success, or an error if the chain could not be parsed.
320 :
321 : @see use_certificate_chain_file
322 : */
323 : std::error_code use_certificate_chain(std::string_view chain);
324 :
325 : /** Load a certificate chain from a file.
326 :
327 : Loads the entity certificate followed by intermediate CA certificates
328 : from a PEM file. The file should contain concatenated PEM certificates
329 : ordered from leaf to root (excluding the root).
330 :
331 : @param filename Path to the certificate chain file.
332 :
333 : @return Success, or an error if the file could not be read or parsed.
334 :
335 : @par Example
336 : @code
337 : // Load certificate chain (cert + intermediates)
338 : ctx.use_certificate_chain_file( "fullchain.pem" );
339 : @endcode
340 :
341 : @see use_certificate_chain
342 : */
343 : std::error_code use_certificate_chain_file(std::string_view filename);
344 :
345 : /** Load the private key from a memory buffer.
346 :
347 : Sets the private key corresponding to the entity certificate.
348 : The key must match the certificate loaded via `use_certificate()`
349 : or `use_certificate_chain()`.
350 :
351 : If the key is encrypted, set a password callback via
352 : `set_password_callback()` before calling this function.
353 :
354 : @param private_key The private key data.
355 :
356 : @param format The encoding format of the key data.
357 :
358 : @return Success, or an error if the key could not be parsed,
359 : is encrypted without a password callback, or doesn't match
360 : the certificate.
361 :
362 : @see use_private_key_file
363 : @see set_password_callback
364 : */
365 : std::error_code
366 : use_private_key(std::string_view private_key, tls_file_format format);
367 :
368 : /** Load the private key from a file.
369 :
370 : Sets the private key corresponding to the entity certificate.
371 : The key must match the certificate loaded via `use_certificate_file()`
372 : or `use_certificate_chain_file()`.
373 :
374 : If the key file is encrypted, set a password callback via
375 : `set_password_callback()` before calling this function.
376 :
377 : @param filename Path to the private key file.
378 :
379 : @param format The encoding format of the file.
380 :
381 : @return Success, or an error if the file could not be read,
382 : the key is invalid, or it doesn't match the certificate.
383 :
384 : @par Example
385 : @code
386 : ctx.use_private_key_file( "server.key", tls_file_format::pem );
387 : @endcode
388 :
389 : @see use_private_key
390 : @see set_password_callback
391 : */
392 : std::error_code
393 : use_private_key_file(std::string_view filename, tls_file_format format);
394 :
395 : /** Load credentials from a PKCS#12 bundle in memory.
396 :
397 : PKCS#12 (also known as PFX) is a binary format that bundles a
398 : certificate, private key, and optionally intermediate certificates
399 : into a single password-protected file.
400 :
401 : @param data The PKCS#12 bundle data.
402 :
403 : @param passphrase The password protecting the bundle.
404 :
405 : @return Success, or an error if the bundle could not be parsed
406 : or the passphrase is incorrect.
407 :
408 : @note Not yet implemented in this release; returns
409 : `std::errc::function_not_supported`. Load the certificate
410 : and key separately via `use_certificate_chain()` and
411 : `use_private_key()` instead.
412 :
413 : @see use_pkcs12_file
414 : */
415 : std::error_code
416 : use_pkcs12(std::string_view data, std::string_view passphrase);
417 :
418 : /** Load credentials from a PKCS#12 file.
419 :
420 : PKCS#12 (also known as PFX) is a binary format that bundles a
421 : certificate, private key, and optionally intermediate certificates
422 : into a single password-protected file. This is common on Windows
423 : and for certificates exported from browsers.
424 :
425 : @param filename Path to the PKCS#12 file.
426 :
427 : @param passphrase The password protecting the file.
428 :
429 : @return Success, or an error if the file could not be read,
430 : parsed, or the passphrase is incorrect.
431 :
432 : @note Not yet implemented in this release; returns
433 : `std::errc::function_not_supported`. Load the certificate
434 : and key separately via `use_certificate_chain_file()` and
435 : `use_private_key_file()` instead.
436 :
437 : @par Example
438 : @code
439 : ctx.use_pkcs12_file( "credentials.pfx", "secret" );
440 : @endcode
441 :
442 : @see use_pkcs12
443 : */
444 : std::error_code
445 : use_pkcs12_file(std::string_view filename, std::string_view passphrase);
446 :
447 : //
448 : // Trust Anchors
449 : //
450 :
451 : /** Add a certificate authority for peer verification.
452 :
453 : Adds a single CA certificate to the trust store used for verifying
454 : peer certificates. Call this multiple times to add multiple CAs,
455 : or use `load_verify_file()` for a bundle.
456 :
457 : @param ca The CA certificate data in PEM format.
458 :
459 : @return Success, or an error if the certificate could not be parsed.
460 :
461 : @see load_verify_file
462 : @see set_default_verify_paths
463 : */
464 : std::error_code add_certificate_authority(std::string_view ca);
465 :
466 : /** Load CA certificates from a file.
467 :
468 : Loads one or more CA certificates from a PEM file. The file may
469 : contain multiple concatenated PEM certificates.
470 :
471 : @param filename Path to a PEM file containing CA certificates.
472 :
473 : @return Success, or an error if the file could not be read or parsed.
474 :
475 : @par Example
476 : @code
477 : // Load a custom CA bundle
478 : ctx.load_verify_file( "/etc/ssl/certs/ca-certificates.crt" );
479 : @endcode
480 :
481 : @see add_certificate_authority
482 : @see add_verify_path
483 : */
484 : std::error_code load_verify_file(std::string_view filename);
485 :
486 : /** Add a directory of CA certificates for verification.
487 :
488 : Adds a directory containing CA certificate files. Each file must
489 : contain a single certificate in PEM format, named using the
490 : subject name hash (as generated by `openssl rehash` or
491 : `c_rehash`).
492 :
493 : @param path Path to the directory containing hashed CA certificates.
494 :
495 : @return Success, or an error if the directory is invalid.
496 :
497 : @note Not yet applied by the backends in this release; the
498 : directory is accepted but never loaded. Use
499 : `load_verify_file()` or `add_certificate_authority()` to
500 : supply trust anchors.
501 :
502 : @par Example
503 : @code
504 : ctx.add_verify_path( "/etc/ssl/certs" );
505 : @endcode
506 :
507 : @see load_verify_file
508 : @see set_default_verify_paths
509 : */
510 : std::error_code add_verify_path(std::string_view path);
511 :
512 : /** Use the system default CA certificate store.
513 :
514 : Configures the context to use the operating system's default
515 : trust store for peer certificate verification. This is the
516 : recommended approach for HTTPS clients connecting to public
517 : servers.
518 :
519 : On different platforms this uses:
520 : - Linux: `/etc/ssl/certs` or distribution-specific paths
521 : - macOS: System Keychain
522 : - Windows: Windows Certificate Store
523 :
524 : @return Success, or an error if the system store could not be loaded.
525 :
526 : @note Not yet applied by the backends in this release. This is a
527 : no-op: the OS trust store is never loaded, so a client that
528 : relies on it has an empty trust store and cannot verify a
529 : public server. To verify a peer today, supply CA certificates
530 : explicitly via `load_verify_file()` or
531 : `add_certificate_authority()`.
532 :
533 : @par Example
534 : @code
535 : // Trust the same CAs as the system
536 : ctx.set_default_verify_paths();
537 : @endcode
538 :
539 : @see load_verify_file
540 : @see add_verify_path
541 : */
542 : std::error_code set_default_verify_paths();
543 :
544 : //
545 : // Protocol Configuration
546 : //
547 :
548 : /** Set the minimum TLS protocol version.
549 :
550 : Connections will reject protocol versions older than this.
551 : The default allows TLS 1.2 and newer.
552 :
553 : @param v The minimum protocol version to accept.
554 :
555 : @return Success, or an error if the version is not supported
556 : by the backend.
557 :
558 : @note Not yet applied by the backends in this release; the bound
559 : is accepted but has no effect. The negotiated range is
560 : whatever the native default method provides.
561 :
562 : @par Example
563 : @code
564 : // Require TLS 1.3 minimum
565 : ctx.set_min_protocol_version( tls_version::tls_1_3 );
566 : @endcode
567 :
568 : @see set_max_protocol_version
569 : */
570 : std::error_code set_min_protocol_version(tls_version v);
571 :
572 : /** Set the maximum TLS protocol version.
573 :
574 : Connections will not negotiate protocol versions newer than this.
575 : The default allows the newest supported version.
576 :
577 : @param v The maximum protocol version to accept.
578 :
579 : @return Success, or an error if the version is not supported
580 : by the backend.
581 :
582 : @note Not yet applied by the backends in this release; the bound
583 : is accepted but has no effect. The negotiated range is
584 : whatever the native default method provides.
585 :
586 : @see set_min_protocol_version
587 : */
588 : std::error_code set_max_protocol_version(tls_version v);
589 :
590 : /** Set the allowed cipher suites.
591 :
592 : Configures which cipher suites may be used for connections.
593 : The format is backend-specific but typically follows OpenSSL
594 : cipher list syntax.
595 :
596 : @param ciphers The cipher suite specification string.
597 :
598 : @return Success, or an error if the cipher string is invalid.
599 :
600 : @par Example
601 : @code
602 : // TLS 1.2 cipher suites (OpenSSL format)
603 : ctx.set_ciphersuites( "ECDHE+AESGCM:ECDHE+CHACHA20" );
604 : @endcode
605 :
606 : @note For TLS 1.3, use `set_ciphersuites_tls13()` on backends
607 : that distinguish between TLS 1.2 and 1.3 cipher configuration.
608 :
609 : @note Applied by the OpenSSL backend only in this release; the
610 : WolfSSL backend accepts the string but silently ignores it.
611 : */
612 : std::error_code set_ciphersuites(std::string_view ciphers);
613 :
614 : /** Set the ALPN protocol list.
615 :
616 : Configures Application-Layer Protocol Negotiation (ALPN) for
617 : the connection. ALPN is used to negotiate which application
618 : protocol to use over the TLS connection (e.g., "h2" for HTTP/2,
619 : "http/1.1" for HTTP/1.1).
620 :
621 : The protocols are tried in preference order (first = highest).
622 :
623 : @param protocols Ordered list of protocol identifiers.
624 :
625 : @return Success, or an error if ALPN configuration fails.
626 :
627 : @note Not yet applied by the backends in this release; the
628 : protocol list is accepted but ALPN is never negotiated.
629 :
630 : @par Example
631 : @code
632 : // Prefer HTTP/2, fall back to HTTP/1.1
633 : ctx.set_alpn( { "h2", "http/1.1" } );
634 : @endcode
635 : */
636 : std::error_code set_alpn(std::initializer_list<std::string_view> protocols);
637 :
638 : //
639 : // Certificate Verification
640 : //
641 :
642 : /** Set the peer certificate verification mode.
643 :
644 : Controls whether and how peer certificates are verified during
645 : the TLS handshake.
646 :
647 : @param mode The verification mode to use.
648 :
649 : @return Success, or an error if the mode could not be set.
650 :
651 : @par Example
652 : @code
653 : // Verify peer certificate (typical for clients)
654 : ctx.set_verify_mode( tls_verify_mode::peer );
655 :
656 : // Require client certificate (server-side mTLS)
657 : ctx.set_verify_mode( tls_verify_mode::require_peer );
658 : @endcode
659 :
660 : @see tls_verify_mode
661 : */
662 : std::error_code set_verify_mode(tls_verify_mode mode);
663 :
664 : /** Set the maximum certificate chain verification depth.
665 :
666 : Limits how many intermediate certificates can appear between
667 : the peer certificate and a trusted root. The default is
668 : typically 100, which is sufficient for most certificate chains.
669 :
670 : @param depth Maximum number of intermediate certificates allowed.
671 :
672 : @return Success, or an error if the depth is invalid.
673 : */
674 : std::error_code set_verify_depth(int depth);
675 :
676 : /** Set a custom certificate verification callback.
677 :
678 : Installs a callback that is invoked during certificate chain
679 : verification. The callback can perform additional validation
680 : beyond the standard checks and can override verification
681 : results.
682 :
683 : The callback receives the verification result so far and
684 : information about the certificate being verified. Return
685 : `true` to accept the certificate, `false` to reject.
686 :
687 : @tparam Callback A callable with signature
688 : `bool( bool preverified, verify_context& ctx )`.
689 :
690 : @param callback The verification callback.
691 :
692 : @return Success, or an error if the callback could not be set.
693 :
694 : @note Not yet implemented in this release. This template is
695 : declared but not defined; code that instantiates it fails to
696 : link. Use `set_verify_mode()` with explicitly supplied trust
697 : anchors instead.
698 :
699 : @note The `verify_context` type provides access to the
700 : certificate and chain information. Its exact interface
701 : depends on the TLS backend.
702 : */
703 : template<typename Callback>
704 : std::error_code set_verify_callback(Callback callback);
705 :
706 : /** Set the expected server hostname for verification.
707 :
708 : For client connections, sets the hostname that the server
709 : certificate must match. This enables:
710 :
711 : 1. SNI (Server Name Indication) — tells the server which
712 : certificate to present (for virtual hosting)
713 : 2. Hostname verification — validates the certificate's
714 : Subject Alternative Name or Common Name matches
715 :
716 : @param hostname The expected server hostname.
717 :
718 : @par Example
719 : @code
720 : ctx.set_hostname( "api.example.com" );
721 : @endcode
722 :
723 : @note This is typically required for HTTPS clients to ensure
724 : they're connecting to the intended server.
725 : */
726 : void set_hostname(std::string_view hostname);
727 :
728 : /** Set a callback for Server Name Indication (SNI).
729 :
730 : For server connections, this callback is invoked during the TLS
731 : handshake when a client sends an SNI extension. The callback
732 : receives the requested hostname and can accept or reject the
733 : connection.
734 :
735 : @tparam Callback A callable with signature
736 : `bool( std::string_view hostname )`.
737 :
738 : @param callback The SNI callback. Return `true` to accept the
739 : connection or `false` to reject it with an alert.
740 :
741 : @par Example
742 : @code
743 : // Accept connections for specific domains only
744 : ctx.set_servername_callback(
745 : []( std::string_view hostname ) -> bool
746 : {
747 : return hostname == "api.example.com" ||
748 : hostname == "www.example.com";
749 : });
750 : @endcode
751 :
752 : @note For virtual hosting with different certificates per hostname,
753 : create separate contexts and select the appropriate one before
754 : creating the TLS stream.
755 :
756 : @see set_hostname
757 : */
758 : template<typename Callback>
759 : void set_servername_callback(Callback callback);
760 :
761 : private:
762 : void set_servername_callback_impl(
763 : std::function<bool(std::string_view)> callback);
764 :
765 : void set_password_callback_impl(
766 : std::function<std::string(std::size_t, tls_password_purpose)> callback);
767 :
768 : public:
769 : //
770 : // Revocation Checking
771 : //
772 :
773 : /** Add a Certificate Revocation List from memory.
774 :
775 : Adds a CRL to the verification store for checking whether
776 : certificates have been revoked. CRLs are typically fetched
777 : from the URLs in a certificate's CRL Distribution Points
778 : extension.
779 :
780 : @param crl The CRL data in DER or PEM format.
781 :
782 : @return Success, or an error if the CRL could not be parsed.
783 :
784 : @note Not yet applied by the backends in this release; the CRL is
785 : accepted but never used during verification.
786 :
787 : @see add_crl_file
788 : @see set_revocation_policy
789 : */
790 : std::error_code add_crl(std::string_view crl);
791 :
792 : /** Add a Certificate Revocation List from a file.
793 :
794 : Adds a CRL to the verification store for checking whether
795 : certificates have been revoked.
796 :
797 : @param filename Path to a CRL file (DER or PEM format).
798 :
799 : @return Success, or an error if the file could not be read
800 : or the CRL is invalid.
801 :
802 : @note Not yet applied by the backends in this release; the CRL is
803 : accepted but never used during verification.
804 :
805 : @par Example
806 : @code
807 : ctx.add_crl_file( "issuer.crl" );
808 : @endcode
809 :
810 : @see add_crl
811 : @see set_revocation_policy
812 : */
813 : std::error_code add_crl_file(std::string_view filename);
814 :
815 : /** Set the OCSP staple response for server-side stapling.
816 :
817 : For servers, provides a pre-fetched OCSP response to send
818 : to clients during the handshake. This proves the server's
819 : certificate hasn't been revoked without requiring the client
820 : to contact the OCSP responder.
821 :
822 : The OCSP response must be periodically refreshed (typically
823 : every few hours to days) before it expires.
824 :
825 : @param response The DER-encoded OCSP response.
826 :
827 : @return Success, or an error if the response is invalid.
828 :
829 : @note Not yet applied by the backends in this release; the
830 : response is accepted but never stapled into the handshake.
831 :
832 : @note This is a server-side operation. Clients use
833 : `set_require_ocsp_staple()` to require stapled responses.
834 : */
835 : std::error_code set_ocsp_staple(std::string_view response);
836 :
837 : /** Require OCSP stapling from the server.
838 :
839 : For clients, requires the server to provide a stapled OCSP
840 : response proving its certificate hasn't been revoked. If
841 : the server doesn't provide a stapled response, the handshake
842 : fails.
843 :
844 : @param require Whether to require OCSP stapling.
845 :
846 : @note Not yet applied by the backends in this release; the flag
847 : is accepted but has no effect. Setting it to `true` does not
848 : make the handshake fail when no staple is present.
849 :
850 : @note Not all servers support OCSP stapling. Enable this only
851 : when connecting to servers known to support it.
852 : */
853 : void set_require_ocsp_staple(bool require);
854 :
855 : /** Set the certificate revocation checking policy.
856 :
857 : Controls how certificate revocation status is checked during
858 : verification. This affects both CRL and OCSP checking.
859 :
860 : @param policy The revocation checking policy.
861 :
862 : @par Example
863 : @code
864 : // Require successful revocation check
865 : ctx.set_revocation_policy( tls_revocation_policy::hard_fail );
866 :
867 : // Check but allow unknown status
868 : ctx.set_revocation_policy( tls_revocation_policy::soft_fail );
869 : @endcode
870 :
871 : @note Not yet applied by the backends in this release; the policy
872 : is accepted but has no effect. `soft_fail` and `hard_fail` do
873 : not change verification behavior.
874 :
875 : @see tls_revocation_policy
876 : @see add_crl
877 : */
878 : void set_revocation_policy(tls_revocation_policy policy);
879 :
880 : //
881 : // Password Handling
882 : //
883 :
884 : /** Set the password callback for encrypted keys.
885 :
886 : Installs a callback that provides passwords for encrypted
887 : private keys and PKCS#12 files. The callback is invoked when
888 : loading encrypted key material.
889 :
890 : @tparam Callback A callable with signature
891 : `std::string( std::size_t max_length, password_purpose purpose )`.
892 :
893 : @param callback The password callback. It receives the maximum
894 : password length and the purpose (reading or writing), and
895 : returns the password string.
896 :
897 : @par Example
898 : @code
899 : ctx.set_password_callback(
900 : []( std::size_t max_len, tls_password_purpose purpose )
901 : {
902 : // In practice, prompt user or read from secure storage
903 : return std::string( "my-key-password" );
904 : });
905 :
906 : // Now load encrypted key
907 : ctx.use_private_key_file( "encrypted.key", tls_file_format::pem );
908 : @endcode
909 :
910 : @see tls_password_purpose
911 : */
912 : template<typename Callback>
913 : void set_password_callback(Callback callback);
914 : };
915 : #ifdef _MSC_VER
916 : #pragma warning(pop)
917 : #endif
918 :
919 : template<typename Callback>
920 : void
921 1 : tls_context::set_servername_callback(Callback callback)
922 : {
923 1 : set_servername_callback_impl(std::move(callback));
924 1 : }
925 :
926 : template<typename Callback>
927 : void
928 1 : tls_context::set_password_callback(Callback callback)
929 : {
930 1 : set_password_callback_impl(std::move(callback));
931 1 : }
932 :
933 : } // namespace boost::corosio
934 :
935 : #endif
|