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