1*663afb9bSAndroid Build Coastguard Worker /* 2*663afb9bSAndroid Build Coastguard Worker * Copyright (c) 2009-2012 Niels Provos and Nick Mathewson 3*663afb9bSAndroid Build Coastguard Worker * 4*663afb9bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 5*663afb9bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 6*663afb9bSAndroid Build Coastguard Worker * are met: 7*663afb9bSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 8*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 9*663afb9bSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 10*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 11*663afb9bSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 12*663afb9bSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products 13*663afb9bSAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 14*663afb9bSAndroid Build Coastguard Worker * 15*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16*663afb9bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17*663afb9bSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18*663afb9bSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19*663afb9bSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20*663afb9bSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21*663afb9bSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22*663afb9bSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23*663afb9bSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25*663afb9bSAndroid Build Coastguard Worker */ 26*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT2_BUFFEREVENT_SSL_H_INCLUDED_ 27*663afb9bSAndroid Build Coastguard Worker #define EVENT2_BUFFEREVENT_SSL_H_INCLUDED_ 28*663afb9bSAndroid Build Coastguard Worker 29*663afb9bSAndroid Build Coastguard Worker /** @file event2/bufferevent_ssl.h 30*663afb9bSAndroid Build Coastguard Worker 31*663afb9bSAndroid Build Coastguard Worker OpenSSL support for bufferevents. 32*663afb9bSAndroid Build Coastguard Worker */ 33*663afb9bSAndroid Build Coastguard Worker #include <event2/visibility.h> 34*663afb9bSAndroid Build Coastguard Worker #include <event2/event-config.h> 35*663afb9bSAndroid Build Coastguard Worker #include <event2/bufferevent.h> 36*663afb9bSAndroid Build Coastguard Worker #include <event2/util.h> 37*663afb9bSAndroid Build Coastguard Worker 38*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus 39*663afb9bSAndroid Build Coastguard Worker extern "C" { 40*663afb9bSAndroid Build Coastguard Worker #endif 41*663afb9bSAndroid Build Coastguard Worker 42*663afb9bSAndroid Build Coastguard Worker /* This is what openssl's SSL objects are underneath. */ 43*663afb9bSAndroid Build Coastguard Worker struct ssl_st; 44*663afb9bSAndroid Build Coastguard Worker 45*663afb9bSAndroid Build Coastguard Worker /** 46*663afb9bSAndroid Build Coastguard Worker The state of an SSL object to be used when creating a new 47*663afb9bSAndroid Build Coastguard Worker SSL bufferevent. 48*663afb9bSAndroid Build Coastguard Worker */ 49*663afb9bSAndroid Build Coastguard Worker enum bufferevent_ssl_state { 50*663afb9bSAndroid Build Coastguard Worker BUFFEREVENT_SSL_OPEN = 0, 51*663afb9bSAndroid Build Coastguard Worker BUFFEREVENT_SSL_CONNECTING = 1, 52*663afb9bSAndroid Build Coastguard Worker BUFFEREVENT_SSL_ACCEPTING = 2 53*663afb9bSAndroid Build Coastguard Worker }; 54*663afb9bSAndroid Build Coastguard Worker 55*663afb9bSAndroid Build Coastguard Worker #if defined(EVENT__HAVE_OPENSSL) || defined(EVENT_IN_DOXYGEN_) 56*663afb9bSAndroid Build Coastguard Worker /** 57*663afb9bSAndroid Build Coastguard Worker Create a new SSL bufferevent to send its data over another bufferevent. 58*663afb9bSAndroid Build Coastguard Worker 59*663afb9bSAndroid Build Coastguard Worker @param base An event_base to use to detect reading and writing. It 60*663afb9bSAndroid Build Coastguard Worker must also be the base for the underlying bufferevent. 61*663afb9bSAndroid Build Coastguard Worker @param underlying A socket to use for this SSL 62*663afb9bSAndroid Build Coastguard Worker @param ssl A SSL* object from openssl. 63*663afb9bSAndroid Build Coastguard Worker @param state The current state of the SSL connection 64*663afb9bSAndroid Build Coastguard Worker @param options One or more bufferevent_options 65*663afb9bSAndroid Build Coastguard Worker @return A new bufferevent on success, or NULL on failure 66*663afb9bSAndroid Build Coastguard Worker */ 67*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 68*663afb9bSAndroid Build Coastguard Worker struct bufferevent * 69*663afb9bSAndroid Build Coastguard Worker bufferevent_openssl_filter_new(struct event_base *base, 70*663afb9bSAndroid Build Coastguard Worker struct bufferevent *underlying, 71*663afb9bSAndroid Build Coastguard Worker struct ssl_st *ssl, 72*663afb9bSAndroid Build Coastguard Worker enum bufferevent_ssl_state state, 73*663afb9bSAndroid Build Coastguard Worker int options); 74*663afb9bSAndroid Build Coastguard Worker 75*663afb9bSAndroid Build Coastguard Worker /** 76*663afb9bSAndroid Build Coastguard Worker Create a new SSL bufferevent to send its data over an SSL * on a socket. 77*663afb9bSAndroid Build Coastguard Worker 78*663afb9bSAndroid Build Coastguard Worker @param base An event_base to use to detect reading and writing 79*663afb9bSAndroid Build Coastguard Worker @param fd A socket to use for this SSL 80*663afb9bSAndroid Build Coastguard Worker @param ssl A SSL* object from openssl. 81*663afb9bSAndroid Build Coastguard Worker @param state The current state of the SSL connection 82*663afb9bSAndroid Build Coastguard Worker @param options One or more bufferevent_options 83*663afb9bSAndroid Build Coastguard Worker @return A new bufferevent on success, or NULL on failure. 84*663afb9bSAndroid Build Coastguard Worker */ 85*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 86*663afb9bSAndroid Build Coastguard Worker struct bufferevent * 87*663afb9bSAndroid Build Coastguard Worker bufferevent_openssl_socket_new(struct event_base *base, 88*663afb9bSAndroid Build Coastguard Worker evutil_socket_t fd, 89*663afb9bSAndroid Build Coastguard Worker struct ssl_st *ssl, 90*663afb9bSAndroid Build Coastguard Worker enum bufferevent_ssl_state state, 91*663afb9bSAndroid Build Coastguard Worker int options); 92*663afb9bSAndroid Build Coastguard Worker 93*663afb9bSAndroid Build Coastguard Worker /** Control how to report dirty SSL shutdowns. 94*663afb9bSAndroid Build Coastguard Worker 95*663afb9bSAndroid Build Coastguard Worker If the peer (or the network, or an attacker) closes the TCP 96*663afb9bSAndroid Build Coastguard Worker connection before closing the SSL channel, and the protocol is SSL >= v3, 97*663afb9bSAndroid Build Coastguard Worker this is a "dirty" shutdown. If allow_dirty_shutdown is 0 (default), 98*663afb9bSAndroid Build Coastguard Worker this is reported as BEV_EVENT_ERROR. 99*663afb9bSAndroid Build Coastguard Worker 100*663afb9bSAndroid Build Coastguard Worker If instead allow_dirty_shutdown=1, a dirty shutdown is reported as 101*663afb9bSAndroid Build Coastguard Worker BEV_EVENT_EOF. 102*663afb9bSAndroid Build Coastguard Worker 103*663afb9bSAndroid Build Coastguard Worker (Note that if the protocol is < SSLv3, you will always receive 104*663afb9bSAndroid Build Coastguard Worker BEV_EVENT_EOF, since SSL 2 and earlier cannot distinguish a secure 105*663afb9bSAndroid Build Coastguard Worker connection close from a dirty one. This is one reason (among many) 106*663afb9bSAndroid Build Coastguard Worker not to use SSL 2.) 107*663afb9bSAndroid Build Coastguard Worker */ 108*663afb9bSAndroid Build Coastguard Worker 109*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 110*663afb9bSAndroid Build Coastguard Worker int bufferevent_openssl_get_allow_dirty_shutdown(struct bufferevent *bev); 111*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 112*663afb9bSAndroid Build Coastguard Worker void bufferevent_openssl_set_allow_dirty_shutdown(struct bufferevent *bev, 113*663afb9bSAndroid Build Coastguard Worker int allow_dirty_shutdown); 114*663afb9bSAndroid Build Coastguard Worker 115*663afb9bSAndroid Build Coastguard Worker /** Return the underlying openssl SSL * object for an SSL bufferevent. */ 116*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 117*663afb9bSAndroid Build Coastguard Worker struct ssl_st * 118*663afb9bSAndroid Build Coastguard Worker bufferevent_openssl_get_ssl(struct bufferevent *bufev); 119*663afb9bSAndroid Build Coastguard Worker 120*663afb9bSAndroid Build Coastguard Worker /** Tells a bufferevent to begin SSL renegotiation. */ 121*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 122*663afb9bSAndroid Build Coastguard Worker int bufferevent_ssl_renegotiate(struct bufferevent *bev); 123*663afb9bSAndroid Build Coastguard Worker 124*663afb9bSAndroid Build Coastguard Worker /** Return the most recent OpenSSL error reported on an SSL bufferevent. */ 125*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 126*663afb9bSAndroid Build Coastguard Worker unsigned long bufferevent_get_openssl_error(struct bufferevent *bev); 127*663afb9bSAndroid Build Coastguard Worker 128*663afb9bSAndroid Build Coastguard Worker #endif 129*663afb9bSAndroid Build Coastguard Worker 130*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus 131*663afb9bSAndroid Build Coastguard Worker } 132*663afb9bSAndroid Build Coastguard Worker #endif 133*663afb9bSAndroid Build Coastguard Worker 134*663afb9bSAndroid Build Coastguard Worker #endif /* EVENT2_BUFFEREVENT_SSL_H_INCLUDED_ */ 135