Mercurial > code
annotate C++/SocketSsl.h @ 297:836903141476
Socket: provide experimental SSL support
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 15 Nov 2014 12:41:52 +0100 |
parents | |
children | c9356cb38c86 |
rev | line source |
---|---|
297
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * SocketSsl.h -- OpenSSL extension for sockets |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2013, David Demelier <markand@malikania.fr> |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #ifndef _SOCKET_SSL_H_ |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #define _SOCKET_SSL_H_ |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <openssl/err.h> |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include <openssl/evp.h> |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #include <openssl/ssl.h> |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #include "Socket.h" |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 struct SocketSslOptions { |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 enum { |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 SSLv3 = (1 << 0), |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 TLSv1 = (1 << 1), |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 All = (0xf) |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 }; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 unsigned short method{All}; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 std::string certificate; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 std::string privateKey; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 bool verify{false}; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 SocketSslOptions() = default; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 SocketSslOptions(unsigned short method, std::string certificate, std::string key, bool verify = false) |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 : method(method) |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 , certificate(std::move(certificate)) |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 , privateKey(std::move(key)) |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 , verify(verify) |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 { |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 } |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 }; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 class SocketSslInterface : public SocketStandard { |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 private: |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 using Ssl = std::shared_ptr<SSL>; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 using SslContext = std::shared_ptr<SSL_CTX>; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 SslContext m_context; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 Ssl m_ssl; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 SocketSslOptions m_options; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 public: |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 SocketSslInterface(SSL_CTX *context, SSL *ssl, SocketSslOptions options = {}); |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 SocketSslInterface(SocketSslOptions options = {}); |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 void connect(Socket &s, const SocketAddress &address) override; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 void tryConnect(Socket &s, const SocketAddress &address, int timeout) override; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 Socket accept(Socket &s, SocketAddress &info) override; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 unsigned recv(Socket &s, void *data, unsigned len) override; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 unsigned recvfrom(Socket &s, void *data, unsigned len, SocketAddress &info) override; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 unsigned tryRecv(Socket &s, void *data, unsigned len, int timeout) override; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 unsigned tryRecvfrom(Socket &s, void *data, unsigned len, SocketAddress &info, int timeout) override; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 unsigned send(Socket &s, const void *data, unsigned len) override; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 unsigned sendto(Socket &s, const void *data, unsigned len, const SocketAddress &info) override; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 unsigned trySend(Socket &s, const void *data, unsigned len, int timeout) override; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 unsigned trySendto(Socket &s, const void *data, unsigned len, const SocketAddress &info, int timeout) override; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 }; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 /** |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 * @class SocketSsl |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 * @brief SSL interface for sockets |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 * |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 * This class derives from Socket and provide SSL support through OpenSSL. |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 * |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 * It is perfectly safe to cast SocketSsl to Socket and vice-versa. |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 */ |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 class SocketSsl : public Socket { |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 private: |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 using Socket::Socket; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 public: |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 /** |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 * Initialize SSL library. |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 */ |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 static void init(); |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 /** |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 * Close SSL library. |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 */ |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 static void finish(); |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 /** |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 * Open a SSL socket with the specified family. Automatically |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 * use SOCK_STREAM as the type. |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 * |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 * @param family the family |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 * @param options the options |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 */ |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 SocketSsl(int family, SocketSslOptions options = {}); |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 }; |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 |
836903141476
Socket: provide experimental SSL support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 #endif // !_SOCKET_SSL_H_ |