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