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
35class NEFORCE_API ssl_stream {
36public:
41#ifdef NEFORCE_PLATFORM_WINDOWS
43#else
44 int;
45#endif
46
47private:
48 struct ssl_deleter {
49 void operator()(::SSL* ssl) const noexcept {
50 if (ssl != nullptr) {
51 ::SSL_free(ssl);
52 }
53 }
54 };
55
56 struct x509_deleter {
57 void operator()(::X509* cert) const noexcept {
58 if (cert != nullptr) {
59 ::X509_free(cert);
60 }
61 }
62 };
63 using x509_ptr = unique_ptr<::X509, x509_deleter>;
64
65 unique_ptr<::SSL, ssl_deleter> ssl_;
66 string last_error_;
67
68 void handle_ssl_error(int ret, const char* operation);
69
70public:
76 ssl_stream() = default;
77
83 explicit ssl_stream(const ssl_context& ctx) { reset(ctx); }
84
85 ssl_stream(ssl_stream&& other) noexcept = default;
86 ssl_stream& operator=(ssl_stream&& other) noexcept = default;
87
96 void reset(const ssl_context& ctx);
97
108
116 void accept();
117
126 bool connect();
127
134 void close() noexcept;
135
145 ssize_t read(void* buffer, size_t size);
146
156 ssize_t write(const void* buffer, size_t size);
157
167 vector<char> read_all(size_t max_size = 8192);
168
178 bool write_all(const void* data, size_t size);
179
186 NEFORCE_NODISCARD int pending() const;
187
197 void set_sni_hostname(const string& hostname);
198
205 NEFORCE_NODISCARD x509_ptr get_peer_certificate() const;
206
214 NEFORCE_NODISCARD bool verify_peer() const;
215
222 NEFORCE_NODISCARD string get_cipher_name() const;
223
228 NEFORCE_NODISCARD string get_version() const;
229
234 NEFORCE_NODISCARD const string& last_error() const { return last_error_; }
235
240 NEFORCE_NODISCARD bool is_valid() const noexcept { return ssl_ != nullptr; }
241
246 explicit operator bool() const noexcept { return is_valid(); }
247
252 NEFORCE_NODISCARD ::SSL* native_handle() const noexcept { return ssl_.get(); }
253
260 NEFORCE_NODISCARD ::SSL* release() noexcept { return ssl_.release(); }
261};
262 // SSL/TLS
264
265NEFORCE_END_NAMESPACE__
266#endif // NEFORCE_NETWORK_SSL_SSL_STREAM_HPP__
SSL/TLS上下文管理类
SSL/TLS流封装类
ssl_stream(const ssl_context &ctx)
从SSL上下文构造
void set_sni_hostname(const string &hostname)
设置SNI主机名(客户端)
bool connect()
执行客户端TLS握手
int pending() const
获取缓冲区中可读字节数
::SSL * release() noexcept
释放SSL对象所有权
ssize_t read(void *buffer, size_t size)
读取加密数据
bool write_all(const void *data, size_t size)
写入所有数据
bool is_valid() const noexcept
检查SSL对象是否有效
string get_version() const
获取TLS协议版本
string get_cipher_name() const
获取密码套件名称
void accept()
执行服务器端TLS握手
void close() noexcept
关闭SSL连接
void set_fd(native_handle_type fd)
设置底层socket文件描述符
bool verify_peer() const
验证对等方证书
ssl_stream()=default
默认构造函数
x509_ptr get_peer_certificate() const
获取对等方证书
void reset(const ssl_context &ctx)
重置SSL流
const string & last_error() const
获取最后错误信息
vector< char > read_all(size_t max_size=8192)
读取所有可用数据
uintptr_t native_handle_type
原生文件描述符类型
ssize_t write(const void *buffer, size_t size)
写入加密数据
::SSL * native_handle() const noexcept
获取原生SSL对象指针
动态大小数组容器
int64_t ssize_t
有符号大小类型
uint64_t uintptr_t
可容纳指针的无符号整数类型
constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
SSL/TLS上下文管理