]> git.proxmox.com Git - mirror_ovs.git/blame - lib/stream-ssl.c
stream: By default disable probing on unix sockets.
[mirror_ovs.git] / lib / stream-ssl.c
CommitLineData
9467fe62 1/*
f01eb73c 2 * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
9467fe62
BP
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <config.h>
18#include "stream-ssl.h"
19#include "dhparams.h"
20#include <assert.h>
21#include <ctype.h>
22#include <errno.h>
23#include <inttypes.h>
24#include <string.h>
bd6b7545
GC
25#include <sys/types.h>
26#include <sys/socket.h>
9467fe62
BP
27#include <netinet/tcp.h>
28#include <openssl/err.h>
29#include <openssl/ssl.h>
30#include <openssl/x509v3.h>
31#include <poll.h>
32#include <sys/fcntl.h>
33#include <sys/stat.h>
34#include <unistd.h>
f2f7be86 35#include "coverage.h"
9467fe62
BP
36#include "dynamic-string.h"
37#include "leak-checker.h"
38#include "ofpbuf.h"
39#include "openflow/openflow.h"
40#include "packets.h"
41#include "poll-loop.h"
f2f7be86 42#include "shash.h"
9467fe62 43#include "socket-util.h"
9467fe62
BP
44#include "util.h"
45#include "stream-provider.h"
46#include "stream.h"
415f6c0b 47#include "timeval.h"
9467fe62 48#include "vlog.h"
5136ce49 49
d98e6007 50VLOG_DEFINE_THIS_MODULE(stream_ssl);
9467fe62
BP
51
52/* Active SSL. */
53
54enum ssl_state {
55 STATE_TCP_CONNECTING,
56 STATE_SSL_CONNECTING
57};
58
59enum session_type {
60 CLIENT,
61 SERVER
62};
63
64struct ssl_stream
65{
66 struct stream stream;
67 enum ssl_state state;
9467fe62
BP
68 enum session_type type;
69 int fd;
70 SSL *ssl;
71 struct ofpbuf *txbuf;
ff1760f1 72 unsigned int session_nr;
9467fe62
BP
73
74 /* rx_want and tx_want record the result of the last call to SSL_read()
75 * and SSL_write(), respectively:
76 *
77 * - If the call reported that data needed to be read from the file
78 * descriptor, the corresponding member is set to SSL_READING.
79 *
80 * - If the call reported that data needed to be written to the file
81 * descriptor, the corresponding member is set to SSL_WRITING.
82 *
83 * - Otherwise, the member is set to SSL_NOTHING, indicating that the
84 * call completed successfully (or with an error) and that there is no
85 * need to block.
86 *
87 * These are needed because there is no way to ask OpenSSL what a data read
88 * or write would require without giving it a buffer to receive into or
89 * data to send, respectively. (Note that the SSL_want() status is
90 * overwritten by each SSL_read() or SSL_write() call, so we can't rely on
91 * its value.)
92 *
93 * A single call to SSL_read() or SSL_write() can perform both reading
94 * and writing and thus invalidate not one of these values but actually
95 * both. Consider this situation, for example:
96 *
97 * - SSL_write() blocks on a read, so tx_want gets SSL_READING.
98 *
99 * - SSL_read() laters succeeds reading from 'fd' and clears out the
100 * whole receive buffer, so rx_want gets SSL_READING.
101 *
102 * - Client calls stream_wait(STREAM_RECV) and stream_wait(STREAM_SEND)
103 * and blocks.
104 *
105 * - Now we're stuck blocking until the peer sends us data, even though
106 * SSL_write() could now succeed, which could easily be a deadlock
107 * condition.
108 *
109 * On the other hand, we can't reset both tx_want and rx_want on every call
110 * to SSL_read() or SSL_write(), because that would produce livelock,
111 * e.g. in this situation:
112 *
113 * - SSL_write() blocks, so tx_want gets SSL_READING or SSL_WRITING.
114 *
115 * - SSL_read() blocks, so rx_want gets SSL_READING or SSL_WRITING,
116 * but tx_want gets reset to SSL_NOTHING.
117 *
118 * - Client calls stream_wait(STREAM_RECV) and stream_wait(STREAM_SEND)
119 * and blocks.
120 *
121 * - Client wakes up immediately since SSL_NOTHING in tx_want indicates
122 * that no blocking is necessary.
123 *
124 * The solution we adopt here is to set tx_want to SSL_NOTHING after
125 * calling SSL_read() only if the SSL state of the connection changed,
126 * which indicates that an SSL-level renegotiation made some progress, and
127 * similarly for rx_want and SSL_write(). This prevents both the
128 * deadlock and livelock situations above.
129 */
130 int rx_want, tx_want;
1e3c0047 131
ff1760f1 132 /* A few bytes of header data in case SSL negotiation fails. */
1e3c0047
BP
133 uint8_t head[2];
134 short int n_head;
9467fe62
BP
135};
136
137/* SSL context created by ssl_init(). */
138static SSL_CTX *ctx;
139
415f6c0b
BP
140struct ssl_config_file {
141 bool read; /* Whether the file was successfully read. */
142 char *file_name; /* Configured file name, if any. */
9cb07887 143 struct timespec mtime; /* File mtime as of last time we read it. */
415f6c0b
BP
144};
145
146/* SSL configuration files. */
147static struct ssl_config_file private_key;
148static struct ssl_config_file certificate;
149static struct ssl_config_file ca_cert;
9467fe62 150
ba104a1e
BP
151/* Ordinarily, the SSL client and server verify each other's certificates using
152 * a CA certificate. Setting this to false disables this behavior. (This is a
153 * security risk.) */
154static bool verify_peer_cert = true;
155
9467fe62 156/* Ordinarily, we require a CA certificate for the peer to be locally
415f6c0b
BP
157 * available. We can, however, bootstrap the CA certificate from the peer at
158 * the beginning of our first connection then use that certificate on all
159 * subsequent connections, saving it to a file for use in future runs also. In
160 * this case, 'bootstrap_ca_cert' is true. */
9467fe62 161static bool bootstrap_ca_cert;
9467fe62 162
ff1760f1
BP
163/* Session number. Used in debug logging messages to uniquely identify a
164 * session. */
165static unsigned int next_session_nr;
166
9467fe62
BP
167/* Who knows what can trigger various SSL errors, so let's throttle them down
168 * quite a bit. */
169static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(10, 25);
170
171static int ssl_init(void);
172static int do_ssl_init(void);
173static bool ssl_wants_io(int ssl_error);
174static void ssl_close(struct stream *);
175static void ssl_clear_txbuf(struct ssl_stream *);
246f5b5e 176static void interpret_queued_ssl_error(const char *function);
9467fe62
BP
177static int interpret_ssl_error(const char *function, int ret, int error,
178 int *want);
67a4917b 179static DH *tmp_dh_callback(SSL *ssl, int is_export OVS_UNUSED, int keylength);
9467fe62 180static void log_ca_cert(const char *file_name, X509 *cert);
415f6c0b 181static void stream_ssl_set_ca_cert_file__(const char *file_name,
f1484874 182 bool bootstrap, bool force);
ff1760f1
BP
183static void ssl_protocol_cb(int write_p, int version, int content_type,
184 const void *, size_t, SSL *, void *sslv_);
f1484874 185static bool update_ssl_config(struct ssl_config_file *, const char *file_name);
9467fe62
BP
186
187static short int
188want_to_poll_events(int want)
189{
190 switch (want) {
191 case SSL_NOTHING:
192 NOT_REACHED();
193
194 case SSL_READING:
195 return POLLIN;
196
197 case SSL_WRITING:
198 return POLLOUT;
199
200 default:
201 NOT_REACHED();
202 }
203}
204
205static int
206new_ssl_stream(const char *name, int fd, enum session_type type,
f125905c
MM
207 enum ssl_state state, const struct sockaddr_in *remote,
208 struct stream **streamp)
9467fe62
BP
209{
210 struct sockaddr_in local;
211 socklen_t local_len = sizeof local;
212 struct ssl_stream *sslv;
213 SSL *ssl = NULL;
214 int on = 1;
215 int retval;
216
217 /* Check for all the needful configuration. */
218 retval = 0;
415f6c0b 219 if (!private_key.read) {
9467fe62
BP
220 VLOG_ERR("Private key must be configured to use SSL");
221 retval = ENOPROTOOPT;
222 }
415f6c0b 223 if (!certificate.read) {
9467fe62
BP
224 VLOG_ERR("Certificate must be configured to use SSL");
225 retval = ENOPROTOOPT;
226 }
ba104a1e 227 if (!ca_cert.read && verify_peer_cert && !bootstrap_ca_cert) {
9467fe62
BP
228 VLOG_ERR("CA certificate must be configured to use SSL");
229 retval = ENOPROTOOPT;
230 }
231 if (!SSL_CTX_check_private_key(ctx)) {
232 VLOG_ERR("Private key does not match certificate public key: %s",
233 ERR_error_string(ERR_get_error(), NULL));
234 retval = ENOPROTOOPT;
235 }
236 if (retval) {
237 goto error;
238 }
239
240 /* Get the local IP and port information */
241 retval = getsockname(fd, (struct sockaddr *) &local, &local_len);
242 if (retval) {
243 memset(&local, 0, sizeof local);
244 }
245
246 /* Disable Nagle. */
247 retval = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof on);
248 if (retval) {
249 VLOG_ERR("%s: setsockopt(TCP_NODELAY): %s", name, strerror(errno));
250 retval = errno;
251 goto error;
252 }
253
254 /* Create and configure OpenSSL stream. */
255 ssl = SSL_new(ctx);
256 if (ssl == NULL) {
257 VLOG_ERR("SSL_new: %s", ERR_error_string(ERR_get_error(), NULL));
258 retval = ENOPROTOOPT;
259 goto error;
260 }
261 if (SSL_set_fd(ssl, fd) == 0) {
262 VLOG_ERR("SSL_set_fd: %s", ERR_error_string(ERR_get_error(), NULL));
263 retval = ENOPROTOOPT;
264 goto error;
265 }
ba104a1e 266 if (!verify_peer_cert || (bootstrap_ca_cert && type == CLIENT)) {
9467fe62
BP
267 SSL_set_verify(ssl, SSL_VERIFY_NONE, NULL);
268 }
269
270 /* Create and return the ssl_stream. */
271 sslv = xmalloc(sizeof *sslv);
272 stream_init(&sslv->stream, &ssl_stream_class, EAGAIN, name);
273 stream_set_remote_ip(&sslv->stream, remote->sin_addr.s_addr);
274 stream_set_remote_port(&sslv->stream, remote->sin_port);
275 stream_set_local_ip(&sslv->stream, local.sin_addr.s_addr);
276 stream_set_local_port(&sslv->stream, local.sin_port);
277 sslv->state = state;
278 sslv->type = type;
279 sslv->fd = fd;
280 sslv->ssl = ssl;
281 sslv->txbuf = NULL;
282 sslv->rx_want = sslv->tx_want = SSL_NOTHING;
ff1760f1 283 sslv->session_nr = next_session_nr++;
1e3c0047 284 sslv->n_head = 0;
ff1760f1
BP
285
286 if (VLOG_IS_DBG_ENABLED()) {
287 SSL_set_msg_callback(ssl, ssl_protocol_cb);
288 SSL_set_msg_callback_arg(ssl, sslv);
289 }
290
9467fe62
BP
291 *streamp = &sslv->stream;
292 return 0;
293
294error:
295 if (ssl) {
296 SSL_free(ssl);
297 }
298 close(fd);
299 return retval;
300}
301
302static struct ssl_stream *
303ssl_stream_cast(struct stream *stream)
304{
305 stream_assert_class(stream, &ssl_stream_class);
306 return CONTAINER_OF(stream, struct ssl_stream, stream);
307}
308
309static int
f125905c 310ssl_open(const char *name, char *suffix, struct stream **streamp, uint8_t dscp)
9467fe62
BP
311{
312 struct sockaddr_in sin;
313 int error, fd;
314
315 error = ssl_init();
316 if (error) {
317 return error;
318 }
319
f125905c
MM
320 error = inet_open_active(SOCK_STREAM, suffix, OFP_SSL_PORT, &sin, &fd,
321 dscp);
9467fe62
BP
322 if (fd >= 0) {
323 int state = error ? STATE_TCP_CONNECTING : STATE_SSL_CONNECTING;
324 return new_ssl_stream(name, fd, CLIENT, state, &sin, streamp);
325 } else {
326 VLOG_ERR("%s: connect: %s", name, strerror(error));
327 return error;
328 }
329}
330
331static int
332do_ca_cert_bootstrap(struct stream *stream)
333{
334 struct ssl_stream *sslv = ssl_stream_cast(stream);
335 STACK_OF(X509) *chain;
415f6c0b 336 X509 *cert;
9467fe62
BP
337 FILE *file;
338 int error;
339 int fd;
340
341 chain = SSL_get_peer_cert_chain(sslv->ssl);
342 if (!chain || !sk_X509_num(chain)) {
343 VLOG_ERR("could not bootstrap CA cert: no certificate presented by "
344 "peer");
345 return EPROTO;
346 }
415f6c0b 347 cert = sk_X509_value(chain, sk_X509_num(chain) - 1);
9467fe62 348
415f6c0b 349 /* Check that 'cert' is self-signed. Otherwise it is not a CA
9467fe62 350 * certificate and we should not attempt to use it as one. */
415f6c0b 351 error = X509_check_issued(cert, cert);
9467fe62
BP
352 if (error) {
353 VLOG_ERR("could not bootstrap CA cert: obtained certificate is "
354 "not self-signed (%s)",
355 X509_verify_cert_error_string(error));
356 if (sk_X509_num(chain) < 2) {
357 VLOG_ERR("only one certificate was received, so probably the peer "
358 "is not configured to send its CA certificate");
359 }
360 return EPROTO;
361 }
362
415f6c0b 363 fd = open(ca_cert.file_name, O_CREAT | O_EXCL | O_WRONLY, 0444);
9467fe62 364 if (fd < 0) {
deb1f433 365 if (errno == EEXIST) {
f1484874
BP
366 VLOG_INFO_RL(&rl, "reading CA cert %s created by another process",
367 ca_cert.file_name);
368 stream_ssl_set_ca_cert_file__(ca_cert.file_name, true, true);
deb1f433
BP
369 return EPROTO;
370 } else {
371 VLOG_ERR("could not bootstrap CA cert: creating %s failed: %s",
415f6c0b 372 ca_cert.file_name, strerror(errno));
deb1f433
BP
373 return errno;
374 }
9467fe62
BP
375 }
376
377 file = fdopen(fd, "w");
378 if (!file) {
2a022368 379 error = errno;
9467fe62
BP
380 VLOG_ERR("could not bootstrap CA cert: fdopen failed: %s",
381 strerror(error));
415f6c0b 382 unlink(ca_cert.file_name);
9467fe62
BP
383 return error;
384 }
385
415f6c0b 386 if (!PEM_write_X509(file, cert)) {
9467fe62 387 VLOG_ERR("could not bootstrap CA cert: PEM_write_X509 to %s failed: "
415f6c0b
BP
388 "%s", ca_cert.file_name,
389 ERR_error_string(ERR_get_error(), NULL));
9467fe62 390 fclose(file);
415f6c0b 391 unlink(ca_cert.file_name);
9467fe62
BP
392 return EIO;
393 }
394
395 if (fclose(file)) {
2a022368 396 error = errno;
9467fe62 397 VLOG_ERR("could not bootstrap CA cert: writing %s failed: %s",
415f6c0b
BP
398 ca_cert.file_name, strerror(error));
399 unlink(ca_cert.file_name);
9467fe62
BP
400 return error;
401 }
402
415f6c0b
BP
403 VLOG_INFO("successfully bootstrapped CA cert to %s", ca_cert.file_name);
404 log_ca_cert(ca_cert.file_name, cert);
9467fe62 405 bootstrap_ca_cert = false;
415f6c0b 406 ca_cert.read = true;
9467fe62 407
415f6c0b
BP
408 /* SSL_CTX_add_client_CA makes a copy of cert's relevant data. */
409 SSL_CTX_add_client_CA(ctx, cert);
9467fe62
BP
410
411 /* SSL_CTX_use_certificate() takes ownership of the certificate passed in.
415f6c0b
BP
412 * 'cert' is owned by sslv->ssl, so we need to duplicate it. */
413 cert = X509_dup(cert);
414 if (!cert) {
9467fe62
BP
415 out_of_memory();
416 }
e6a8ca62 417 SSL_CTX_set_cert_store(ctx, X509_STORE_new());
415f6c0b 418 if (SSL_CTX_load_verify_locations(ctx, ca_cert.file_name, NULL) != 1) {
9467fe62
BP
419 VLOG_ERR("SSL_CTX_load_verify_locations: %s",
420 ERR_error_string(ERR_get_error(), NULL));
421 return EPROTO;
422 }
423 VLOG_INFO("killing successful connection to retry using CA cert");
424 return EPROTO;
425}
426
427static int
428ssl_connect(struct stream *stream)
429{
430 struct ssl_stream *sslv = ssl_stream_cast(stream);
431 int retval;
432
433 switch (sslv->state) {
434 case STATE_TCP_CONNECTING:
435 retval = check_connection_completion(sslv->fd);
436 if (retval) {
437 return retval;
438 }
439 sslv->state = STATE_SSL_CONNECTING;
440 /* Fall through. */
441
442 case STATE_SSL_CONNECTING:
1e3c0047
BP
443 /* Capture the first few bytes of received data so that we can guess
444 * what kind of funny data we've been sent if SSL negotation fails. */
445 if (sslv->n_head <= 0) {
446 sslv->n_head = recv(sslv->fd, sslv->head, sizeof sslv->head,
447 MSG_PEEK);
448 }
449
9467fe62
BP
450 retval = (sslv->type == CLIENT
451 ? SSL_connect(sslv->ssl) : SSL_accept(sslv->ssl));
452 if (retval != 1) {
453 int error = SSL_get_error(sslv->ssl, retval);
454 if (retval < 0 && ssl_wants_io(error)) {
455 return EAGAIN;
456 } else {
457 int unused;
f2f7be86 458
9467fe62
BP
459 interpret_ssl_error((sslv->type == CLIENT ? "SSL_connect"
460 : "SSL_accept"), retval, error, &unused);
461 shutdown(sslv->fd, SHUT_RDWR);
1e3c0047
BP
462 stream_report_content(sslv->head, sslv->n_head, STREAM_SSL,
463 THIS_MODULE, stream_get_name(stream));
9467fe62
BP
464 return EPROTO;
465 }
466 } else if (bootstrap_ca_cert) {
467 return do_ca_cert_bootstrap(stream);
ba104a1e
BP
468 } else if (verify_peer_cert
469 && ((SSL_get_verify_mode(sslv->ssl)
470 & (SSL_VERIFY_NONE | SSL_VERIFY_PEER))
471 != SSL_VERIFY_PEER)) {
9467fe62
BP
472 /* Two or more SSL connections completed at the same time while we
473 * were in bootstrap mode. Only one of these can finish the
474 * bootstrap successfully. The other one(s) must be rejected
475 * because they were not verified against the bootstrapped CA
476 * certificate. (Alternatively we could verify them against the CA
477 * certificate, but that's more trouble than it's worth. These
478 * connections will succeed the next time they retry, assuming that
479 * they have a certificate against the correct CA.) */
480 VLOG_ERR("rejecting SSL connection during bootstrap race window");
481 return EPROTO;
482 } else {
483 return 0;
484 }
485 }
486
487 NOT_REACHED();
488}
489
490static void
491ssl_close(struct stream *stream)
492{
493 struct ssl_stream *sslv = ssl_stream_cast(stream);
494 ssl_clear_txbuf(sslv);
5e4641a1
BP
495
496 /* Attempt clean shutdown of the SSL connection. This will work most of
497 * the time, as long as the kernel send buffer has some free space and the
498 * SSL connection isn't renegotiating, etc. That has to be good enough,
499 * since we don't have any way to continue the close operation in the
500 * background. */
501 SSL_shutdown(sslv->ssl);
502
3d47699c
BP
503 /* SSL_shutdown() might have signaled an error, in which case we need to
504 * flush it out of the OpenSSL error queue or the next OpenSSL operation
505 * will falsely signal an error. */
506 ERR_clear_error();
507
9467fe62
BP
508 SSL_free(sslv->ssl);
509 close(sslv->fd);
510 free(sslv);
511}
512
246f5b5e
BP
513static void
514interpret_queued_ssl_error(const char *function)
515{
516 int queued_error = ERR_get_error();
517 if (queued_error != 0) {
518 VLOG_WARN_RL(&rl, "%s: %s",
519 function, ERR_error_string(queued_error, NULL));
520 } else {
521 VLOG_ERR_RL(&rl, "%s: SSL_ERROR_SSL without queued error", function);
522 }
523}
524
9467fe62
BP
525static int
526interpret_ssl_error(const char *function, int ret, int error,
527 int *want)
528{
529 *want = SSL_NOTHING;
530
531 switch (error) {
532 case SSL_ERROR_NONE:
533 VLOG_ERR_RL(&rl, "%s: unexpected SSL_ERROR_NONE", function);
534 break;
535
536 case SSL_ERROR_ZERO_RETURN:
537 VLOG_ERR_RL(&rl, "%s: unexpected SSL_ERROR_ZERO_RETURN", function);
538 break;
539
540 case SSL_ERROR_WANT_READ:
541 *want = SSL_READING;
542 return EAGAIN;
543
544 case SSL_ERROR_WANT_WRITE:
545 *want = SSL_WRITING;
546 return EAGAIN;
547
548 case SSL_ERROR_WANT_CONNECT:
549 VLOG_ERR_RL(&rl, "%s: unexpected SSL_ERROR_WANT_CONNECT", function);
550 break;
551
552 case SSL_ERROR_WANT_ACCEPT:
553 VLOG_ERR_RL(&rl, "%s: unexpected SSL_ERROR_WANT_ACCEPT", function);
554 break;
555
556 case SSL_ERROR_WANT_X509_LOOKUP:
557 VLOG_ERR_RL(&rl, "%s: unexpected SSL_ERROR_WANT_X509_LOOKUP",
558 function);
559 break;
560
561 case SSL_ERROR_SYSCALL: {
562 int queued_error = ERR_get_error();
563 if (queued_error == 0) {
564 if (ret < 0) {
565 int status = errno;
566 VLOG_WARN_RL(&rl, "%s: system error (%s)",
567 function, strerror(status));
568 return status;
569 } else {
570 VLOG_WARN_RL(&rl, "%s: unexpected SSL connection close",
571 function);
572 return EPROTO;
573 }
574 } else {
575 VLOG_WARN_RL(&rl, "%s: %s",
576 function, ERR_error_string(queued_error, NULL));
577 break;
578 }
579 }
580
246f5b5e
BP
581 case SSL_ERROR_SSL:
582 interpret_queued_ssl_error(function);
9467fe62 583 break;
9467fe62
BP
584
585 default:
586 VLOG_ERR_RL(&rl, "%s: bad SSL error code %d", function, error);
587 break;
588 }
589 return EIO;
590}
591
592static ssize_t
593ssl_recv(struct stream *stream, void *buffer, size_t n)
594{
595 struct ssl_stream *sslv = ssl_stream_cast(stream);
596 int old_state;
597 ssize_t ret;
598
599 /* Behavior of zero-byte SSL_read is poorly defined. */
600 assert(n > 0);
601
602 old_state = SSL_get_state(sslv->ssl);
603 ret = SSL_read(sslv->ssl, buffer, n);
604 if (old_state != SSL_get_state(sslv->ssl)) {
605 sslv->tx_want = SSL_NOTHING;
606 }
607 sslv->rx_want = SSL_NOTHING;
608
609 if (ret > 0) {
610 return ret;
611 } else {
612 int error = SSL_get_error(sslv->ssl, ret);
613 if (error == SSL_ERROR_ZERO_RETURN) {
614 return 0;
615 } else {
2b494771
BP
616 return -interpret_ssl_error("SSL_read", ret, error,
617 &sslv->rx_want);
9467fe62
BP
618 }
619 }
620}
621
622static void
623ssl_clear_txbuf(struct ssl_stream *sslv)
624{
625 ofpbuf_delete(sslv->txbuf);
626 sslv->txbuf = NULL;
627}
628
629static int
630ssl_do_tx(struct stream *stream)
631{
632 struct ssl_stream *sslv = ssl_stream_cast(stream);
633
634 for (;;) {
635 int old_state = SSL_get_state(sslv->ssl);
636 int ret = SSL_write(sslv->ssl, sslv->txbuf->data, sslv->txbuf->size);
637 if (old_state != SSL_get_state(sslv->ssl)) {
638 sslv->rx_want = SSL_NOTHING;
639 }
640 sslv->tx_want = SSL_NOTHING;
641 if (ret > 0) {
642 ofpbuf_pull(sslv->txbuf, ret);
643 if (sslv->txbuf->size == 0) {
644 return 0;
645 }
646 } else {
647 int ssl_error = SSL_get_error(sslv->ssl, ret);
648 if (ssl_error == SSL_ERROR_ZERO_RETURN) {
649 VLOG_WARN_RL(&rl, "SSL_write: connection closed");
650 return EPIPE;
651 } else {
652 return interpret_ssl_error("SSL_write", ret, ssl_error,
653 &sslv->tx_want);
654 }
655 }
656 }
657}
658
659static ssize_t
660ssl_send(struct stream *stream, const void *buffer, size_t n)
661{
662 struct ssl_stream *sslv = ssl_stream_cast(stream);
663
664 if (sslv->txbuf) {
2b494771 665 return -EAGAIN;
9467fe62
BP
666 } else {
667 int error;
668
669 sslv->txbuf = ofpbuf_clone_data(buffer, n);
670 error = ssl_do_tx(stream);
671 switch (error) {
672 case 0:
673 ssl_clear_txbuf(sslv);
2b494771 674 return n;
9467fe62
BP
675 case EAGAIN:
676 leak_checker_claim(buffer);
2b494771 677 return n;
9467fe62
BP
678 default:
679 sslv->txbuf = NULL;
2b494771 680 return -error;
9467fe62
BP
681 }
682 }
683}
684
685static void
686ssl_run(struct stream *stream)
687{
688 struct ssl_stream *sslv = ssl_stream_cast(stream);
689
690 if (sslv->txbuf && ssl_do_tx(stream) != EAGAIN) {
691 ssl_clear_txbuf(sslv);
692 }
693}
694
695static void
696ssl_run_wait(struct stream *stream)
697{
698 struct ssl_stream *sslv = ssl_stream_cast(stream);
699
700 if (sslv->tx_want != SSL_NOTHING) {
701 poll_fd_wait(sslv->fd, want_to_poll_events(sslv->tx_want));
702 }
703}
704
705static void
706ssl_wait(struct stream *stream, enum stream_wait_type wait)
707{
708 struct ssl_stream *sslv = ssl_stream_cast(stream);
709
710 switch (wait) {
711 case STREAM_CONNECT:
712 if (stream_connect(stream) != EAGAIN) {
713 poll_immediate_wake();
714 } else {
715 switch (sslv->state) {
716 case STATE_TCP_CONNECTING:
717 poll_fd_wait(sslv->fd, POLLOUT);
718 break;
719
720 case STATE_SSL_CONNECTING:
721 /* ssl_connect() called SSL_accept() or SSL_connect(), which
722 * set up the status that we test here. */
723 poll_fd_wait(sslv->fd,
724 want_to_poll_events(SSL_want(sslv->ssl)));
725 break;
726
727 default:
728 NOT_REACHED();
729 }
730 }
731 break;
732
733 case STREAM_RECV:
734 if (sslv->rx_want != SSL_NOTHING) {
735 poll_fd_wait(sslv->fd, want_to_poll_events(sslv->rx_want));
736 } else {
737 poll_immediate_wake();
738 }
739 break;
740
741 case STREAM_SEND:
742 if (!sslv->txbuf) {
743 /* We have room in our tx queue. */
744 poll_immediate_wake();
745 } else {
746 /* stream_run_wait() will do the right thing; don't bother with
747 * redundancy. */
748 }
749 break;
750
751 default:
752 NOT_REACHED();
753 }
754}
755
da327b18 756const struct stream_class ssl_stream_class = {
9467fe62 757 "ssl", /* name */
f1936eb6 758 true, /* needs_probes */
9467fe62
BP
759 ssl_open, /* open */
760 ssl_close, /* close */
761 ssl_connect, /* connect */
762 ssl_recv, /* recv */
763 ssl_send, /* send */
764 ssl_run, /* run */
765 ssl_run_wait, /* run_wait */
766 ssl_wait, /* wait */
767};
768\f
769/* Passive SSL. */
770
771struct pssl_pstream
772{
773 struct pstream pstream;
774 int fd;
775};
776
da327b18 777const struct pstream_class pssl_pstream_class;
9467fe62
BP
778
779static struct pssl_pstream *
780pssl_pstream_cast(struct pstream *pstream)
781{
782 pstream_assert_class(pstream, &pssl_pstream_class);
783 return CONTAINER_OF(pstream, struct pssl_pstream, pstream);
784}
785
786static int
f125905c
MM
787pssl_open(const char *name OVS_UNUSED, char *suffix, struct pstream **pstreamp,
788 uint8_t dscp)
9467fe62
BP
789{
790 struct pssl_pstream *pssl;
42967038
BP
791 struct sockaddr_in sin;
792 char bound_name[128];
9467fe62
BP
793 int retval;
794 int fd;
795
796 retval = ssl_init();
797 if (retval) {
798 return retval;
799 }
800
f125905c 801 fd = inet_open_passive(SOCK_STREAM, suffix, OFP_SSL_PORT, &sin, dscp);
9467fe62
BP
802 if (fd < 0) {
803 return -fd;
804 }
42967038
BP
805 sprintf(bound_name, "pssl:%"PRIu16":"IP_FMT,
806 ntohs(sin.sin_port), IP_ARGS(&sin.sin_addr.s_addr));
9467fe62
BP
807
808 pssl = xmalloc(sizeof *pssl);
42967038 809 pstream_init(&pssl->pstream, &pssl_pstream_class, bound_name);
9467fe62
BP
810 pssl->fd = fd;
811 *pstreamp = &pssl->pstream;
812 return 0;
813}
814
815static void
816pssl_close(struct pstream *pstream)
817{
818 struct pssl_pstream *pssl = pssl_pstream_cast(pstream);
819 close(pssl->fd);
820 free(pssl);
821}
822
823static int
824pssl_accept(struct pstream *pstream, struct stream **new_streamp)
825{
826 struct pssl_pstream *pssl = pssl_pstream_cast(pstream);
827 struct sockaddr_in sin;
828 socklen_t sin_len = sizeof sin;
829 char name[128];
830 int new_fd;
831 int error;
832
c5530655 833 new_fd = accept(pssl->fd, (struct sockaddr *) &sin, &sin_len);
9467fe62 834 if (new_fd < 0) {
2a022368 835 error = errno;
9467fe62
BP
836 if (error != EAGAIN) {
837 VLOG_DBG_RL(&rl, "accept: %s", strerror(error));
838 }
839 return error;
840 }
841
842 error = set_nonblocking(new_fd);
843 if (error) {
844 close(new_fd);
845 return error;
846 }
847
848 sprintf(name, "ssl:"IP_FMT, IP_ARGS(&sin.sin_addr));
849 if (sin.sin_port != htons(OFP_SSL_PORT)) {
850 sprintf(strchr(name, '\0'), ":%"PRIu16, ntohs(sin.sin_port));
851 }
852 return new_ssl_stream(name, new_fd, SERVER, STATE_SSL_CONNECTING, &sin,
f125905c 853 new_streamp);
9467fe62
BP
854}
855
856static void
857pssl_wait(struct pstream *pstream)
858{
859 struct pssl_pstream *pssl = pssl_pstream_cast(pstream);
860 poll_fd_wait(pssl->fd, POLLIN);
861}
862
da327b18 863const struct pstream_class pssl_pstream_class = {
9467fe62 864 "pssl",
f1936eb6 865 true,
9467fe62
BP
866 pssl_open,
867 pssl_close,
868 pssl_accept,
869 pssl_wait,
870};
871\f
872/*
873 * Returns true if OpenSSL error is WANT_READ or WANT_WRITE, indicating that
874 * OpenSSL is requesting that we call it back when the socket is ready for read
875 * or writing, respectively.
876 */
877static bool
878ssl_wants_io(int ssl_error)
879{
880 return (ssl_error == SSL_ERROR_WANT_WRITE
881 || ssl_error == SSL_ERROR_WANT_READ);
882}
883
884static int
885ssl_init(void)
886{
887 static int init_status = -1;
888 if (init_status < 0) {
889 init_status = do_ssl_init();
890 assert(init_status >= 0);
891 }
892 return init_status;
893}
894
895static int
896do_ssl_init(void)
897{
898 SSL_METHOD *method;
899
900 SSL_library_init();
901 SSL_load_error_strings();
902
444b381e
BP
903 /* New OpenSSL changed TLSv1_method() to return a "const" pointer, so the
904 * cast is needed to avoid a warning with those newer versions. */
905 method = (SSL_METHOD *) TLSv1_method();
9467fe62
BP
906 if (method == NULL) {
907 VLOG_ERR("TLSv1_method: %s", ERR_error_string(ERR_get_error(), NULL));
908 return ENOPROTOOPT;
909 }
910
911 ctx = SSL_CTX_new(method);
912 if (ctx == NULL) {
913 VLOG_ERR("SSL_CTX_new: %s", ERR_error_string(ERR_get_error(), NULL));
914 return ENOPROTOOPT;
915 }
916 SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
917 SSL_CTX_set_tmp_dh_callback(ctx, tmp_dh_callback);
918 SSL_CTX_set_mode(ctx, SSL_MODE_ENABLE_PARTIAL_WRITE);
919 SSL_CTX_set_mode(ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
920 SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
921 NULL);
922
923 return 0;
924}
925
926static DH *
67a4917b 927tmp_dh_callback(SSL *ssl OVS_UNUSED, int is_export OVS_UNUSED, int keylength)
9467fe62
BP
928{
929 struct dh {
930 int keylength;
931 DH *dh;
932 DH *(*constructor)(void);
933 };
934
935 static struct dh dh_table[] = {
936 {1024, NULL, get_dh1024},
937 {2048, NULL, get_dh2048},
938 {4096, NULL, get_dh4096},
939 };
940
941 struct dh *dh;
942
943 for (dh = dh_table; dh < &dh_table[ARRAY_SIZE(dh_table)]; dh++) {
944 if (dh->keylength == keylength) {
945 if (!dh->dh) {
946 dh->dh = dh->constructor();
947 if (!dh->dh) {
1d2c568d 948 out_of_memory();
9467fe62
BP
949 }
950 }
951 return dh->dh;
952 }
953 }
954 VLOG_ERR_RL(&rl, "no Diffie-Hellman parameters for key length %d",
955 keylength);
956 return NULL;
957}
958
959/* Returns true if SSL is at least partially configured. */
960bool
d295e8e9 961stream_ssl_is_configured(void)
9467fe62 962{
415f6c0b
BP
963 return private_key.file_name || certificate.file_name || ca_cert.file_name;
964}
965
966static bool
967update_ssl_config(struct ssl_config_file *config, const char *file_name)
968{
9cb07887 969 struct timespec mtime;
e68f6dea 970 int error;
9cb07887
BP
971
972 if (ssl_init() || !file_name) {
973 return false;
974 }
975
976 /* If the file name hasn't changed and neither has the file contents, stop
977 * here. */
e68f6dea
BP
978 error = get_mtime(file_name, &mtime);
979 if (error && error != ENOENT) {
980 VLOG_ERR_RL(&rl, "%s: stat failed (%s)", file_name, strerror(error));
981 }
9cb07887
BP
982 if (config->file_name
983 && !strcmp(config->file_name, file_name)
984 && mtime.tv_sec == config->mtime.tv_sec
985 && mtime.tv_nsec == config->mtime.tv_nsec) {
415f6c0b
BP
986 return false;
987 }
988
2b1a27a1 989 /* Update 'config'. */
9cb07887 990 config->mtime = mtime;
2b1a27a1
BP
991 if (file_name != config->file_name) {
992 free(config->file_name);
993 config->file_name = xstrdup(file_name);
994 }
415f6c0b 995 return true;
9467fe62
BP
996}
997
6f1e91b1
BP
998static void
999stream_ssl_set_private_key_file__(const char *file_name)
1000{
1001 if (SSL_CTX_use_PrivateKey_file(ctx, file_name, SSL_FILETYPE_PEM) == 1) {
1002 private_key.read = true;
1003 } else {
1004 VLOG_ERR("SSL_use_PrivateKey_file: %s",
1005 ERR_error_string(ERR_get_error(), NULL));
1006 }
1007}
1008
9467fe62
BP
1009void
1010stream_ssl_set_private_key_file(const char *file_name)
1011{
6f1e91b1
BP
1012 if (update_ssl_config(&private_key, file_name)) {
1013 stream_ssl_set_private_key_file__(file_name);
9467fe62 1014 }
6f1e91b1
BP
1015}
1016
1017static void
1018stream_ssl_set_certificate_file__(const char *file_name)
1019{
1020 if (SSL_CTX_use_certificate_chain_file(ctx, file_name) == 1) {
1021 certificate.read = true;
1022 } else {
1023 VLOG_ERR("SSL_use_certificate_file: %s",
9467fe62 1024 ERR_error_string(ERR_get_error(), NULL));
9467fe62 1025 }
9467fe62
BP
1026}
1027
1028void
1029stream_ssl_set_certificate_file(const char *file_name)
1030{
6f1e91b1
BP
1031 if (update_ssl_config(&certificate, file_name)) {
1032 stream_ssl_set_certificate_file__(file_name);
9467fe62 1033 }
6f1e91b1
BP
1034}
1035
1036/* Sets the private key and certificate files in one operation. Use this
1037 * interface, instead of calling stream_ssl_set_private_key_file() and
1038 * stream_ssl_set_certificate_file() individually, in the main loop of a
1039 * long-running program whose key and certificate might change at runtime.
1040 *
1041 * This is important because of OpenSSL's behavior. If an OpenSSL context
1042 * already has a certificate, and stream_ssl_set_private_key_file() is called
1043 * to install a new private key, OpenSSL will report an error because the new
1044 * private key does not match the old certificate. The other order, of setting
1045 * a new certificate, then setting a new private key, does work.
1046 *
1047 * If this were the only problem, calling stream_ssl_set_certificate_file()
1048 * before stream_ssl_set_private_key_file() would fix it. But, if the private
1049 * key is changed before the certificate (e.g. someone "scp"s or "mv"s the new
1050 * private key in place before the certificate), then OpenSSL would reject that
1051 * change, and then the change of certificate would succeed, but there would be
1052 * no associated private key (because it had only changed once and therefore
1053 * there was no point in re-reading it).
1054 *
1055 * This function avoids both problems by, whenever either the certificate or
1056 * the private key file changes, re-reading both of them, in the correct order.
1057 */
1058void
1059stream_ssl_set_key_and_cert(const char *private_key_file,
1060 const char *certificate_file)
1061{
1062 if (update_ssl_config(&private_key, private_key_file)
1063 || update_ssl_config(&certificate, certificate_file)) {
1064 stream_ssl_set_certificate_file__(certificate_file);
1065 stream_ssl_set_private_key_file__(private_key_file);
9467fe62 1066 }
9467fe62
BP
1067}
1068
1069/* Reads the X509 certificate or certificates in file 'file_name'. On success,
1070 * stores the address of the first element in an array of pointers to
1071 * certificates in '*certs' and the number of certificates in the array in
1072 * '*n_certs', and returns 0. On failure, stores a null pointer in '*certs', 0
1073 * in '*n_certs', and returns a positive errno value.
1074 *
1075 * The caller is responsible for freeing '*certs'. */
1076static int
1077read_cert_file(const char *file_name, X509 ***certs, size_t *n_certs)
1078{
1079 FILE *file;
1080 size_t allocated_certs = 0;
1081
1082 *certs = NULL;
1083 *n_certs = 0;
1084
1085 file = fopen(file_name, "r");
1086 if (!file) {
1087 VLOG_ERR("failed to open %s for reading: %s",
1088 file_name, strerror(errno));
1089 return errno;
1090 }
1091
1092 for (;;) {
1093 X509 *certificate;
1094 int c;
1095
1096 /* Read certificate from file. */
1097 certificate = PEM_read_X509(file, NULL, NULL, NULL);
1098 if (!certificate) {
1099 size_t i;
1100
1101 VLOG_ERR("PEM_read_X509 failed reading %s: %s",
1102 file_name, ERR_error_string(ERR_get_error(), NULL));
1103 for (i = 0; i < *n_certs; i++) {
1104 X509_free((*certs)[i]);
1105 }
1106 free(*certs);
1107 *certs = NULL;
1108 *n_certs = 0;
1109 return EIO;
1110 }
1111
1112 /* Add certificate to array. */
1113 if (*n_certs >= allocated_certs) {
1114 *certs = x2nrealloc(*certs, &allocated_certs, sizeof **certs);
1115 }
1116 (*certs)[(*n_certs)++] = certificate;
1117
1118 /* Are there additional certificates in the file? */
1119 do {
1120 c = getc(file);
1121 } while (isspace(c));
1122 if (c == EOF) {
1123 break;
1124 }
1125 ungetc(c, file);
1126 }
1127 fclose(file);
1128 return 0;
1129}
1130
1131
1132/* Sets 'file_name' as the name of a file containing one or more X509
1133 * certificates to send to the peer. Typical use in OpenFlow is to send the CA
1134 * certificate to the peer, which enables a switch to pick up the controller's
1135 * CA certificate on its first connection. */
1136void
1137stream_ssl_set_peer_ca_cert_file(const char *file_name)
1138{
1139 X509 **certs;
1140 size_t n_certs;
1141 size_t i;
1142
1143 if (ssl_init()) {
1144 return;
1145 }
1146
1147 if (!read_cert_file(file_name, &certs, &n_certs)) {
1148 for (i = 0; i < n_certs; i++) {
1149 if (SSL_CTX_add_extra_chain_cert(ctx, certs[i]) != 1) {
1150 VLOG_ERR("SSL_CTX_add_extra_chain_cert: %s",
1151 ERR_error_string(ERR_get_error(), NULL));
1152 }
1153 }
1154 free(certs);
1155 }
1156}
1157
1158/* Logs fingerprint of CA certificate 'cert' obtained from 'file_name'. */
1159static void
1160log_ca_cert(const char *file_name, X509 *cert)
1161{
1162 unsigned char digest[EVP_MAX_MD_SIZE];
1163 unsigned int n_bytes;
1164 struct ds fp;
1165 char *subject;
1166
1167 ds_init(&fp);
1168 if (!X509_digest(cert, EVP_sha1(), digest, &n_bytes)) {
1169 ds_put_cstr(&fp, "<out of memory>");
1170 } else {
1171 unsigned int i;
1172 for (i = 0; i < n_bytes; i++) {
1173 if (i) {
1174 ds_put_char(&fp, ':');
1175 }
1176 ds_put_format(&fp, "%02hhx", digest[i]);
1177 }
1178 }
1179 subject = X509_NAME_oneline(X509_get_subject_name(cert), NULL, 0);
1180 VLOG_INFO("Trusting CA cert from %s (%s) (fingerprint %s)", file_name,
1181 subject ? subject : "<out of memory>", ds_cstr(&fp));
3c7b5c2d 1182 OPENSSL_free(subject);
9467fe62
BP
1183 ds_destroy(&fp);
1184}
1185
415f6c0b 1186static void
f1484874
BP
1187stream_ssl_set_ca_cert_file__(const char *file_name,
1188 bool bootstrap, bool force)
9467fe62
BP
1189{
1190 X509 **certs;
1191 size_t n_certs;
1192 struct stat s;
1193
f1484874
BP
1194 if (!update_ssl_config(&ca_cert, file_name) && !force) {
1195 return;
1196 }
1197
ba104a1e
BP
1198 if (!strcmp(file_name, "none")) {
1199 verify_peer_cert = false;
1200 VLOG_WARN("Peer certificate validation disabled "
1201 "(this is a security risk)");
1202 } else if (bootstrap && stat(file_name, &s) && errno == ENOENT) {
9467fe62 1203 bootstrap_ca_cert = true;
9467fe62
BP
1204 } else if (!read_cert_file(file_name, &certs, &n_certs)) {
1205 size_t i;
1206
1207 /* Set up list of CAs that the server will accept from the client. */
1208 for (i = 0; i < n_certs; i++) {
1209 /* SSL_CTX_add_client_CA makes a copy of the relevant data. */
1210 if (SSL_CTX_add_client_CA(ctx, certs[i]) != 1) {
0fee489f 1211 VLOG_ERR("failed to add client certificate %zu from %s: %s",
9467fe62
BP
1212 i, file_name,
1213 ERR_error_string(ERR_get_error(), NULL));
1214 } else {
1215 log_ca_cert(file_name, certs[i]);
1216 }
1217 X509_free(certs[i]);
1218 }
f6b60e02 1219 free(certs);
9467fe62
BP
1220
1221 /* Set up CAs for OpenSSL to trust in verifying the peer's
1222 * certificate. */
e6a8ca62 1223 SSL_CTX_set_cert_store(ctx, X509_STORE_new());
9467fe62
BP
1224 if (SSL_CTX_load_verify_locations(ctx, file_name, NULL) != 1) {
1225 VLOG_ERR("SSL_CTX_load_verify_locations: %s",
1226 ERR_error_string(ERR_get_error(), NULL));
1227 return;
1228 }
1229
415f6c0b 1230 bootstrap_ca_cert = false;
9467fe62 1231 }
415f6c0b 1232 ca_cert.read = true;
9467fe62 1233}
415f6c0b
BP
1234
1235/* Sets 'file_name' as the name of the file from which to read the CA
1236 * certificate used to verify the peer within SSL connections. If 'bootstrap'
1237 * is false, the file must exist. If 'bootstrap' is false, then the file is
1238 * read if it is exists; if it does not, then it will be created from the CA
1239 * certificate received from the peer on the first SSL connection. */
1240void
1241stream_ssl_set_ca_cert_file(const char *file_name, bool bootstrap)
1242{
f1484874 1243 stream_ssl_set_ca_cert_file__(file_name, bootstrap, false);
415f6c0b 1244}
ff1760f1
BP
1245\f
1246/* SSL protocol logging. */
1247
1248static const char *
1249ssl_alert_level_to_string(uint8_t type)
1250{
1251 switch (type) {
1252 case 1: return "warning";
1253 case 2: return "fatal";
1254 default: return "<unknown>";
1255 }
1256}
415f6c0b 1257
ff1760f1
BP
1258static const char *
1259ssl_alert_description_to_string(uint8_t type)
1260{
1261 switch (type) {
1262 case 0: return "close_notify";
1263 case 10: return "unexpected_message";
1264 case 20: return "bad_record_mac";
1265 case 21: return "decryption_failed";
1266 case 22: return "record_overflow";
1267 case 30: return "decompression_failure";
1268 case 40: return "handshake_failure";
1269 case 42: return "bad_certificate";
1270 case 43: return "unsupported_certificate";
1271 case 44: return "certificate_revoked";
1272 case 45: return "certificate_expired";
1273 case 46: return "certificate_unknown";
1274 case 47: return "illegal_parameter";
1275 case 48: return "unknown_ca";
1276 case 49: return "access_denied";
1277 case 50: return "decode_error";
1278 case 51: return "decrypt_error";
1279 case 60: return "export_restriction";
1280 case 70: return "protocol_version";
1281 case 71: return "insufficient_security";
1282 case 80: return "internal_error";
1283 case 90: return "user_canceled";
1284 case 100: return "no_renegotiation";
1285 default: return "<unknown>";
1286 }
1287}
415f6c0b 1288
ff1760f1
BP
1289static const char *
1290ssl_handshake_type_to_string(uint8_t type)
1291{
1292 switch (type) {
1293 case 0: return "hello_request";
1294 case 1: return "client_hello";
1295 case 2: return "server_hello";
1296 case 11: return "certificate";
1297 case 12: return "server_key_exchange";
1298 case 13: return "certificate_request";
1299 case 14: return "server_hello_done";
1300 case 15: return "certificate_verify";
1301 case 16: return "client_key_exchange";
1302 case 20: return "finished";
1303 default: return "<unknown>";
1304 }
1305}
1306
1307static void
1308ssl_protocol_cb(int write_p, int version OVS_UNUSED, int content_type,
1309 const void *buf_, size_t len, SSL *ssl OVS_UNUSED, void *sslv_)
1310{
1311 const struct ssl_stream *sslv = sslv_;
1312 const uint8_t *buf = buf_;
1313 struct ds details;
1314
1315 if (!VLOG_IS_DBG_ENABLED()) {
1316 return;
1317 }
1318
1319 ds_init(&details);
1320 if (content_type == 20) {
1321 ds_put_cstr(&details, "change_cipher_spec");
1322 } else if (content_type == 21) {
1323 ds_put_format(&details, "alert: %s, %s",
1324 ssl_alert_level_to_string(buf[0]),
1325 ssl_alert_description_to_string(buf[1]));
1326 } else if (content_type == 22) {
1327 ds_put_format(&details, "handshake: %s",
1328 ssl_handshake_type_to_string(buf[0]));
1329 } else {
1330 ds_put_format(&details, "type %d", content_type);
1331 }
1332
1333 VLOG_DBG("%s%u%s%s %s (%zu bytes)",
1334 sslv->type == CLIENT ? "client" : "server",
1335 sslv->session_nr, write_p ? "-->" : "<--",
1336 stream_get_name(&sslv->stream), ds_cstr(&details), len);
1337
1338 ds_destroy(&details);
1339}