NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
ssl_stream.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NETWORK_SSL_SSL_STREAM_HPP__
2#define NEFORCE_NETWORK_SSL_SSL_STREAM_HPP__
3
11
13NEFORCE_BEGIN_NAMESPACE__
14
19
24
40class NEFORCE_API ssl_stream {
41public:
46#ifdef NEFORCE_PLATFORM_WINDOWS
48#else
49 int;
50#endif
51
52private:
53 struct ssl_deleter {
54 void operator()(::SSL* ssl) const noexcept {
55 if (ssl) {
56 ::SSL_shutdown(ssl);
57 ::SSL_free(ssl);
58 }
59 }
60 };
61
62 struct x509_deleter {
63 void operator()(::X509* cert) const noexcept {
64 if (cert) {
65 ::X509_free(cert);
66 }
67 }
68 };
69 using x509_ptr = unique_ptr<::X509, x509_deleter>;
70
71 unique_ptr<::SSL, ssl_deleter> ssl_;
72 string last_error_;
73
74 void handle_ssl_error(int ret, const char* operation);
75
76public:
82 ssl_stream() = default;
83
89 explicit ssl_stream(const ssl_context& ctx) { reset(ctx); }
90
91 ssl_stream(ssl_stream&& other) noexcept = default;
92 ssl_stream& operator=(ssl_stream&& other) noexcept = default;
93
102 void reset(const ssl_context& ctx);
103
114
122 void accept();
123
132 bool connect();
133
140 void close();
141
151 ssize_t read(void* buffer, size_t size);
152
162 ssize_t write(const void* buffer, size_t size);
163
173 vector<char> read_all(size_t max_size = 8192);
174
184 bool write_all(const void* data, size_t size);
185
192 NEFORCE_NODISCARD int pending() const;
193
203 void set_sni_hostname(const string& hostname);
204
211 NEFORCE_NODISCARD x509_ptr get_peer_certificate() const;
212
220 NEFORCE_NODISCARD bool verify_peer() const;
221
228 NEFORCE_NODISCARD string get_cipher_name() const;
229
234 NEFORCE_NODISCARD string get_version() const;
235
240 NEFORCE_NODISCARD const string& last_error() const { return last_error_; }
241
246 NEFORCE_NODISCARD bool is_valid() const noexcept { return ssl_ != nullptr; }
247
252 explicit operator bool() const noexcept { return is_valid(); }
253
258 NEFORCE_NODISCARD ::SSL* native_handle() const noexcept { return ssl_.get(); }
259
266 NEFORCE_NODISCARD ::SSL* release() noexcept { return ssl_.release(); }
267};
268 // SSL/TLS
270 // Network
272
273NEFORCE_END_NAMESPACE__
274#endif // NEFORCE_NETWORK_SSL_SSL_STREAM_HPP__
SSL/TLS上下文管理类
SSL/TLS流封装类
ssl_stream(const ssl_context &ctx)
从SSL上下文构造
NEFORCE_NODISCARD const string & last_error() const
获取最后错误信息
void set_sni_hostname(const string &hostname)
设置SNI主机名(客户端)
NEFORCE_NODISCARD bool is_valid() const noexcept
检查SSL对象是否有效
bool connect()
执行客户端TLS握手
NEFORCE_NODISCARD bool verify_peer() const
验证对等方证书
ssize_t read(void *buffer, size_t size)
读取加密数据
bool write_all(const void *data, size_t size)
写入所有数据
NEFORCE_NODISCARD x509_ptr get_peer_certificate() const
获取对等方证书
void close()
关闭SSL连接
void accept()
执行服务器端TLS握手
NEFORCE_NODISCARD int pending() const
获取缓冲区中可读字节数
void set_fd(native_handle_type fd)
设置底层socket文件描述符
NEFORCE_NODISCARD::SSL * release() noexcept
释放SSL对象所有权
NEFORCE_NODISCARD string get_version() const
获取TLS协议版本
ssl_stream()=default
默认构造函数
void reset(const ssl_context &ctx)
重置SSL流
NEFORCE_NODISCARD string get_cipher_name() const
获取密码套件名称
NEFORCE_NODISCARD::SSL * native_handle() const noexcept
获取原生SSL对象指针
vector< char > read_all(size_t max_size=8192)
读取所有可用数据
ssize_t write(const void *buffer, size_t size)
写入加密数据
int native_handle_type
原生文件描述符类型
动态大小数组容器
int64_t ssize_t
有符号大小类型
uint64_t uintptr_t
可容纳指针的无符号整数类型
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
SSL/TLS上下文管理