Test suite: disable OCSP for old openssl part 2
[exim.git] / src / src / tls-openssl.c
CommitLineData
059ec3d9
PH
1/*************************************************
2* Exim - an Internet mail transport agent *
3*************************************************/
4
5a66c31b 5/* Copyright (c) University of Cambridge 1995 - 2014 */
059ec3d9
PH
6/* See the file NOTICE for conditions of use and distribution. */
7
f5d78688
JH
8/* Portions Copyright (c) The OpenSSL Project 1999 */
9
059ec3d9
PH
10/* This module provides the TLS (aka SSL) support for Exim using the OpenSSL
11library. It is #included into the tls.c file when that library is used. The
12code herein is based on a patch that was originally contributed by Steve
13Haslam. It was adapted from stunnel, a GPL program by Michal Trojnara.
14
15No cryptographic code is included in Exim. All this module does is to call
16functions from the OpenSSL library. */
17
18
19/* Heading stuff */
20
21#include <openssl/lhash.h>
22#include <openssl/ssl.h>
23#include <openssl/err.h>
24#include <openssl/rand.h>
f2de3a33 25#ifndef DISABLE_OCSP
e51c7be2 26# include <openssl/ocsp.h>
3f7eeb86 27#endif
85098ee7
JH
28#ifdef EXPERIMENTAL_DANE
29# include <danessl.h>
30#endif
31
3f7eeb86 32
f2de3a33
JH
33#ifndef DISABLE_OCSP
34# define EXIM_OCSP_SKEW_SECONDS (300L)
35# define EXIM_OCSP_MAX_AGE (-1L)
3f7eeb86 36#endif
059ec3d9 37
3bcbbbe2 38#if OPENSSL_VERSION_NUMBER >= 0x0090806fL && !defined(OPENSSL_NO_TLSEXT)
e51c7be2 39# define EXIM_HAVE_OPENSSL_TLSEXT
3bcbbbe2 40#endif
2dfb468b
JH
41#if OPENSSL_VERSION_NUMBER >= 0x010100000L
42# define EXIM_HAVE_OPENSSL_CHECKHOST
43#endif
44#if OPENSSL_VERSION_NUMBER >= 0x010000000L \
45 && (OPENSSL_VERSION_NUMBER & 0x0000ff000L) >= 0x000002000L
46# define EXIM_HAVE_OPENSSL_CHECKHOST
47#endif
3bcbbbe2 48
67791ce4
JH
49#if !defined(EXIM_HAVE_OPENSSL_TLSEXT) && !defined(DISABLE_OCSP)
50# warning "OpenSSL library version too old; define DISABLE_OCSP in Makefile"
51# define DISABLE_OCSP
52#endif
53
059ec3d9
PH
54/* Structure for collecting random data for seeding. */
55
56typedef struct randstuff {
9e3331ea
TK
57 struct timeval tv;
58 pid_t p;
059ec3d9
PH
59} randstuff;
60
61/* Local static variables */
62
a2ff477a
JH
63static BOOL client_verify_callback_called = FALSE;
64static BOOL server_verify_callback_called = FALSE;
059ec3d9
PH
65static const uschar *sid_ctx = US"exim";
66
d4f09789
PP
67/* We have three different contexts to care about.
68
69Simple case: client, `client_ctx`
70 As a client, we can be doing a callout or cut-through delivery while receiving
71 a message. So we have a client context, which should have options initialised
72 from the SMTP Transport.
73
74Server:
75 There are two cases: with and without ServerNameIndication from the client.
76 Given TLS SNI, we can be using different keys, certs and various other
77 configuration settings, because they're re-expanded with $tls_sni set. This
78 allows vhosting with TLS. This SNI is sent in the handshake.
79 A client might not send SNI, so we need a fallback, and an initial setup too.
80 So as a server, we start out using `server_ctx`.
81 If SNI is sent by the client, then we as server, mid-negotiation, try to clone
82 `server_sni` from `server_ctx` and then initialise settings by re-expanding
83 configuration.
84*/
85
817d9f57
JH
86static SSL_CTX *client_ctx = NULL;
87static SSL_CTX *server_ctx = NULL;
88static SSL *client_ssl = NULL;
89static SSL *server_ssl = NULL;
389ca47a 90
35731706 91#ifdef EXIM_HAVE_OPENSSL_TLSEXT
817d9f57 92static SSL_CTX *server_sni = NULL;
35731706 93#endif
059ec3d9
PH
94
95static char ssl_errstring[256];
96
97static int ssl_session_timeout = 200;
a2ff477a
JH
98static BOOL client_verify_optional = FALSE;
99static BOOL server_verify_optional = FALSE;
059ec3d9 100
f5d78688 101static BOOL reexpand_tls_files_for_sni = FALSE;
059ec3d9
PH
102
103
7be682ca
PP
104typedef struct tls_ext_ctx_cb {
105 uschar *certificate;
106 uschar *privatekey;
f2de3a33 107#ifndef DISABLE_OCSP
f5d78688
JH
108 BOOL is_server;
109 union {
110 struct {
111 uschar *file;
112 uschar *file_expanded;
113 OCSP_RESPONSE *response;
114 } server;
115 struct {
44662487
JH
116 X509_STORE *verify_store; /* non-null if status requested */
117 BOOL verify_required;
f5d78688
JH
118 } client;
119 } u_ocsp;
3f7eeb86 120#endif
7be682ca
PP
121 uschar *dhparam;
122 /* these are cached from first expand */
123 uschar *server_cipher_list;
124 /* only passed down to tls_error: */
125 host_item *host;
e51c7be2
JH
126
127#ifdef EXPERIMENTAL_CERTNAMES
128 uschar * verify_cert_hostnames;
129#endif
774ef2d7 130#ifdef EXPERIMENTAL_EVENT
a7538db1
JH
131 uschar * event_action;
132#endif
7be682ca
PP
133} tls_ext_ctx_cb;
134
135/* should figure out a cleanup of API to handle state preserved per
136implementation, for various reasons, which can be void * in the APIs.
137For now, we hack around it. */
817d9f57
JH
138tls_ext_ctx_cb *client_static_cbinfo = NULL;
139tls_ext_ctx_cb *server_static_cbinfo = NULL;
7be682ca
PP
140
141static int
983207c1
JH
142setup_certs(SSL_CTX *sctx, uschar *certs, uschar *crl, host_item *host, BOOL optional,
143 int (*cert_vfy_cb)(int, X509_STORE_CTX *) );
059ec3d9 144
3f7eeb86 145/* Callbacks */
3bcbbbe2 146#ifdef EXIM_HAVE_OPENSSL_TLSEXT
3f7eeb86 147static int tls_servername_cb(SSL *s, int *ad ARG_UNUSED, void *arg);
3bcbbbe2 148#endif
f2de3a33 149#ifndef DISABLE_OCSP
f5d78688 150static int tls_server_stapling_cb(SSL *s, void *arg);
3f7eeb86
PP
151#endif
152
059ec3d9
PH
153
154/*************************************************
155* Handle TLS error *
156*************************************************/
157
158/* Called from lots of places when errors occur before actually starting to do
159the TLS handshake, that is, while the session is still in clear. Always returns
160DEFER for a server and FAIL for a client so that most calls can use "return
161tls_error(...)" to do this processing and then give an appropriate return. A
162single function is used for both server and client, because it is called from
163some shared functions.
164
165Argument:
166 prefix text to include in the logged error
167 host NULL if setting up a server;
168 the connected host if setting up a client
7199e1ee 169 msg error message or NULL if we should ask OpenSSL
059ec3d9
PH
170
171Returns: OK/DEFER/FAIL
172*/
173
174static int
7199e1ee 175tls_error(uschar *prefix, host_item *host, uschar *msg)
059ec3d9 176{
c562fd30 177if (!msg)
7199e1ee
TF
178 {
179 ERR_error_string(ERR_get_error(), ssl_errstring);
5ca6d115 180 msg = (uschar *)ssl_errstring;
7199e1ee
TF
181 }
182
c562fd30
JH
183if (host)
184 {
185 log_write(0, LOG_MAIN, "H=%s [%s] TLS error on connection (%s): %s",
186 host->name, host->address, prefix, msg);
187 return FAIL;
188 }
189else
059ec3d9 190 {
7199e1ee 191 uschar *conn_info = smtp_get_connection_info();
5ca6d115 192 if (Ustrncmp(conn_info, US"SMTP ", 5) == 0)
7199e1ee 193 conn_info += 5;
c562fd30 194 /* I'd like to get separated H= here, but too hard for now */
7199e1ee
TF
195 log_write(0, LOG_MAIN, "TLS error on %s (%s): %s",
196 conn_info, prefix, msg);
059ec3d9
PH
197 return DEFER;
198 }
059ec3d9
PH
199}
200
201
202
203/*************************************************
204* Callback to generate RSA key *
205*************************************************/
206
207/*
208Arguments:
209 s SSL connection
210 export not used
211 keylength keylength
212
213Returns: pointer to generated key
214*/
215
216static RSA *
217rsa_callback(SSL *s, int export, int keylength)
218{
219RSA *rsa_key;
220export = export; /* Shut picky compilers up */
221DEBUG(D_tls) debug_printf("Generating %d bit RSA key...\n", keylength);
222rsa_key = RSA_generate_key(keylength, RSA_F4, NULL, NULL);
223if (rsa_key == NULL)
224 {
225 ERR_error_string(ERR_get_error(), ssl_errstring);
226 log_write(0, LOG_MAIN|LOG_PANIC, "TLS error (RSA_generate_key): %s",
227 ssl_errstring);
228 return NULL;
229 }
230return rsa_key;
231}
232
233
234
f5d78688 235/* Extreme debug
f2de3a33 236#ifndef DISABLE_OCSP
f5d78688
JH
237void
238x509_store_dump_cert_s_names(X509_STORE * store)
239{
240STACK_OF(X509_OBJECT) * roots= store->objs;
241int i;
242static uschar name[256];
243
244for(i= 0; i<sk_X509_OBJECT_num(roots); i++)
245 {
246 X509_OBJECT * tmp_obj= sk_X509_OBJECT_value(roots, i);
247 if(tmp_obj->type == X509_LU_X509)
248 {
249 X509 * current_cert= tmp_obj->data.x509;
250 X509_NAME_oneline(X509_get_subject_name(current_cert), CS name, sizeof(name));
251 debug_printf(" %s\n", name);
252 }
253 }
254}
255#endif
256*/
257
059ec3d9
PH
258
259/*************************************************
260* Callback for verification *
261*************************************************/
262
263/* The SSL library does certificate verification if set up to do so. This
264callback has the current yes/no state is in "state". If verification succeeded,
265we set up the tls_peerdn string. If verification failed, what happens depends
266on whether the client is required to present a verifiable certificate or not.
267
268If verification is optional, we change the state to yes, but still log the
269verification error. For some reason (it really would help to have proper
270documentation of OpenSSL), this callback function then gets called again, this
271time with state = 1. In fact, that's useful, because we can set up the peerdn
272value, but we must take care not to set the private verified flag on the second
273time through.
274
275Note: this function is not called if the client fails to present a certificate
276when asked. We get here only if a certificate has been received. Handling of
277optional verification for this case is done when requesting SSL to verify, by
278setting SSL_VERIFY_FAIL_IF_NO_PEER_CERT in the non-optional case.
279
a7538db1
JH
280May be called multiple times for different issues with a certificate, even
281for a given "depth" in the certificate chain.
282
059ec3d9
PH
283Arguments:
284 state current yes/no state as 1/0
285 x509ctx certificate information.
a2ff477a 286 client TRUE for client startup, FALSE for server startup
059ec3d9
PH
287
288Returns: 1 if verified, 0 if not
289*/
290
291static int
421aff85
JH
292verify_callback(int state, X509_STORE_CTX *x509ctx,
293 tls_support *tlsp, BOOL *calledp, BOOL *optionalp)
059ec3d9 294{
421aff85 295X509 * cert = X509_STORE_CTX_get_current_cert(x509ctx);
a7538db1 296int depth = X509_STORE_CTX_get_error_depth(x509ctx);
723fe533 297uschar * ev;
059ec3d9
PH
298static uschar txt[256];
299
e51c7be2 300X509_NAME_oneline(X509_get_subject_name(cert), CS txt, sizeof(txt));
059ec3d9
PH
301
302if (state == 0)
303 {
304 log_write(0, LOG_MAIN, "SSL verify error: depth=%d error=%s cert=%s",
a7538db1 305 depth,
421aff85 306 X509_verify_cert_error_string(X509_STORE_CTX_get_error(x509ctx)),
059ec3d9 307 txt);
a2ff477a
JH
308 tlsp->certificate_verified = FALSE;
309 *calledp = TRUE;
9d1c15ef
JH
310 if (!*optionalp)
311 {
421aff85 312 tlsp->peercert = X509_dup(cert);
9d1c15ef
JH
313 return 0; /* reject */
314 }
059ec3d9
PH
315 DEBUG(D_tls) debug_printf("SSL verify failure overridden (host in "
316 "tls_try_verify_hosts)\n");
059ec3d9
PH
317 }
318
a7538db1 319else if (depth != 0)
059ec3d9 320 {
a7538db1 321 DEBUG(D_tls) debug_printf("SSL verify ok: depth=%d SN=%s\n", depth, txt);
f2de3a33 322#ifndef DISABLE_OCSP
f5d78688
JH
323 if (tlsp == &tls_out && client_static_cbinfo->u_ocsp.client.verify_store)
324 { /* client, wanting stapling */
325 /* Add the server cert's signing chain as the one
326 for the verification of the OCSP stapled information. */
327
328 if (!X509_STORE_add_cert(client_static_cbinfo->u_ocsp.client.verify_store,
421aff85 329 cert))
f5d78688
JH
330 ERR_clear_error();
331 }
a7538db1 332#endif
774ef2d7 333#ifdef EXPERIMENTAL_EVENT
723fe533
JH
334 ev = tlsp == &tls_out ? client_static_cbinfo->event_action : event_action;
335 if (ev)
a7538db1
JH
336 {
337 tlsp->peercert = X509_dup(cert);
723fe533 338 if (event_raise(ev, US"tls:cert", string_sprintf("%d", depth)) == DEFER)
a7538db1
JH
339 {
340 log_write(0, LOG_MAIN, "SSL verify denied by event-action: "
341 "depth=%d cert=%s", depth, txt);
342 tlsp->certificate_verified = FALSE;
343 *calledp = TRUE;
344 return 0; /* reject */
345 }
346 X509_free(tlsp->peercert);
347 tlsp->peercert = NULL;
348 }
f5d78688 349#endif
059ec3d9
PH
350 }
351else
352 {
e51c7be2
JH
353#ifdef EXPERIMENTAL_CERTNAMES
354 uschar * verify_cert_hostnames;
355#endif
356
a2ff477a 357 tlsp->peerdn = txt;
421aff85 358 tlsp->peercert = X509_dup(cert);
e51c7be2
JH
359
360#ifdef EXPERIMENTAL_CERTNAMES
361 if ( tlsp == &tls_out
362 && ((verify_cert_hostnames = client_static_cbinfo->verify_cert_hostnames)))
363 /* client, wanting hostname check */
364
2dfb468b 365# if EXIM_HAVE_OPENSSL_CHECKHOST
d8e7834a
JH
366# ifndef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
367# define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0
368# endif
e51c7be2
JH
369 {
370 int sep = 0;
371 uschar * list = verify_cert_hostnames;
372 uschar * name;
d8e7834a
JH
373 int rc;
374 while ((name = string_nextinlist(&list, &sep, NULL, 0)))
375 if ((rc = X509_check_host(cert, name, 0,
376 X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS)))
377 {
378 if (rc < 0)
379 {
380 log_write(0, LOG_MAIN, "SSL verify error: internal error\n");
381 name = NULL;
382 }
e51c7be2 383 break;
d8e7834a 384 }
e51c7be2
JH
385 if (!name)
386 {
387 log_write(0, LOG_MAIN,
388 "SSL verify error: certificate name mismatch: \"%s\"\n", txt);
389 return 0; /* reject */
390 }
391 }
392# else
393 if (!tls_is_name_for_cert(verify_cert_hostnames, cert))
394 {
395 log_write(0, LOG_MAIN,
396 "SSL verify error: certificate name mismatch: \"%s\"\n", txt);
397 return 0; /* reject */
398 }
399# endif
e5cccda9 400#endif /*EXPERIMENTAL_CERTNAMES*/
e51c7be2 401
774ef2d7 402#ifdef EXPERIMENTAL_EVENT
723fe533
JH
403 ev = tlsp == &tls_out ? client_static_cbinfo->event_action : event_action;
404 if (ev)
405 if (event_raise(ev, US"tls:cert", US"0") == DEFER)
a7538db1
JH
406 {
407 log_write(0, LOG_MAIN, "SSL verify denied by event-action: "
408 "depth=0 cert=%s", txt);
409 tlsp->certificate_verified = FALSE;
410 *calledp = TRUE;
411 return 0; /* reject */
412 }
e51c7be2
JH
413#endif
414
93dcb1c2
JH
415 DEBUG(D_tls) debug_printf("SSL%s verify ok: depth=0 SN=%s\n",
416 *calledp ? "" : " authenticated", txt);
417 if (!*calledp) tlsp->certificate_verified = TRUE;
418 *calledp = TRUE;
059ec3d9
PH
419 }
420
a7538db1 421return 1; /* accept, at least for this level */
059ec3d9
PH
422}
423
a2ff477a
JH
424static int
425verify_callback_client(int state, X509_STORE_CTX *x509ctx)
426{
f5d78688 427return verify_callback(state, x509ctx, &tls_out, &client_verify_callback_called, &client_verify_optional);
a2ff477a
JH
428}
429
430static int
431verify_callback_server(int state, X509_STORE_CTX *x509ctx)
432{
f5d78688 433return verify_callback(state, x509ctx, &tls_in, &server_verify_callback_called, &server_verify_optional);
a2ff477a
JH
434}
435
059ec3d9 436
e5cccda9 437#ifdef EXPERIMENTAL_DANE
53a7196b 438
e5cccda9
JH
439/* This gets called *by* the dane library verify callback, which interposes
440itself.
441*/
442static int
443verify_callback_client_dane(int state, X509_STORE_CTX * x509ctx)
444{
445X509 * cert = X509_STORE_CTX_get_current_cert(x509ctx);
446static uschar txt[256];
774ef2d7 447#ifdef EXPERIMENTAL_EVENT
83b27293
JH
448int depth = X509_STORE_CTX_get_error_depth(x509ctx);
449#endif
e5cccda9
JH
450
451X509_NAME_oneline(X509_get_subject_name(cert), CS txt, sizeof(txt));
452
453DEBUG(D_tls) debug_printf("verify_callback_client_dane: %s\n", txt);
454tls_out.peerdn = txt;
455tls_out.peercert = X509_dup(cert);
456
774ef2d7 457#ifdef EXPERIMENTAL_EVENT
83b27293
JH
458 if (client_static_cbinfo->event_action)
459 {
774ef2d7 460 if (event_raise(client_static_cbinfo->event_action,
83b27293
JH
461 US"tls:cert", string_sprintf("%d", depth)) == DEFER)
462 {
463 log_write(0, LOG_MAIN, "DANE verify denied by event-action: "
464 "depth=%d cert=%s", depth, txt);
465 tls_out.certificate_verified = FALSE;
466 return 0; /* reject */
467 }
468 if (depth != 0)
469 {
470 X509_free(tls_out.peercert);
471 tls_out.peercert = NULL;
472 }
473 }
474#endif
475
e5cccda9 476if (state == 1)
53a7196b 477 tls_out.dane_verified =
e5cccda9
JH
478 tls_out.certificate_verified = TRUE;
479return 1;
480}
53a7196b
JH
481
482#endif /*EXPERIMENTAL_DANE*/
e5cccda9 483
059ec3d9
PH
484
485/*************************************************
486* Information callback *
487*************************************************/
488
489/* The SSL library functions call this from time to time to indicate what they
7be682ca
PP
490are doing. We copy the string to the debugging output when TLS debugging has
491been requested.
059ec3d9
PH
492
493Arguments:
494 s the SSL connection
495 where
496 ret
497
498Returns: nothing
499*/
500
501static void
502info_callback(SSL *s, int where, int ret)
503{
504where = where;
505ret = ret;
506DEBUG(D_tls) debug_printf("SSL info: %s\n", SSL_state_string_long(s));
507}
508
509
510
511/*************************************************
512* Initialize for DH *
513*************************************************/
514
515/* If dhparam is set, expand it, and load up the parameters for DH encryption.
516
517Arguments:
a799883d 518 dhparam DH parameter file or fixed parameter identity string
7199e1ee 519 host connected host, if client; NULL if server
059ec3d9
PH
520
521Returns: TRUE if OK (nothing to set up, or setup worked)
522*/
523
524static BOOL
a799883d 525init_dh(SSL_CTX *sctx, uschar *dhparam, host_item *host)
059ec3d9 526{
059ec3d9
PH
527BIO *bio;
528DH *dh;
529uschar *dhexpanded;
a799883d 530const char *pem;
059ec3d9
PH
531
532if (!expand_check(dhparam, US"tls_dhparam", &dhexpanded))
533 return FALSE;
534
0df4ab80 535if (!dhexpanded || !*dhexpanded)
a799883d 536 bio = BIO_new_mem_buf(CS std_dh_prime_default(), -1);
a799883d 537else if (dhexpanded[0] == '/')
059ec3d9 538 {
0df4ab80 539 if (!(bio = BIO_new_file(CS dhexpanded, "r")))
059ec3d9 540 {
7199e1ee 541 tls_error(string_sprintf("could not read dhparams file %s", dhexpanded),
a799883d
PP
542 host, US strerror(errno));
543 return FALSE;
059ec3d9 544 }
a799883d
PP
545 }
546else
547 {
548 if (Ustrcmp(dhexpanded, "none") == 0)
059ec3d9 549 {
a799883d
PP
550 DEBUG(D_tls) debug_printf("Requested no DH parameters.\n");
551 return TRUE;
059ec3d9 552 }
a799883d 553
0df4ab80 554 if (!(pem = std_dh_prime_named(dhexpanded)))
a799883d
PP
555 {
556 tls_error(string_sprintf("Unknown standard DH prime \"%s\"", dhexpanded),
557 host, US strerror(errno));
558 return FALSE;
559 }
560 bio = BIO_new_mem_buf(CS pem, -1);
561 }
562
0df4ab80 563if (!(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)))
a799883d 564 {
059ec3d9 565 BIO_free(bio);
a799883d
PP
566 tls_error(string_sprintf("Could not read tls_dhparams \"%s\"", dhexpanded),
567 host, NULL);
568 return FALSE;
569 }
570
571/* Even if it is larger, we silently return success rather than cause things
572 * to fail out, so that a too-large DH will not knock out all TLS; it's a
573 * debatable choice. */
574if ((8*DH_size(dh)) > tls_dh_max_bits)
575 {
576 DEBUG(D_tls)
577 debug_printf("dhparams file %d bits, is > tls_dh_max_bits limit of %d",
578 8*DH_size(dh), tls_dh_max_bits);
579 }
580else
581 {
582 SSL_CTX_set_tmp_dh(sctx, dh);
583 DEBUG(D_tls)
584 debug_printf("Diffie-Hellman initialized from %s with %d-bit prime\n",
585 dhexpanded ? dhexpanded : US"default", 8*DH_size(dh));
059ec3d9
PH
586 }
587
a799883d
PP
588DH_free(dh);
589BIO_free(bio);
590
591return TRUE;
059ec3d9
PH
592}
593
594
595
596
f2de3a33 597#ifndef DISABLE_OCSP
3f7eeb86
PP
598/*************************************************
599* Load OCSP information into state *
600*************************************************/
601
f5d78688 602/* Called to load the server OCSP response from the given file into memory, once
3f7eeb86
PP
603caller has determined this is needed. Checks validity. Debugs a message
604if invalid.
605
606ASSUMES: single response, for single cert.
607
608Arguments:
609 sctx the SSL_CTX* to update
610 cbinfo various parts of session state
611 expanded the filename putatively holding an OCSP response
612
613*/
614
615static void
f5d78688 616ocsp_load_response(SSL_CTX *sctx, tls_ext_ctx_cb *cbinfo, const uschar *expanded)
3f7eeb86
PP
617{
618BIO *bio;
619OCSP_RESPONSE *resp;
620OCSP_BASICRESP *basic_response;
621OCSP_SINGLERESP *single_response;
622ASN1_GENERALIZEDTIME *rev, *thisupd, *nextupd;
623X509_STORE *store;
624unsigned long verify_flags;
625int status, reason, i;
626
f5d78688
JH
627cbinfo->u_ocsp.server.file_expanded = string_copy(expanded);
628if (cbinfo->u_ocsp.server.response)
3f7eeb86 629 {
f5d78688
JH
630 OCSP_RESPONSE_free(cbinfo->u_ocsp.server.response);
631 cbinfo->u_ocsp.server.response = NULL;
3f7eeb86
PP
632 }
633
f5d78688 634bio = BIO_new_file(CS cbinfo->u_ocsp.server.file_expanded, "rb");
3f7eeb86
PP
635if (!bio)
636 {
637 DEBUG(D_tls) debug_printf("Failed to open OCSP response file \"%s\"\n",
f5d78688 638 cbinfo->u_ocsp.server.file_expanded);
3f7eeb86
PP
639 return;
640 }
641
642resp = d2i_OCSP_RESPONSE_bio(bio, NULL);
643BIO_free(bio);
644if (!resp)
645 {
646 DEBUG(D_tls) debug_printf("Error reading OCSP response.\n");
647 return;
648 }
649
650status = OCSP_response_status(resp);
651if (status != OCSP_RESPONSE_STATUS_SUCCESSFUL)
652 {
653 DEBUG(D_tls) debug_printf("OCSP response not valid: %s (%d)\n",
654 OCSP_response_status_str(status), status);
f5d78688 655 goto bad;
3f7eeb86
PP
656 }
657
658basic_response = OCSP_response_get1_basic(resp);
659if (!basic_response)
660 {
661 DEBUG(D_tls)
662 debug_printf("OCSP response parse error: unable to extract basic response.\n");
f5d78688 663 goto bad;
3f7eeb86
PP
664 }
665
666store = SSL_CTX_get_cert_store(sctx);
667verify_flags = OCSP_NOVERIFY; /* check sigs, but not purpose */
668
669/* May need to expose ability to adjust those flags?
670OCSP_NOSIGS OCSP_NOVERIFY OCSP_NOCHAIN OCSP_NOCHECKS OCSP_NOEXPLICIT
671OCSP_TRUSTOTHER OCSP_NOINTERN */
672
673i = OCSP_basic_verify(basic_response, NULL, store, verify_flags);
674if (i <= 0)
675 {
676 DEBUG(D_tls) {
677 ERR_error_string(ERR_get_error(), ssl_errstring);
678 debug_printf("OCSP response verify failure: %s\n", US ssl_errstring);
f5d78688
JH
679 }
680 goto bad;
3f7eeb86
PP
681 }
682
683/* Here's the simplifying assumption: there's only one response, for the
684one certificate we use, and nothing for anything else in a chain. If this
685proves false, we need to extract a cert id from our issued cert
686(tls_certificate) and use that for OCSP_resp_find_status() (which finds the
687right cert in the stack and then calls OCSP_single_get0_status()).
688
689I'm hoping to avoid reworking a bunch more of how we handle state here. */
690single_response = OCSP_resp_get0(basic_response, 0);
691if (!single_response)
692 {
693 DEBUG(D_tls)
694 debug_printf("Unable to get first response from OCSP basic response.\n");
f5d78688 695 goto bad;
3f7eeb86
PP
696 }
697
698status = OCSP_single_get0_status(single_response, &reason, &rev, &thisupd, &nextupd);
f5d78688 699if (status != V_OCSP_CERTSTATUS_GOOD)
3f7eeb86 700 {
f5d78688
JH
701 DEBUG(D_tls) debug_printf("OCSP response bad cert status: %s (%d) %s (%d)\n",
702 OCSP_cert_status_str(status), status,
703 OCSP_crl_reason_str(reason), reason);
704 goto bad;
3f7eeb86
PP
705 }
706
707if (!OCSP_check_validity(thisupd, nextupd, EXIM_OCSP_SKEW_SECONDS, EXIM_OCSP_MAX_AGE))
708 {
709 DEBUG(D_tls) debug_printf("OCSP status invalid times.\n");
f5d78688 710 goto bad;
3f7eeb86
PP
711 }
712
f5d78688 713supply_response:
018058b2 714 cbinfo->u_ocsp.server.response = resp;
f5d78688
JH
715return;
716
717bad:
018058b2
JH
718 if (running_in_test_harness)
719 {
720 extern char ** environ;
721 uschar ** p;
722 for (p = USS environ; *p != NULL; p++)
723 if (Ustrncmp(*p, "EXIM_TESTHARNESS_DISABLE_OCSPVALIDITYCHECK", 42) == 0)
724 {
725 DEBUG(D_tls) debug_printf("Supplying known bad OCSP response\n");
726 goto supply_response;
727 }
728 }
f5d78688 729return;
3f7eeb86 730}
f2de3a33 731#endif /*!DISABLE_OCSP*/
3f7eeb86
PP
732
733
734
735
7be682ca
PP
736/*************************************************
737* Expand key and cert file specs *
738*************************************************/
739
f5d78688 740/* Called once during tls_init and possibly again during TLS setup, for a
7be682ca
PP
741new context, if Server Name Indication was used and tls_sni was seen in
742the certificate string.
743
744Arguments:
745 sctx the SSL_CTX* to update
746 cbinfo various parts of session state
747
748Returns: OK/DEFER/FAIL
749*/
750
751static int
3f7eeb86 752tls_expand_session_files(SSL_CTX *sctx, tls_ext_ctx_cb *cbinfo)
7be682ca
PP
753{
754uschar *expanded;
755
756if (cbinfo->certificate == NULL)
757 return OK;
758
d9b2312b
JH
759if (Ustrstr(cbinfo->certificate, US"tls_sni") ||
760 Ustrstr(cbinfo->certificate, US"tls_in_sni") ||
761 Ustrstr(cbinfo->certificate, US"tls_out_sni")
762 )
7be682ca
PP
763 reexpand_tls_files_for_sni = TRUE;
764
765if (!expand_check(cbinfo->certificate, US"tls_certificate", &expanded))
766 return DEFER;
767
768if (expanded != NULL)
769 {
770 DEBUG(D_tls) debug_printf("tls_certificate file %s\n", expanded);
771 if (!SSL_CTX_use_certificate_chain_file(sctx, CS expanded))
772 return tls_error(string_sprintf(
773 "SSL_CTX_use_certificate_chain_file file=%s", expanded),
774 cbinfo->host, NULL);
775 }
776
777if (cbinfo->privatekey != NULL &&
778 !expand_check(cbinfo->privatekey, US"tls_privatekey", &expanded))
779 return DEFER;
780
781/* If expansion was forced to fail, key_expanded will be NULL. If the result
782of the expansion is an empty string, ignore it also, and assume the private
783key is in the same file as the certificate. */
784
785if (expanded != NULL && *expanded != 0)
786 {
787 DEBUG(D_tls) debug_printf("tls_privatekey file %s\n", expanded);
788 if (!SSL_CTX_use_PrivateKey_file(sctx, CS expanded, SSL_FILETYPE_PEM))
789 return tls_error(string_sprintf(
790 "SSL_CTX_use_PrivateKey_file file=%s", expanded), cbinfo->host, NULL);
791 }
792
f2de3a33 793#ifndef DISABLE_OCSP
f5d78688 794if (cbinfo->is_server && cbinfo->u_ocsp.server.file != NULL)
3f7eeb86 795 {
f5d78688 796 if (!expand_check(cbinfo->u_ocsp.server.file, US"tls_ocsp_file", &expanded))
3f7eeb86
PP
797 return DEFER;
798
799 if (expanded != NULL && *expanded != 0)
800 {
801 DEBUG(D_tls) debug_printf("tls_ocsp_file %s\n", expanded);
f5d78688
JH
802 if (cbinfo->u_ocsp.server.file_expanded &&
803 (Ustrcmp(expanded, cbinfo->u_ocsp.server.file_expanded) == 0))
3f7eeb86
PP
804 {
805 DEBUG(D_tls)
806 debug_printf("tls_ocsp_file value unchanged, using existing values.\n");
807 } else {
808 ocsp_load_response(sctx, cbinfo, expanded);
809 }
810 }
811 }
812#endif
813
7be682ca
PP
814return OK;
815}
816
817
818
819
820/*************************************************
821* Callback to handle SNI *
822*************************************************/
823
824/* Called when acting as server during the TLS session setup if a Server Name
825Indication extension was sent by the client.
826
827API documentation is OpenSSL s_server.c implementation.
828
829Arguments:
830 s SSL* of the current session
831 ad unknown (part of OpenSSL API) (unused)
832 arg Callback of "our" registered data
833
834Returns: SSL_TLSEXT_ERR_{OK,ALERT_WARNING,ALERT_FATAL,NOACK}
835*/
836
3bcbbbe2 837#ifdef EXIM_HAVE_OPENSSL_TLSEXT
7be682ca
PP
838static int
839tls_servername_cb(SSL *s, int *ad ARG_UNUSED, void *arg)
840{
841const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
3f7eeb86 842tls_ext_ctx_cb *cbinfo = (tls_ext_ctx_cb *) arg;
7be682ca 843int rc;
3f0945ff 844int old_pool = store_pool;
7be682ca
PP
845
846if (!servername)
847 return SSL_TLSEXT_ERR_OK;
848
3f0945ff 849DEBUG(D_tls) debug_printf("Received TLS SNI \"%s\"%s\n", servername,
7be682ca
PP
850 reexpand_tls_files_for_sni ? "" : " (unused for certificate selection)");
851
852/* Make the extension value available for expansion */
3f0945ff 853store_pool = POOL_PERM;
817d9f57 854tls_in.sni = string_copy(US servername);
3f0945ff 855store_pool = old_pool;
7be682ca
PP
856
857if (!reexpand_tls_files_for_sni)
858 return SSL_TLSEXT_ERR_OK;
859
860/* Can't find an SSL_CTX_clone() or equivalent, so we do it manually;
861not confident that memcpy wouldn't break some internal reference counting.
862Especially since there's a references struct member, which would be off. */
863
0df4ab80 864if (!(server_sni = SSL_CTX_new(SSLv23_server_method())))
7be682ca
PP
865 {
866 ERR_error_string(ERR_get_error(), ssl_errstring);
867 DEBUG(D_tls) debug_printf("SSL_CTX_new() failed: %s\n", ssl_errstring);
868 return SSL_TLSEXT_ERR_NOACK;
869 }
870
871/* Not sure how many of these are actually needed, since SSL object
872already exists. Might even need this selfsame callback, for reneg? */
873
817d9f57
JH
874SSL_CTX_set_info_callback(server_sni, SSL_CTX_get_info_callback(server_ctx));
875SSL_CTX_set_mode(server_sni, SSL_CTX_get_mode(server_ctx));
876SSL_CTX_set_options(server_sni, SSL_CTX_get_options(server_ctx));
877SSL_CTX_set_timeout(server_sni, SSL_CTX_get_timeout(server_ctx));
878SSL_CTX_set_tlsext_servername_callback(server_sni, tls_servername_cb);
879SSL_CTX_set_tlsext_servername_arg(server_sni, cbinfo);
7be682ca 880if (cbinfo->server_cipher_list)
817d9f57 881 SSL_CTX_set_cipher_list(server_sni, CS cbinfo->server_cipher_list);
f2de3a33 882#ifndef DISABLE_OCSP
f5d78688 883if (cbinfo->u_ocsp.server.file)
3f7eeb86 884 {
f5d78688 885 SSL_CTX_set_tlsext_status_cb(server_sni, tls_server_stapling_cb);
14c7b357 886 SSL_CTX_set_tlsext_status_arg(server_sni, cbinfo);
3f7eeb86
PP
887 }
888#endif
7be682ca 889
983207c1 890rc = setup_certs(server_sni, tls_verify_certificates, tls_crl, NULL, FALSE, verify_callback_server);
7be682ca
PP
891if (rc != OK) return SSL_TLSEXT_ERR_NOACK;
892
3f7eeb86
PP
893/* do this after setup_certs, because this can require the certs for verifying
894OCSP information. */
817d9f57 895rc = tls_expand_session_files(server_sni, cbinfo);
7be682ca
PP
896if (rc != OK) return SSL_TLSEXT_ERR_NOACK;
897
0df4ab80
JH
898if (!init_dh(server_sni, cbinfo->dhparam, NULL))
899 return SSL_TLSEXT_ERR_NOACK;
a799883d 900
7be682ca 901DEBUG(D_tls) debug_printf("Switching SSL context.\n");
817d9f57 902SSL_set_SSL_CTX(s, server_sni);
7be682ca
PP
903
904return SSL_TLSEXT_ERR_OK;
905}
3bcbbbe2 906#endif /* EXIM_HAVE_OPENSSL_TLSEXT */
7be682ca
PP
907
908
909
910
f2de3a33 911#ifndef DISABLE_OCSP
f5d78688 912
3f7eeb86
PP
913/*************************************************
914* Callback to handle OCSP Stapling *
915*************************************************/
916
917/* Called when acting as server during the TLS session setup if the client
918requests OCSP information with a Certificate Status Request.
919
920Documentation via openssl s_server.c and the Apache patch from the OpenSSL
921project.
922
923*/
924
925static int
f5d78688 926tls_server_stapling_cb(SSL *s, void *arg)
3f7eeb86
PP
927{
928const tls_ext_ctx_cb *cbinfo = (tls_ext_ctx_cb *) arg;
929uschar *response_der;
930int response_der_len;
931
af4a1bca
JH
932DEBUG(D_tls)
933 debug_printf("Received TLS status request (OCSP stapling); %s response.",
f5d78688
JH
934 cbinfo->u_ocsp.server.response ? "have" : "lack");
935
44662487 936tls_in.ocsp = OCSP_NOT_RESP;
f5d78688 937if (!cbinfo->u_ocsp.server.response)
3f7eeb86
PP
938 return SSL_TLSEXT_ERR_NOACK;
939
940response_der = NULL;
44662487
JH
941response_der_len = i2d_OCSP_RESPONSE(cbinfo->u_ocsp.server.response,
942 &response_der);
3f7eeb86
PP
943if (response_der_len <= 0)
944 return SSL_TLSEXT_ERR_NOACK;
945
5e55c7a9 946SSL_set_tlsext_status_ocsp_resp(server_ssl, response_der, response_der_len);
44662487 947tls_in.ocsp = OCSP_VFIED;
3f7eeb86
PP
948return SSL_TLSEXT_ERR_OK;
949}
950
3f7eeb86 951
f5d78688
JH
952static void
953time_print(BIO * bp, const char * str, ASN1_GENERALIZEDTIME * time)
954{
955BIO_printf(bp, "\t%s: ", str);
956ASN1_GENERALIZEDTIME_print(bp, time);
957BIO_puts(bp, "\n");
958}
959
960static int
961tls_client_stapling_cb(SSL *s, void *arg)
962{
963tls_ext_ctx_cb * cbinfo = arg;
964const unsigned char * p;
965int len;
966OCSP_RESPONSE * rsp;
967OCSP_BASICRESP * bs;
968int i;
969
970DEBUG(D_tls) debug_printf("Received TLS status response (OCSP stapling):");
971len = SSL_get_tlsext_status_ocsp_resp(s, &p);
972if(!p)
973 {
44662487
JH
974 /* Expect this when we requested ocsp but got none */
975 if ( cbinfo->u_ocsp.client.verify_required
976 && log_extra_selector & LX_tls_cipher)
977 log_write(0, LOG_MAIN, "Received TLS status callback, null content");
f5d78688
JH
978 else
979 DEBUG(D_tls) debug_printf(" null\n");
44662487 980 return cbinfo->u_ocsp.client.verify_required ? 0 : 1;
f5d78688 981 }
018058b2 982
f5d78688
JH
983if(!(rsp = d2i_OCSP_RESPONSE(NULL, &p, len)))
984 {
018058b2 985 tls_out.ocsp = OCSP_FAILED;
f5d78688 986 if (log_extra_selector & LX_tls_cipher)
1eca31ca 987 log_write(0, LOG_MAIN, "Received TLS cert status response, parse error");
f5d78688
JH
988 else
989 DEBUG(D_tls) debug_printf(" parse error\n");
990 return 0;
991 }
992
993if(!(bs = OCSP_response_get1_basic(rsp)))
994 {
018058b2 995 tls_out.ocsp = OCSP_FAILED;
f5d78688 996 if (log_extra_selector & LX_tls_cipher)
1eca31ca 997 log_write(0, LOG_MAIN, "Received TLS cert status response, error parsing response");
f5d78688
JH
998 else
999 DEBUG(D_tls) debug_printf(" error parsing response\n");
1000 OCSP_RESPONSE_free(rsp);
1001 return 0;
1002 }
1003
1004/* We'd check the nonce here if we'd put one in the request. */
1005/* However that would defeat cacheability on the server so we don't. */
1006
f5d78688
JH
1007/* This section of code reworked from OpenSSL apps source;
1008 The OpenSSL Project retains copyright:
1009 Copyright (c) 1999 The OpenSSL Project. All rights reserved.
1010*/
1011 {
1012 BIO * bp = NULL;
f5d78688
JH
1013 int status, reason;
1014 ASN1_GENERALIZEDTIME *rev, *thisupd, *nextupd;
1015
1016 DEBUG(D_tls) bp = BIO_new_fp(stderr, BIO_NOCLOSE);
1017
1018 /*OCSP_RESPONSE_print(bp, rsp, 0); extreme debug: stapling content */
1019
1020 /* Use the chain that verified the server cert to verify the stapled info */
1021 /* DEBUG(D_tls) x509_store_dump_cert_s_names(cbinfo->u_ocsp.client.verify_store); */
1022
44662487
JH
1023 if ((i = OCSP_basic_verify(bs, NULL,
1024 cbinfo->u_ocsp.client.verify_store, 0)) <= 0)
f5d78688 1025 {
018058b2 1026 tls_out.ocsp = OCSP_FAILED;
1eca31ca
JH
1027 if (log_extra_selector & LX_tls_cipher)
1028 log_write(0, LOG_MAIN, "Received TLS cert status response, itself unverifiable");
f5d78688
JH
1029 BIO_printf(bp, "OCSP response verify failure\n");
1030 ERR_print_errors(bp);
44662487 1031 i = cbinfo->u_ocsp.client.verify_required ? 0 : 1;
f5d78688
JH
1032 goto out;
1033 }
1034
1035 BIO_printf(bp, "OCSP response well-formed and signed OK\n");
1036
1037 {
1038 STACK_OF(OCSP_SINGLERESP) * sresp = bs->tbsResponseData->responses;
1039 OCSP_SINGLERESP * single;
1040
1041 if (sk_OCSP_SINGLERESP_num(sresp) != 1)
1042 {
018058b2 1043 tls_out.ocsp = OCSP_FAILED;
44662487
JH
1044 log_write(0, LOG_MAIN, "OCSP stapling "
1045 "with multiple responses not handled");
1046 i = cbinfo->u_ocsp.client.verify_required ? 0 : 1;
f5d78688
JH
1047 goto out;
1048 }
1049 single = OCSP_resp_get0(bs, 0);
44662487
JH
1050 status = OCSP_single_get0_status(single, &reason, &rev,
1051 &thisupd, &nextupd);
f5d78688
JH
1052 }
1053
f5d78688
JH
1054 DEBUG(D_tls) time_print(bp, "This OCSP Update", thisupd);
1055 DEBUG(D_tls) if(nextupd) time_print(bp, "Next OCSP Update", nextupd);
44662487
JH
1056 if (!OCSP_check_validity(thisupd, nextupd,
1057 EXIM_OCSP_SKEW_SECONDS, EXIM_OCSP_MAX_AGE))
f5d78688 1058 {
018058b2 1059 tls_out.ocsp = OCSP_FAILED;
f5d78688
JH
1060 DEBUG(D_tls) ERR_print_errors(bp);
1061 log_write(0, LOG_MAIN, "Server OSCP dates invalid");
44662487 1062 i = cbinfo->u_ocsp.client.verify_required ? 0 : 1;
f5d78688 1063 }
44662487 1064 else
f5d78688 1065 {
44662487
JH
1066 DEBUG(D_tls) BIO_printf(bp, "Certificate status: %s\n",
1067 OCSP_cert_status_str(status));
1068 switch(status)
1069 {
1070 case V_OCSP_CERTSTATUS_GOOD:
44662487 1071 tls_out.ocsp = OCSP_VFIED;
018058b2 1072 i = 1;
44662487
JH
1073 break;
1074 case V_OCSP_CERTSTATUS_REVOKED:
018058b2 1075 tls_out.ocsp = OCSP_FAILED;
44662487
JH
1076 log_write(0, LOG_MAIN, "Server certificate revoked%s%s",
1077 reason != -1 ? "; reason: " : "",
1078 reason != -1 ? OCSP_crl_reason_str(reason) : "");
1079 DEBUG(D_tls) time_print(bp, "Revocation Time", rev);
1080 i = cbinfo->u_ocsp.client.verify_required ? 0 : 1;
1081 break;
1082 default:
018058b2 1083 tls_out.ocsp = OCSP_FAILED;
44662487
JH
1084 log_write(0, LOG_MAIN,
1085 "Server certificate status unknown, in OCSP stapling");
1086 i = cbinfo->u_ocsp.client.verify_required ? 0 : 1;
1087 break;
1088 }
f5d78688
JH
1089 }
1090 out:
1091 BIO_free(bp);
1092 }
1093
1094OCSP_RESPONSE_free(rsp);
1095return i;
1096}
f2de3a33 1097#endif /*!DISABLE_OCSP*/
3f7eeb86
PP
1098
1099
059ec3d9
PH
1100/*************************************************
1101* Initialize for TLS *
1102*************************************************/
1103
e51c7be2
JH
1104/* Called from both server and client code, to do preliminary initialization
1105of the library. We allocate and return a context structure.
059ec3d9
PH
1106
1107Arguments:
946ecbe0 1108 ctxp returned SSL context
059ec3d9
PH
1109 host connected host, if client; NULL if server
1110 dhparam DH parameter file
1111 certificate certificate file
1112 privatekey private key
f5d78688 1113 ocsp_file file of stapling info (server); flag for require ocsp (client)
059ec3d9 1114 addr address if client; NULL if server (for some randomness)
946ecbe0 1115 cbp place to put allocated callback context
059ec3d9
PH
1116
1117Returns: OK/DEFER/FAIL
1118*/
1119
1120static int
817d9f57 1121tls_init(SSL_CTX **ctxp, host_item *host, uschar *dhparam, uschar *certificate,
3f7eeb86 1122 uschar *privatekey,
f2de3a33 1123#ifndef DISABLE_OCSP
3f7eeb86
PP
1124 uschar *ocsp_file,
1125#endif
817d9f57 1126 address_item *addr, tls_ext_ctx_cb ** cbp)
059ec3d9 1127{
77bb000f 1128long init_options;
7be682ca 1129int rc;
77bb000f 1130BOOL okay;
a7538db1 1131tls_ext_ctx_cb * cbinfo;
7be682ca
PP
1132
1133cbinfo = store_malloc(sizeof(tls_ext_ctx_cb));
1134cbinfo->certificate = certificate;
1135cbinfo->privatekey = privatekey;
f2de3a33 1136#ifndef DISABLE_OCSP
f5d78688
JH
1137if ((cbinfo->is_server = host==NULL))
1138 {
1139 cbinfo->u_ocsp.server.file = ocsp_file;
1140 cbinfo->u_ocsp.server.file_expanded = NULL;
1141 cbinfo->u_ocsp.server.response = NULL;
1142 }
1143else
1144 cbinfo->u_ocsp.client.verify_store = NULL;
3f7eeb86 1145#endif
7be682ca 1146cbinfo->dhparam = dhparam;
0df4ab80 1147cbinfo->server_cipher_list = NULL;
7be682ca 1148cbinfo->host = host;
774ef2d7 1149#ifdef EXPERIMENTAL_EVENT
a7538db1
JH
1150cbinfo->event_action = NULL;
1151#endif
77bb000f 1152
059ec3d9
PH
1153SSL_load_error_strings(); /* basic set up */
1154OpenSSL_add_ssl_algorithms();
1155
388d6564 1156#if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && !defined(OPENSSL_NO_SHA256)
77bb000f 1157/* SHA256 is becoming ever more popular. This makes sure it gets added to the
a0475b69
TK
1158list of available digests. */
1159EVP_add_digest(EVP_sha256());
cf1ef1a9 1160#endif
a0475b69 1161
f0f5a555
PP
1162/* Create a context.
1163The OpenSSL docs in 1.0.1b have not been updated to clarify TLS variant
1164negotiation in the different methods; as far as I can tell, the only
1165*_{server,client}_method which allows negotiation is SSLv23, which exists even
1166when OpenSSL is built without SSLv2 support.
1167By disabling with openssl_options, we can let admins re-enable with the
1168existing knob. */
059ec3d9 1169
817d9f57 1170*ctxp = SSL_CTX_new((host == NULL)?
059ec3d9
PH
1171 SSLv23_server_method() : SSLv23_client_method());
1172
817d9f57 1173if (*ctxp == NULL) return tls_error(US"SSL_CTX_new", host, NULL);
059ec3d9
PH
1174
1175/* It turns out that we need to seed the random number generator this early in
1176order to get the full complement of ciphers to work. It took me roughly a day
1177of work to discover this by experiment.
1178
1179On systems that have /dev/urandom, SSL may automatically seed itself from
1180there. Otherwise, we have to make something up as best we can. Double check
1181afterwards. */
1182
1183if (!RAND_status())
1184 {
1185 randstuff r;
9e3331ea 1186 gettimeofday(&r.tv, NULL);
059ec3d9
PH
1187 r.p = getpid();
1188
1189 RAND_seed((uschar *)(&r), sizeof(r));
1190 RAND_seed((uschar *)big_buffer, big_buffer_size);
1191 if (addr != NULL) RAND_seed((uschar *)addr, sizeof(addr));
1192
1193 if (!RAND_status())
7199e1ee 1194 return tls_error(US"RAND_status", host,
5ca6d115 1195 US"unable to seed random number generator");
059ec3d9
PH
1196 }
1197
1198/* Set up the information callback, which outputs if debugging is at a suitable
1199level. */
1200
817d9f57 1201SSL_CTX_set_info_callback(*ctxp, (void (*)())info_callback);
059ec3d9 1202
c80c5570 1203/* Automatically re-try reads/writes after renegotiation. */
817d9f57 1204(void) SSL_CTX_set_mode(*ctxp, SSL_MODE_AUTO_RETRY);
c80c5570 1205
77bb000f
PP
1206/* Apply administrator-supplied work-arounds.
1207Historically we applied just one requested option,
1208SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS, but when bug 994 requested a second, we
1209moved to an administrator-controlled list of options to specify and
1210grandfathered in the first one as the default value for "openssl_options".
059ec3d9 1211
77bb000f
PP
1212No OpenSSL version number checks: the options we accept depend upon the
1213availability of the option value macros from OpenSSL. */
059ec3d9 1214
77bb000f
PP
1215okay = tls_openssl_options_parse(openssl_options, &init_options);
1216if (!okay)
73a46702 1217 return tls_error(US"openssl_options parsing failed", host, NULL);
77bb000f
PP
1218
1219if (init_options)
1220 {
1221 DEBUG(D_tls) debug_printf("setting SSL CTX options: %#lx\n", init_options);
817d9f57 1222 if (!(SSL_CTX_set_options(*ctxp, init_options)))
77bb000f
PP
1223 return tls_error(string_sprintf(
1224 "SSL_CTX_set_option(%#lx)", init_options), host, NULL);
1225 }
1226else
1227 DEBUG(D_tls) debug_printf("no SSL CTX options to set\n");
059ec3d9
PH
1228
1229/* Initialize with DH parameters if supplied */
1230
817d9f57 1231if (!init_dh(*ctxp, dhparam, host)) return DEFER;
059ec3d9 1232
3f7eeb86 1233/* Set up certificate and key (and perhaps OCSP info) */
059ec3d9 1234
817d9f57 1235rc = tls_expand_session_files(*ctxp, cbinfo);
7be682ca 1236if (rc != OK) return rc;
c91535f3 1237
7be682ca 1238/* If we need to handle SNI, do so */
3bcbbbe2 1239#ifdef EXIM_HAVE_OPENSSL_TLSEXT
f5d78688 1240if (host == NULL) /* server */
3f0945ff 1241 {
f2de3a33 1242# ifndef DISABLE_OCSP
f5d78688 1243 /* We check u_ocsp.server.file, not server.response, because we care about if
3f7eeb86
PP
1244 the option exists, not what the current expansion might be, as SNI might
1245 change the certificate and OCSP file in use between now and the time the
1246 callback is invoked. */
f5d78688 1247 if (cbinfo->u_ocsp.server.file)
3f7eeb86 1248 {
f5d78688 1249 SSL_CTX_set_tlsext_status_cb(server_ctx, tls_server_stapling_cb);
5e55c7a9 1250 SSL_CTX_set_tlsext_status_arg(server_ctx, cbinfo);
3f7eeb86 1251 }
f5d78688 1252# endif
3f0945ff
PP
1253 /* We always do this, so that $tls_sni is available even if not used in
1254 tls_certificate */
817d9f57
JH
1255 SSL_CTX_set_tlsext_servername_callback(*ctxp, tls_servername_cb);
1256 SSL_CTX_set_tlsext_servername_arg(*ctxp, cbinfo);
3f0945ff 1257 }
f2de3a33 1258# ifndef DISABLE_OCSP
f5d78688
JH
1259else /* client */
1260 if(ocsp_file) /* wanting stapling */
1261 {
1262 if (!(cbinfo->u_ocsp.client.verify_store = X509_STORE_new()))
1263 {
1264 DEBUG(D_tls) debug_printf("failed to create store for stapling verify\n");
1265 return FAIL;
1266 }
1267 SSL_CTX_set_tlsext_status_cb(*ctxp, tls_client_stapling_cb);
1268 SSL_CTX_set_tlsext_status_arg(*ctxp, cbinfo);
1269 }
1270# endif
7be682ca 1271#endif
059ec3d9 1272
e51c7be2
JH
1273#ifdef EXPERIMENTAL_CERTNAMES
1274cbinfo->verify_cert_hostnames = NULL;
1275#endif
1276
059ec3d9
PH
1277/* Set up the RSA callback */
1278
817d9f57 1279SSL_CTX_set_tmp_rsa_callback(*ctxp, rsa_callback);
059ec3d9
PH
1280
1281/* Finally, set the timeout, and we are done */
1282
817d9f57 1283SSL_CTX_set_timeout(*ctxp, ssl_session_timeout);
059ec3d9 1284DEBUG(D_tls) debug_printf("Initialized TLS\n");
7be682ca 1285
817d9f57 1286*cbp = cbinfo;
7be682ca 1287
059ec3d9
PH
1288return OK;
1289}
1290
1291
1292
1293
1294/*************************************************
1295* Get name of cipher in use *
1296*************************************************/
1297
817d9f57 1298/*
059ec3d9 1299Argument: pointer to an SSL structure for the connection
817d9f57
JH
1300 buffer to use for answer
1301 size of buffer
1302 pointer to number of bits for cipher
059ec3d9
PH
1303Returns: nothing
1304*/
1305
1306static void
817d9f57 1307construct_cipher_name(SSL *ssl, uschar *cipherbuf, int bsize, int *bits)
059ec3d9 1308{
57b3a7f5
PP
1309/* With OpenSSL 1.0.0a, this needs to be const but the documentation doesn't
1310yet reflect that. It should be a safe change anyway, even 0.9.8 versions have
1311the accessor functions use const in the prototype. */
1312const SSL_CIPHER *c;
d9784128 1313const uschar *ver;
059ec3d9 1314
d9784128 1315ver = (const uschar *)SSL_get_version(ssl);
059ec3d9 1316
57b3a7f5 1317c = (const SSL_CIPHER *) SSL_get_current_cipher(ssl);
817d9f57 1318SSL_CIPHER_get_bits(c, bits);
059ec3d9 1319
817d9f57
JH
1320string_format(cipherbuf, bsize, "%s:%s:%u", ver,
1321 SSL_CIPHER_get_name(c), *bits);
059ec3d9
PH
1322
1323DEBUG(D_tls) debug_printf("Cipher: %s\n", cipherbuf);
1324}
1325
1326
1327
1328
1329
1330/*************************************************
1331* Set up for verifying certificates *
1332*************************************************/
1333
1334/* Called by both client and server startup
1335
1336Arguments:
7be682ca 1337 sctx SSL_CTX* to initialise
059ec3d9
PH
1338 certs certs file or NULL
1339 crl CRL file or NULL
1340 host NULL in a server; the remote host in a client
1341 optional TRUE if called from a server for a host in tls_try_verify_hosts;
1342 otherwise passed as FALSE
983207c1 1343 cert_vfy_cb Callback function for certificate verification
059ec3d9
PH
1344
1345Returns: OK/DEFER/FAIL
1346*/
1347
1348static int
983207c1
JH
1349setup_certs(SSL_CTX *sctx, uschar *certs, uschar *crl, host_item *host, BOOL optional,
1350 int (*cert_vfy_cb)(int, X509_STORE_CTX *) )
059ec3d9
PH
1351{
1352uschar *expcerts, *expcrl;
1353
1354if (!expand_check(certs, US"tls_verify_certificates", &expcerts))
1355 return DEFER;
1356
26e72755 1357if (expcerts != NULL && *expcerts != '\0')
059ec3d9
PH
1358 {
1359 struct stat statbuf;
7be682ca 1360 if (!SSL_CTX_set_default_verify_paths(sctx))
7199e1ee 1361 return tls_error(US"SSL_CTX_set_default_verify_paths", host, NULL);
059ec3d9
PH
1362
1363 if (Ustat(expcerts, &statbuf) < 0)
1364 {
1365 log_write(0, LOG_MAIN|LOG_PANIC,
1366 "failed to stat %s for certificates", expcerts);
1367 return DEFER;
1368 }
1369 else
1370 {
1371 uschar *file, *dir;
1372 if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
1373 { file = NULL; dir = expcerts; }
1374 else
1375 { file = expcerts; dir = NULL; }
1376
1377 /* If a certificate file is empty, the next function fails with an
1378 unhelpful error message. If we skip it, we get the correct behaviour (no
1379 certificates are recognized, but the error message is still misleading (it
1380 says no certificate was supplied.) But this is better. */
1381
1382 if ((file == NULL || statbuf.st_size > 0) &&
7be682ca 1383 !SSL_CTX_load_verify_locations(sctx, CS file, CS dir))
7199e1ee 1384 return tls_error(US"SSL_CTX_load_verify_locations", host, NULL);
059ec3d9 1385
3281c6ea 1386 /* Load the list of CAs for which we will accept certs, for sending
a805c12a
JH
1387 to the client. This is only for the one-file tls_verify_certificates
1388 variant.
1389 If a list isn't loaded into the server, but
1390 some verify locations are set, the server end appears to make
1391 a wildcard reqest for client certs.
1392 Meanwhile, the client library as deafult behaviour *ignores* the list
1393 we send over the wire - see man SSL_CTX_set_client_cert_cb.
1394 Because of this, and that the dir variant is likely only used for
1395 the public-CA bundle (not for a private CA), not worth fixing.
1396 */
059ec3d9
PH
1397 if (file != NULL)
1398 {
3281c6ea
JH
1399 STACK_OF(X509_NAME) * names = SSL_load_client_CA_file(CS file);
1400DEBUG(D_tls) debug_printf("Added %d certificate authorities.\n",
1401 sk_X509_NAME_num(names));
1402 SSL_CTX_set_client_CA_list(sctx, names);
059ec3d9
PH
1403 }
1404 }
1405
1406 /* Handle a certificate revocation list. */
1407
1408 #if OPENSSL_VERSION_NUMBER > 0x00907000L
1409
8b417f2c
PH
1410 /* This bit of code is now the version supplied by Lars Mainka. (I have
1411 * merely reformatted it into the Exim code style.)
1412
1413 * "From here I changed the code to add support for multiple crl's
1414 * in pem format in one file or to support hashed directory entries in
1415 * pem format instead of a file. This method now uses the library function
1416 * X509_STORE_load_locations to add the CRL location to the SSL context.
1417 * OpenSSL will then handle the verify against CA certs and CRLs by
1418 * itself in the verify callback." */
1419
059ec3d9
PH
1420 if (!expand_check(crl, US"tls_crl", &expcrl)) return DEFER;
1421 if (expcrl != NULL && *expcrl != 0)
1422 {
8b417f2c
PH
1423 struct stat statbufcrl;
1424 if (Ustat(expcrl, &statbufcrl) < 0)
1425 {
1426 log_write(0, LOG_MAIN|LOG_PANIC,
1427 "failed to stat %s for certificates revocation lists", expcrl);
1428 return DEFER;
1429 }
1430 else
059ec3d9 1431 {
8b417f2c
PH
1432 /* is it a file or directory? */
1433 uschar *file, *dir;
7be682ca 1434 X509_STORE *cvstore = SSL_CTX_get_cert_store(sctx);
8b417f2c 1435 if ((statbufcrl.st_mode & S_IFMT) == S_IFDIR)
059ec3d9 1436 {
8b417f2c
PH
1437 file = NULL;
1438 dir = expcrl;
1439 DEBUG(D_tls) debug_printf("SSL CRL value is a directory %s\n", dir);
059ec3d9
PH
1440 }
1441 else
1442 {
8b417f2c
PH
1443 file = expcrl;
1444 dir = NULL;
1445 DEBUG(D_tls) debug_printf("SSL CRL value is a file %s\n", file);
059ec3d9 1446 }
8b417f2c 1447 if (X509_STORE_load_locations(cvstore, CS file, CS dir) == 0)
7199e1ee 1448 return tls_error(US"X509_STORE_load_locations", host, NULL);
8b417f2c
PH
1449
1450 /* setting the flags to check against the complete crl chain */
1451
1452 X509_STORE_set_flags(cvstore,
1453 X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
059ec3d9 1454 }
059ec3d9
PH
1455 }
1456
1457 #endif /* OPENSSL_VERSION_NUMBER > 0x00907000L */
1458
1459 /* If verification is optional, don't fail if no certificate */
1460
7be682ca 1461 SSL_CTX_set_verify(sctx,
059ec3d9 1462 SSL_VERIFY_PEER | (optional? 0 : SSL_VERIFY_FAIL_IF_NO_PEER_CERT),
983207c1 1463 cert_vfy_cb);
059ec3d9
PH
1464 }
1465
1466return OK;
1467}
1468
1469
1470
1471/*************************************************
1472* Start a TLS session in a server *
1473*************************************************/
1474
1475/* This is called when Exim is running as a server, after having received
1476the STARTTLS command. It must respond to that command, and then negotiate
1477a TLS session.
1478
1479Arguments:
1480 require_ciphers allowed ciphers
1481
1482Returns: OK on success
1483 DEFER for errors before the start of the negotiation
1484 FAIL for errors during the negotation; the server can't
1485 continue running.
1486*/
1487
1488int
17c76198 1489tls_server_start(const uschar *require_ciphers)
059ec3d9
PH
1490{
1491int rc;
1492uschar *expciphers;
7be682ca 1493tls_ext_ctx_cb *cbinfo;
817d9f57 1494static uschar cipherbuf[256];
059ec3d9
PH
1495
1496/* Check for previous activation */
1497
817d9f57 1498if (tls_in.active >= 0)
059ec3d9 1499 {
5ca6d115 1500 tls_error(US"STARTTLS received after TLS started", NULL, US"");
059ec3d9
PH
1501 smtp_printf("554 Already in TLS\r\n");
1502 return FAIL;
1503 }
1504
1505/* Initialize the SSL library. If it fails, it will already have logged
1506the error. */
1507
817d9f57 1508rc = tls_init(&server_ctx, NULL, tls_dhparam, tls_certificate, tls_privatekey,
f2de3a33 1509#ifndef DISABLE_OCSP
3f7eeb86
PP
1510 tls_ocsp_file,
1511#endif
817d9f57 1512 NULL, &server_static_cbinfo);
059ec3d9 1513if (rc != OK) return rc;
817d9f57 1514cbinfo = server_static_cbinfo;
059ec3d9
PH
1515
1516if (!expand_check(require_ciphers, US"tls_require_ciphers", &expciphers))
1517 return FAIL;
1518
1519/* In OpenSSL, cipher components are separated by hyphens. In GnuTLS, they
17c76198
PP
1520were historically separated by underscores. So that I can use either form in my
1521tests, and also for general convenience, we turn underscores into hyphens here.
1522*/
059ec3d9
PH
1523
1524if (expciphers != NULL)
1525 {
1526 uschar *s = expciphers;
1527 while (*s != 0) { if (*s == '_') *s = '-'; s++; }
1528 DEBUG(D_tls) debug_printf("required ciphers: %s\n", expciphers);
817d9f57 1529 if (!SSL_CTX_set_cipher_list(server_ctx, CS expciphers))
7199e1ee 1530 return tls_error(US"SSL_CTX_set_cipher_list", NULL, NULL);
7be682ca 1531 cbinfo->server_cipher_list = expciphers;
059ec3d9
PH
1532 }
1533
1534/* If this is a host for which certificate verification is mandatory or
1535optional, set up appropriately. */
1536
817d9f57 1537tls_in.certificate_verified = FALSE;
53a7196b
JH
1538#ifdef EXPERIMENTAL_DANE
1539tls_in.dane_verified = FALSE;
1540#endif
a2ff477a 1541server_verify_callback_called = FALSE;
059ec3d9
PH
1542
1543if (verify_check_host(&tls_verify_hosts) == OK)
1544 {
983207c1
JH
1545 rc = setup_certs(server_ctx, tls_verify_certificates, tls_crl, NULL,
1546 FALSE, verify_callback_server);
059ec3d9 1547 if (rc != OK) return rc;
a2ff477a 1548 server_verify_optional = FALSE;
059ec3d9
PH
1549 }
1550else if (verify_check_host(&tls_try_verify_hosts) == OK)
1551 {
983207c1
JH
1552 rc = setup_certs(server_ctx, tls_verify_certificates, tls_crl, NULL,
1553 TRUE, verify_callback_server);
059ec3d9 1554 if (rc != OK) return rc;
a2ff477a 1555 server_verify_optional = TRUE;
059ec3d9
PH
1556 }
1557
1558/* Prepare for new connection */
1559
817d9f57 1560if ((server_ssl = SSL_new(server_ctx)) == NULL) return tls_error(US"SSL_new", NULL, NULL);
da3ad30d
PP
1561
1562/* Warning: we used to SSL_clear(ssl) here, it was removed.
1563 *
1564 * With the SSL_clear(), we get strange interoperability bugs with
1565 * OpenSSL 1.0.1b and TLS1.1/1.2. It looks as though this may be a bug in
1566 * OpenSSL itself, as a clear should not lead to inability to follow protocols.
1567 *
1568 * The SSL_clear() call is to let an existing SSL* be reused, typically after
1569 * session shutdown. In this case, we have a brand new object and there's no
1570 * obvious reason to immediately clear it. I'm guessing that this was
1571 * originally added because of incomplete initialisation which the clear fixed,
1572 * in some historic release.
1573 */
059ec3d9
PH
1574
1575/* Set context and tell client to go ahead, except in the case of TLS startup
1576on connection, where outputting anything now upsets the clients and tends to
1577make them disconnect. We need to have an explicit fflush() here, to force out
1578the response. Other smtp_printf() calls do not need it, because in non-TLS
1579mode, the fflush() happens when smtp_getc() is called. */
1580
817d9f57
JH
1581SSL_set_session_id_context(server_ssl, sid_ctx, Ustrlen(sid_ctx));
1582if (!tls_in.on_connect)
059ec3d9
PH
1583 {
1584 smtp_printf("220 TLS go ahead\r\n");
1585 fflush(smtp_out);
1586 }
1587
1588/* Now negotiate the TLS session. We put our own timer on it, since it seems
1589that the OpenSSL library doesn't. */
1590
817d9f57
JH
1591SSL_set_wfd(server_ssl, fileno(smtp_out));
1592SSL_set_rfd(server_ssl, fileno(smtp_in));
1593SSL_set_accept_state(server_ssl);
059ec3d9
PH
1594
1595DEBUG(D_tls) debug_printf("Calling SSL_accept\n");
1596
1597sigalrm_seen = FALSE;
1598if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
817d9f57 1599rc = SSL_accept(server_ssl);
059ec3d9
PH
1600alarm(0);
1601
1602if (rc <= 0)
1603 {
7199e1ee 1604 tls_error(US"SSL_accept", NULL, sigalrm_seen ? US"timed out" : NULL);
77bb000f
PP
1605 if (ERR_get_error() == 0)
1606 log_write(0, LOG_MAIN,
a053d125 1607 "TLS client disconnected cleanly (rejected our certificate?)");
059ec3d9
PH
1608 return FAIL;
1609 }
1610
1611DEBUG(D_tls) debug_printf("SSL_accept was successful\n");
1612
1613/* TLS has been set up. Adjust the input functions to read via TLS,
1614and initialize things. */
1615
817d9f57
JH
1616construct_cipher_name(server_ssl, cipherbuf, sizeof(cipherbuf), &tls_in.bits);
1617tls_in.cipher = cipherbuf;
059ec3d9
PH
1618
1619DEBUG(D_tls)
1620 {
1621 uschar buf[2048];
817d9f57 1622 if (SSL_get_shared_ciphers(server_ssl, CS buf, sizeof(buf)) != NULL)
059ec3d9
PH
1623 debug_printf("Shared ciphers: %s\n", buf);
1624 }
1625
9d1c15ef
JH
1626/* Record the certificate we presented */
1627 {
1628 X509 * crt = SSL_get_certificate(server_ssl);
1629 tls_in.ourcert = crt ? X509_dup(crt) : NULL;
1630 }
059ec3d9 1631
817d9f57
JH
1632/* Only used by the server-side tls (tls_in), including tls_getc.
1633 Client-side (tls_out) reads (seem to?) go via
1634 smtp_read_response()/ip_recv().
1635 Hence no need to duplicate for _in and _out.
1636 */
059ec3d9
PH
1637ssl_xfer_buffer = store_malloc(ssl_xfer_buffer_size);
1638ssl_xfer_buffer_lwm = ssl_xfer_buffer_hwm = 0;
1639ssl_xfer_eof = ssl_xfer_error = 0;
1640
1641receive_getc = tls_getc;
1642receive_ungetc = tls_ungetc;
1643receive_feof = tls_feof;
1644receive_ferror = tls_ferror;
58eb016e 1645receive_smtp_buffered = tls_smtp_buffered;
059ec3d9 1646
817d9f57 1647tls_in.active = fileno(smtp_out);
059ec3d9
PH
1648return OK;
1649}
1650
1651
1652
1653
043b1248
JH
1654static int
1655tls_client_basic_ctx_init(SSL_CTX * ctx,
1656 host_item * host, smtp_transport_options_block * ob
1657#ifdef EXPERIMENTAL_CERTNAMES
1658 , tls_ext_ctx_cb * cbinfo
1659#endif
1660 )
1661{
1662int rc;
1663/* stick to the old behaviour for compatibility if tls_verify_certificates is
1664 set but both tls_verify_hosts and tls_try_verify_hosts is not set. Check only
1665 the specified host patterns if one of them is defined */
1666
1667if ((!ob->tls_verify_hosts && !ob->tls_try_verify_hosts) ||
1668 (verify_check_host(&ob->tls_verify_hosts) == OK))
1669 {
1670 if ((rc = setup_certs(ctx, ob->tls_verify_certificates,
1671 ob->tls_crl, host, FALSE, verify_callback_client)) != OK)
1672 return rc;
1673 client_verify_optional = FALSE;
1674
1675#ifdef EXPERIMENTAL_CERTNAMES
1676 if (ob->tls_verify_cert_hostnames)
1677 {
1678 if (!expand_check(ob->tls_verify_cert_hostnames,
1679 US"tls_verify_cert_hostnames",
1680 &cbinfo->verify_cert_hostnames))
1681 return FAIL;
1682 if (cbinfo->verify_cert_hostnames)
1683 DEBUG(D_tls) debug_printf("Cert hostname to check: \"%s\"\n",
1684 cbinfo->verify_cert_hostnames);
1685 }
1686#endif
1687 }
1688else if (verify_check_host(&ob->tls_try_verify_hosts) == OK)
1689 {
1690 if ((rc = setup_certs(ctx, ob->tls_verify_certificates,
1691 ob->tls_crl, host, TRUE, verify_callback_client)) != OK)
1692 return rc;
1693 client_verify_optional = TRUE;
1694 }
1695
1696return OK;
1697}
059ec3d9 1698
fde080a4
JH
1699
1700#ifdef EXPERIMENTAL_DANE
fde080a4
JH
1701static int
1702dane_tlsa_load(SSL * ssl, host_item * host, dns_answer * dnsa)
1703{
1704dns_record * rr;
1705dns_scan dnss;
1706const char * hostnames[2] = { CS host->name, NULL };
1707int found = 0;
1708
1709if (DANESSL_init(ssl, NULL, hostnames) != 1)
1710 return tls_error(US"hostnames load", host, NULL);
1711
1712for (rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS);
1713 rr;
1714 rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)
1715 ) if (rr->type == T_TLSA)
1716 {
1717 uschar * p = rr->data;
1718 uint8_t usage, selector, mtype;
1719 const char * mdname;
1720
fde080a4 1721 usage = *p++;
133d2546
JH
1722
1723 /* Only DANE-TA(2) and DANE-EE(3) are supported */
1724 if (usage != 2 && usage != 3) continue;
1725
fde080a4
JH
1726 selector = *p++;
1727 mtype = *p++;
1728
1729 switch (mtype)
1730 {
133d2546
JH
1731 default: continue; /* Only match-types 0, 1, 2 are supported */
1732 case 0: mdname = NULL; break;
1733 case 1: mdname = "sha256"; break;
1734 case 2: mdname = "sha512"; break;
fde080a4
JH
1735 }
1736
133d2546 1737 found++;
fde080a4
JH
1738 switch (DANESSL_add_tlsa(ssl, usage, selector, mdname, p, rr->size - 3))
1739 {
1740 default:
1741 case 0: /* action not taken */
1742 return tls_error(US"tlsa load", host, NULL);
1743 case 1: break;
1744 }
594706ea
JH
1745
1746 tls_out.tlsa_usage |= 1<<usage;
fde080a4
JH
1747 }
1748
1749if (found)
1750 return OK;
1751
133d2546 1752log_write(0, LOG_MAIN, "DANE error: No usable TLSA records");
fde080a4
JH
1753return FAIL;
1754}
1755#endif /*EXPERIMENTAL_DANE*/
1756
1757
1758
059ec3d9
PH
1759/*************************************************
1760* Start a TLS session in a client *
1761*************************************************/
1762
1763/* Called from the smtp transport after STARTTLS has been accepted.
1764
1765Argument:
1766 fd the fd of the connection
1767 host connected host (for messages)
83da1223 1768 addr the first address
a7538db1 1769 tb transport (always smtp)
0e66b3b6 1770 tlsa_dnsa tlsa lookup, if DANE, else null
059ec3d9
PH
1771
1772Returns: OK on success
1773 FAIL otherwise - note that tls_error() will not give DEFER
1774 because this is not a server
1775*/
1776
1777int
f5d78688 1778tls_client_start(int fd, host_item *host, address_item *addr,
0e66b3b6
JH
1779 transport_instance *tb
1780#ifdef EXPERIMENTAL_DANE
1781 , dns_answer * tlsa_dnsa
1782#endif
1783 )
059ec3d9 1784{
a7538db1
JH
1785smtp_transport_options_block * ob =
1786 (smtp_transport_options_block *)tb->options_block;
059ec3d9 1787static uschar txt[256];
868f5672
JH
1788uschar * expciphers;
1789X509 * server_cert;
059ec3d9 1790int rc;
817d9f57 1791static uschar cipherbuf[256];
043b1248
JH
1792
1793#ifndef DISABLE_OCSP
043b1248 1794BOOL request_ocsp = FALSE;
6634ac8d 1795BOOL require_ocsp = FALSE;
043b1248 1796#endif
043b1248
JH
1797
1798#ifdef EXPERIMENTAL_DANE
594706ea 1799tls_out.tlsa_usage = 0;
043b1248
JH
1800#endif
1801
f2de3a33 1802#ifndef DISABLE_OCSP
043b1248 1803 {
4f59c424
JH
1804# ifdef EXPERIMENTAL_DANE
1805 if ( tlsa_dnsa
1806 && ob->hosts_request_ocsp[0] == '*'
1807 && ob->hosts_request_ocsp[1] == '\0'
1808 )
1809 {
1810 /* Unchanged from default. Use a safer one under DANE */
1811 request_ocsp = TRUE;
1812 ob->hosts_request_ocsp = US"${if or { {= {0}{$tls_out_tlsa_usage}} "
1813 " {= {4}{$tls_out_tlsa_usage}} } "
1814 " {*}{}}";
1815 }
1816# endif
1817
fca41d5a
JH
1818 if ((require_ocsp = verify_check_this_host(&ob->hosts_require_ocsp,
1819 NULL, host->name, host->address, NULL) == OK))
1820 request_ocsp = TRUE;
1821 else
fca41d5a 1822# ifdef EXPERIMENTAL_DANE
4f59c424 1823 if (!request_ocsp)
fca41d5a
JH
1824# endif
1825 request_ocsp = verify_check_this_host(&ob->hosts_request_ocsp,
1826 NULL, host->name, host->address, NULL) == OK;
043b1248 1827 }
f5d78688 1828#endif
059ec3d9 1829
65867078
JH
1830rc = tls_init(&client_ctx, host, NULL,
1831 ob->tls_certificate, ob->tls_privatekey,
f2de3a33 1832#ifndef DISABLE_OCSP
44662487 1833 (void *)(long)request_ocsp,
3f7eeb86 1834#endif
817d9f57 1835 addr, &client_static_cbinfo);
059ec3d9
PH
1836if (rc != OK) return rc;
1837
817d9f57 1838tls_out.certificate_verified = FALSE;
a2ff477a 1839client_verify_callback_called = FALSE;
059ec3d9 1840
65867078
JH
1841if (!expand_check(ob->tls_require_ciphers, US"tls_require_ciphers",
1842 &expciphers))
059ec3d9
PH
1843 return FAIL;
1844
1845/* In OpenSSL, cipher components are separated by hyphens. In GnuTLS, they
1846are separated by underscores. So that I can use either form in my tests, and
1847also for general convenience, we turn underscores into hyphens here. */
1848
1849if (expciphers != NULL)
1850 {
1851 uschar *s = expciphers;
1852 while (*s != 0) { if (*s == '_') *s = '-'; s++; }
1853 DEBUG(D_tls) debug_printf("required ciphers: %s\n", expciphers);
817d9f57 1854 if (!SSL_CTX_set_cipher_list(client_ctx, CS expciphers))
7199e1ee 1855 return tls_error(US"SSL_CTX_set_cipher_list", host, NULL);
059ec3d9
PH
1856 }
1857
043b1248 1858#ifdef EXPERIMENTAL_DANE
0e66b3b6 1859if (tlsa_dnsa)
a63be306 1860 {
e5cccda9
JH
1861 SSL_CTX_set_verify(client_ctx, SSL_VERIFY_PEER, verify_callback_client_dane);
1862
043b1248 1863 if (!DANESSL_library_init())
b4161d10 1864 return tls_error(US"library init", host, NULL);
043b1248 1865 if (DANESSL_CTX_init(client_ctx) <= 0)
b4161d10 1866 return tls_error(US"context init", host, NULL);
043b1248
JH
1867 }
1868else
e51c7be2 1869
043b1248
JH
1870#endif
1871
1872 if ((rc = tls_client_basic_ctx_init(client_ctx, host, ob
e51c7be2 1873#ifdef EXPERIMENTAL_CERTNAMES
043b1248 1874 , client_static_cbinfo
e51c7be2 1875#endif
043b1248 1876 )) != OK)
65867078 1877 return rc;
059ec3d9 1878
65867078
JH
1879if ((client_ssl = SSL_new(client_ctx)) == NULL)
1880 return tls_error(US"SSL_new", host, NULL);
817d9f57
JH
1881SSL_set_session_id_context(client_ssl, sid_ctx, Ustrlen(sid_ctx));
1882SSL_set_fd(client_ssl, fd);
1883SSL_set_connect_state(client_ssl);
059ec3d9 1884
65867078 1885if (ob->tls_sni)
3f0945ff 1886 {
65867078 1887 if (!expand_check(ob->tls_sni, US"tls_sni", &tls_out.sni))
3f0945ff 1888 return FAIL;
ec4b68e5 1889 if (tls_out.sni == NULL)
2c9a0e86
PP
1890 {
1891 DEBUG(D_tls) debug_printf("Setting TLS SNI forced to fail, not sending\n");
1892 }
ec4b68e5 1893 else if (!Ustrlen(tls_out.sni))
817d9f57 1894 tls_out.sni = NULL;
3f0945ff
PP
1895 else
1896 {
35731706 1897#ifdef EXIM_HAVE_OPENSSL_TLSEXT
817d9f57
JH
1898 DEBUG(D_tls) debug_printf("Setting TLS SNI \"%s\"\n", tls_out.sni);
1899 SSL_set_tlsext_host_name(client_ssl, tls_out.sni);
35731706
PP
1900#else
1901 DEBUG(D_tls)
1902 debug_printf("OpenSSL at build-time lacked SNI support, ignoring \"%s\"\n",
02d9264f 1903 tls_out.sni);
35731706 1904#endif
3f0945ff
PP
1905 }
1906 }
1907
594706ea 1908#ifdef EXPERIMENTAL_DANE
0e66b3b6
JH
1909if (tlsa_dnsa)
1910 if ((rc = dane_tlsa_load(client_ssl, host, tlsa_dnsa)) != OK)
594706ea
JH
1911 return rc;
1912#endif
1913
f2de3a33 1914#ifndef DISABLE_OCSP
f5d78688
JH
1915/* Request certificate status at connection-time. If the server
1916does OCSP stapling we will get the callback (set in tls_init()) */
b50c8b84 1917# ifdef EXPERIMENTAL_DANE
594706ea
JH
1918if (request_ocsp)
1919 {
1920 const uschar * s;
41afb5cb
JH
1921 if ( ((s = ob->hosts_require_ocsp) && Ustrstr(s, US"tls_out_tlsa_usage"))
1922 || ((s = ob->hosts_request_ocsp) && Ustrstr(s, US"tls_out_tlsa_usage"))
594706ea
JH
1923 )
1924 { /* Re-eval now $tls_out_tlsa_usage is populated. If
1925 this means we avoid the OCSP request, we wasted the setup
1926 cost in tls_init(). */
1927 require_ocsp = verify_check_this_host(&ob->hosts_require_ocsp,
1928 NULL, host->name, host->address, NULL) == OK;
1929 request_ocsp = require_ocsp ? TRUE
1930 : verify_check_this_host(&ob->hosts_request_ocsp,
1931 NULL, host->name, host->address, NULL) == OK;
1932 }
1933 }
b50c8b84
JH
1934# endif
1935
44662487
JH
1936if (request_ocsp)
1937 {
f5d78688 1938 SSL_set_tlsext_status_type(client_ssl, TLSEXT_STATUSTYPE_ocsp);
44662487
JH
1939 client_static_cbinfo->u_ocsp.client.verify_required = require_ocsp;
1940 tls_out.ocsp = OCSP_NOT_RESP;
1941 }
f5d78688
JH
1942#endif
1943
774ef2d7
JH
1944#ifdef EXPERIMENTAL_EVENT
1945client_static_cbinfo->event_action = tb->event_action;
a7538db1 1946#endif
043b1248 1947
059ec3d9
PH
1948/* There doesn't seem to be a built-in timeout on connection. */
1949
1950DEBUG(D_tls) debug_printf("Calling SSL_connect\n");
1951sigalrm_seen = FALSE;
65867078 1952alarm(ob->command_timeout);
817d9f57 1953rc = SSL_connect(client_ssl);
059ec3d9
PH
1954alarm(0);
1955
043b1248 1956#ifdef EXPERIMENTAL_DANE
0e66b3b6 1957if (tlsa_dnsa)
fde080a4 1958 DANESSL_cleanup(client_ssl);
043b1248
JH
1959#endif
1960
059ec3d9 1961if (rc <= 0)
7199e1ee 1962 return tls_error(US"SSL_connect", host, sigalrm_seen ? US"timed out" : NULL);
059ec3d9
PH
1963
1964DEBUG(D_tls) debug_printf("SSL_connect succeeded\n");
1965
453a6645 1966/* Beware anonymous ciphers which lead to server_cert being NULL */
9d1c15ef 1967/*XXX server_cert is never freed... use X509_free() */
817d9f57 1968server_cert = SSL_get_peer_certificate (client_ssl);
453a6645
PP
1969if (server_cert)
1970 {
817d9f57 1971 tls_out.peerdn = US X509_NAME_oneline(X509_get_subject_name(server_cert),
453a6645 1972 CS txt, sizeof(txt));
9d1c15ef 1973 tls_out.peerdn = txt; /*XXX a static buffer... */
453a6645
PP
1974 }
1975else
817d9f57 1976 tls_out.peerdn = NULL;
059ec3d9 1977
817d9f57
JH
1978construct_cipher_name(client_ssl, cipherbuf, sizeof(cipherbuf), &tls_out.bits);
1979tls_out.cipher = cipherbuf;
059ec3d9 1980
9d1c15ef
JH
1981/* Record the certificate we presented */
1982 {
1983 X509 * crt = SSL_get_certificate(client_ssl);
1984 tls_out.ourcert = crt ? X509_dup(crt) : NULL;
1985 }
1986
817d9f57 1987tls_out.active = fd;
059ec3d9
PH
1988return OK;
1989}
1990
1991
1992
1993
1994
1995/*************************************************
1996* TLS version of getc *
1997*************************************************/
1998
1999/* This gets the next byte from the TLS input buffer. If the buffer is empty,
2000it refills the buffer via the SSL reading function.
2001
2002Arguments: none
2003Returns: the next character or EOF
817d9f57
JH
2004
2005Only used by the server-side TLS.
059ec3d9
PH
2006*/
2007
2008int
2009tls_getc(void)
2010{
2011if (ssl_xfer_buffer_lwm >= ssl_xfer_buffer_hwm)
2012 {
2013 int error;
2014 int inbytes;
2015
817d9f57 2016 DEBUG(D_tls) debug_printf("Calling SSL_read(%p, %p, %u)\n", server_ssl,
c80c5570 2017 ssl_xfer_buffer, ssl_xfer_buffer_size);
059ec3d9
PH
2018
2019 if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
817d9f57
JH
2020 inbytes = SSL_read(server_ssl, CS ssl_xfer_buffer, ssl_xfer_buffer_size);
2021 error = SSL_get_error(server_ssl, inbytes);
059ec3d9
PH
2022 alarm(0);
2023
2024 /* SSL_ERROR_ZERO_RETURN appears to mean that the SSL session has been
2025 closed down, not that the socket itself has been closed down. Revert to
2026 non-SSL handling. */
2027
2028 if (error == SSL_ERROR_ZERO_RETURN)
2029 {
2030 DEBUG(D_tls) debug_printf("Got SSL_ERROR_ZERO_RETURN\n");
2031
2032 receive_getc = smtp_getc;
2033 receive_ungetc = smtp_ungetc;
2034 receive_feof = smtp_feof;
2035 receive_ferror = smtp_ferror;
58eb016e 2036 receive_smtp_buffered = smtp_buffered;
059ec3d9 2037
817d9f57
JH
2038 SSL_free(server_ssl);
2039 server_ssl = NULL;
2040 tls_in.active = -1;
2041 tls_in.bits = 0;
2042 tls_in.cipher = NULL;
2043 tls_in.peerdn = NULL;
2044 tls_in.sni = NULL;
059ec3d9
PH
2045
2046 return smtp_getc();
2047 }
2048
2049 /* Handle genuine errors */
2050
ba084640
PP
2051 else if (error == SSL_ERROR_SSL)
2052 {
2053 ERR_error_string(ERR_get_error(), ssl_errstring);
89dd51cd 2054 log_write(0, LOG_MAIN, "TLS error (SSL_read): %s", ssl_errstring);
ba084640
PP
2055 ssl_xfer_error = 1;
2056 return EOF;
2057 }
2058
059ec3d9
PH
2059 else if (error != SSL_ERROR_NONE)
2060 {
2061 DEBUG(D_tls) debug_printf("Got SSL error %d\n", error);
2062 ssl_xfer_error = 1;
2063 return EOF;
2064 }
c80c5570 2065
80a47a2c
TK
2066#ifndef DISABLE_DKIM
2067 dkim_exim_verify_feed(ssl_xfer_buffer, inbytes);
2068#endif
059ec3d9
PH
2069 ssl_xfer_buffer_hwm = inbytes;
2070 ssl_xfer_buffer_lwm = 0;
2071 }
2072
2073/* Something in the buffer; return next uschar */
2074
2075return ssl_xfer_buffer[ssl_xfer_buffer_lwm++];
2076}
2077
2078
2079
2080/*************************************************
2081* Read bytes from TLS channel *
2082*************************************************/
2083
2084/*
2085Arguments:
2086 buff buffer of data
2087 len size of buffer
2088
2089Returns: the number of bytes read
2090 -1 after a failed read
817d9f57
JH
2091
2092Only used by the client-side TLS.
059ec3d9
PH
2093*/
2094
2095int
389ca47a 2096tls_read(BOOL is_server, uschar *buff, size_t len)
059ec3d9 2097{
389ca47a 2098SSL *ssl = is_server ? server_ssl : client_ssl;
059ec3d9
PH
2099int inbytes;
2100int error;
2101
389ca47a 2102DEBUG(D_tls) debug_printf("Calling SSL_read(%p, %p, %u)\n", ssl,
c80c5570 2103 buff, (unsigned int)len);
059ec3d9 2104
389ca47a
JH
2105inbytes = SSL_read(ssl, CS buff, len);
2106error = SSL_get_error(ssl, inbytes);
059ec3d9
PH
2107
2108if (error == SSL_ERROR_ZERO_RETURN)
2109 {
2110 DEBUG(D_tls) debug_printf("Got SSL_ERROR_ZERO_RETURN\n");
2111 return -1;
2112 }
2113else if (error != SSL_ERROR_NONE)
2114 {
2115 return -1;
2116 }
2117
2118return inbytes;
2119}
2120
2121
2122
2123
2124
2125/*************************************************
2126* Write bytes down TLS channel *
2127*************************************************/
2128
2129/*
2130Arguments:
817d9f57 2131 is_server channel specifier
059ec3d9
PH
2132 buff buffer of data
2133 len number of bytes
2134
2135Returns: the number of bytes after a successful write,
2136 -1 after a failed write
817d9f57
JH
2137
2138Used by both server-side and client-side TLS.
059ec3d9
PH
2139*/
2140
2141int
817d9f57 2142tls_write(BOOL is_server, const uschar *buff, size_t len)
059ec3d9
PH
2143{
2144int outbytes;
2145int error;
2146int left = len;
817d9f57 2147SSL *ssl = is_server ? server_ssl : client_ssl;
059ec3d9 2148
c80c5570 2149DEBUG(D_tls) debug_printf("tls_do_write(%p, %d)\n", buff, left);
059ec3d9
PH
2150while (left > 0)
2151 {
c80c5570 2152 DEBUG(D_tls) debug_printf("SSL_write(SSL, %p, %d)\n", buff, left);
059ec3d9
PH
2153 outbytes = SSL_write(ssl, CS buff, left);
2154 error = SSL_get_error(ssl, outbytes);
2155 DEBUG(D_tls) debug_printf("outbytes=%d error=%d\n", outbytes, error);
2156 switch (error)
2157 {
2158 case SSL_ERROR_SSL:
2159 ERR_error_string(ERR_get_error(), ssl_errstring);
2160 log_write(0, LOG_MAIN, "TLS error (SSL_write): %s", ssl_errstring);
2161 return -1;
2162
2163 case SSL_ERROR_NONE:
2164 left -= outbytes;
2165 buff += outbytes;
2166 break;
2167
2168 case SSL_ERROR_ZERO_RETURN:
2169 log_write(0, LOG_MAIN, "SSL channel closed on write");
2170 return -1;
2171
817d9f57
JH
2172 case SSL_ERROR_SYSCALL:
2173 log_write(0, LOG_MAIN, "SSL_write: (from %s) syscall: %s",
2174 sender_fullhost ? sender_fullhost : US"<unknown>",
2175 strerror(errno));
2176
059ec3d9
PH
2177 default:
2178 log_write(0, LOG_MAIN, "SSL_write error %d", error);
2179 return -1;
2180 }
2181 }
2182return len;
2183}
2184
2185
2186
2187/*************************************************
2188* Close down a TLS session *
2189*************************************************/
2190
2191/* This is also called from within a delivery subprocess forked from the
2192daemon, to shut down the TLS library, without actually doing a shutdown (which
2193would tamper with the SSL session in the parent process).
2194
2195Arguments: TRUE if SSL_shutdown is to be called
2196Returns: nothing
817d9f57
JH
2197
2198Used by both server-side and client-side TLS.
059ec3d9
PH
2199*/
2200
2201void
817d9f57 2202tls_close(BOOL is_server, BOOL shutdown)
059ec3d9 2203{
817d9f57 2204SSL **sslp = is_server ? &server_ssl : &client_ssl;
389ca47a 2205int *fdp = is_server ? &tls_in.active : &tls_out.active;
817d9f57
JH
2206
2207if (*fdp < 0) return; /* TLS was not active */
059ec3d9
PH
2208
2209if (shutdown)
2210 {
2211 DEBUG(D_tls) debug_printf("tls_close(): shutting down SSL\n");
817d9f57 2212 SSL_shutdown(*sslp);
059ec3d9
PH
2213 }
2214
817d9f57
JH
2215SSL_free(*sslp);
2216*sslp = NULL;
059ec3d9 2217
817d9f57 2218*fdp = -1;
059ec3d9
PH
2219}
2220
36f12725
NM
2221
2222
2223
3375e053
PP
2224/*************************************************
2225* Let tls_require_ciphers be checked at startup *
2226*************************************************/
2227
2228/* The tls_require_ciphers option, if set, must be something which the
2229library can parse.
2230
2231Returns: NULL on success, or error message
2232*/
2233
2234uschar *
2235tls_validate_require_cipher(void)
2236{
2237SSL_CTX *ctx;
2238uschar *s, *expciphers, *err;
2239
2240/* this duplicates from tls_init(), we need a better "init just global
2241state, for no specific purpose" singleton function of our own */
2242
2243SSL_load_error_strings();
2244OpenSSL_add_ssl_algorithms();
2245#if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && !defined(OPENSSL_NO_SHA256)
2246/* SHA256 is becoming ever more popular. This makes sure it gets added to the
2247list of available digests. */
2248EVP_add_digest(EVP_sha256());
2249#endif
2250
2251if (!(tls_require_ciphers && *tls_require_ciphers))
2252 return NULL;
2253
2254if (!expand_check(tls_require_ciphers, US"tls_require_ciphers", &expciphers))
2255 return US"failed to expand tls_require_ciphers";
2256
2257if (!(expciphers && *expciphers))
2258 return NULL;
2259
2260/* normalisation ripped from above */
2261s = expciphers;
2262while (*s != 0) { if (*s == '_') *s = '-'; s++; }
2263
2264err = NULL;
2265
2266ctx = SSL_CTX_new(SSLv23_server_method());
2267if (!ctx)
2268 {
2269 ERR_error_string(ERR_get_error(), ssl_errstring);
2270 return string_sprintf("SSL_CTX_new() failed: %s", ssl_errstring);
2271 }
2272
2273DEBUG(D_tls)
2274 debug_printf("tls_require_ciphers expands to \"%s\"\n", expciphers);
2275
2276if (!SSL_CTX_set_cipher_list(ctx, CS expciphers))
2277 {
2278 ERR_error_string(ERR_get_error(), ssl_errstring);
2279 err = string_sprintf("SSL_CTX_set_cipher_list(%s) failed", expciphers);
2280 }
2281
2282SSL_CTX_free(ctx);
2283
2284return err;
2285}
2286
2287
2288
2289
36f12725
NM
2290/*************************************************
2291* Report the library versions. *
2292*************************************************/
2293
2294/* There have historically been some issues with binary compatibility in
2295OpenSSL libraries; if Exim (like many other applications) is built against
2296one version of OpenSSL but the run-time linker picks up another version,
2297it can result in serious failures, including crashing with a SIGSEGV. So
2298report the version found by the compiler and the run-time version.
2299
f64a1e23
PP
2300Note: some OS vendors backport security fixes without changing the version
2301number/string, and the version date remains unchanged. The _build_ date
2302will change, so we can more usefully assist with version diagnosis by also
2303reporting the build date.
2304
36f12725
NM
2305Arguments: a FILE* to print the results to
2306Returns: nothing
2307*/
2308
2309void
2310tls_version_report(FILE *f)
2311{
754a0503 2312fprintf(f, "Library version: OpenSSL: Compile: %s\n"
f64a1e23
PP
2313 " Runtime: %s\n"
2314 " : %s\n",
754a0503 2315 OPENSSL_VERSION_TEXT,
f64a1e23
PP
2316 SSLeay_version(SSLEAY_VERSION),
2317 SSLeay_version(SSLEAY_BUILT_ON));
2318/* third line is 38 characters for the %s and the line is 73 chars long;
2319the OpenSSL output includes a "built on: " prefix already. */
36f12725
NM
2320}
2321
9e3331ea
TK
2322
2323
2324
2325/*************************************************
17c76198 2326* Random number generation *
9e3331ea
TK
2327*************************************************/
2328
2329/* Pseudo-random number generation. The result is not expected to be
2330cryptographically strong but not so weak that someone will shoot themselves
2331in the foot using it as a nonce in input in some email header scheme or
2332whatever weirdness they'll twist this into. The result should handle fork()
2333and avoid repeating sequences. OpenSSL handles that for us.
2334
2335Arguments:
2336 max range maximum
2337Returns a random number in range [0, max-1]
2338*/
2339
2340int
17c76198 2341vaguely_random_number(int max)
9e3331ea
TK
2342{
2343unsigned int r;
2344int i, needed_len;
de6135a0
PP
2345static pid_t pidlast = 0;
2346pid_t pidnow;
9e3331ea
TK
2347uschar *p;
2348uschar smallbuf[sizeof(r)];
2349
2350if (max <= 1)
2351 return 0;
2352
de6135a0
PP
2353pidnow = getpid();
2354if (pidnow != pidlast)
2355 {
2356 /* Although OpenSSL documents that "OpenSSL makes sure that the PRNG state
2357 is unique for each thread", this doesn't apparently apply across processes,
2358 so our own warning from vaguely_random_number_fallback() applies here too.
2359 Fix per PostgreSQL. */
2360 if (pidlast != 0)
2361 RAND_cleanup();
2362 pidlast = pidnow;
2363 }
2364
9e3331ea
TK
2365/* OpenSSL auto-seeds from /dev/random, etc, but this a double-check. */
2366if (!RAND_status())
2367 {
2368 randstuff r;
2369 gettimeofday(&r.tv, NULL);
2370 r.p = getpid();
2371
2372 RAND_seed((uschar *)(&r), sizeof(r));
2373 }
2374/* We're after pseudo-random, not random; if we still don't have enough data
2375in the internal PRNG then our options are limited. We could sleep and hope
2376for entropy to come along (prayer technique) but if the system is so depleted
2377in the first place then something is likely to just keep taking it. Instead,
2378we'll just take whatever little bit of pseudo-random we can still manage to
2379get. */
2380
2381needed_len = sizeof(r);
2382/* Don't take 8 times more entropy than needed if int is 8 octets and we were
2383asked for a number less than 10. */
2384for (r = max, i = 0; r; ++i)
2385 r >>= 1;
2386i = (i + 7) / 8;
2387if (i < needed_len)
2388 needed_len = i;
2389
2390/* We do not care if crypto-strong */
17c76198
PP
2391i = RAND_pseudo_bytes(smallbuf, needed_len);
2392if (i < 0)
2393 {
2394 DEBUG(D_all)
2395 debug_printf("OpenSSL RAND_pseudo_bytes() not supported by RAND method, using fallback.\n");
2396 return vaguely_random_number_fallback(max);
2397 }
2398
9e3331ea
TK
2399r = 0;
2400for (p = smallbuf; needed_len; --needed_len, ++p)
2401 {
2402 r *= 256;
2403 r += *p;
2404 }
2405
2406/* We don't particularly care about weighted results; if someone wants
2407smooth distribution and cares enough then they should submit a patch then. */
2408return r % max;
2409}
2410
77bb000f
PP
2411
2412
2413
2414/*************************************************
2415* OpenSSL option parse *
2416*************************************************/
2417
2418/* Parse one option for tls_openssl_options_parse below
2419
2420Arguments:
2421 name one option name
2422 value place to store a value for it
2423Returns success or failure in parsing
2424*/
2425
2426struct exim_openssl_option {
2427 uschar *name;
2428 long value;
2429};
2430/* We could use a macro to expand, but we need the ifdef and not all the
2431options document which version they were introduced in. Policylet: include
2432all options unless explicitly for DTLS, let the administrator choose which
2433to apply.
2434
2435This list is current as of:
e2fbf4a2
PP
2436 ==> 1.0.1b <==
2437Plus SSL_OP_SAFARI_ECDHE_ECDSA_BUG from 2013-June patch/discussion on openssl-dev
2438*/
77bb000f
PP
2439static struct exim_openssl_option exim_openssl_options[] = {
2440/* KEEP SORTED ALPHABETICALLY! */
2441#ifdef SSL_OP_ALL
73a46702 2442 { US"all", SSL_OP_ALL },
77bb000f
PP
2443#endif
2444#ifdef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION
73a46702 2445 { US"allow_unsafe_legacy_renegotiation", SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION },
77bb000f
PP
2446#endif
2447#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
73a46702 2448 { US"cipher_server_preference", SSL_OP_CIPHER_SERVER_PREFERENCE },
77bb000f
PP
2449#endif
2450#ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
73a46702 2451 { US"dont_insert_empty_fragments", SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS },
77bb000f
PP
2452#endif
2453#ifdef SSL_OP_EPHEMERAL_RSA
73a46702 2454 { US"ephemeral_rsa", SSL_OP_EPHEMERAL_RSA },
77bb000f
PP
2455#endif
2456#ifdef SSL_OP_LEGACY_SERVER_CONNECT
73a46702 2457 { US"legacy_server_connect", SSL_OP_LEGACY_SERVER_CONNECT },
77bb000f
PP
2458#endif
2459#ifdef SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER
73a46702 2460 { US"microsoft_big_sslv3_buffer", SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER },
77bb000f
PP
2461#endif
2462#ifdef SSL_OP_MICROSOFT_SESS_ID_BUG
73a46702 2463 { US"microsoft_sess_id_bug", SSL_OP_MICROSOFT_SESS_ID_BUG },
77bb000f
PP
2464#endif
2465#ifdef SSL_OP_MSIE_SSLV2_RSA_PADDING
73a46702 2466 { US"msie_sslv2_rsa_padding", SSL_OP_MSIE_SSLV2_RSA_PADDING },
77bb000f
PP
2467#endif
2468#ifdef SSL_OP_NETSCAPE_CHALLENGE_BUG
73a46702 2469 { US"netscape_challenge_bug", SSL_OP_NETSCAPE_CHALLENGE_BUG },
77bb000f
PP
2470#endif
2471#ifdef SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG
73a46702 2472 { US"netscape_reuse_cipher_change_bug", SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG },
77bb000f 2473#endif
c80c5570
PP
2474#ifdef SSL_OP_NO_COMPRESSION
2475 { US"no_compression", SSL_OP_NO_COMPRESSION },
2476#endif
77bb000f 2477#ifdef SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
73a46702 2478 { US"no_session_resumption_on_renegotiation", SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION },
77bb000f 2479#endif
c0c7b2da
PP
2480#ifdef SSL_OP_NO_SSLv2
2481 { US"no_sslv2", SSL_OP_NO_SSLv2 },
2482#endif
2483#ifdef SSL_OP_NO_SSLv3
2484 { US"no_sslv3", SSL_OP_NO_SSLv3 },
2485#endif
2486#ifdef SSL_OP_NO_TICKET
2487 { US"no_ticket", SSL_OP_NO_TICKET },
2488#endif
2489#ifdef SSL_OP_NO_TLSv1
2490 { US"no_tlsv1", SSL_OP_NO_TLSv1 },
2491#endif
c80c5570
PP
2492#ifdef SSL_OP_NO_TLSv1_1
2493#if SSL_OP_NO_TLSv1_1 == 0x00000400L
2494 /* Error in chosen value in 1.0.1a; see first item in CHANGES for 1.0.1b */
2495#warning OpenSSL 1.0.1a uses a bad value for SSL_OP_NO_TLSv1_1, ignoring
2496#else
2497 { US"no_tlsv1_1", SSL_OP_NO_TLSv1_1 },
2498#endif
2499#endif
2500#ifdef SSL_OP_NO_TLSv1_2
2501 { US"no_tlsv1_2", SSL_OP_NO_TLSv1_2 },
2502#endif
e2fbf4a2
PP
2503#ifdef SSL_OP_SAFARI_ECDHE_ECDSA_BUG
2504 { US"safari_ecdhe_ecdsa_bug", SSL_OP_SAFARI_ECDHE_ECDSA_BUG },
2505#endif
77bb000f 2506#ifdef SSL_OP_SINGLE_DH_USE
73a46702 2507 { US"single_dh_use", SSL_OP_SINGLE_DH_USE },
77bb000f
PP
2508#endif
2509#ifdef SSL_OP_SINGLE_ECDH_USE
73a46702 2510 { US"single_ecdh_use", SSL_OP_SINGLE_ECDH_USE },
77bb000f
PP
2511#endif
2512#ifdef SSL_OP_SSLEAY_080_CLIENT_DH_BUG
73a46702 2513 { US"ssleay_080_client_dh_bug", SSL_OP_SSLEAY_080_CLIENT_DH_BUG },
77bb000f
PP
2514#endif
2515#ifdef SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG
73a46702 2516 { US"sslref2_reuse_cert_type_bug", SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG },
77bb000f
PP
2517#endif
2518#ifdef SSL_OP_TLS_BLOCK_PADDING_BUG
73a46702 2519 { US"tls_block_padding_bug", SSL_OP_TLS_BLOCK_PADDING_BUG },
77bb000f
PP
2520#endif
2521#ifdef SSL_OP_TLS_D5_BUG
73a46702 2522 { US"tls_d5_bug", SSL_OP_TLS_D5_BUG },
77bb000f
PP
2523#endif
2524#ifdef SSL_OP_TLS_ROLLBACK_BUG
73a46702 2525 { US"tls_rollback_bug", SSL_OP_TLS_ROLLBACK_BUG },
77bb000f
PP
2526#endif
2527};
2528static int exim_openssl_options_size =
2529 sizeof(exim_openssl_options)/sizeof(struct exim_openssl_option);
2530
c80c5570 2531
77bb000f
PP
2532static BOOL
2533tls_openssl_one_option_parse(uschar *name, long *value)
2534{
2535int first = 0;
2536int last = exim_openssl_options_size;
2537while (last > first)
2538 {
2539 int middle = (first + last)/2;
2540 int c = Ustrcmp(name, exim_openssl_options[middle].name);
2541 if (c == 0)
2542 {
2543 *value = exim_openssl_options[middle].value;
2544 return TRUE;
2545 }
2546 else if (c > 0)
2547 first = middle + 1;
2548 else
2549 last = middle;
2550 }
2551return FALSE;
2552}
2553
2554
2555
2556
2557/*************************************************
2558* OpenSSL option parsing logic *
2559*************************************************/
2560
2561/* OpenSSL has a number of compatibility options which an administrator might
2562reasonably wish to set. Interpret a list similarly to decode_bits(), so that
2563we look like log_selector.
2564
2565Arguments:
2566 option_spec the administrator-supplied string of options
2567 results ptr to long storage for the options bitmap
2568Returns success or failure
2569*/
2570
2571BOOL
2572tls_openssl_options_parse(uschar *option_spec, long *results)
2573{
2574long result, item;
2575uschar *s, *end;
2576uschar keep_c;
2577BOOL adding, item_parsed;
2578
0e944a0d 2579result = 0L;
b1770b6e 2580/* Prior to 4.80 we or'd in SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS; removed
da3ad30d 2581 * from default because it increases BEAST susceptibility. */
f0f5a555
PP
2582#ifdef SSL_OP_NO_SSLv2
2583result |= SSL_OP_NO_SSLv2;
2584#endif
77bb000f
PP
2585
2586if (option_spec == NULL)
2587 {
2588 *results = result;
2589 return TRUE;
2590 }
2591
2592for (s=option_spec; *s != '\0'; /**/)
2593 {
2594 while (isspace(*s)) ++s;
2595 if (*s == '\0')
2596 break;
2597 if (*s != '+' && *s != '-')
2598 {
2599 DEBUG(D_tls) debug_printf("malformed openssl option setting: "
0e944a0d 2600 "+ or - expected but found \"%s\"\n", s);
77bb000f
PP
2601 return FALSE;
2602 }
2603 adding = *s++ == '+';
2604 for (end = s; (*end != '\0') && !isspace(*end); ++end) /**/ ;
2605 keep_c = *end;
2606 *end = '\0';
2607 item_parsed = tls_openssl_one_option_parse(s, &item);
2608 if (!item_parsed)
2609 {
0e944a0d 2610 DEBUG(D_tls) debug_printf("openssl option setting unrecognised: \"%s\"\n", s);
77bb000f
PP
2611 return FALSE;
2612 }
2613 DEBUG(D_tls) debug_printf("openssl option, %s from %lx: %lx (%s)\n",
2614 adding ? "adding" : "removing", result, item, s);
2615 if (adding)
2616 result |= item;
2617 else
2618 result &= ~item;
2619 *end = keep_c;
2620 s = end;
2621 }
2622
2623*results = result;
2624return TRUE;
2625}
2626
9d1c15ef
JH
2627/* vi: aw ai sw=2
2628*/
059ec3d9 2629/* End of tls-openssl.c */