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