dc910b1aaa587e5e7944b22ab5eef2e45c9bc7ac
[ircu2.10.12-pk.git] / include / ssl.h
1 /** @file ssl.h
2  * @brief Declarations for ssl handler.
3  * @version $Id$
4  */
5 #ifndef INCLUDED_ssl_h
6 #define INCLUDED_ssl_h
7 #include "ircd_osdep.h"
8
9 enum SSLFlag {
10   SSLFLAG_INCOMING,
11   SSLFLAG_OUTGOING,
12   SSLFLAG_READY,
13   SSLFLAG_HANDSHAKE,
14   SSLFLAG_HANDSHAKE_R,
15   SSLFLAG_HANDSHAKE_W,
16
17   SSLFLAG_LAST
18 };
19
20 /** Declare flagset type for ssl flags. */
21 DECLARE_FLAGSET(SSLFlags, SSLFLAG_LAST);
22
23 enum SSLDataType {
24   SSLData_Client
25 };
26
27 #if defined(HAVE_GNUTLS_GNUTLS_H)
28 #include <gnutls/gnutls.h>
29
30 struct SSLConnection {
31   struct SSLFlags flags;
32   gnutls_session_t session;
33   gnutls_certificate_client_credentials credentials;
34 };
35
36 struct SSLListener {
37   struct SSLFlags flags;
38   gnutls_priority_t priority;
39   gnutls_certificate_credentials_t credentials;
40 };
41
42 #elif defined(HAVE_OPENSSL_SSL_H)
43 #include <openssl/rand.h>
44 #include <openssl/ssl.h>
45 #include <openssl/err.h>
46
47 struct SSLConnection {
48   struct SSLFlags flags;
49   SSL *session;
50 };
51
52 struct SSLOutConnection {
53   struct SSLFlags flags;
54   SSL *session;
55   SSL_CTX *context;
56 };
57
58 struct SSLListener {
59   struct SSLFlags flags;
60   
61   SSL *listener;
62   SSL_CTX *context;
63 };
64
65 #else
66
67 struct SSLConnection {
68   struct SSLFlags flags;
69   //just unused
70 };
71
72 struct SSLListener {
73   struct SSLFlags flags;
74   //just unused
75 };
76 #endif
77
78 #define ssl_handshake(x)   (FlagHas(&(x)->flags, SSLFLAG_HANDSHAKE))
79 #define ssl_wantwrite(x)   (FlagHas(&(x)->flags, SSLFLAG_HANDSHAKE_W))
80 #define ssl_wantread(x)   (FlagHas(&(x)->flags, SSLFLAG_HANDSHAKE_R))
81
82
83 extern void ssl_free_connection(struct SSLConnection *connection);
84 extern void ssl_free_listener(struct SSLListener *listener);
85
86 extern struct SSLListener *ssl_create_listener();
87 extern struct SSLConnection *ssl_create_connect(int fd, void *data, enum SSLDataType datatype);
88
89 extern struct SSLConnection *ssl_start_handshake_listener(struct SSLListener *listener, int fd, void *data, enum SSLDataType datatype);
90 extern void ssl_start_handshake_connect(struct SSLConnection *connection);
91
92 IOResult ssl_recv_decrypt(struct SSLConnection *connection, char *buf, unsigned int buflen, unsigned int *len);
93 IOResult ssl_send_encrypt(struct SSLConnection *connection, struct MsgQ* buf, unsigned int *count_in, unsigned int *count_out);
94 IOResult ssl_send_encrypt_plain(struct SSLConnection *connection, char *buf, int len);
95 extern int ssl_connection_flush(struct SSLConnection *connection);
96
97 #endif /* INCLUDED_parse_h */