bufferevent_openssl.c revision 1.1.1.1.4.2 1 1.1.1.1.4.2 yamt /* $NetBSD: bufferevent_openssl.c,v 1.1.1.1.4.2 2014/05/22 15:50:12 yamt Exp $ */
2 1.1.1.1.4.2 yamt
3 1.1.1.1.4.2 yamt /*
4 1.1.1.1.4.2 yamt * Copyright (c) 2009-2012 Niels Provos and Nick Mathewson
5 1.1.1.1.4.2 yamt *
6 1.1.1.1.4.2 yamt * Redistribution and use in source and binary forms, with or without
7 1.1.1.1.4.2 yamt * modification, are permitted provided that the following conditions
8 1.1.1.1.4.2 yamt * are met:
9 1.1.1.1.4.2 yamt * 1. Redistributions of source code must retain the above copyright
10 1.1.1.1.4.2 yamt * notice, this list of conditions and the following disclaimer.
11 1.1.1.1.4.2 yamt * 2. Redistributions in binary form must reproduce the above copyright
12 1.1.1.1.4.2 yamt * notice, this list of conditions and the following disclaimer in the
13 1.1.1.1.4.2 yamt * documentation and/or other materials provided with the distribution.
14 1.1.1.1.4.2 yamt * 3. The name of the author may not be used to endorse or promote products
15 1.1.1.1.4.2 yamt * derived from this software without specific prior written permission.
16 1.1.1.1.4.2 yamt *
17 1.1.1.1.4.2 yamt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 1.1.1.1.4.2 yamt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 1.1.1.1.4.2 yamt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 1.1.1.1.4.2 yamt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 1.1.1.1.4.2 yamt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 1.1.1.1.4.2 yamt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 1.1.1.1.4.2 yamt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 1.1.1.1.4.2 yamt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 1.1.1.1.4.2 yamt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 1.1.1.1.4.2 yamt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 1.1.1.1.4.2 yamt */
28 1.1.1.1.4.2 yamt
29 1.1.1.1.4.2 yamt #include "event2/event-config.h"
30 1.1.1.1.4.2 yamt #include "evconfig-private.h"
31 1.1.1.1.4.2 yamt
32 1.1.1.1.4.2 yamt #include <sys/types.h>
33 1.1.1.1.4.2 yamt
34 1.1.1.1.4.2 yamt #ifdef EVENT__HAVE_SYS_TIME_H
35 1.1.1.1.4.2 yamt #include <sys/time.h>
36 1.1.1.1.4.2 yamt #endif
37 1.1.1.1.4.2 yamt
38 1.1.1.1.4.2 yamt #include <errno.h>
39 1.1.1.1.4.2 yamt #include <stdio.h>
40 1.1.1.1.4.2 yamt #include <stdlib.h>
41 1.1.1.1.4.2 yamt #include <string.h>
42 1.1.1.1.4.2 yamt #ifdef EVENT__HAVE_STDARG_H
43 1.1.1.1.4.2 yamt #include <stdarg.h>
44 1.1.1.1.4.2 yamt #endif
45 1.1.1.1.4.2 yamt #ifdef EVENT__HAVE_UNISTD_H
46 1.1.1.1.4.2 yamt #include <unistd.h>
47 1.1.1.1.4.2 yamt #endif
48 1.1.1.1.4.2 yamt
49 1.1.1.1.4.2 yamt #ifdef _WIN32
50 1.1.1.1.4.2 yamt #include <winsock2.h>
51 1.1.1.1.4.2 yamt #endif
52 1.1.1.1.4.2 yamt
53 1.1.1.1.4.2 yamt #include "event2/bufferevent.h"
54 1.1.1.1.4.2 yamt #include "event2/bufferevent_struct.h"
55 1.1.1.1.4.2 yamt #include "event2/bufferevent_ssl.h"
56 1.1.1.1.4.2 yamt #include "event2/buffer.h"
57 1.1.1.1.4.2 yamt #include "event2/event.h"
58 1.1.1.1.4.2 yamt
59 1.1.1.1.4.2 yamt #include "mm-internal.h"
60 1.1.1.1.4.2 yamt #include "bufferevent-internal.h"
61 1.1.1.1.4.2 yamt #include "log-internal.h"
62 1.1.1.1.4.2 yamt
63 1.1.1.1.4.2 yamt #include <openssl/bio.h>
64 1.1.1.1.4.2 yamt #include <openssl/ssl.h>
65 1.1.1.1.4.2 yamt #include <openssl/err.h>
66 1.1.1.1.4.2 yamt
67 1.1.1.1.4.2 yamt /*
68 1.1.1.1.4.2 yamt * Define an OpenSSL bio that targets a bufferevent.
69 1.1.1.1.4.2 yamt */
70 1.1.1.1.4.2 yamt
71 1.1.1.1.4.2 yamt /* --------------------
72 1.1.1.1.4.2 yamt A BIO is an OpenSSL abstraction that handles reading and writing data. The
73 1.1.1.1.4.2 yamt library will happily speak SSL over anything that implements a BIO
74 1.1.1.1.4.2 yamt interface.
75 1.1.1.1.4.2 yamt
76 1.1.1.1.4.2 yamt Here we define a BIO implementation that directs its output to a
77 1.1.1.1.4.2 yamt bufferevent. We'll want to use this only when none of OpenSSL's built-in
78 1.1.1.1.4.2 yamt IO mechanisms work for us.
79 1.1.1.1.4.2 yamt -------------------- */
80 1.1.1.1.4.2 yamt
81 1.1.1.1.4.2 yamt /* every BIO type needs its own integer type value. */
82 1.1.1.1.4.2 yamt #define BIO_TYPE_LIBEVENT 57
83 1.1.1.1.4.2 yamt /* ???? Arguably, we should set BIO_TYPE_FILTER or BIO_TYPE_SOURCE_SINK on
84 1.1.1.1.4.2 yamt * this. */
85 1.1.1.1.4.2 yamt
86 1.1.1.1.4.2 yamt #if 0
87 1.1.1.1.4.2 yamt static void
88 1.1.1.1.4.2 yamt print_err(int val)
89 1.1.1.1.4.2 yamt {
90 1.1.1.1.4.2 yamt int err;
91 1.1.1.1.4.2 yamt printf("Error was %d\n", val);
92 1.1.1.1.4.2 yamt
93 1.1.1.1.4.2 yamt while ((err = ERR_get_error())) {
94 1.1.1.1.4.2 yamt const char *msg = (const char*)ERR_reason_error_string(err);
95 1.1.1.1.4.2 yamt const char *lib = (const char*)ERR_lib_error_string(err);
96 1.1.1.1.4.2 yamt const char *func = (const char*)ERR_func_error_string(err);
97 1.1.1.1.4.2 yamt
98 1.1.1.1.4.2 yamt printf("%s in %s %s\n", msg, lib, func);
99 1.1.1.1.4.2 yamt }
100 1.1.1.1.4.2 yamt }
101 1.1.1.1.4.2 yamt #else
102 1.1.1.1.4.2 yamt #define print_err(v) ((void)0)
103 1.1.1.1.4.2 yamt #endif
104 1.1.1.1.4.2 yamt
105 1.1.1.1.4.2 yamt /* Called to initialize a new BIO */
106 1.1.1.1.4.2 yamt static int
107 1.1.1.1.4.2 yamt bio_bufferevent_new(BIO *b)
108 1.1.1.1.4.2 yamt {
109 1.1.1.1.4.2 yamt b->init = 0;
110 1.1.1.1.4.2 yamt b->num = -1;
111 1.1.1.1.4.2 yamt b->ptr = NULL; /* We'll be putting the bufferevent in this field.*/
112 1.1.1.1.4.2 yamt b->flags = 0;
113 1.1.1.1.4.2 yamt return 1;
114 1.1.1.1.4.2 yamt }
115 1.1.1.1.4.2 yamt
116 1.1.1.1.4.2 yamt /* Called to uninitialize the BIO. */
117 1.1.1.1.4.2 yamt static int
118 1.1.1.1.4.2 yamt bio_bufferevent_free(BIO *b)
119 1.1.1.1.4.2 yamt {
120 1.1.1.1.4.2 yamt if (!b)
121 1.1.1.1.4.2 yamt return 0;
122 1.1.1.1.4.2 yamt if (b->shutdown) {
123 1.1.1.1.4.2 yamt if (b->init && b->ptr)
124 1.1.1.1.4.2 yamt bufferevent_free(b->ptr);
125 1.1.1.1.4.2 yamt b->init = 0;
126 1.1.1.1.4.2 yamt b->flags = 0;
127 1.1.1.1.4.2 yamt b->ptr = NULL;
128 1.1.1.1.4.2 yamt }
129 1.1.1.1.4.2 yamt return 1;
130 1.1.1.1.4.2 yamt }
131 1.1.1.1.4.2 yamt
132 1.1.1.1.4.2 yamt /* Called to extract data from the BIO. */
133 1.1.1.1.4.2 yamt static int
134 1.1.1.1.4.2 yamt bio_bufferevent_read(BIO *b, char *out, int outlen)
135 1.1.1.1.4.2 yamt {
136 1.1.1.1.4.2 yamt int r = 0;
137 1.1.1.1.4.2 yamt struct evbuffer *input;
138 1.1.1.1.4.2 yamt
139 1.1.1.1.4.2 yamt BIO_clear_retry_flags(b);
140 1.1.1.1.4.2 yamt
141 1.1.1.1.4.2 yamt if (!out)
142 1.1.1.1.4.2 yamt return 0;
143 1.1.1.1.4.2 yamt if (!b->ptr)
144 1.1.1.1.4.2 yamt return -1;
145 1.1.1.1.4.2 yamt
146 1.1.1.1.4.2 yamt input = bufferevent_get_input(b->ptr);
147 1.1.1.1.4.2 yamt if (evbuffer_get_length(input) == 0) {
148 1.1.1.1.4.2 yamt /* If there's no data to read, say so. */
149 1.1.1.1.4.2 yamt BIO_set_retry_read(b);
150 1.1.1.1.4.2 yamt return -1;
151 1.1.1.1.4.2 yamt } else {
152 1.1.1.1.4.2 yamt r = evbuffer_remove(input, out, outlen);
153 1.1.1.1.4.2 yamt }
154 1.1.1.1.4.2 yamt
155 1.1.1.1.4.2 yamt return r;
156 1.1.1.1.4.2 yamt }
157 1.1.1.1.4.2 yamt
158 1.1.1.1.4.2 yamt /* Called to write data info the BIO */
159 1.1.1.1.4.2 yamt static int
160 1.1.1.1.4.2 yamt bio_bufferevent_write(BIO *b, const char *in, int inlen)
161 1.1.1.1.4.2 yamt {
162 1.1.1.1.4.2 yamt struct bufferevent *bufev = b->ptr;
163 1.1.1.1.4.2 yamt struct evbuffer *output;
164 1.1.1.1.4.2 yamt size_t outlen;
165 1.1.1.1.4.2 yamt
166 1.1.1.1.4.2 yamt BIO_clear_retry_flags(b);
167 1.1.1.1.4.2 yamt
168 1.1.1.1.4.2 yamt if (!b->ptr)
169 1.1.1.1.4.2 yamt return -1;
170 1.1.1.1.4.2 yamt
171 1.1.1.1.4.2 yamt output = bufferevent_get_output(bufev);
172 1.1.1.1.4.2 yamt outlen = evbuffer_get_length(output);
173 1.1.1.1.4.2 yamt
174 1.1.1.1.4.2 yamt /* Copy only as much data onto the output buffer as can fit under the
175 1.1.1.1.4.2 yamt * high-water mark. */
176 1.1.1.1.4.2 yamt if (bufev->wm_write.high && bufev->wm_write.high <= (outlen+inlen)) {
177 1.1.1.1.4.2 yamt if (bufev->wm_write.high <= outlen) {
178 1.1.1.1.4.2 yamt /* If no data can fit, we'll need to retry later. */
179 1.1.1.1.4.2 yamt BIO_set_retry_write(b);
180 1.1.1.1.4.2 yamt return -1;
181 1.1.1.1.4.2 yamt }
182 1.1.1.1.4.2 yamt inlen = bufev->wm_write.high - outlen;
183 1.1.1.1.4.2 yamt }
184 1.1.1.1.4.2 yamt
185 1.1.1.1.4.2 yamt EVUTIL_ASSERT(inlen > 0);
186 1.1.1.1.4.2 yamt evbuffer_add(output, in, inlen);
187 1.1.1.1.4.2 yamt return inlen;
188 1.1.1.1.4.2 yamt }
189 1.1.1.1.4.2 yamt
190 1.1.1.1.4.2 yamt /* Called to handle various requests */
191 1.1.1.1.4.2 yamt static long
192 1.1.1.1.4.2 yamt bio_bufferevent_ctrl(BIO *b, int cmd, long num, void *ptr)
193 1.1.1.1.4.2 yamt {
194 1.1.1.1.4.2 yamt struct bufferevent *bufev = b->ptr;
195 1.1.1.1.4.2 yamt long ret = 1;
196 1.1.1.1.4.2 yamt
197 1.1.1.1.4.2 yamt switch (cmd) {
198 1.1.1.1.4.2 yamt case BIO_CTRL_GET_CLOSE:
199 1.1.1.1.4.2 yamt ret = b->shutdown;
200 1.1.1.1.4.2 yamt break;
201 1.1.1.1.4.2 yamt case BIO_CTRL_SET_CLOSE:
202 1.1.1.1.4.2 yamt b->shutdown = (int)num;
203 1.1.1.1.4.2 yamt break;
204 1.1.1.1.4.2 yamt case BIO_CTRL_PENDING:
205 1.1.1.1.4.2 yamt ret = evbuffer_get_length(bufferevent_get_input(bufev)) != 0;
206 1.1.1.1.4.2 yamt break;
207 1.1.1.1.4.2 yamt case BIO_CTRL_WPENDING:
208 1.1.1.1.4.2 yamt ret = evbuffer_get_length(bufferevent_get_output(bufev)) != 0;
209 1.1.1.1.4.2 yamt break;
210 1.1.1.1.4.2 yamt /* XXXX These two are given a special-case treatment because
211 1.1.1.1.4.2 yamt * of cargo-cultism. I should come up with a better reason. */
212 1.1.1.1.4.2 yamt case BIO_CTRL_DUP:
213 1.1.1.1.4.2 yamt case BIO_CTRL_FLUSH:
214 1.1.1.1.4.2 yamt ret = 1;
215 1.1.1.1.4.2 yamt break;
216 1.1.1.1.4.2 yamt default:
217 1.1.1.1.4.2 yamt ret = 0;
218 1.1.1.1.4.2 yamt break;
219 1.1.1.1.4.2 yamt }
220 1.1.1.1.4.2 yamt return ret;
221 1.1.1.1.4.2 yamt }
222 1.1.1.1.4.2 yamt
223 1.1.1.1.4.2 yamt /* Called to write a string to the BIO */
224 1.1.1.1.4.2 yamt static int
225 1.1.1.1.4.2 yamt bio_bufferevent_puts(BIO *b, const char *s)
226 1.1.1.1.4.2 yamt {
227 1.1.1.1.4.2 yamt return bio_bufferevent_write(b, s, strlen(s));
228 1.1.1.1.4.2 yamt }
229 1.1.1.1.4.2 yamt
230 1.1.1.1.4.2 yamt /* Method table for the bufferevent BIO */
231 1.1.1.1.4.2 yamt static BIO_METHOD methods_bufferevent = {
232 1.1.1.1.4.2 yamt BIO_TYPE_LIBEVENT, "bufferevent",
233 1.1.1.1.4.2 yamt bio_bufferevent_write,
234 1.1.1.1.4.2 yamt bio_bufferevent_read,
235 1.1.1.1.4.2 yamt bio_bufferevent_puts,
236 1.1.1.1.4.2 yamt NULL /* bio_bufferevent_gets */,
237 1.1.1.1.4.2 yamt bio_bufferevent_ctrl,
238 1.1.1.1.4.2 yamt bio_bufferevent_new,
239 1.1.1.1.4.2 yamt bio_bufferevent_free,
240 1.1.1.1.4.2 yamt NULL /* callback_ctrl */,
241 1.1.1.1.4.2 yamt };
242 1.1.1.1.4.2 yamt
243 1.1.1.1.4.2 yamt /* Return the method table for the bufferevents BIO */
244 1.1.1.1.4.2 yamt static BIO_METHOD *
245 1.1.1.1.4.2 yamt BIO_s_bufferevent(void)
246 1.1.1.1.4.2 yamt {
247 1.1.1.1.4.2 yamt return &methods_bufferevent;
248 1.1.1.1.4.2 yamt }
249 1.1.1.1.4.2 yamt
250 1.1.1.1.4.2 yamt /* Create a new BIO to wrap communication around a bufferevent. If close_flag
251 1.1.1.1.4.2 yamt * is true, the bufferevent will be freed when the BIO is closed. */
252 1.1.1.1.4.2 yamt static BIO *
253 1.1.1.1.4.2 yamt BIO_new_bufferevent(struct bufferevent *bufferevent, int close_flag)
254 1.1.1.1.4.2 yamt {
255 1.1.1.1.4.2 yamt BIO *result;
256 1.1.1.1.4.2 yamt if (!bufferevent)
257 1.1.1.1.4.2 yamt return NULL;
258 1.1.1.1.4.2 yamt if (!(result = BIO_new(BIO_s_bufferevent())))
259 1.1.1.1.4.2 yamt return NULL;
260 1.1.1.1.4.2 yamt result->init = 1;
261 1.1.1.1.4.2 yamt result->ptr = bufferevent;
262 1.1.1.1.4.2 yamt result->shutdown = close_flag ? 1 : 0;
263 1.1.1.1.4.2 yamt return result;
264 1.1.1.1.4.2 yamt }
265 1.1.1.1.4.2 yamt
266 1.1.1.1.4.2 yamt /* --------------------
267 1.1.1.1.4.2 yamt Now, here's the OpenSSL-based implementation of bufferevent.
268 1.1.1.1.4.2 yamt
269 1.1.1.1.4.2 yamt The implementation comes in two flavors: one that connects its SSL object
270 1.1.1.1.4.2 yamt to an underlying bufferevent using a BIO_bufferevent, and one that has the
271 1.1.1.1.4.2 yamt SSL object connect to a socket directly. The latter should generally be
272 1.1.1.1.4.2 yamt faster, except on Windows, where your best bet is using a
273 1.1.1.1.4.2 yamt bufferevent_async.
274 1.1.1.1.4.2 yamt
275 1.1.1.1.4.2 yamt (OpenSSL supports many other BIO types, too. But we can't use any unless
276 1.1.1.1.4.2 yamt we have a good way to get notified when they become readable/writable.)
277 1.1.1.1.4.2 yamt -------------------- */
278 1.1.1.1.4.2 yamt
279 1.1.1.1.4.2 yamt struct bio_data_counts {
280 1.1.1.1.4.2 yamt unsigned long n_written;
281 1.1.1.1.4.2 yamt unsigned long n_read;
282 1.1.1.1.4.2 yamt };
283 1.1.1.1.4.2 yamt
284 1.1.1.1.4.2 yamt struct bufferevent_openssl {
285 1.1.1.1.4.2 yamt /* Shared fields with common bufferevent implementation code.
286 1.1.1.1.4.2 yamt If we were set up with an underlying bufferevent, we use the
287 1.1.1.1.4.2 yamt events here as timers only. If we have an SSL, then we use
288 1.1.1.1.4.2 yamt the events as socket events.
289 1.1.1.1.4.2 yamt */
290 1.1.1.1.4.2 yamt struct bufferevent_private bev;
291 1.1.1.1.4.2 yamt /* An underlying bufferevent that we're directing our output to.
292 1.1.1.1.4.2 yamt If it's NULL, then we're connected to an fd, not an evbuffer. */
293 1.1.1.1.4.2 yamt struct bufferevent *underlying;
294 1.1.1.1.4.2 yamt /* The SSL object doing our encryption. */
295 1.1.1.1.4.2 yamt SSL *ssl;
296 1.1.1.1.4.2 yamt
297 1.1.1.1.4.2 yamt /* A callback that's invoked when data arrives on our outbuf so we
298 1.1.1.1.4.2 yamt know to write data to the SSL. */
299 1.1.1.1.4.2 yamt struct evbuffer_cb_entry *outbuf_cb;
300 1.1.1.1.4.2 yamt
301 1.1.1.1.4.2 yamt /* A count of how much data the bios have read/written total. Used
302 1.1.1.1.4.2 yamt for rate-limiting. */
303 1.1.1.1.4.2 yamt struct bio_data_counts counts;
304 1.1.1.1.4.2 yamt
305 1.1.1.1.4.2 yamt /* If this value is greater than 0, then the last SSL_write blocked,
306 1.1.1.1.4.2 yamt * and we need to try it again with this many bytes. */
307 1.1.1.1.4.2 yamt ev_ssize_t last_write;
308 1.1.1.1.4.2 yamt
309 1.1.1.1.4.2 yamt #define NUM_ERRORS 3
310 1.1.1.1.4.2 yamt ev_uint32_t errors[NUM_ERRORS];
311 1.1.1.1.4.2 yamt
312 1.1.1.1.4.2 yamt /* When we next get available space, we should say "read" instead of
313 1.1.1.1.4.2 yamt "write". This can happen if there's a renegotiation during a read
314 1.1.1.1.4.2 yamt operation. */
315 1.1.1.1.4.2 yamt unsigned read_blocked_on_write : 1;
316 1.1.1.1.4.2 yamt /* When we next get data, we should say "write" instead of "read". */
317 1.1.1.1.4.2 yamt unsigned write_blocked_on_read : 1;
318 1.1.1.1.4.2 yamt /* Treat TCP close before SSL close on SSL >= v3 as clean EOF. */
319 1.1.1.1.4.2 yamt unsigned allow_dirty_shutdown : 1;
320 1.1.1.1.4.2 yamt /* XXXX */
321 1.1.1.1.4.2 yamt unsigned fd_is_set : 1;
322 1.1.1.1.4.2 yamt /* XXX */
323 1.1.1.1.4.2 yamt unsigned n_errors : 2;
324 1.1.1.1.4.2 yamt
325 1.1.1.1.4.2 yamt /* Are we currently connecting, accepting, or doing IO? */
326 1.1.1.1.4.2 yamt unsigned state : 2;
327 1.1.1.1.4.2 yamt };
328 1.1.1.1.4.2 yamt
329 1.1.1.1.4.2 yamt static int be_openssl_enable(struct bufferevent *, short);
330 1.1.1.1.4.2 yamt static int be_openssl_disable(struct bufferevent *, short);
331 1.1.1.1.4.2 yamt static void be_openssl_destruct(struct bufferevent *);
332 1.1.1.1.4.2 yamt static int be_openssl_adj_timeouts(struct bufferevent *);
333 1.1.1.1.4.2 yamt static int be_openssl_flush(struct bufferevent *bufev,
334 1.1.1.1.4.2 yamt short iotype, enum bufferevent_flush_mode mode);
335 1.1.1.1.4.2 yamt static int be_openssl_ctrl(struct bufferevent *, enum bufferevent_ctrl_op, union bufferevent_ctrl_data *);
336 1.1.1.1.4.2 yamt
337 1.1.1.1.4.2 yamt const struct bufferevent_ops bufferevent_ops_openssl = {
338 1.1.1.1.4.2 yamt "ssl",
339 1.1.1.1.4.2 yamt evutil_offsetof(struct bufferevent_openssl, bev.bev),
340 1.1.1.1.4.2 yamt be_openssl_enable,
341 1.1.1.1.4.2 yamt be_openssl_disable,
342 1.1.1.1.4.2 yamt be_openssl_destruct,
343 1.1.1.1.4.2 yamt be_openssl_adj_timeouts,
344 1.1.1.1.4.2 yamt be_openssl_flush,
345 1.1.1.1.4.2 yamt be_openssl_ctrl,
346 1.1.1.1.4.2 yamt };
347 1.1.1.1.4.2 yamt
348 1.1.1.1.4.2 yamt /* Given a bufferevent, return a pointer to the bufferevent_openssl that
349 1.1.1.1.4.2 yamt * contains it, if any. */
350 1.1.1.1.4.2 yamt static inline struct bufferevent_openssl *
351 1.1.1.1.4.2 yamt upcast(struct bufferevent *bev)
352 1.1.1.1.4.2 yamt {
353 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_o;
354 1.1.1.1.4.2 yamt if (bev->be_ops != &bufferevent_ops_openssl)
355 1.1.1.1.4.2 yamt return NULL;
356 1.1.1.1.4.2 yamt bev_o = (void*)( ((char*)bev) -
357 1.1.1.1.4.2 yamt evutil_offsetof(struct bufferevent_openssl, bev.bev));
358 1.1.1.1.4.2 yamt EVUTIL_ASSERT(bev_o->bev.bev.be_ops == &bufferevent_ops_openssl);
359 1.1.1.1.4.2 yamt return bev_o;
360 1.1.1.1.4.2 yamt }
361 1.1.1.1.4.2 yamt
362 1.1.1.1.4.2 yamt static inline void
363 1.1.1.1.4.2 yamt put_error(struct bufferevent_openssl *bev_ssl, unsigned long err)
364 1.1.1.1.4.2 yamt {
365 1.1.1.1.4.2 yamt if (bev_ssl->n_errors == NUM_ERRORS)
366 1.1.1.1.4.2 yamt return;
367 1.1.1.1.4.2 yamt /* The error type according to openssl is "unsigned long", but
368 1.1.1.1.4.2 yamt openssl never uses more than 32 bits of it. It _can't_ use more
369 1.1.1.1.4.2 yamt than 32 bits of it, since it needs to report errors on systems
370 1.1.1.1.4.2 yamt where long is only 32 bits.
371 1.1.1.1.4.2 yamt */
372 1.1.1.1.4.2 yamt bev_ssl->errors[bev_ssl->n_errors++] = (ev_uint32_t) err;
373 1.1.1.1.4.2 yamt }
374 1.1.1.1.4.2 yamt
375 1.1.1.1.4.2 yamt /* Have the base communications channel (either the underlying bufferevent or
376 1.1.1.1.4.2 yamt * ev_read and ev_write) start reading. Take the read-blocked-on-write flag
377 1.1.1.1.4.2 yamt * into account. */
378 1.1.1.1.4.2 yamt static int
379 1.1.1.1.4.2 yamt start_reading(struct bufferevent_openssl *bev_ssl)
380 1.1.1.1.4.2 yamt {
381 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
382 1.1.1.1.4.2 yamt bufferevent_unsuspend_read_(bev_ssl->underlying,
383 1.1.1.1.4.2 yamt BEV_SUSPEND_FILT_READ);
384 1.1.1.1.4.2 yamt return 0;
385 1.1.1.1.4.2 yamt } else {
386 1.1.1.1.4.2 yamt struct bufferevent *bev = &bev_ssl->bev.bev;
387 1.1.1.1.4.2 yamt int r;
388 1.1.1.1.4.2 yamt r = bufferevent_add_event_(&bev->ev_read, &bev->timeout_read);
389 1.1.1.1.4.2 yamt if (r == 0 && bev_ssl->read_blocked_on_write)
390 1.1.1.1.4.2 yamt r = bufferevent_add_event_(&bev->ev_write,
391 1.1.1.1.4.2 yamt &bev->timeout_write);
392 1.1.1.1.4.2 yamt return r;
393 1.1.1.1.4.2 yamt }
394 1.1.1.1.4.2 yamt }
395 1.1.1.1.4.2 yamt
396 1.1.1.1.4.2 yamt /* Have the base communications channel (either the underlying bufferevent or
397 1.1.1.1.4.2 yamt * ev_read and ev_write) start writing. Take the write-blocked-on-read flag
398 1.1.1.1.4.2 yamt * into account. */
399 1.1.1.1.4.2 yamt static int
400 1.1.1.1.4.2 yamt start_writing(struct bufferevent_openssl *bev_ssl)
401 1.1.1.1.4.2 yamt {
402 1.1.1.1.4.2 yamt int r = 0;
403 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
404 1.1.1.1.4.2 yamt ;
405 1.1.1.1.4.2 yamt } else {
406 1.1.1.1.4.2 yamt struct bufferevent *bev = &bev_ssl->bev.bev;
407 1.1.1.1.4.2 yamt r = bufferevent_add_event_(&bev->ev_write, &bev->timeout_write);
408 1.1.1.1.4.2 yamt if (!r && bev_ssl->write_blocked_on_read)
409 1.1.1.1.4.2 yamt r = bufferevent_add_event_(&bev->ev_read,
410 1.1.1.1.4.2 yamt &bev->timeout_read);
411 1.1.1.1.4.2 yamt }
412 1.1.1.1.4.2 yamt return r;
413 1.1.1.1.4.2 yamt }
414 1.1.1.1.4.2 yamt
415 1.1.1.1.4.2 yamt static void
416 1.1.1.1.4.2 yamt stop_reading(struct bufferevent_openssl *bev_ssl)
417 1.1.1.1.4.2 yamt {
418 1.1.1.1.4.2 yamt if (bev_ssl->write_blocked_on_read)
419 1.1.1.1.4.2 yamt return;
420 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
421 1.1.1.1.4.2 yamt bufferevent_suspend_read_(bev_ssl->underlying,
422 1.1.1.1.4.2 yamt BEV_SUSPEND_FILT_READ);
423 1.1.1.1.4.2 yamt } else {
424 1.1.1.1.4.2 yamt struct bufferevent *bev = &bev_ssl->bev.bev;
425 1.1.1.1.4.2 yamt event_del(&bev->ev_read);
426 1.1.1.1.4.2 yamt }
427 1.1.1.1.4.2 yamt }
428 1.1.1.1.4.2 yamt
429 1.1.1.1.4.2 yamt static void
430 1.1.1.1.4.2 yamt stop_writing(struct bufferevent_openssl *bev_ssl)
431 1.1.1.1.4.2 yamt {
432 1.1.1.1.4.2 yamt if (bev_ssl->read_blocked_on_write)
433 1.1.1.1.4.2 yamt return;
434 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
435 1.1.1.1.4.2 yamt ;
436 1.1.1.1.4.2 yamt } else {
437 1.1.1.1.4.2 yamt struct bufferevent *bev = &bev_ssl->bev.bev;
438 1.1.1.1.4.2 yamt event_del(&bev->ev_write);
439 1.1.1.1.4.2 yamt }
440 1.1.1.1.4.2 yamt }
441 1.1.1.1.4.2 yamt
442 1.1.1.1.4.2 yamt static int
443 1.1.1.1.4.2 yamt set_rbow(struct bufferevent_openssl *bev_ssl)
444 1.1.1.1.4.2 yamt {
445 1.1.1.1.4.2 yamt if (!bev_ssl->underlying)
446 1.1.1.1.4.2 yamt stop_reading(bev_ssl);
447 1.1.1.1.4.2 yamt bev_ssl->read_blocked_on_write = 1;
448 1.1.1.1.4.2 yamt return start_writing(bev_ssl);
449 1.1.1.1.4.2 yamt }
450 1.1.1.1.4.2 yamt
451 1.1.1.1.4.2 yamt static int
452 1.1.1.1.4.2 yamt set_wbor(struct bufferevent_openssl *bev_ssl)
453 1.1.1.1.4.2 yamt {
454 1.1.1.1.4.2 yamt if (!bev_ssl->underlying)
455 1.1.1.1.4.2 yamt stop_writing(bev_ssl);
456 1.1.1.1.4.2 yamt bev_ssl->write_blocked_on_read = 1;
457 1.1.1.1.4.2 yamt return start_reading(bev_ssl);
458 1.1.1.1.4.2 yamt }
459 1.1.1.1.4.2 yamt
460 1.1.1.1.4.2 yamt static int
461 1.1.1.1.4.2 yamt clear_rbow(struct bufferevent_openssl *bev_ssl)
462 1.1.1.1.4.2 yamt {
463 1.1.1.1.4.2 yamt struct bufferevent *bev = &bev_ssl->bev.bev;
464 1.1.1.1.4.2 yamt int r = 0;
465 1.1.1.1.4.2 yamt bev_ssl->read_blocked_on_write = 0;
466 1.1.1.1.4.2 yamt if (!(bev->enabled & EV_WRITE))
467 1.1.1.1.4.2 yamt stop_writing(bev_ssl);
468 1.1.1.1.4.2 yamt if (bev->enabled & EV_READ)
469 1.1.1.1.4.2 yamt r = start_reading(bev_ssl);
470 1.1.1.1.4.2 yamt return r;
471 1.1.1.1.4.2 yamt }
472 1.1.1.1.4.2 yamt
473 1.1.1.1.4.2 yamt
474 1.1.1.1.4.2 yamt static int
475 1.1.1.1.4.2 yamt clear_wbor(struct bufferevent_openssl *bev_ssl)
476 1.1.1.1.4.2 yamt {
477 1.1.1.1.4.2 yamt struct bufferevent *bev = &bev_ssl->bev.bev;
478 1.1.1.1.4.2 yamt int r = 0;
479 1.1.1.1.4.2 yamt bev_ssl->write_blocked_on_read = 0;
480 1.1.1.1.4.2 yamt if (!(bev->enabled & EV_READ))
481 1.1.1.1.4.2 yamt stop_reading(bev_ssl);
482 1.1.1.1.4.2 yamt if (bev->enabled & EV_WRITE)
483 1.1.1.1.4.2 yamt r = start_writing(bev_ssl);
484 1.1.1.1.4.2 yamt return r;
485 1.1.1.1.4.2 yamt }
486 1.1.1.1.4.2 yamt
487 1.1.1.1.4.2 yamt static void
488 1.1.1.1.4.2 yamt conn_closed(struct bufferevent_openssl *bev_ssl, int when, int errcode, int ret)
489 1.1.1.1.4.2 yamt {
490 1.1.1.1.4.2 yamt int event = BEV_EVENT_ERROR;
491 1.1.1.1.4.2 yamt int dirty_shutdown = 0;
492 1.1.1.1.4.2 yamt unsigned long err;
493 1.1.1.1.4.2 yamt
494 1.1.1.1.4.2 yamt switch (errcode) {
495 1.1.1.1.4.2 yamt case SSL_ERROR_ZERO_RETURN:
496 1.1.1.1.4.2 yamt /* Possibly a clean shutdown. */
497 1.1.1.1.4.2 yamt if (SSL_get_shutdown(bev_ssl->ssl) & SSL_RECEIVED_SHUTDOWN)
498 1.1.1.1.4.2 yamt event = BEV_EVENT_EOF;
499 1.1.1.1.4.2 yamt else
500 1.1.1.1.4.2 yamt dirty_shutdown = 1;
501 1.1.1.1.4.2 yamt break;
502 1.1.1.1.4.2 yamt case SSL_ERROR_SYSCALL:
503 1.1.1.1.4.2 yamt /* IO error; possibly a dirty shutdown. */
504 1.1.1.1.4.2 yamt if (ret == 0 && ERR_peek_error() == 0)
505 1.1.1.1.4.2 yamt dirty_shutdown = 1;
506 1.1.1.1.4.2 yamt break;
507 1.1.1.1.4.2 yamt case SSL_ERROR_SSL:
508 1.1.1.1.4.2 yamt /* Protocol error. */
509 1.1.1.1.4.2 yamt break;
510 1.1.1.1.4.2 yamt case SSL_ERROR_WANT_X509_LOOKUP:
511 1.1.1.1.4.2 yamt /* XXXX handle this. */
512 1.1.1.1.4.2 yamt break;
513 1.1.1.1.4.2 yamt case SSL_ERROR_NONE:
514 1.1.1.1.4.2 yamt case SSL_ERROR_WANT_READ:
515 1.1.1.1.4.2 yamt case SSL_ERROR_WANT_WRITE:
516 1.1.1.1.4.2 yamt case SSL_ERROR_WANT_CONNECT:
517 1.1.1.1.4.2 yamt case SSL_ERROR_WANT_ACCEPT:
518 1.1.1.1.4.2 yamt default:
519 1.1.1.1.4.2 yamt /* should be impossible; treat as normal error. */
520 1.1.1.1.4.2 yamt event_warnx("BUG: Unexpected OpenSSL error code %d", errcode);
521 1.1.1.1.4.2 yamt break;
522 1.1.1.1.4.2 yamt }
523 1.1.1.1.4.2 yamt
524 1.1.1.1.4.2 yamt while ((err = ERR_get_error())) {
525 1.1.1.1.4.2 yamt put_error(bev_ssl, err);
526 1.1.1.1.4.2 yamt }
527 1.1.1.1.4.2 yamt
528 1.1.1.1.4.2 yamt if (dirty_shutdown && bev_ssl->allow_dirty_shutdown)
529 1.1.1.1.4.2 yamt event = BEV_EVENT_EOF;
530 1.1.1.1.4.2 yamt
531 1.1.1.1.4.2 yamt stop_reading(bev_ssl);
532 1.1.1.1.4.2 yamt stop_writing(bev_ssl);
533 1.1.1.1.4.2 yamt
534 1.1.1.1.4.2 yamt /* when is BEV_EVENT_{READING|WRITING} */
535 1.1.1.1.4.2 yamt event = when | event;
536 1.1.1.1.4.2 yamt bufferevent_run_eventcb_(&bev_ssl->bev.bev, event);
537 1.1.1.1.4.2 yamt }
538 1.1.1.1.4.2 yamt
539 1.1.1.1.4.2 yamt static void
540 1.1.1.1.4.2 yamt init_bio_counts(struct bufferevent_openssl *bev_ssl)
541 1.1.1.1.4.2 yamt {
542 1.1.1.1.4.2 yamt bev_ssl->counts.n_written =
543 1.1.1.1.4.2 yamt BIO_number_written(SSL_get_wbio(bev_ssl->ssl));
544 1.1.1.1.4.2 yamt bev_ssl->counts.n_read =
545 1.1.1.1.4.2 yamt BIO_number_read(SSL_get_rbio(bev_ssl->ssl));
546 1.1.1.1.4.2 yamt }
547 1.1.1.1.4.2 yamt
548 1.1.1.1.4.2 yamt static inline void
549 1.1.1.1.4.2 yamt decrement_buckets(struct bufferevent_openssl *bev_ssl)
550 1.1.1.1.4.2 yamt {
551 1.1.1.1.4.2 yamt unsigned long num_w = BIO_number_written(SSL_get_wbio(bev_ssl->ssl));
552 1.1.1.1.4.2 yamt unsigned long num_r = BIO_number_read(SSL_get_rbio(bev_ssl->ssl));
553 1.1.1.1.4.2 yamt /* These next two subtractions can wrap around. That's okay. */
554 1.1.1.1.4.2 yamt unsigned long w = num_w - bev_ssl->counts.n_written;
555 1.1.1.1.4.2 yamt unsigned long r = num_r - bev_ssl->counts.n_read;
556 1.1.1.1.4.2 yamt if (w)
557 1.1.1.1.4.2 yamt bufferevent_decrement_write_buckets_(&bev_ssl->bev, w);
558 1.1.1.1.4.2 yamt if (r)
559 1.1.1.1.4.2 yamt bufferevent_decrement_read_buckets_(&bev_ssl->bev, r);
560 1.1.1.1.4.2 yamt bev_ssl->counts.n_written = num_w;
561 1.1.1.1.4.2 yamt bev_ssl->counts.n_read = num_r;
562 1.1.1.1.4.2 yamt }
563 1.1.1.1.4.2 yamt
564 1.1.1.1.4.2 yamt #define OP_MADE_PROGRESS 1
565 1.1.1.1.4.2 yamt #define OP_BLOCKED 2
566 1.1.1.1.4.2 yamt #define OP_ERR 4
567 1.1.1.1.4.2 yamt
568 1.1.1.1.4.2 yamt /* Return a bitmask of OP_MADE_PROGRESS (if we read anything); OP_BLOCKED (if
569 1.1.1.1.4.2 yamt we're now blocked); and OP_ERR (if an error occurred). */
570 1.1.1.1.4.2 yamt static int
571 1.1.1.1.4.2 yamt do_read(struct bufferevent_openssl *bev_ssl, int n_to_read) {
572 1.1.1.1.4.2 yamt /* Requires lock */
573 1.1.1.1.4.2 yamt struct bufferevent *bev = &bev_ssl->bev.bev;
574 1.1.1.1.4.2 yamt struct evbuffer *input = bev->input;
575 1.1.1.1.4.2 yamt int r, n, i, n_used = 0, atmost;
576 1.1.1.1.4.2 yamt struct evbuffer_iovec space[2];
577 1.1.1.1.4.2 yamt int result = 0;
578 1.1.1.1.4.2 yamt
579 1.1.1.1.4.2 yamt if (bev_ssl->bev.read_suspended)
580 1.1.1.1.4.2 yamt return 0;
581 1.1.1.1.4.2 yamt
582 1.1.1.1.4.2 yamt atmost = bufferevent_get_read_max_(&bev_ssl->bev);
583 1.1.1.1.4.2 yamt if (n_to_read > atmost)
584 1.1.1.1.4.2 yamt n_to_read = atmost;
585 1.1.1.1.4.2 yamt
586 1.1.1.1.4.2 yamt n = evbuffer_reserve_space(input, n_to_read, space, 2);
587 1.1.1.1.4.2 yamt if (n < 0)
588 1.1.1.1.4.2 yamt return OP_ERR;
589 1.1.1.1.4.2 yamt
590 1.1.1.1.4.2 yamt for (i=0; i<n; ++i) {
591 1.1.1.1.4.2 yamt if (bev_ssl->bev.read_suspended)
592 1.1.1.1.4.2 yamt break;
593 1.1.1.1.4.2 yamt r = SSL_read(bev_ssl->ssl, space[i].iov_base, space[i].iov_len);
594 1.1.1.1.4.2 yamt if (r>0) {
595 1.1.1.1.4.2 yamt result |= OP_MADE_PROGRESS;
596 1.1.1.1.4.2 yamt if (bev_ssl->read_blocked_on_write)
597 1.1.1.1.4.2 yamt if (clear_rbow(bev_ssl) < 0)
598 1.1.1.1.4.2 yamt return OP_ERR | result;
599 1.1.1.1.4.2 yamt ++n_used;
600 1.1.1.1.4.2 yamt space[i].iov_len = r;
601 1.1.1.1.4.2 yamt decrement_buckets(bev_ssl);
602 1.1.1.1.4.2 yamt } else {
603 1.1.1.1.4.2 yamt int err = SSL_get_error(bev_ssl->ssl, r);
604 1.1.1.1.4.2 yamt print_err(err);
605 1.1.1.1.4.2 yamt switch (err) {
606 1.1.1.1.4.2 yamt case SSL_ERROR_WANT_READ:
607 1.1.1.1.4.2 yamt /* Can't read until underlying has more data. */
608 1.1.1.1.4.2 yamt if (bev_ssl->read_blocked_on_write)
609 1.1.1.1.4.2 yamt if (clear_rbow(bev_ssl) < 0)
610 1.1.1.1.4.2 yamt return OP_ERR | result;
611 1.1.1.1.4.2 yamt break;
612 1.1.1.1.4.2 yamt case SSL_ERROR_WANT_WRITE:
613 1.1.1.1.4.2 yamt /* This read operation requires a write, and the
614 1.1.1.1.4.2 yamt * underlying is full */
615 1.1.1.1.4.2 yamt if (!bev_ssl->read_blocked_on_write)
616 1.1.1.1.4.2 yamt if (set_rbow(bev_ssl) < 0)
617 1.1.1.1.4.2 yamt return OP_ERR | result;
618 1.1.1.1.4.2 yamt break;
619 1.1.1.1.4.2 yamt default:
620 1.1.1.1.4.2 yamt conn_closed(bev_ssl, BEV_EVENT_READING, err, r);
621 1.1.1.1.4.2 yamt break;
622 1.1.1.1.4.2 yamt }
623 1.1.1.1.4.2 yamt result |= OP_BLOCKED;
624 1.1.1.1.4.2 yamt break; /* out of the loop */
625 1.1.1.1.4.2 yamt }
626 1.1.1.1.4.2 yamt }
627 1.1.1.1.4.2 yamt
628 1.1.1.1.4.2 yamt if (n_used) {
629 1.1.1.1.4.2 yamt evbuffer_commit_space(input, space, n_used);
630 1.1.1.1.4.2 yamt if (bev_ssl->underlying)
631 1.1.1.1.4.2 yamt BEV_RESET_GENERIC_READ_TIMEOUT(bev);
632 1.1.1.1.4.2 yamt }
633 1.1.1.1.4.2 yamt
634 1.1.1.1.4.2 yamt return result;
635 1.1.1.1.4.2 yamt }
636 1.1.1.1.4.2 yamt
637 1.1.1.1.4.2 yamt /* Return a bitmask of OP_MADE_PROGRESS (if we wrote anything); OP_BLOCKED (if
638 1.1.1.1.4.2 yamt we're now blocked); and OP_ERR (if an error occurred). */
639 1.1.1.1.4.2 yamt static int
640 1.1.1.1.4.2 yamt do_write(struct bufferevent_openssl *bev_ssl, int atmost)
641 1.1.1.1.4.2 yamt {
642 1.1.1.1.4.2 yamt int i, r, n, n_written = 0;
643 1.1.1.1.4.2 yamt struct bufferevent *bev = &bev_ssl->bev.bev;
644 1.1.1.1.4.2 yamt struct evbuffer *output = bev->output;
645 1.1.1.1.4.2 yamt struct evbuffer_iovec space[8];
646 1.1.1.1.4.2 yamt int result = 0;
647 1.1.1.1.4.2 yamt
648 1.1.1.1.4.2 yamt if (bev_ssl->last_write > 0)
649 1.1.1.1.4.2 yamt atmost = bev_ssl->last_write;
650 1.1.1.1.4.2 yamt else
651 1.1.1.1.4.2 yamt atmost = bufferevent_get_write_max_(&bev_ssl->bev);
652 1.1.1.1.4.2 yamt
653 1.1.1.1.4.2 yamt n = evbuffer_peek(output, atmost, NULL, space, 8);
654 1.1.1.1.4.2 yamt if (n < 0)
655 1.1.1.1.4.2 yamt return OP_ERR | result;
656 1.1.1.1.4.2 yamt
657 1.1.1.1.4.2 yamt if (n > 8)
658 1.1.1.1.4.2 yamt n = 8;
659 1.1.1.1.4.2 yamt for (i=0; i < n; ++i) {
660 1.1.1.1.4.2 yamt if (bev_ssl->bev.write_suspended)
661 1.1.1.1.4.2 yamt break;
662 1.1.1.1.4.2 yamt
663 1.1.1.1.4.2 yamt /* SSL_write will (reasonably) return 0 if we tell it to
664 1.1.1.1.4.2 yamt send 0 data. Skip this case so we don't interpret the
665 1.1.1.1.4.2 yamt result as an error */
666 1.1.1.1.4.2 yamt if (space[i].iov_len == 0)
667 1.1.1.1.4.2 yamt continue;
668 1.1.1.1.4.2 yamt
669 1.1.1.1.4.2 yamt r = SSL_write(bev_ssl->ssl, space[i].iov_base,
670 1.1.1.1.4.2 yamt space[i].iov_len);
671 1.1.1.1.4.2 yamt if (r > 0) {
672 1.1.1.1.4.2 yamt result |= OP_MADE_PROGRESS;
673 1.1.1.1.4.2 yamt if (bev_ssl->write_blocked_on_read)
674 1.1.1.1.4.2 yamt if (clear_wbor(bev_ssl) < 0)
675 1.1.1.1.4.2 yamt return OP_ERR | result;
676 1.1.1.1.4.2 yamt n_written += r;
677 1.1.1.1.4.2 yamt bev_ssl->last_write = -1;
678 1.1.1.1.4.2 yamt decrement_buckets(bev_ssl);
679 1.1.1.1.4.2 yamt } else {
680 1.1.1.1.4.2 yamt int err = SSL_get_error(bev_ssl->ssl, r);
681 1.1.1.1.4.2 yamt print_err(err);
682 1.1.1.1.4.2 yamt switch (err) {
683 1.1.1.1.4.2 yamt case SSL_ERROR_WANT_WRITE:
684 1.1.1.1.4.2 yamt /* Can't read until underlying has more data. */
685 1.1.1.1.4.2 yamt if (bev_ssl->write_blocked_on_read)
686 1.1.1.1.4.2 yamt if (clear_wbor(bev_ssl) < 0)
687 1.1.1.1.4.2 yamt return OP_ERR | result;
688 1.1.1.1.4.2 yamt bev_ssl->last_write = space[i].iov_len;
689 1.1.1.1.4.2 yamt break;
690 1.1.1.1.4.2 yamt case SSL_ERROR_WANT_READ:
691 1.1.1.1.4.2 yamt /* This read operation requires a write, and the
692 1.1.1.1.4.2 yamt * underlying is full */
693 1.1.1.1.4.2 yamt if (!bev_ssl->write_blocked_on_read)
694 1.1.1.1.4.2 yamt if (set_wbor(bev_ssl) < 0)
695 1.1.1.1.4.2 yamt return OP_ERR | result;
696 1.1.1.1.4.2 yamt bev_ssl->last_write = space[i].iov_len;
697 1.1.1.1.4.2 yamt break;
698 1.1.1.1.4.2 yamt default:
699 1.1.1.1.4.2 yamt conn_closed(bev_ssl, BEV_EVENT_WRITING, err, r);
700 1.1.1.1.4.2 yamt bev_ssl->last_write = -1;
701 1.1.1.1.4.2 yamt break;
702 1.1.1.1.4.2 yamt }
703 1.1.1.1.4.2 yamt result |= OP_BLOCKED;
704 1.1.1.1.4.2 yamt break;
705 1.1.1.1.4.2 yamt }
706 1.1.1.1.4.2 yamt }
707 1.1.1.1.4.2 yamt if (n_written) {
708 1.1.1.1.4.2 yamt evbuffer_drain(output, n_written);
709 1.1.1.1.4.2 yamt if (bev_ssl->underlying)
710 1.1.1.1.4.2 yamt BEV_RESET_GENERIC_WRITE_TIMEOUT(bev);
711 1.1.1.1.4.2 yamt
712 1.1.1.1.4.2 yamt if (evbuffer_get_length(output) <= bev->wm_write.low)
713 1.1.1.1.4.2 yamt bufferevent_run_writecb_(bev);
714 1.1.1.1.4.2 yamt }
715 1.1.1.1.4.2 yamt return result;
716 1.1.1.1.4.2 yamt }
717 1.1.1.1.4.2 yamt
718 1.1.1.1.4.2 yamt #define WRITE_FRAME 15000
719 1.1.1.1.4.2 yamt
720 1.1.1.1.4.2 yamt #define READ_DEFAULT 4096
721 1.1.1.1.4.2 yamt
722 1.1.1.1.4.2 yamt /* Try to figure out how many bytes to read; return 0 if we shouldn't be
723 1.1.1.1.4.2 yamt * reading. */
724 1.1.1.1.4.2 yamt static int
725 1.1.1.1.4.2 yamt bytes_to_read(struct bufferevent_openssl *bev)
726 1.1.1.1.4.2 yamt {
727 1.1.1.1.4.2 yamt struct evbuffer *input = bev->bev.bev.input;
728 1.1.1.1.4.2 yamt struct event_watermark *wm = &bev->bev.bev.wm_read;
729 1.1.1.1.4.2 yamt int result = READ_DEFAULT;
730 1.1.1.1.4.2 yamt ev_ssize_t limit;
731 1.1.1.1.4.2 yamt /* XXX 99% of this is generic code that nearly all bufferevents will
732 1.1.1.1.4.2 yamt * want. */
733 1.1.1.1.4.2 yamt
734 1.1.1.1.4.2 yamt if (bev->write_blocked_on_read) {
735 1.1.1.1.4.2 yamt return 0;
736 1.1.1.1.4.2 yamt }
737 1.1.1.1.4.2 yamt
738 1.1.1.1.4.2 yamt if (! (bev->bev.bev.enabled & EV_READ)) {
739 1.1.1.1.4.2 yamt return 0;
740 1.1.1.1.4.2 yamt }
741 1.1.1.1.4.2 yamt
742 1.1.1.1.4.2 yamt if (bev->bev.read_suspended) {
743 1.1.1.1.4.2 yamt return 0;
744 1.1.1.1.4.2 yamt }
745 1.1.1.1.4.2 yamt
746 1.1.1.1.4.2 yamt if (wm->high) {
747 1.1.1.1.4.2 yamt if (evbuffer_get_length(input) >= wm->high) {
748 1.1.1.1.4.2 yamt return 0;
749 1.1.1.1.4.2 yamt }
750 1.1.1.1.4.2 yamt
751 1.1.1.1.4.2 yamt result = wm->high - evbuffer_get_length(input);
752 1.1.1.1.4.2 yamt } else {
753 1.1.1.1.4.2 yamt result = READ_DEFAULT;
754 1.1.1.1.4.2 yamt }
755 1.1.1.1.4.2 yamt
756 1.1.1.1.4.2 yamt /* Respect the rate limit */
757 1.1.1.1.4.2 yamt limit = bufferevent_get_read_max_(&bev->bev);
758 1.1.1.1.4.2 yamt if (result > limit) {
759 1.1.1.1.4.2 yamt result = limit;
760 1.1.1.1.4.2 yamt }
761 1.1.1.1.4.2 yamt
762 1.1.1.1.4.2 yamt return result;
763 1.1.1.1.4.2 yamt }
764 1.1.1.1.4.2 yamt
765 1.1.1.1.4.2 yamt
766 1.1.1.1.4.2 yamt /* Things look readable. If write is blocked on read, write till it isn't.
767 1.1.1.1.4.2 yamt * Read from the underlying buffer until we block or we hit our high-water
768 1.1.1.1.4.2 yamt * mark.
769 1.1.1.1.4.2 yamt */
770 1.1.1.1.4.2 yamt static void
771 1.1.1.1.4.2 yamt consider_reading(struct bufferevent_openssl *bev_ssl)
772 1.1.1.1.4.2 yamt {
773 1.1.1.1.4.2 yamt int r;
774 1.1.1.1.4.2 yamt int n_to_read;
775 1.1.1.1.4.2 yamt int all_result_flags = 0;
776 1.1.1.1.4.2 yamt
777 1.1.1.1.4.2 yamt while (bev_ssl->write_blocked_on_read) {
778 1.1.1.1.4.2 yamt r = do_write(bev_ssl, WRITE_FRAME);
779 1.1.1.1.4.2 yamt if (r & (OP_BLOCKED|OP_ERR))
780 1.1.1.1.4.2 yamt break;
781 1.1.1.1.4.2 yamt }
782 1.1.1.1.4.2 yamt if (bev_ssl->write_blocked_on_read)
783 1.1.1.1.4.2 yamt return;
784 1.1.1.1.4.2 yamt
785 1.1.1.1.4.2 yamt n_to_read = bytes_to_read(bev_ssl);
786 1.1.1.1.4.2 yamt
787 1.1.1.1.4.2 yamt while (n_to_read) {
788 1.1.1.1.4.2 yamt r = do_read(bev_ssl, n_to_read);
789 1.1.1.1.4.2 yamt all_result_flags |= r;
790 1.1.1.1.4.2 yamt
791 1.1.1.1.4.2 yamt if (r & (OP_BLOCKED|OP_ERR))
792 1.1.1.1.4.2 yamt break;
793 1.1.1.1.4.2 yamt
794 1.1.1.1.4.2 yamt if (bev_ssl->bev.read_suspended)
795 1.1.1.1.4.2 yamt break;
796 1.1.1.1.4.2 yamt
797 1.1.1.1.4.2 yamt /* Read all pending data. This won't hit the network
798 1.1.1.1.4.2 yamt * again, and will (most importantly) put us in a state
799 1.1.1.1.4.2 yamt * where we don't need to read anything else until the
800 1.1.1.1.4.2 yamt * socket is readable again. It'll potentially make us
801 1.1.1.1.4.2 yamt * overrun our read high-watermark (somewhat
802 1.1.1.1.4.2 yamt * regrettable). The damage to the rate-limit has
803 1.1.1.1.4.2 yamt * already been done, since OpenSSL went and read a
804 1.1.1.1.4.2 yamt * whole SSL record anyway. */
805 1.1.1.1.4.2 yamt n_to_read = SSL_pending(bev_ssl->ssl);
806 1.1.1.1.4.2 yamt
807 1.1.1.1.4.2 yamt /* XXX This if statement is actually a bad bug, added to avoid
808 1.1.1.1.4.2 yamt * XXX a worse bug.
809 1.1.1.1.4.2 yamt *
810 1.1.1.1.4.2 yamt * The bad bug: It can potentially cause resource unfairness
811 1.1.1.1.4.2 yamt * by reading too much data from the underlying bufferevent;
812 1.1.1.1.4.2 yamt * it can potentially cause read looping if the underlying
813 1.1.1.1.4.2 yamt * bufferevent is a bufferevent_pair and deferred callbacks
814 1.1.1.1.4.2 yamt * aren't used.
815 1.1.1.1.4.2 yamt *
816 1.1.1.1.4.2 yamt * The worse bug: If we didn't do this, then we would
817 1.1.1.1.4.2 yamt * potentially not read any more from bev_ssl->underlying
818 1.1.1.1.4.2 yamt * until more data arrived there, which could lead to us
819 1.1.1.1.4.2 yamt * waiting forever.
820 1.1.1.1.4.2 yamt */
821 1.1.1.1.4.2 yamt if (!n_to_read && bev_ssl->underlying)
822 1.1.1.1.4.2 yamt n_to_read = bytes_to_read(bev_ssl);
823 1.1.1.1.4.2 yamt }
824 1.1.1.1.4.2 yamt
825 1.1.1.1.4.2 yamt if (all_result_flags & OP_MADE_PROGRESS) {
826 1.1.1.1.4.2 yamt struct bufferevent *bev = &bev_ssl->bev.bev;
827 1.1.1.1.4.2 yamt struct evbuffer *input = bev->input;
828 1.1.1.1.4.2 yamt
829 1.1.1.1.4.2 yamt if (evbuffer_get_length(input) >= bev->wm_read.low) {
830 1.1.1.1.4.2 yamt bufferevent_run_readcb_(bev);
831 1.1.1.1.4.2 yamt }
832 1.1.1.1.4.2 yamt }
833 1.1.1.1.4.2 yamt
834 1.1.1.1.4.2 yamt if (!bev_ssl->underlying) {
835 1.1.1.1.4.2 yamt /* Should be redundant, but let's avoid busy-looping */
836 1.1.1.1.4.2 yamt if (bev_ssl->bev.read_suspended ||
837 1.1.1.1.4.2 yamt !(bev_ssl->bev.bev.enabled & EV_READ)) {
838 1.1.1.1.4.2 yamt event_del(&bev_ssl->bev.bev.ev_read);
839 1.1.1.1.4.2 yamt }
840 1.1.1.1.4.2 yamt }
841 1.1.1.1.4.2 yamt }
842 1.1.1.1.4.2 yamt
843 1.1.1.1.4.2 yamt static void
844 1.1.1.1.4.2 yamt consider_writing(struct bufferevent_openssl *bev_ssl)
845 1.1.1.1.4.2 yamt {
846 1.1.1.1.4.2 yamt int r;
847 1.1.1.1.4.2 yamt struct evbuffer *output = bev_ssl->bev.bev.output;
848 1.1.1.1.4.2 yamt struct evbuffer *target = NULL;
849 1.1.1.1.4.2 yamt struct event_watermark *wm = NULL;
850 1.1.1.1.4.2 yamt
851 1.1.1.1.4.2 yamt while (bev_ssl->read_blocked_on_write) {
852 1.1.1.1.4.2 yamt r = do_read(bev_ssl, 1024); /* XXXX 1024 is a hack */
853 1.1.1.1.4.2 yamt if (r & OP_MADE_PROGRESS) {
854 1.1.1.1.4.2 yamt struct bufferevent *bev = &bev_ssl->bev.bev;
855 1.1.1.1.4.2 yamt struct evbuffer *input = bev->input;
856 1.1.1.1.4.2 yamt
857 1.1.1.1.4.2 yamt if (evbuffer_get_length(input) >= bev->wm_read.low) {
858 1.1.1.1.4.2 yamt bufferevent_run_readcb_(bev);
859 1.1.1.1.4.2 yamt }
860 1.1.1.1.4.2 yamt }
861 1.1.1.1.4.2 yamt if (r & (OP_ERR|OP_BLOCKED))
862 1.1.1.1.4.2 yamt break;
863 1.1.1.1.4.2 yamt }
864 1.1.1.1.4.2 yamt if (bev_ssl->read_blocked_on_write)
865 1.1.1.1.4.2 yamt return;
866 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
867 1.1.1.1.4.2 yamt target = bev_ssl->underlying->output;
868 1.1.1.1.4.2 yamt wm = &bev_ssl->underlying->wm_write;
869 1.1.1.1.4.2 yamt }
870 1.1.1.1.4.2 yamt while ((bev_ssl->bev.bev.enabled & EV_WRITE) &&
871 1.1.1.1.4.2 yamt (! bev_ssl->bev.write_suspended) &&
872 1.1.1.1.4.2 yamt evbuffer_get_length(output) &&
873 1.1.1.1.4.2 yamt (!target || (! wm->high || evbuffer_get_length(target) < wm->high))) {
874 1.1.1.1.4.2 yamt int n_to_write;
875 1.1.1.1.4.2 yamt if (wm && wm->high)
876 1.1.1.1.4.2 yamt n_to_write = wm->high - evbuffer_get_length(target);
877 1.1.1.1.4.2 yamt else
878 1.1.1.1.4.2 yamt n_to_write = WRITE_FRAME;
879 1.1.1.1.4.2 yamt r = do_write(bev_ssl, n_to_write);
880 1.1.1.1.4.2 yamt if (r & (OP_BLOCKED|OP_ERR))
881 1.1.1.1.4.2 yamt break;
882 1.1.1.1.4.2 yamt }
883 1.1.1.1.4.2 yamt
884 1.1.1.1.4.2 yamt if (!bev_ssl->underlying) {
885 1.1.1.1.4.2 yamt if (evbuffer_get_length(output) == 0) {
886 1.1.1.1.4.2 yamt event_del(&bev_ssl->bev.bev.ev_write);
887 1.1.1.1.4.2 yamt } else if (bev_ssl->bev.write_suspended ||
888 1.1.1.1.4.2 yamt !(bev_ssl->bev.bev.enabled & EV_WRITE)) {
889 1.1.1.1.4.2 yamt /* Should be redundant, but let's avoid busy-looping */
890 1.1.1.1.4.2 yamt event_del(&bev_ssl->bev.bev.ev_write);
891 1.1.1.1.4.2 yamt }
892 1.1.1.1.4.2 yamt }
893 1.1.1.1.4.2 yamt }
894 1.1.1.1.4.2 yamt
895 1.1.1.1.4.2 yamt static void
896 1.1.1.1.4.2 yamt be_openssl_readcb(struct bufferevent *bev_base, void *ctx)
897 1.1.1.1.4.2 yamt {
898 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = ctx;
899 1.1.1.1.4.2 yamt consider_reading(bev_ssl);
900 1.1.1.1.4.2 yamt }
901 1.1.1.1.4.2 yamt
902 1.1.1.1.4.2 yamt static void
903 1.1.1.1.4.2 yamt be_openssl_writecb(struct bufferevent *bev_base, void *ctx)
904 1.1.1.1.4.2 yamt {
905 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = ctx;
906 1.1.1.1.4.2 yamt consider_writing(bev_ssl);
907 1.1.1.1.4.2 yamt }
908 1.1.1.1.4.2 yamt
909 1.1.1.1.4.2 yamt static void
910 1.1.1.1.4.2 yamt be_openssl_eventcb(struct bufferevent *bev_base, short what, void *ctx)
911 1.1.1.1.4.2 yamt {
912 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = ctx;
913 1.1.1.1.4.2 yamt int event = 0;
914 1.1.1.1.4.2 yamt
915 1.1.1.1.4.2 yamt if (what & BEV_EVENT_EOF) {
916 1.1.1.1.4.2 yamt if (bev_ssl->allow_dirty_shutdown)
917 1.1.1.1.4.2 yamt event = BEV_EVENT_EOF;
918 1.1.1.1.4.2 yamt else
919 1.1.1.1.4.2 yamt event = BEV_EVENT_ERROR;
920 1.1.1.1.4.2 yamt } else if (what & BEV_EVENT_TIMEOUT) {
921 1.1.1.1.4.2 yamt /* We sure didn't set this. Propagate it to the user. */
922 1.1.1.1.4.2 yamt event = what;
923 1.1.1.1.4.2 yamt } else if (what & BEV_EVENT_ERROR) {
924 1.1.1.1.4.2 yamt /* An error occurred on the connection. Propagate it to the user. */
925 1.1.1.1.4.2 yamt event = what;
926 1.1.1.1.4.2 yamt } else if (what & BEV_EVENT_CONNECTED) {
927 1.1.1.1.4.2 yamt /* Ignore it. We're saying SSL_connect() already, which will
928 1.1.1.1.4.2 yamt eat it. */
929 1.1.1.1.4.2 yamt }
930 1.1.1.1.4.2 yamt if (event)
931 1.1.1.1.4.2 yamt bufferevent_run_eventcb_(&bev_ssl->bev.bev, event);
932 1.1.1.1.4.2 yamt }
933 1.1.1.1.4.2 yamt
934 1.1.1.1.4.2 yamt static void
935 1.1.1.1.4.2 yamt be_openssl_readeventcb(evutil_socket_t fd, short what, void *ptr)
936 1.1.1.1.4.2 yamt {
937 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = ptr;
938 1.1.1.1.4.2 yamt bufferevent_incref_and_lock_(&bev_ssl->bev.bev);
939 1.1.1.1.4.2 yamt if (what == EV_TIMEOUT) {
940 1.1.1.1.4.2 yamt bufferevent_run_eventcb_(&bev_ssl->bev.bev,
941 1.1.1.1.4.2 yamt BEV_EVENT_TIMEOUT|BEV_EVENT_READING);
942 1.1.1.1.4.2 yamt } else {
943 1.1.1.1.4.2 yamt consider_reading(bev_ssl);
944 1.1.1.1.4.2 yamt }
945 1.1.1.1.4.2 yamt bufferevent_decref_and_unlock_(&bev_ssl->bev.bev);
946 1.1.1.1.4.2 yamt }
947 1.1.1.1.4.2 yamt
948 1.1.1.1.4.2 yamt static void
949 1.1.1.1.4.2 yamt be_openssl_writeeventcb(evutil_socket_t fd, short what, void *ptr)
950 1.1.1.1.4.2 yamt {
951 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = ptr;
952 1.1.1.1.4.2 yamt bufferevent_incref_and_lock_(&bev_ssl->bev.bev);
953 1.1.1.1.4.2 yamt if (what == EV_TIMEOUT) {
954 1.1.1.1.4.2 yamt bufferevent_run_eventcb_(&bev_ssl->bev.bev,
955 1.1.1.1.4.2 yamt BEV_EVENT_TIMEOUT|BEV_EVENT_WRITING);
956 1.1.1.1.4.2 yamt } else {
957 1.1.1.1.4.2 yamt consider_writing(bev_ssl);
958 1.1.1.1.4.2 yamt }
959 1.1.1.1.4.2 yamt bufferevent_decref_and_unlock_(&bev_ssl->bev.bev);
960 1.1.1.1.4.2 yamt }
961 1.1.1.1.4.2 yamt
962 1.1.1.1.4.2 yamt static int
963 1.1.1.1.4.2 yamt set_open_callbacks(struct bufferevent_openssl *bev_ssl, evutil_socket_t fd)
964 1.1.1.1.4.2 yamt {
965 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
966 1.1.1.1.4.2 yamt bufferevent_setcb(bev_ssl->underlying,
967 1.1.1.1.4.2 yamt be_openssl_readcb, be_openssl_writecb, be_openssl_eventcb,
968 1.1.1.1.4.2 yamt bev_ssl);
969 1.1.1.1.4.2 yamt return 0;
970 1.1.1.1.4.2 yamt } else {
971 1.1.1.1.4.2 yamt struct bufferevent *bev = &bev_ssl->bev.bev;
972 1.1.1.1.4.2 yamt int rpending=0, wpending=0, r1=0, r2=0;
973 1.1.1.1.4.2 yamt if (fd < 0 && bev_ssl->fd_is_set)
974 1.1.1.1.4.2 yamt fd = event_get_fd(&bev->ev_read);
975 1.1.1.1.4.2 yamt if (bev_ssl->fd_is_set) {
976 1.1.1.1.4.2 yamt rpending = event_pending(&bev->ev_read, EV_READ, NULL);
977 1.1.1.1.4.2 yamt wpending = event_pending(&bev->ev_write, EV_WRITE, NULL);
978 1.1.1.1.4.2 yamt event_del(&bev->ev_read);
979 1.1.1.1.4.2 yamt event_del(&bev->ev_write);
980 1.1.1.1.4.2 yamt }
981 1.1.1.1.4.2 yamt event_assign(&bev->ev_read, bev->ev_base, fd,
982 1.1.1.1.4.2 yamt EV_READ|EV_PERSIST, be_openssl_readeventcb, bev_ssl);
983 1.1.1.1.4.2 yamt event_assign(&bev->ev_write, bev->ev_base, fd,
984 1.1.1.1.4.2 yamt EV_WRITE|EV_PERSIST, be_openssl_writeeventcb, bev_ssl);
985 1.1.1.1.4.2 yamt if (rpending)
986 1.1.1.1.4.2 yamt r1 = bufferevent_add_event_(&bev->ev_read, &bev->timeout_read);
987 1.1.1.1.4.2 yamt if (wpending)
988 1.1.1.1.4.2 yamt r2 = bufferevent_add_event_(&bev->ev_write, &bev->timeout_write);
989 1.1.1.1.4.2 yamt if (fd >= 0) {
990 1.1.1.1.4.2 yamt bev_ssl->fd_is_set = 1;
991 1.1.1.1.4.2 yamt }
992 1.1.1.1.4.2 yamt return (r1<0 || r2<0) ? -1 : 0;
993 1.1.1.1.4.2 yamt }
994 1.1.1.1.4.2 yamt }
995 1.1.1.1.4.2 yamt
996 1.1.1.1.4.2 yamt static int
997 1.1.1.1.4.2 yamt do_handshake(struct bufferevent_openssl *bev_ssl)
998 1.1.1.1.4.2 yamt {
999 1.1.1.1.4.2 yamt int r;
1000 1.1.1.1.4.2 yamt
1001 1.1.1.1.4.2 yamt switch (bev_ssl->state) {
1002 1.1.1.1.4.2 yamt default:
1003 1.1.1.1.4.2 yamt case BUFFEREVENT_SSL_OPEN:
1004 1.1.1.1.4.2 yamt EVUTIL_ASSERT(0);
1005 1.1.1.1.4.2 yamt return -1;
1006 1.1.1.1.4.2 yamt case BUFFEREVENT_SSL_CONNECTING:
1007 1.1.1.1.4.2 yamt case BUFFEREVENT_SSL_ACCEPTING:
1008 1.1.1.1.4.2 yamt r = SSL_do_handshake(bev_ssl->ssl);
1009 1.1.1.1.4.2 yamt break;
1010 1.1.1.1.4.2 yamt }
1011 1.1.1.1.4.2 yamt decrement_buckets(bev_ssl);
1012 1.1.1.1.4.2 yamt
1013 1.1.1.1.4.2 yamt if (r==1) {
1014 1.1.1.1.4.2 yamt /* We're done! */
1015 1.1.1.1.4.2 yamt bev_ssl->state = BUFFEREVENT_SSL_OPEN;
1016 1.1.1.1.4.2 yamt set_open_callbacks(bev_ssl, -1); /* XXXX handle failure */
1017 1.1.1.1.4.2 yamt /* Call do_read and do_write as needed */
1018 1.1.1.1.4.2 yamt bufferevent_enable(&bev_ssl->bev.bev, bev_ssl->bev.bev.enabled);
1019 1.1.1.1.4.2 yamt bufferevent_run_eventcb_(&bev_ssl->bev.bev,
1020 1.1.1.1.4.2 yamt BEV_EVENT_CONNECTED);
1021 1.1.1.1.4.2 yamt return 1;
1022 1.1.1.1.4.2 yamt } else {
1023 1.1.1.1.4.2 yamt int err = SSL_get_error(bev_ssl->ssl, r);
1024 1.1.1.1.4.2 yamt print_err(err);
1025 1.1.1.1.4.2 yamt switch (err) {
1026 1.1.1.1.4.2 yamt case SSL_ERROR_WANT_WRITE:
1027 1.1.1.1.4.2 yamt if (!bev_ssl->underlying) {
1028 1.1.1.1.4.2 yamt stop_reading(bev_ssl);
1029 1.1.1.1.4.2 yamt return start_writing(bev_ssl);
1030 1.1.1.1.4.2 yamt }
1031 1.1.1.1.4.2 yamt return 0;
1032 1.1.1.1.4.2 yamt case SSL_ERROR_WANT_READ:
1033 1.1.1.1.4.2 yamt if (!bev_ssl->underlying) {
1034 1.1.1.1.4.2 yamt stop_writing(bev_ssl);
1035 1.1.1.1.4.2 yamt return start_reading(bev_ssl);
1036 1.1.1.1.4.2 yamt }
1037 1.1.1.1.4.2 yamt return 0;
1038 1.1.1.1.4.2 yamt default:
1039 1.1.1.1.4.2 yamt conn_closed(bev_ssl, BEV_EVENT_READING, err, r);
1040 1.1.1.1.4.2 yamt return -1;
1041 1.1.1.1.4.2 yamt }
1042 1.1.1.1.4.2 yamt }
1043 1.1.1.1.4.2 yamt }
1044 1.1.1.1.4.2 yamt
1045 1.1.1.1.4.2 yamt static void
1046 1.1.1.1.4.2 yamt be_openssl_handshakecb(struct bufferevent *bev_base, void *ctx)
1047 1.1.1.1.4.2 yamt {
1048 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = ctx;
1049 1.1.1.1.4.2 yamt do_handshake(bev_ssl);/* XXX handle failure */
1050 1.1.1.1.4.2 yamt }
1051 1.1.1.1.4.2 yamt
1052 1.1.1.1.4.2 yamt static void
1053 1.1.1.1.4.2 yamt be_openssl_handshakeeventcb(evutil_socket_t fd, short what, void *ptr)
1054 1.1.1.1.4.2 yamt {
1055 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = ptr;
1056 1.1.1.1.4.2 yamt
1057 1.1.1.1.4.2 yamt bufferevent_incref_and_lock_(&bev_ssl->bev.bev);
1058 1.1.1.1.4.2 yamt if (what & EV_TIMEOUT) {
1059 1.1.1.1.4.2 yamt bufferevent_run_eventcb_(&bev_ssl->bev.bev, BEV_EVENT_TIMEOUT);
1060 1.1.1.1.4.2 yamt } else
1061 1.1.1.1.4.2 yamt do_handshake(bev_ssl);/* XXX handle failure */
1062 1.1.1.1.4.2 yamt bufferevent_decref_and_unlock_(&bev_ssl->bev.bev);
1063 1.1.1.1.4.2 yamt }
1064 1.1.1.1.4.2 yamt
1065 1.1.1.1.4.2 yamt static int
1066 1.1.1.1.4.2 yamt set_handshake_callbacks(struct bufferevent_openssl *bev_ssl, evutil_socket_t fd)
1067 1.1.1.1.4.2 yamt {
1068 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
1069 1.1.1.1.4.2 yamt bufferevent_setcb(bev_ssl->underlying,
1070 1.1.1.1.4.2 yamt be_openssl_handshakecb, be_openssl_handshakecb,
1071 1.1.1.1.4.2 yamt be_openssl_eventcb,
1072 1.1.1.1.4.2 yamt bev_ssl);
1073 1.1.1.1.4.2 yamt return do_handshake(bev_ssl);
1074 1.1.1.1.4.2 yamt } else {
1075 1.1.1.1.4.2 yamt struct bufferevent *bev = &bev_ssl->bev.bev;
1076 1.1.1.1.4.2 yamt int r1=0, r2=0;
1077 1.1.1.1.4.2 yamt if (fd < 0 && bev_ssl->fd_is_set)
1078 1.1.1.1.4.2 yamt fd = event_get_fd(&bev->ev_read);
1079 1.1.1.1.4.2 yamt if (bev_ssl->fd_is_set) {
1080 1.1.1.1.4.2 yamt event_del(&bev->ev_read);
1081 1.1.1.1.4.2 yamt event_del(&bev->ev_write);
1082 1.1.1.1.4.2 yamt }
1083 1.1.1.1.4.2 yamt event_assign(&bev->ev_read, bev->ev_base, fd,
1084 1.1.1.1.4.2 yamt EV_READ|EV_PERSIST, be_openssl_handshakeeventcb, bev_ssl);
1085 1.1.1.1.4.2 yamt event_assign(&bev->ev_write, bev->ev_base, fd,
1086 1.1.1.1.4.2 yamt EV_WRITE|EV_PERSIST, be_openssl_handshakeeventcb, bev_ssl);
1087 1.1.1.1.4.2 yamt if (fd >= 0) {
1088 1.1.1.1.4.2 yamt r1 = bufferevent_add_event_(&bev->ev_read, &bev->timeout_read);
1089 1.1.1.1.4.2 yamt r2 = bufferevent_add_event_(&bev->ev_write, &bev->timeout_write);
1090 1.1.1.1.4.2 yamt bev_ssl->fd_is_set = 1;
1091 1.1.1.1.4.2 yamt }
1092 1.1.1.1.4.2 yamt return (r1<0 || r2<0) ? -1 : 0;
1093 1.1.1.1.4.2 yamt }
1094 1.1.1.1.4.2 yamt }
1095 1.1.1.1.4.2 yamt
1096 1.1.1.1.4.2 yamt int
1097 1.1.1.1.4.2 yamt bufferevent_ssl_renegotiate(struct bufferevent *bev)
1098 1.1.1.1.4.2 yamt {
1099 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = upcast(bev);
1100 1.1.1.1.4.2 yamt if (!bev_ssl)
1101 1.1.1.1.4.2 yamt return -1;
1102 1.1.1.1.4.2 yamt if (SSL_renegotiate(bev_ssl->ssl) < 0)
1103 1.1.1.1.4.2 yamt return -1;
1104 1.1.1.1.4.2 yamt bev_ssl->state = BUFFEREVENT_SSL_CONNECTING;
1105 1.1.1.1.4.2 yamt if (set_handshake_callbacks(bev_ssl, -1) < 0)
1106 1.1.1.1.4.2 yamt return -1;
1107 1.1.1.1.4.2 yamt if (!bev_ssl->underlying)
1108 1.1.1.1.4.2 yamt return do_handshake(bev_ssl);
1109 1.1.1.1.4.2 yamt return 0;
1110 1.1.1.1.4.2 yamt }
1111 1.1.1.1.4.2 yamt
1112 1.1.1.1.4.2 yamt static void
1113 1.1.1.1.4.2 yamt be_openssl_outbuf_cb(struct evbuffer *buf,
1114 1.1.1.1.4.2 yamt const struct evbuffer_cb_info *cbinfo, void *arg)
1115 1.1.1.1.4.2 yamt {
1116 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = arg;
1117 1.1.1.1.4.2 yamt int r = 0;
1118 1.1.1.1.4.2 yamt /* XXX need to hold a reference here. */
1119 1.1.1.1.4.2 yamt
1120 1.1.1.1.4.2 yamt if (cbinfo->n_added && bev_ssl->state == BUFFEREVENT_SSL_OPEN) {
1121 1.1.1.1.4.2 yamt if (cbinfo->orig_size == 0)
1122 1.1.1.1.4.2 yamt r = bufferevent_add_event_(&bev_ssl->bev.bev.ev_write,
1123 1.1.1.1.4.2 yamt &bev_ssl->bev.bev.timeout_write);
1124 1.1.1.1.4.2 yamt consider_writing(bev_ssl);
1125 1.1.1.1.4.2 yamt }
1126 1.1.1.1.4.2 yamt /* XXX Handle r < 0 */
1127 1.1.1.1.4.2 yamt (void)r;
1128 1.1.1.1.4.2 yamt }
1129 1.1.1.1.4.2 yamt
1130 1.1.1.1.4.2 yamt
1131 1.1.1.1.4.2 yamt static int
1132 1.1.1.1.4.2 yamt be_openssl_enable(struct bufferevent *bev, short events)
1133 1.1.1.1.4.2 yamt {
1134 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = upcast(bev);
1135 1.1.1.1.4.2 yamt int r1 = 0, r2 = 0;
1136 1.1.1.1.4.2 yamt
1137 1.1.1.1.4.2 yamt if (bev_ssl->state != BUFFEREVENT_SSL_OPEN)
1138 1.1.1.1.4.2 yamt return 0;
1139 1.1.1.1.4.2 yamt
1140 1.1.1.1.4.2 yamt if (events & EV_READ)
1141 1.1.1.1.4.2 yamt r1 = start_reading(bev_ssl);
1142 1.1.1.1.4.2 yamt if (events & EV_WRITE)
1143 1.1.1.1.4.2 yamt r2 = start_writing(bev_ssl);
1144 1.1.1.1.4.2 yamt
1145 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
1146 1.1.1.1.4.2 yamt if (events & EV_READ)
1147 1.1.1.1.4.2 yamt BEV_RESET_GENERIC_READ_TIMEOUT(bev);
1148 1.1.1.1.4.2 yamt if (events & EV_WRITE)
1149 1.1.1.1.4.2 yamt BEV_RESET_GENERIC_WRITE_TIMEOUT(bev);
1150 1.1.1.1.4.2 yamt
1151 1.1.1.1.4.2 yamt if (events & EV_READ)
1152 1.1.1.1.4.2 yamt consider_reading(bev_ssl);
1153 1.1.1.1.4.2 yamt if (events & EV_WRITE)
1154 1.1.1.1.4.2 yamt consider_writing(bev_ssl);
1155 1.1.1.1.4.2 yamt }
1156 1.1.1.1.4.2 yamt return (r1 < 0 || r2 < 0) ? -1 : 0;
1157 1.1.1.1.4.2 yamt }
1158 1.1.1.1.4.2 yamt
1159 1.1.1.1.4.2 yamt static int
1160 1.1.1.1.4.2 yamt be_openssl_disable(struct bufferevent *bev, short events)
1161 1.1.1.1.4.2 yamt {
1162 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = upcast(bev);
1163 1.1.1.1.4.2 yamt if (bev_ssl->state != BUFFEREVENT_SSL_OPEN)
1164 1.1.1.1.4.2 yamt return 0;
1165 1.1.1.1.4.2 yamt
1166 1.1.1.1.4.2 yamt if (events & EV_READ)
1167 1.1.1.1.4.2 yamt stop_reading(bev_ssl);
1168 1.1.1.1.4.2 yamt if (events & EV_WRITE)
1169 1.1.1.1.4.2 yamt stop_writing(bev_ssl);
1170 1.1.1.1.4.2 yamt
1171 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
1172 1.1.1.1.4.2 yamt if (events & EV_READ)
1173 1.1.1.1.4.2 yamt BEV_DEL_GENERIC_READ_TIMEOUT(bev);
1174 1.1.1.1.4.2 yamt if (events & EV_WRITE)
1175 1.1.1.1.4.2 yamt BEV_DEL_GENERIC_WRITE_TIMEOUT(bev);
1176 1.1.1.1.4.2 yamt }
1177 1.1.1.1.4.2 yamt return 0;
1178 1.1.1.1.4.2 yamt }
1179 1.1.1.1.4.2 yamt
1180 1.1.1.1.4.2 yamt static void
1181 1.1.1.1.4.2 yamt be_openssl_destruct(struct bufferevent *bev)
1182 1.1.1.1.4.2 yamt {
1183 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = upcast(bev);
1184 1.1.1.1.4.2 yamt
1185 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
1186 1.1.1.1.4.2 yamt bufferevent_del_generic_timeout_cbs_(bev);
1187 1.1.1.1.4.2 yamt } else {
1188 1.1.1.1.4.2 yamt event_del(&bev->ev_read);
1189 1.1.1.1.4.2 yamt event_del(&bev->ev_write);
1190 1.1.1.1.4.2 yamt }
1191 1.1.1.1.4.2 yamt
1192 1.1.1.1.4.2 yamt if (bev_ssl->bev.options & BEV_OPT_CLOSE_ON_FREE) {
1193 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
1194 1.1.1.1.4.2 yamt if (BEV_UPCAST(bev_ssl->underlying)->refcnt < 2) {
1195 1.1.1.1.4.2 yamt event_warnx("BEV_OPT_CLOSE_ON_FREE set on an "
1196 1.1.1.1.4.2 yamt "bufferevent with too few references");
1197 1.1.1.1.4.2 yamt } else {
1198 1.1.1.1.4.2 yamt bufferevent_free(bev_ssl->underlying);
1199 1.1.1.1.4.2 yamt bev_ssl->underlying = NULL;
1200 1.1.1.1.4.2 yamt }
1201 1.1.1.1.4.2 yamt } else {
1202 1.1.1.1.4.2 yamt evutil_socket_t fd = -1;
1203 1.1.1.1.4.2 yamt BIO *bio = SSL_get_wbio(bev_ssl->ssl);
1204 1.1.1.1.4.2 yamt if (bio)
1205 1.1.1.1.4.2 yamt fd = BIO_get_fd(bio, NULL);
1206 1.1.1.1.4.2 yamt if (fd >= 0)
1207 1.1.1.1.4.2 yamt evutil_closesocket(fd);
1208 1.1.1.1.4.2 yamt }
1209 1.1.1.1.4.2 yamt SSL_free(bev_ssl->ssl);
1210 1.1.1.1.4.2 yamt } else {
1211 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
1212 1.1.1.1.4.2 yamt if (bev_ssl->underlying->errorcb == be_openssl_eventcb)
1213 1.1.1.1.4.2 yamt bufferevent_setcb(bev_ssl->underlying,
1214 1.1.1.1.4.2 yamt NULL,NULL,NULL,NULL);
1215 1.1.1.1.4.2 yamt bufferevent_unsuspend_read_(bev_ssl->underlying,
1216 1.1.1.1.4.2 yamt BEV_SUSPEND_FILT_READ);
1217 1.1.1.1.4.2 yamt }
1218 1.1.1.1.4.2 yamt }
1219 1.1.1.1.4.2 yamt }
1220 1.1.1.1.4.2 yamt
1221 1.1.1.1.4.2 yamt static int
1222 1.1.1.1.4.2 yamt be_openssl_adj_timeouts(struct bufferevent *bev)
1223 1.1.1.1.4.2 yamt {
1224 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = upcast(bev);
1225 1.1.1.1.4.2 yamt
1226 1.1.1.1.4.2 yamt if (bev_ssl->underlying) {
1227 1.1.1.1.4.2 yamt return bufferevent_generic_adj_timeouts_(bev);
1228 1.1.1.1.4.2 yamt } else {
1229 1.1.1.1.4.2 yamt int r1=0, r2=0;
1230 1.1.1.1.4.2 yamt if (event_pending(&bev->ev_read, EV_READ, NULL)) {
1231 1.1.1.1.4.2 yamt if (evutil_timerisset(&bev->timeout_read)) {
1232 1.1.1.1.4.2 yamt r1 = bufferevent_add_event_(&bev->ev_read, &bev->timeout_read);
1233 1.1.1.1.4.2 yamt } else {
1234 1.1.1.1.4.2 yamt event_remove_timer(&bev->ev_read);
1235 1.1.1.1.4.2 yamt }
1236 1.1.1.1.4.2 yamt }
1237 1.1.1.1.4.2 yamt if (event_pending(&bev->ev_write, EV_WRITE, NULL)) {
1238 1.1.1.1.4.2 yamt if (evutil_timerisset(&bev->timeout_write)) {
1239 1.1.1.1.4.2 yamt r2 = bufferevent_add_event_(&bev->ev_write, &bev->timeout_write);
1240 1.1.1.1.4.2 yamt } else {
1241 1.1.1.1.4.2 yamt event_remove_timer(&bev->ev_write);
1242 1.1.1.1.4.2 yamt }
1243 1.1.1.1.4.2 yamt }
1244 1.1.1.1.4.2 yamt
1245 1.1.1.1.4.2 yamt return (r1<0 || r2<0) ? -1 : 0;
1246 1.1.1.1.4.2 yamt }
1247 1.1.1.1.4.2 yamt }
1248 1.1.1.1.4.2 yamt
1249 1.1.1.1.4.2 yamt static int
1250 1.1.1.1.4.2 yamt be_openssl_flush(struct bufferevent *bufev,
1251 1.1.1.1.4.2 yamt short iotype, enum bufferevent_flush_mode mode)
1252 1.1.1.1.4.2 yamt {
1253 1.1.1.1.4.2 yamt /* XXXX Implement this. */
1254 1.1.1.1.4.2 yamt return 0;
1255 1.1.1.1.4.2 yamt }
1256 1.1.1.1.4.2 yamt
1257 1.1.1.1.4.2 yamt static int
1258 1.1.1.1.4.2 yamt be_openssl_ctrl(struct bufferevent *bev,
1259 1.1.1.1.4.2 yamt enum bufferevent_ctrl_op op, union bufferevent_ctrl_data *data)
1260 1.1.1.1.4.2 yamt {
1261 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = upcast(bev);
1262 1.1.1.1.4.2 yamt switch (op) {
1263 1.1.1.1.4.2 yamt case BEV_CTRL_SET_FD:
1264 1.1.1.1.4.2 yamt if (bev_ssl->underlying)
1265 1.1.1.1.4.2 yamt return -1;
1266 1.1.1.1.4.2 yamt {
1267 1.1.1.1.4.2 yamt BIO *bio;
1268 1.1.1.1.4.2 yamt bio = BIO_new_socket(data->fd, 0);
1269 1.1.1.1.4.2 yamt SSL_set_bio(bev_ssl->ssl, bio, bio);
1270 1.1.1.1.4.2 yamt bev_ssl->fd_is_set = 1;
1271 1.1.1.1.4.2 yamt }
1272 1.1.1.1.4.2 yamt if (bev_ssl->state == BUFFEREVENT_SSL_OPEN)
1273 1.1.1.1.4.2 yamt return set_open_callbacks(bev_ssl, data->fd);
1274 1.1.1.1.4.2 yamt else {
1275 1.1.1.1.4.2 yamt return set_handshake_callbacks(bev_ssl, data->fd);
1276 1.1.1.1.4.2 yamt }
1277 1.1.1.1.4.2 yamt case BEV_CTRL_GET_FD:
1278 1.1.1.1.4.2 yamt if (bev_ssl->underlying)
1279 1.1.1.1.4.2 yamt return -1;
1280 1.1.1.1.4.2 yamt if (!bev_ssl->fd_is_set)
1281 1.1.1.1.4.2 yamt return -1;
1282 1.1.1.1.4.2 yamt data->fd = event_get_fd(&bev->ev_read);
1283 1.1.1.1.4.2 yamt return 0;
1284 1.1.1.1.4.2 yamt case BEV_CTRL_GET_UNDERLYING:
1285 1.1.1.1.4.2 yamt if (!bev_ssl->underlying)
1286 1.1.1.1.4.2 yamt return -1;
1287 1.1.1.1.4.2 yamt data->ptr = bev_ssl->underlying;
1288 1.1.1.1.4.2 yamt return 0;
1289 1.1.1.1.4.2 yamt case BEV_CTRL_CANCEL_ALL:
1290 1.1.1.1.4.2 yamt default:
1291 1.1.1.1.4.2 yamt return -1;
1292 1.1.1.1.4.2 yamt }
1293 1.1.1.1.4.2 yamt }
1294 1.1.1.1.4.2 yamt
1295 1.1.1.1.4.2 yamt SSL *
1296 1.1.1.1.4.2 yamt bufferevent_openssl_get_ssl(struct bufferevent *bufev)
1297 1.1.1.1.4.2 yamt {
1298 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = upcast(bufev);
1299 1.1.1.1.4.2 yamt if (!bev_ssl)
1300 1.1.1.1.4.2 yamt return NULL;
1301 1.1.1.1.4.2 yamt return bev_ssl->ssl;
1302 1.1.1.1.4.2 yamt }
1303 1.1.1.1.4.2 yamt
1304 1.1.1.1.4.2 yamt static struct bufferevent *
1305 1.1.1.1.4.2 yamt bufferevent_openssl_new_impl(struct event_base *base,
1306 1.1.1.1.4.2 yamt struct bufferevent *underlying,
1307 1.1.1.1.4.2 yamt evutil_socket_t fd,
1308 1.1.1.1.4.2 yamt SSL *ssl,
1309 1.1.1.1.4.2 yamt enum bufferevent_ssl_state state,
1310 1.1.1.1.4.2 yamt int options)
1311 1.1.1.1.4.2 yamt {
1312 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl = NULL;
1313 1.1.1.1.4.2 yamt struct bufferevent_private *bev_p = NULL;
1314 1.1.1.1.4.2 yamt int tmp_options = options & ~BEV_OPT_THREADSAFE;
1315 1.1.1.1.4.2 yamt
1316 1.1.1.1.4.2 yamt if (underlying != NULL && fd >= 0)
1317 1.1.1.1.4.2 yamt return NULL; /* Only one can be set. */
1318 1.1.1.1.4.2 yamt
1319 1.1.1.1.4.2 yamt if (!(bev_ssl = mm_calloc(1, sizeof(struct bufferevent_openssl))))
1320 1.1.1.1.4.2 yamt goto err;
1321 1.1.1.1.4.2 yamt
1322 1.1.1.1.4.2 yamt bev_p = &bev_ssl->bev;
1323 1.1.1.1.4.2 yamt
1324 1.1.1.1.4.2 yamt if (bufferevent_init_common_(bev_p, base,
1325 1.1.1.1.4.2 yamt &bufferevent_ops_openssl, tmp_options) < 0)
1326 1.1.1.1.4.2 yamt goto err;
1327 1.1.1.1.4.2 yamt
1328 1.1.1.1.4.2 yamt /* Don't explode if we decide to realloc a chunk we're writing from in
1329 1.1.1.1.4.2 yamt * the output buffer. */
1330 1.1.1.1.4.2 yamt SSL_set_mode(ssl, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
1331 1.1.1.1.4.2 yamt
1332 1.1.1.1.4.2 yamt bev_ssl->underlying = underlying;
1333 1.1.1.1.4.2 yamt bev_ssl->ssl = ssl;
1334 1.1.1.1.4.2 yamt
1335 1.1.1.1.4.2 yamt bev_ssl->outbuf_cb = evbuffer_add_cb(bev_p->bev.output,
1336 1.1.1.1.4.2 yamt be_openssl_outbuf_cb, bev_ssl);
1337 1.1.1.1.4.2 yamt
1338 1.1.1.1.4.2 yamt if (options & BEV_OPT_THREADSAFE)
1339 1.1.1.1.4.2 yamt bufferevent_enable_locking_(&bev_ssl->bev.bev, NULL);
1340 1.1.1.1.4.2 yamt
1341 1.1.1.1.4.2 yamt if (underlying) {
1342 1.1.1.1.4.2 yamt bufferevent_init_generic_timeout_cbs_(&bev_ssl->bev.bev);
1343 1.1.1.1.4.2 yamt bufferevent_incref_(underlying);
1344 1.1.1.1.4.2 yamt }
1345 1.1.1.1.4.2 yamt
1346 1.1.1.1.4.2 yamt bev_ssl->state = state;
1347 1.1.1.1.4.2 yamt bev_ssl->last_write = -1;
1348 1.1.1.1.4.2 yamt
1349 1.1.1.1.4.2 yamt init_bio_counts(bev_ssl);
1350 1.1.1.1.4.2 yamt
1351 1.1.1.1.4.2 yamt switch (state) {
1352 1.1.1.1.4.2 yamt case BUFFEREVENT_SSL_ACCEPTING:
1353 1.1.1.1.4.2 yamt SSL_set_accept_state(bev_ssl->ssl);
1354 1.1.1.1.4.2 yamt if (set_handshake_callbacks(bev_ssl, fd) < 0)
1355 1.1.1.1.4.2 yamt goto err;
1356 1.1.1.1.4.2 yamt break;
1357 1.1.1.1.4.2 yamt case BUFFEREVENT_SSL_CONNECTING:
1358 1.1.1.1.4.2 yamt SSL_set_connect_state(bev_ssl->ssl);
1359 1.1.1.1.4.2 yamt if (set_handshake_callbacks(bev_ssl, fd) < 0)
1360 1.1.1.1.4.2 yamt goto err;
1361 1.1.1.1.4.2 yamt break;
1362 1.1.1.1.4.2 yamt case BUFFEREVENT_SSL_OPEN:
1363 1.1.1.1.4.2 yamt if (set_open_callbacks(bev_ssl, fd) < 0)
1364 1.1.1.1.4.2 yamt goto err;
1365 1.1.1.1.4.2 yamt break;
1366 1.1.1.1.4.2 yamt default:
1367 1.1.1.1.4.2 yamt goto err;
1368 1.1.1.1.4.2 yamt }
1369 1.1.1.1.4.2 yamt
1370 1.1.1.1.4.2 yamt if (underlying) {
1371 1.1.1.1.4.2 yamt bufferevent_setwatermark(underlying, EV_READ, 0, 0);
1372 1.1.1.1.4.2 yamt bufferevent_enable(underlying, EV_READ|EV_WRITE);
1373 1.1.1.1.4.2 yamt if (state == BUFFEREVENT_SSL_OPEN)
1374 1.1.1.1.4.2 yamt bufferevent_suspend_read_(underlying,
1375 1.1.1.1.4.2 yamt BEV_SUSPEND_FILT_READ);
1376 1.1.1.1.4.2 yamt } else {
1377 1.1.1.1.4.2 yamt bev_ssl->bev.bev.enabled = EV_READ|EV_WRITE;
1378 1.1.1.1.4.2 yamt if (bev_ssl->fd_is_set) {
1379 1.1.1.1.4.2 yamt if (state != BUFFEREVENT_SSL_OPEN)
1380 1.1.1.1.4.2 yamt if (event_add(&bev_ssl->bev.bev.ev_read, NULL) < 0)
1381 1.1.1.1.4.2 yamt goto err;
1382 1.1.1.1.4.2 yamt if (event_add(&bev_ssl->bev.bev.ev_write, NULL) < 0)
1383 1.1.1.1.4.2 yamt goto err;
1384 1.1.1.1.4.2 yamt }
1385 1.1.1.1.4.2 yamt }
1386 1.1.1.1.4.2 yamt
1387 1.1.1.1.4.2 yamt return &bev_ssl->bev.bev;
1388 1.1.1.1.4.2 yamt err:
1389 1.1.1.1.4.2 yamt if (bev_ssl)
1390 1.1.1.1.4.2 yamt bufferevent_free(&bev_ssl->bev.bev);
1391 1.1.1.1.4.2 yamt return NULL;
1392 1.1.1.1.4.2 yamt }
1393 1.1.1.1.4.2 yamt
1394 1.1.1.1.4.2 yamt struct bufferevent *
1395 1.1.1.1.4.2 yamt bufferevent_openssl_filter_new(struct event_base *base,
1396 1.1.1.1.4.2 yamt struct bufferevent *underlying,
1397 1.1.1.1.4.2 yamt SSL *ssl,
1398 1.1.1.1.4.2 yamt enum bufferevent_ssl_state state,
1399 1.1.1.1.4.2 yamt int options)
1400 1.1.1.1.4.2 yamt {
1401 1.1.1.1.4.2 yamt /* We don't tell the BIO to close the bufferevent; we do it ourselves
1402 1.1.1.1.4.2 yamt * on be_openssl_destruct */
1403 1.1.1.1.4.2 yamt int close_flag = 0; /* options & BEV_OPT_CLOSE_ON_FREE; */
1404 1.1.1.1.4.2 yamt BIO *bio;
1405 1.1.1.1.4.2 yamt if (!underlying)
1406 1.1.1.1.4.2 yamt return NULL;
1407 1.1.1.1.4.2 yamt if (!(bio = BIO_new_bufferevent(underlying, close_flag)))
1408 1.1.1.1.4.2 yamt return NULL;
1409 1.1.1.1.4.2 yamt
1410 1.1.1.1.4.2 yamt SSL_set_bio(ssl, bio, bio);
1411 1.1.1.1.4.2 yamt
1412 1.1.1.1.4.2 yamt return bufferevent_openssl_new_impl(
1413 1.1.1.1.4.2 yamt base, underlying, -1, ssl, state, options);
1414 1.1.1.1.4.2 yamt }
1415 1.1.1.1.4.2 yamt
1416 1.1.1.1.4.2 yamt struct bufferevent *
1417 1.1.1.1.4.2 yamt bufferevent_openssl_socket_new(struct event_base *base,
1418 1.1.1.1.4.2 yamt evutil_socket_t fd,
1419 1.1.1.1.4.2 yamt SSL *ssl,
1420 1.1.1.1.4.2 yamt enum bufferevent_ssl_state state,
1421 1.1.1.1.4.2 yamt int options)
1422 1.1.1.1.4.2 yamt {
1423 1.1.1.1.4.2 yamt /* Does the SSL already have an fd? */
1424 1.1.1.1.4.2 yamt BIO *bio = SSL_get_wbio(ssl);
1425 1.1.1.1.4.2 yamt long have_fd = -1;
1426 1.1.1.1.4.2 yamt
1427 1.1.1.1.4.2 yamt if (bio)
1428 1.1.1.1.4.2 yamt have_fd = BIO_get_fd(bio, NULL);
1429 1.1.1.1.4.2 yamt
1430 1.1.1.1.4.2 yamt if (have_fd >= 0) {
1431 1.1.1.1.4.2 yamt /* The SSL is already configured with an fd. */
1432 1.1.1.1.4.2 yamt if (fd < 0) {
1433 1.1.1.1.4.2 yamt /* We should learn the fd from the SSL. */
1434 1.1.1.1.4.2 yamt fd = (evutil_socket_t) have_fd;
1435 1.1.1.1.4.2 yamt } else if (have_fd == (long)fd) {
1436 1.1.1.1.4.2 yamt /* We already know the fd from the SSL; do nothing */
1437 1.1.1.1.4.2 yamt } else {
1438 1.1.1.1.4.2 yamt /* We specified an fd different from that of the SSL.
1439 1.1.1.1.4.2 yamt This is probably an error on our part. Fail. */
1440 1.1.1.1.4.2 yamt return NULL;
1441 1.1.1.1.4.2 yamt }
1442 1.1.1.1.4.2 yamt (void) BIO_set_close(bio, 0);
1443 1.1.1.1.4.2 yamt } else {
1444 1.1.1.1.4.2 yamt /* The SSL isn't configured with a BIO with an fd. */
1445 1.1.1.1.4.2 yamt if (fd >= 0) {
1446 1.1.1.1.4.2 yamt /* ... and we have an fd we want to use. */
1447 1.1.1.1.4.2 yamt bio = BIO_new_socket(fd, 0);
1448 1.1.1.1.4.2 yamt SSL_set_bio(ssl, bio, bio);
1449 1.1.1.1.4.2 yamt } else {
1450 1.1.1.1.4.2 yamt /* Leave the fd unset. */
1451 1.1.1.1.4.2 yamt }
1452 1.1.1.1.4.2 yamt }
1453 1.1.1.1.4.2 yamt
1454 1.1.1.1.4.2 yamt return bufferevent_openssl_new_impl(
1455 1.1.1.1.4.2 yamt base, NULL, fd, ssl, state, options);
1456 1.1.1.1.4.2 yamt }
1457 1.1.1.1.4.2 yamt
1458 1.1.1.1.4.2 yamt int
1459 1.1.1.1.4.2 yamt bufferevent_openssl_get_allow_dirty_shutdown(struct bufferevent *bev)
1460 1.1.1.1.4.2 yamt {
1461 1.1.1.1.4.2 yamt int allow_dirty_shutdown = -1;
1462 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl;
1463 1.1.1.1.4.2 yamt BEV_LOCK(bev);
1464 1.1.1.1.4.2 yamt bev_ssl = upcast(bev);
1465 1.1.1.1.4.2 yamt if (bev_ssl)
1466 1.1.1.1.4.2 yamt allow_dirty_shutdown = bev_ssl->allow_dirty_shutdown;
1467 1.1.1.1.4.2 yamt BEV_UNLOCK(bev);
1468 1.1.1.1.4.2 yamt return allow_dirty_shutdown;
1469 1.1.1.1.4.2 yamt }
1470 1.1.1.1.4.2 yamt
1471 1.1.1.1.4.2 yamt void
1472 1.1.1.1.4.2 yamt bufferevent_openssl_set_allow_dirty_shutdown(struct bufferevent *bev,
1473 1.1.1.1.4.2 yamt int allow_dirty_shutdown)
1474 1.1.1.1.4.2 yamt {
1475 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl;
1476 1.1.1.1.4.2 yamt BEV_LOCK(bev);
1477 1.1.1.1.4.2 yamt bev_ssl = upcast(bev);
1478 1.1.1.1.4.2 yamt if (bev_ssl)
1479 1.1.1.1.4.2 yamt bev_ssl->allow_dirty_shutdown = !!allow_dirty_shutdown;
1480 1.1.1.1.4.2 yamt BEV_UNLOCK(bev);
1481 1.1.1.1.4.2 yamt }
1482 1.1.1.1.4.2 yamt
1483 1.1.1.1.4.2 yamt unsigned long
1484 1.1.1.1.4.2 yamt bufferevent_get_openssl_error(struct bufferevent *bev)
1485 1.1.1.1.4.2 yamt {
1486 1.1.1.1.4.2 yamt unsigned long err = 0;
1487 1.1.1.1.4.2 yamt struct bufferevent_openssl *bev_ssl;
1488 1.1.1.1.4.2 yamt BEV_LOCK(bev);
1489 1.1.1.1.4.2 yamt bev_ssl = upcast(bev);
1490 1.1.1.1.4.2 yamt if (bev_ssl && bev_ssl->n_errors) {
1491 1.1.1.1.4.2 yamt err = bev_ssl->errors[--bev_ssl->n_errors];
1492 1.1.1.1.4.2 yamt }
1493 1.1.1.1.4.2 yamt BEV_UNLOCK(bev);
1494 1.1.1.1.4.2 yamt return err;
1495 1.1.1.1.4.2 yamt }
1496