1 /*
2  * Copyright (c) 2009-2011 Niels Provos and Nick Mathewson
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *   notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *   notice, this list of conditions and the following disclaimer in the
11  *   documentation and/or other materials provided with the distribution.
12  * 3. The name of the author may not be used to endorse or promote products
13  *   derived from this software without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 /** @file event2/bufferevent_ssl.h
28 
29     OpenSSL support for bufferevents.
30  */
31 module deimos.event2.bufferevent_ssl;
32 
33 public import deimos.event2.bufferevent;
34 public import deimos.event2.util;
35 import deimos.event2._d_util;
36 
37 extern (C):
38 nothrow:
39 
40 /* This is what openssl's SSL objects are underneath. */
41 struct ssl_st {}
42 
43 /**
44    The state of an SSL object to be used when creating a new
45    SSL bufferevent.
46  */
47 enum bufferevent_ssl_state {
48 	BUFFEREVENT_SSL_OPEN = 0,
49 	BUFFEREVENT_SSL_CONNECTING = 1,
50 	BUFFEREVENT_SSL_ACCEPTING = 2
51 };
52 
53 //#if defined(_EVENT_HAVE_OPENSSL) || defined(_EVENT_IN_DOXYGEN)
54 /**
55    Create a new SSL bufferevent to send its data over another bufferevent.
56 
57    @param base An event_base to use to detect reading and writing.  It
58       must also be the base for the underlying bufferevent.
59    @param underlying A socket to use for this SSL
60    @param ssl A SSL* object from openssl.
61    @param state The current state of the SSL connection
62    @param options One or more bufferevent_options
63    @return A new bufferevent on success, or NULL on failure
64 */
65 bufferevent* 
66 bufferevent_openssl_filter_new(event_base* base,
67     bufferevent* underlying,
68     ssl_st* ssl,
69     bufferevent_ssl_state state,
70     int options);
71 
72 /**
73    Create a new SSL bufferevent to send its data over an SSL * on a socket.
74 
75    @param base An event_base to use to detect reading and writing
76    @param fd A socket to use for this SSL
77    @param ssl A SSL* object from openssl.
78    @param state The current state of the SSL connection
79    @param options One or more bufferevent_options
80    @return A new bufferevent on success, or NULL on failure.
81 */
82 bufferevent* 
83 bufferevent_openssl_socket_new(event_base* base,
84     evutil_socket_t fd,
85     ssl_st* ssl,
86     bufferevent_ssl_state state,
87     int options);
88 
89 /** Return the underlying openssl SSL * object for an SSL bufferevent. */
90 ssl_st* 
91 bufferevent_openssl_get_ssl(bufferevent* bufev);
92 
93 /** Tells a bufferevent to begin SSL renegotiation. */
94 int bufferevent_ssl_renegotiate(bufferevent* bev);
95 
96 /** Return the most recent OpenSSL error reported on an SSL bufferevent. */
97 c_ulong bufferevent_get_openssl_error(bufferevent* bev);
98 
99 //#endif