libfilezilla
tls_layer.hpp
Go to the documentation of this file.
1 #ifndef LIBFILEZILLA_TLS_LAYER_HEADER
2 #define LIBFILEZILLA_TLS_LAYER_HEADER
3 
8 #include "socket.hpp"
9 
10 namespace fz {
11 class logger_interface;
12 class tls_system_trust_store;
13 class tls_session_info;
14 
15 class tls_layer;
16 class tls_layer_impl;
17 
18 struct certificate_verification_event_type;
19 
25 
26 enum class tls_ver
27 {
28  v1_0,
29  v1_1,
30  v1_2,
31  v1_3
32 };
33 
34 enum class tls_server_flags : unsigned int
35 {
36  none = 0,
37 
39  no_auto_ticket = 0x1
40 };
41 
42 inline bool operator&(tls_server_flags lhs, tls_server_flags rhs) {
43  return (static_cast<std::underlying_type_t<tls_server_flags>>(lhs) & static_cast<std::underlying_type_t<tls_server_flags>>(rhs)) != 0;
44 }
45 inline tls_server_flags operator|(tls_server_flags lhs, tls_server_flags rhs) {
46  return static_cast<tls_server_flags>(static_cast<std::underlying_type_t<tls_server_flags>>(lhs) | static_cast<std::underlying_type_t<tls_server_flags>>(rhs));
47 }
48 
49 
62 class FZ_PUBLIC_SYMBOL tls_layer final : protected event_handler, public socket_layer
63 {
64 public:
65  tls_layer(event_loop& event_loop, event_handler* evt_handler, socket_interface& layer, tls_system_trust_store * system_trust_store, logger_interface& logger);
66  virtual ~tls_layer();
67 
79  bool client_handshake(std::vector<uint8_t> const& required_certificate, std::vector<uint8_t> const& session_to_resume = std::vector<uint8_t>(), native_string const& session_hostname = native_string());
80 
97  bool client_handshake(event_handler *const verification_handler, std::vector<uint8_t> const& session_to_resume = std::vector<uint8_t>(), native_string const& session_hostname = native_string());
98 
114  bool server_handshake(std::vector<uint8_t> const& session_to_resume = {}, std::string_view const& preamble = {}, tls_server_flags flags = {});
115 
117  std::vector<uint8_t> get_session_parameters() const;
118 
120  std::vector<uint8_t> get_raw_certificate() const;
121 
127  void set_verification_result(bool trusted);
128 
129  std::string get_protocol() const;
130 
131  std::string get_key_exchange() const;
132  std::string get_cipher() const;
133  std::string get_mac() const;
134  int get_algorithm_warnings() const;
135 
137  bool resumed_session() const;
138 
140  static std::string list_tls_ciphers(std::string const& priority);
141 
150  bool set_certificate_file(native_string const& keyfile, native_string const& certsfile, native_string const& password, bool pem = true);
151 
160  bool set_certificate(std::string_view const& key, std::string_view const& certs, native_string const& password, bool pem = true);
161 
163  static std::string get_gnutls_version();
164 
173  static std::pair<std::string, std::string> generate_selfsigned_certificate(native_string const& password, std::string const& distinguished_name, std::vector<std::string> const& hostnames);
174  static std::pair<std::string, std::string> generate_csr(native_string const& password, std::string const& distinguished_name, std::vector<std::string> const& hostnames, bool csr_as_pem = true);
175 
188  bool set_alpn(std::string_view const& alpn);
189  bool set_alpn(std::vector<std::string> const& alpns, bool server_priority = false);
190 
193  void set_min_tls_ver(tls_ver ver);
194 
199  void set_max_tls_ver(tls_ver ver);
200 
202  std::string get_alpn() const;
203 
205  native_string get_hostname() const;
206 
207  bool is_server() const;
208 
217  int new_session_ticket();
218 
232  void set_unexpected_eof_cb(std::function<bool()> const& cb);
233  void set_unexpected_eof_cb(std::function<bool()> && cb);
234 
235  virtual socket_state get_state() const override;
236 
237  virtual int connect(native_string const& host, unsigned int port, address_type family = address_type::unknown) override;
238 
239  virtual int read(void *buffer, unsigned int size, int& error) override;
240  virtual int write(void const* buffer, unsigned int size, int& error) override;
241 
242  virtual int shutdown() override;
243 
244  virtual int shutdown_read() override;
245 
246  virtual void set_event_handler(event_handler* pEvtHandler, fz::socket_event_flag retrigger_block = socket_event_flag{}) override;
247 
248 private:
249  virtual void FZ_PRIVATE_SYMBOL operator()(event_base const& ev) override;
250 
251  friend class tls_layer_impl;
252  std::unique_ptr<tls_layer_impl> impl_;
253 };
254 }
255 
256 #endif
Data has become available.
tls_server_flags
Definition: tls_layer.hpp:34
A Transport Layer Security (TLS) layer.
Definition: tls_layer.hpp:62
Interface for sockets.
Definition: socket.hpp:358
Simple handler for asynchronous event processing.
Definition: event_handler.hpp:54
This is the recommended event class.
Definition: event.hpp:67
Opaque class to load the system trust store asynchronously.
Definition: tls_system_trust_store.hpp:29
simple_event< certificate_verification_event_type, tls_layer *, tls_session_info > certificate_verification_event
This event gets sent during the handshake with details about the session and the used certificate...
Definition: tls_layer.hpp:18
Socket classes for networking.
A threaded event loop that supports sending events and timers.
Definition: event_loop.hpp:33
A base class for socket layers.
Definition: socket.hpp:637
std::wstring native_string
A string in the system's native character type and encoding. Note: This typedef changes depending on...
Definition: string.hpp:33
socket_state
State transitions are monotonically increasing.
Definition: socket.hpp:326
The namespace used by libfilezilla.
Definition: apply.hpp:17
In TLS 1.3, do not automatically send PSKs after finishing handshake. Ignored if not TLS 1...
data can be written.
The buffer class is a simple buffer where data can be appended at the end and consumed at the front...
Definition: buffer.hpp:26
Abstract interface for logging strings.
Definition: logger.hpp:50
Common base class for all events.
Definition: event.hpp:22
socket_event_flag
The type of a socket event.
Definition: socket.hpp:34