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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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_