1 /* 2 This file is part of libmicrospdy 3 Copyright Copyright (C) 2012 Andrey Uzunov 4 5 This program is free software: you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation, either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 /** 20 * @file io_openssl.h 21 * @brief TLS handling. openssl with NPN is used, but as long as the 22 * functions conform to this interface file, other libraries 23 * can be used. 24 * @author Andrey Uzunov 25 */ 26 27 #ifndef IO_OPENSSL_H 28 #define IO_OPENSSL_H 29 30 #include "platform.h" 31 #include "io.h" 32 #include <openssl/err.h> 33 #include <openssl/ssl.h> 34 #include <openssl/rand.h> 35 36 37 /** 38 * Global initializing of openssl. Must be called only once in the program. 39 * 40 */ 41 void 42 SPDYF_openssl_global_init(); 43 44 45 /** 46 * Global deinitializing of openssl for the whole program. Should be called 47 * at the end of the program. 48 * 49 */ 50 void 51 SPDYF_openssl_global_deinit(); 52 53 54 /** 55 * Initializing of openssl for a specific daemon. 56 * Must be called when the daemon starts. 57 * 58 * @param daemon SPDY_Daemon for which openssl will be used. Daemon's 59 * certificate and key file are used. 60 * @return SPDY_YES on success or SPDY_NO on error 61 */ 62 int 63 SPDYF_openssl_init(struct SPDY_Daemon *daemon); 64 65 66 /** 67 * Deinitializing openssl for a daemon. Should be called 68 * when the deamon is stopped. 69 * 70 * @param daemon SPDY_Daemon which is being stopped 71 */ 72 void 73 SPDYF_openssl_deinit(struct SPDY_Daemon *daemon); 74 75 76 /** 77 * Initializing openssl for a specific connection. Must be called 78 * after the connection has been accepted. 79 * 80 * @param session SPDY_Session whose socket will be used by openssl 81 * @return SPDY_NO if some openssl funcs fail. SPDY_YES otherwise 82 */ 83 int 84 SPDYF_openssl_new_session(struct SPDY_Session *session); 85 86 87 /** 88 * Deinitializing openssl for a specific connection. Should be called 89 * closing session's socket. 90 * 91 * @param session SPDY_Session whose socket is used by openssl 92 */ 93 void 94 SPDYF_openssl_close_session(struct SPDY_Session *session); 95 96 97 /** 98 * Reading from a TLS socket. Reads available data and put it to the 99 * buffer. 100 * 101 * @param session for which data is received 102 * @param buffer where data from the socket will be written to 103 * @param size of the buffer 104 * @return number of bytes (at most size) read from the TLS connection 105 * 0 if the other party has closed the connection 106 * SPDY_IO_ERROR code on error 107 */ 108 int 109 SPDYF_openssl_recv(struct SPDY_Session *session, 110 void * buffer, 111 size_t size); 112 113 114 /** 115 * Writing to a TLS socket. Writes the data given into the buffer to the 116 * TLS socket. 117 * 118 * @param session whose context is used 119 * @param buffer from where data will be written to the socket 120 * @param size number of bytes to be taken from the buffer 121 * @return number of bytes (at most size) from the buffer that has been 122 * written to the TLS connection 123 * 0 if the other party has closed the connection 124 * SPDY_IO_ERROR code on error 125 */ 126 int 127 SPDYF_openssl_send(struct SPDY_Session *session, 128 const void * buffer, 129 size_t size); 130 131 132 /** 133 * Checks if there is data staying in the buffers of the underlying 134 * system that waits to be read. 135 * 136 * @param session which is checked 137 * @return SPDY_YES if data is pending or SPDY_NO otherwise 138 */ 139 int 140 SPDYF_openssl_is_pending(struct SPDY_Session *session); 141 142 143 /** 144 * Nothing. 145 * 146 * @param session 147 * @return SPDY_NO if writing must not happen in the call; 148 * SPDY_YES otherwise 149 */ 150 int 151 SPDYF_openssl_before_write(struct SPDY_Session *session); 152 153 154 /** 155 * Nothing. 156 * 157 * @param session 158 * @param was_written has the same value as the write function for the 159 * session will return 160 * @return returned value will be used by the write function to return 161 */ 162 int 163 SPDYF_openssl_after_write(struct SPDY_Session *session, int was_written); 164 165 166 #endif 167