TLS: library version build-time checks for resumption support
[exim.git] / src / src / tls-openssl.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) University of Cambridge 1995 - 2019 */
6 /* See the file NOTICE for conditions of use and distribution. */
7
8 /* Portions Copyright (c) The OpenSSL Project 1999 */
9
10 /* This module provides the TLS (aka SSL) support for Exim using the OpenSSL
11 library. It is #included into the tls.c file when that library is used. The
12 code herein is based on a patch that was originally contributed by Steve
13 Haslam. It was adapted from stunnel, a GPL program by Michal Trojnara.
14
15 No cryptographic code is included in Exim. All this module does is to call
16 functions 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>
25 #ifndef OPENSSL_NO_ECDH
26 # include <openssl/ec.h>
27 #endif
28 #ifndef DISABLE_OCSP
29 # include <openssl/ocsp.h>
30 #endif
31 #ifdef SUPPORT_DANE
32 # include "danessl.h"
33 #endif
34
35
36 #ifndef DISABLE_OCSP
37 # define EXIM_OCSP_SKEW_SECONDS (300L)
38 # define EXIM_OCSP_MAX_AGE (-1L)
39 #endif
40
41 #if OPENSSL_VERSION_NUMBER >= 0x0090806fL && !defined(OPENSSL_NO_TLSEXT)
42 # define EXIM_HAVE_OPENSSL_TLSEXT
43 #endif
44 #if OPENSSL_VERSION_NUMBER >= 0x00908000L
45 # define EXIM_HAVE_RSA_GENKEY_EX
46 #endif
47 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
48 # define EXIM_HAVE_OCSP_RESP_COUNT
49 #else
50 # define EXIM_HAVE_EPHEM_RSA_KEX
51 # define EXIM_HAVE_RAND_PSEUDO
52 #endif
53 #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && !defined(OPENSSL_NO_SHA256)
54 # define EXIM_HAVE_SHA256
55 #endif
56
57 /* X509_check_host provides sane certificate hostname checking, but was added
58 to OpenSSL late, after other projects forked off the code-base.  So in
59 addition to guarding against the base version number, beware that LibreSSL
60 does not (at this time) support this function.
61
62 If LibreSSL gains a different API, perhaps via libtls, then we'll probably
63 opt to disentangle and ask a LibreSSL user to provide glue for a third
64 crypto provider for libtls instead of continuing to tie the OpenSSL glue
65 into even twistier knots.  If LibreSSL gains the same API, we can just
66 change this guard and punt the issue for a while longer. */
67
68 #ifndef LIBRESSL_VERSION_NUMBER
69 # if OPENSSL_VERSION_NUMBER >= 0x010100000L
70 #  define EXIM_HAVE_OPENSSL_CHECKHOST
71 #  define EXIM_HAVE_OPENSSL_DH_BITS
72 #  define EXIM_HAVE_OPENSSL_TLS_METHOD
73 #  define EXIM_HAVE_OPENSSL_KEYLOG
74 #  define EXIM_HAVE_OPENSSL_CIPHER_GET_ID
75 #  define EXIM_HAVE_SESSION_TICKET
76 #  define EXIM_HAVE_OPESSL_TRACE
77 # else
78 #  define EXIM_NEED_OPENSSL_INIT
79 # endif
80 # if OPENSSL_VERSION_NUMBER >= 0x010000000L \
81     && (OPENSSL_VERSION_NUMBER & 0x0000ff000L) >= 0x000002000L
82 #  define EXIM_HAVE_OPENSSL_CHECKHOST
83 # endif
84 #endif
85
86 #if !defined(LIBRESSL_VERSION_NUMBER) \
87     || LIBRESSL_VERSION_NUMBER >= 0x20010000L
88 # if !defined(OPENSSL_NO_ECDH)
89 #  if OPENSSL_VERSION_NUMBER >= 0x0090800fL
90 #   define EXIM_HAVE_ECDH
91 #  endif
92 #  if OPENSSL_VERSION_NUMBER >= 0x10002000L
93 #   define EXIM_HAVE_OPENSSL_EC_NIST2NID
94 #  endif
95 # endif
96 #endif
97
98 #ifndef LIBRESSL_VERSION_NUMBER
99 # if OPENSSL_VERSION_NUMBER >= 0x010101000L
100 #  define OPENSSL_HAVE_KEYLOG_CB
101 #  define OPENSSL_HAVE_NUM_TICKETS
102 #  define EXIM_HAVE_OPENSSL_CIPHER_STD_NAME
103 # endif
104 #endif
105
106 #if !defined(EXIM_HAVE_OPENSSL_TLSEXT) && !defined(DISABLE_OCSP)
107 # warning "OpenSSL library version too old; define DISABLE_OCSP in Makefile"
108 # define DISABLE_OCSP
109 #endif
110
111 #ifdef EXPERIMENTAL_TLS_RESUME
112 # if OPENSSL_VERSION_NUMBER < 0x0101010L
113 #  error OpenSSL version too old for session-resumption
114 # endif
115 #endif
116
117 #ifdef EXIM_HAVE_OPENSSL_CHECKHOST
118 # include <openssl/x509v3.h>
119 #endif
120
121 #ifndef EXIM_HAVE_OPENSSL_CIPHER_STD_NAME
122 # ifndef EXIM_HAVE_OPENSSL_CIPHER_GET_ID
123 #  define SSL_CIPHER_get_id(c) (c->id)
124 # endif
125 # ifndef MACRO_PREDEF
126 #  include "tls-cipher-stdname.c"
127 # endif
128 #endif
129
130 /*************************************************
131 *        OpenSSL option parse                    *
132 *************************************************/
133
134 typedef struct exim_openssl_option {
135   uschar *name;
136   long    value;
137 } exim_openssl_option;
138 /* We could use a macro to expand, but we need the ifdef and not all the
139 options document which version they were introduced in.  Policylet: include
140 all options unless explicitly for DTLS, let the administrator choose which
141 to apply.
142
143 This list is current as of:
144   ==>  1.0.1b  <==
145 Plus SSL_OP_SAFARI_ECDHE_ECDSA_BUG from 2013-June patch/discussion on openssl-dev
146 Plus SSL_OP_NO_TLSv1_3 for 1.1.2-dev
147 */
148 static exim_openssl_option exim_openssl_options[] = {
149 /* KEEP SORTED ALPHABETICALLY! */
150 #ifdef SSL_OP_ALL
151   { US"all", SSL_OP_ALL },
152 #endif
153 #ifdef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION
154   { US"allow_unsafe_legacy_renegotiation", SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION },
155 #endif
156 #ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
157   { US"cipher_server_preference", SSL_OP_CIPHER_SERVER_PREFERENCE },
158 #endif
159 #ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
160   { US"dont_insert_empty_fragments", SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS },
161 #endif
162 #ifdef SSL_OP_EPHEMERAL_RSA
163   { US"ephemeral_rsa", SSL_OP_EPHEMERAL_RSA },
164 #endif
165 #ifdef SSL_OP_LEGACY_SERVER_CONNECT
166   { US"legacy_server_connect", SSL_OP_LEGACY_SERVER_CONNECT },
167 #endif
168 #ifdef SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER
169   { US"microsoft_big_sslv3_buffer", SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER },
170 #endif
171 #ifdef SSL_OP_MICROSOFT_SESS_ID_BUG
172   { US"microsoft_sess_id_bug", SSL_OP_MICROSOFT_SESS_ID_BUG },
173 #endif
174 #ifdef SSL_OP_MSIE_SSLV2_RSA_PADDING
175   { US"msie_sslv2_rsa_padding", SSL_OP_MSIE_SSLV2_RSA_PADDING },
176 #endif
177 #ifdef SSL_OP_NETSCAPE_CHALLENGE_BUG
178   { US"netscape_challenge_bug", SSL_OP_NETSCAPE_CHALLENGE_BUG },
179 #endif
180 #ifdef SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG
181   { US"netscape_reuse_cipher_change_bug", SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG },
182 #endif
183 #ifdef SSL_OP_NO_COMPRESSION
184   { US"no_compression", SSL_OP_NO_COMPRESSION },
185 #endif
186 #ifdef SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
187   { US"no_session_resumption_on_renegotiation", SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION },
188 #endif
189 #ifdef SSL_OP_NO_SSLv2
190   { US"no_sslv2", SSL_OP_NO_SSLv2 },
191 #endif
192 #ifdef SSL_OP_NO_SSLv3
193   { US"no_sslv3", SSL_OP_NO_SSLv3 },
194 #endif
195 #ifdef SSL_OP_NO_TICKET
196   { US"no_ticket", SSL_OP_NO_TICKET },
197 #endif
198 #ifdef SSL_OP_NO_TLSv1
199   { US"no_tlsv1", SSL_OP_NO_TLSv1 },
200 #endif
201 #ifdef SSL_OP_NO_TLSv1_1
202 #if SSL_OP_NO_TLSv1_1 == 0x00000400L
203   /* Error in chosen value in 1.0.1a; see first item in CHANGES for 1.0.1b */
204 #warning OpenSSL 1.0.1a uses a bad value for SSL_OP_NO_TLSv1_1, ignoring
205 #else
206   { US"no_tlsv1_1", SSL_OP_NO_TLSv1_1 },
207 #endif
208 #endif
209 #ifdef SSL_OP_NO_TLSv1_2
210   { US"no_tlsv1_2", SSL_OP_NO_TLSv1_2 },
211 #endif
212 #ifdef SSL_OP_NO_TLSv1_3
213   { US"no_tlsv1_3", SSL_OP_NO_TLSv1_3 },
214 #endif
215 #ifdef SSL_OP_SAFARI_ECDHE_ECDSA_BUG
216   { US"safari_ecdhe_ecdsa_bug", SSL_OP_SAFARI_ECDHE_ECDSA_BUG },
217 #endif
218 #ifdef SSL_OP_SINGLE_DH_USE
219   { US"single_dh_use", SSL_OP_SINGLE_DH_USE },
220 #endif
221 #ifdef SSL_OP_SINGLE_ECDH_USE
222   { US"single_ecdh_use", SSL_OP_SINGLE_ECDH_USE },
223 #endif
224 #ifdef SSL_OP_SSLEAY_080_CLIENT_DH_BUG
225   { US"ssleay_080_client_dh_bug", SSL_OP_SSLEAY_080_CLIENT_DH_BUG },
226 #endif
227 #ifdef SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG
228   { US"sslref2_reuse_cert_type_bug", SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG },
229 #endif
230 #ifdef SSL_OP_TLS_BLOCK_PADDING_BUG
231   { US"tls_block_padding_bug", SSL_OP_TLS_BLOCK_PADDING_BUG },
232 #endif
233 #ifdef SSL_OP_TLS_D5_BUG
234   { US"tls_d5_bug", SSL_OP_TLS_D5_BUG },
235 #endif
236 #ifdef SSL_OP_TLS_ROLLBACK_BUG
237   { US"tls_rollback_bug", SSL_OP_TLS_ROLLBACK_BUG },
238 #endif
239 };
240
241 #ifndef MACRO_PREDEF
242 static int exim_openssl_options_size = nelem(exim_openssl_options);
243 #endif
244
245 #ifdef MACRO_PREDEF
246 void
247 options_tls(void)
248 {
249 uschar buf[64];
250
251 for (struct exim_openssl_option * o = exim_openssl_options;
252      o < exim_openssl_options + nelem(exim_openssl_options); o++)
253   {
254   /* Trailing X is workaround for problem with _OPT_OPENSSL_NO_TLSV1
255   being a ".ifdef _OPT_OPENSSL_NO_TLSV1_3" match */
256
257   spf(buf, sizeof(buf), US"_OPT_OPENSSL_%T_X", o->name);
258   builtin_macro_create(buf);
259   }
260
261 # ifdef EXPERIMENTAL_TLS_RESUME
262 builtin_macro_create_var(US"_RESUME_DECODE", RESUME_DECODE_STRING );
263 # endif
264 }
265 #else
266
267 /******************************************************************************/
268
269 /* Structure for collecting random data for seeding. */
270
271 typedef struct randstuff {
272   struct timeval tv;
273   pid_t          p;
274 } randstuff;
275
276 /* Local static variables */
277
278 static BOOL client_verify_callback_called = FALSE;
279 static BOOL server_verify_callback_called = FALSE;
280 static const uschar *sid_ctx = US"exim";
281
282 /* We have three different contexts to care about.
283
284 Simple case: client, `client_ctx`
285  As a client, we can be doing a callout or cut-through delivery while receiving
286  a message.  So we have a client context, which should have options initialised
287  from the SMTP Transport.  We may also concurrently want to make TLS connections
288  to utility daemons, so client-contexts are allocated and passed around in call
289  args rather than using a gobal.
290
291 Server:
292  There are two cases: with and without ServerNameIndication from the client.
293  Given TLS SNI, we can be using different keys, certs and various other
294  configuration settings, because they're re-expanded with $tls_sni set.  This
295  allows vhosting with TLS.  This SNI is sent in the handshake.
296  A client might not send SNI, so we need a fallback, and an initial setup too.
297  So as a server, we start out using `server_ctx`.
298  If SNI is sent by the client, then we as server, mid-negotiation, try to clone
299  `server_sni` from `server_ctx` and then initialise settings by re-expanding
300  configuration.
301 */
302
303 typedef struct {
304   SSL_CTX *     ctx;
305   SSL *         ssl;
306   gstring *     corked;
307 } exim_openssl_client_tls_ctx;
308
309 static SSL_CTX *server_ctx = NULL;
310 static SSL     *server_ssl = NULL;
311
312 #ifdef EXIM_HAVE_OPENSSL_TLSEXT
313 static SSL_CTX *server_sni = NULL;
314 #endif
315
316 static char ssl_errstring[256];
317
318 static int  ssl_session_timeout = 3600;
319 static BOOL client_verify_optional = FALSE;
320 static BOOL server_verify_optional = FALSE;
321
322 static BOOL reexpand_tls_files_for_sni = FALSE;
323
324
325 typedef struct tls_ext_ctx_cb {
326   tls_support * tlsp;
327   uschar *certificate;
328   uschar *privatekey;
329   BOOL is_server;
330 #ifndef DISABLE_OCSP
331   STACK_OF(X509) *verify_stack;         /* chain for verifying the proof */
332   union {
333     struct {
334       uschar        *file;
335       uschar        *file_expanded;
336       OCSP_RESPONSE *response;
337     } server;
338     struct {
339       X509_STORE    *verify_store;      /* non-null if status requested */
340       BOOL          verify_required;
341     } client;
342   } u_ocsp;
343 #endif
344   uschar *dhparam;
345   /* these are cached from first expand */
346   uschar *server_cipher_list;
347   /* only passed down to tls_error: */
348   host_item *host;
349   const uschar * verify_cert_hostnames;
350 #ifndef DISABLE_EVENT
351   uschar * event_action;
352 #endif
353 } tls_ext_ctx_cb;
354
355 /* should figure out a cleanup of API to handle state preserved per
356 implementation, for various reasons, which can be void * in the APIs.
357 For now, we hack around it. */
358 tls_ext_ctx_cb *client_static_cbinfo = NULL;    /*XXX should not use static; multiple concurrent clients! */
359 tls_ext_ctx_cb *server_static_cbinfo = NULL;
360
361 static int
362 setup_certs(SSL_CTX *sctx, uschar *certs, uschar *crl, host_item *host, BOOL optional,
363     int (*cert_vfy_cb)(int, X509_STORE_CTX *), uschar ** errstr );
364
365 /* Callbacks */
366 #ifdef EXIM_HAVE_OPENSSL_TLSEXT
367 static int tls_servername_cb(SSL *s, int *ad ARG_UNUSED, void *arg);
368 #endif
369 #ifndef DISABLE_OCSP
370 static int tls_server_stapling_cb(SSL *s, void *arg);
371 #endif
372
373
374
375 /* Daemon-called key create/rotate */
376 #ifdef EXPERIMENTAL_TLS_RESUME
377 static void tk_init(void);
378 static int tls_exdata_idx = -1;
379 #endif
380
381 void
382 tls_daemon_init(void)
383 {
384 #ifdef EXPERIMENTAL_TLS_RESUME
385 tk_init();
386 #endif
387 return;
388 }
389
390
391 /*************************************************
392 *               Handle TLS error                 *
393 *************************************************/
394
395 /* Called from lots of places when errors occur before actually starting to do
396 the TLS handshake, that is, while the session is still in clear. Always returns
397 DEFER for a server and FAIL for a client so that most calls can use "return
398 tls_error(...)" to do this processing and then give an appropriate return. A
399 single function is used for both server and client, because it is called from
400 some shared functions.
401
402 Argument:
403   prefix    text to include in the logged error
404   host      NULL if setting up a server;
405             the connected host if setting up a client
406   msg       error message or NULL if we should ask OpenSSL
407   errstr    pointer to output error message
408
409 Returns:    OK/DEFER/FAIL
410 */
411
412 static int
413 tls_error(uschar * prefix, const host_item * host, uschar * msg, uschar ** errstr)
414 {
415 if (!msg)
416   {
417   ERR_error_string_n(ERR_get_error(), ssl_errstring, sizeof(ssl_errstring));
418   msg = US ssl_errstring;
419   }
420
421 msg = string_sprintf("(%s): %s", prefix, msg);
422 DEBUG(D_tls) debug_printf("TLS error '%s'\n", msg);
423 if (errstr) *errstr = msg;
424 return host ? FAIL : DEFER;
425 }
426
427
428
429 /*************************************************
430 *        Callback to generate RSA key            *
431 *************************************************/
432
433 /*
434 Arguments:
435   s          SSL connection (not used)
436   export     not used
437   keylength  keylength
438
439 Returns:     pointer to generated key
440 */
441
442 static RSA *
443 rsa_callback(SSL *s, int export, int keylength)
444 {
445 RSA *rsa_key;
446 #ifdef EXIM_HAVE_RSA_GENKEY_EX
447 BIGNUM *bn = BN_new();
448 #endif
449
450 export = export;     /* Shut picky compilers up */
451 DEBUG(D_tls) debug_printf("Generating %d bit RSA key...\n", keylength);
452
453 #ifdef EXIM_HAVE_RSA_GENKEY_EX
454 if (  !BN_set_word(bn, (unsigned long)RSA_F4)
455    || !(rsa_key = RSA_new())
456    || !RSA_generate_key_ex(rsa_key, keylength, bn, NULL)
457    )
458 #else
459 if (!(rsa_key = RSA_generate_key(keylength, RSA_F4, NULL, NULL)))
460 #endif
461
462   {
463   ERR_error_string_n(ERR_get_error(), ssl_errstring, sizeof(ssl_errstring));
464   log_write(0, LOG_MAIN|LOG_PANIC, "TLS error (RSA_generate_key): %s",
465     ssl_errstring);
466   return NULL;
467   }
468 return rsa_key;
469 }
470
471
472
473 /* Extreme debug
474 #ifndef DISABLE_OCSP
475 void
476 x509_store_dump_cert_s_names(X509_STORE * store)
477 {
478 STACK_OF(X509_OBJECT) * roots= store->objs;
479 static uschar name[256];
480
481 for (int i= 0; i < sk_X509_OBJECT_num(roots); i++)
482   {
483   X509_OBJECT * tmp_obj= sk_X509_OBJECT_value(roots, i);
484   if(tmp_obj->type == X509_LU_X509)
485     {
486     X509_NAME * sn = X509_get_subject_name(tmp_obj->data.x509);
487     if (X509_NAME_oneline(sn, CS name, sizeof(name)))
488       {
489       name[sizeof(name)-1] = '\0';
490       debug_printf(" %s\n", name);
491       }
492     }
493   }
494 }
495 #endif
496 */
497
498
499 #ifndef DISABLE_EVENT
500 static int
501 verify_event(tls_support * tlsp, X509 * cert, int depth, const uschar * dn,
502   BOOL *calledp, const BOOL *optionalp, const uschar * what)
503 {
504 uschar * ev;
505 uschar * yield;
506 X509 * old_cert;
507
508 ev = tlsp == &tls_out ? client_static_cbinfo->event_action : event_action;
509 if (ev)
510   {
511   DEBUG(D_tls) debug_printf("verify_event: %s %d\n", what, depth);
512   old_cert = tlsp->peercert;
513   tlsp->peercert = X509_dup(cert);
514   /* NB we do not bother setting peerdn */
515   if ((yield = event_raise(ev, US"tls:cert", string_sprintf("%d", depth))))
516     {
517     log_write(0, LOG_MAIN, "[%s] %s verify denied by event-action: "
518                 "depth=%d cert=%s: %s",
519               tlsp == &tls_out ? deliver_host_address : sender_host_address,
520               what, depth, dn, yield);
521     *calledp = TRUE;
522     if (!*optionalp)
523       {
524       if (old_cert) tlsp->peercert = old_cert;  /* restore 1st failing cert */
525       return 1;                     /* reject (leaving peercert set) */
526       }
527     DEBUG(D_tls) debug_printf("Event-action verify failure overridden "
528       "(host in tls_try_verify_hosts)\n");
529     }
530   X509_free(tlsp->peercert);
531   tlsp->peercert = old_cert;
532   }
533 return 0;
534 }
535 #endif
536
537 /*************************************************
538 *        Callback for verification               *
539 *************************************************/
540
541 /* The SSL library does certificate verification if set up to do so. This
542 callback has the current yes/no state is in "state". If verification succeeded,
543 we set the certificate-verified flag. If verification failed, what happens
544 depends on whether the client is required to present a verifiable certificate
545 or not.
546
547 If verification is optional, we change the state to yes, but still log the
548 verification error. For some reason (it really would help to have proper
549 documentation of OpenSSL), this callback function then gets called again, this
550 time with state = 1.  We must take care not to set the private verified flag on
551 the second time through.
552
553 Note: this function is not called if the client fails to present a certificate
554 when asked. We get here only if a certificate has been received. Handling of
555 optional verification for this case is done when requesting SSL to verify, by
556 setting SSL_VERIFY_FAIL_IF_NO_PEER_CERT in the non-optional case.
557
558 May be called multiple times for different issues with a certificate, even
559 for a given "depth" in the certificate chain.
560
561 Arguments:
562   preverify_ok current yes/no state as 1/0
563   x509ctx      certificate information.
564   tlsp         per-direction (client vs. server) support data
565   calledp      has-been-called flag
566   optionalp    verification-is-optional flag
567
568 Returns:     0 if verification should fail, otherwise 1
569 */
570
571 static int
572 verify_callback(int preverify_ok, X509_STORE_CTX * x509ctx,
573   tls_support * tlsp, BOOL * calledp, BOOL * optionalp)
574 {
575 X509 * cert = X509_STORE_CTX_get_current_cert(x509ctx);
576 int depth = X509_STORE_CTX_get_error_depth(x509ctx);
577 uschar dn[256];
578
579 if (!X509_NAME_oneline(X509_get_subject_name(cert), CS dn, sizeof(dn)))
580   {
581   DEBUG(D_tls) debug_printf("X509_NAME_oneline() error\n");
582   log_write(0, LOG_MAIN, "[%s] SSL verify error: internal error",
583     tlsp == &tls_out ? deliver_host_address : sender_host_address);
584   return 0;
585   }
586 dn[sizeof(dn)-1] = '\0';
587
588 if (preverify_ok == 0)
589   {
590   uschar * extra = verify_mode ? string_sprintf(" (during %c-verify for [%s])",
591       *verify_mode, sender_host_address)
592     : US"";
593   log_write(0, LOG_MAIN, "[%s] SSL verify error%s: depth=%d error=%s cert=%s",
594     tlsp == &tls_out ? deliver_host_address : sender_host_address,
595     extra, depth,
596     X509_verify_cert_error_string(X509_STORE_CTX_get_error(x509ctx)), dn);
597   *calledp = TRUE;
598   if (!*optionalp)
599     {
600     if (!tlsp->peercert)
601       tlsp->peercert = X509_dup(cert);  /* record failing cert */
602     return 0;                           /* reject */
603     }
604   DEBUG(D_tls) debug_printf("SSL verify failure overridden (host in "
605     "tls_try_verify_hosts)\n");
606   }
607
608 else if (depth != 0)
609   {
610   DEBUG(D_tls) debug_printf("SSL verify ok: depth=%d SN=%s\n", depth, dn);
611 #ifndef DISABLE_OCSP
612   if (tlsp == &tls_out && client_static_cbinfo->u_ocsp.client.verify_store)
613     {   /* client, wanting stapling  */
614     /* Add the server cert's signing chain as the one
615     for the verification of the OCSP stapled information. */
616
617     if (!X509_STORE_add_cert(client_static_cbinfo->u_ocsp.client.verify_store,
618                              cert))
619       ERR_clear_error();
620     sk_X509_push(client_static_cbinfo->verify_stack, cert);
621     }
622 #endif
623 #ifndef DISABLE_EVENT
624     if (verify_event(tlsp, cert, depth, dn, calledp, optionalp, US"SSL"))
625       return 0;                         /* reject, with peercert set */
626 #endif
627   }
628 else
629   {
630   const uschar * verify_cert_hostnames;
631
632   if (  tlsp == &tls_out
633      && ((verify_cert_hostnames = client_static_cbinfo->verify_cert_hostnames)))
634         /* client, wanting hostname check */
635     {
636
637 #ifdef EXIM_HAVE_OPENSSL_CHECKHOST
638 # ifndef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
639 #  define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0
640 # endif
641 # ifndef X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS
642 #  define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0
643 # endif
644     int sep = 0;
645     const uschar * list = verify_cert_hostnames;
646     uschar * name;
647     int rc;
648     while ((name = string_nextinlist(&list, &sep, NULL, 0)))
649       if ((rc = X509_check_host(cert, CCS name, 0,
650                   X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
651                   | X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS,
652                   NULL)))
653         {
654         if (rc < 0)
655           {
656           log_write(0, LOG_MAIN, "[%s] SSL verify error: internal error",
657             tlsp == &tls_out ? deliver_host_address : sender_host_address);
658           name = NULL;
659           }
660         break;
661         }
662     if (!name)
663 #else
664     if (!tls_is_name_for_cert(verify_cert_hostnames, cert))
665 #endif
666       {
667       uschar * extra = verify_mode
668         ? string_sprintf(" (during %c-verify for [%s])",
669           *verify_mode, sender_host_address)
670         : US"";
671       log_write(0, LOG_MAIN,
672         "[%s] SSL verify error%s: certificate name mismatch: DN=\"%s\" H=\"%s\"",
673         tlsp == &tls_out ? deliver_host_address : sender_host_address,
674         extra, dn, verify_cert_hostnames);
675       *calledp = TRUE;
676       if (!*optionalp)
677         {
678         if (!tlsp->peercert)
679           tlsp->peercert = X509_dup(cert);      /* record failing cert */
680         return 0;                               /* reject */
681         }
682       DEBUG(D_tls) debug_printf("SSL verify failure overridden (host in "
683         "tls_try_verify_hosts)\n");
684       }
685     }
686
687 #ifndef DISABLE_EVENT
688   if (verify_event(tlsp, cert, depth, dn, calledp, optionalp, US"SSL"))
689     return 0;                           /* reject, with peercert set */
690 #endif
691
692   DEBUG(D_tls) debug_printf("SSL%s verify ok: depth=0 SN=%s\n",
693     *calledp ? "" : " authenticated", dn);
694   if (!*calledp) tlsp->certificate_verified = TRUE;
695   *calledp = TRUE;
696   }
697
698 return 1;   /* accept, at least for this level */
699 }
700
701 static int
702 verify_callback_client(int preverify_ok, X509_STORE_CTX *x509ctx)
703 {
704 return verify_callback(preverify_ok, x509ctx, &tls_out,
705   &client_verify_callback_called, &client_verify_optional);
706 }
707
708 static int
709 verify_callback_server(int preverify_ok, X509_STORE_CTX *x509ctx)
710 {
711 return verify_callback(preverify_ok, x509ctx, &tls_in,
712   &server_verify_callback_called, &server_verify_optional);
713 }
714
715
716 #ifdef SUPPORT_DANE
717
718 /* This gets called *by* the dane library verify callback, which interposes
719 itself.
720 */
721 static int
722 verify_callback_client_dane(int preverify_ok, X509_STORE_CTX * x509ctx)
723 {
724 X509 * cert = X509_STORE_CTX_get_current_cert(x509ctx);
725 uschar dn[256];
726 int depth = X509_STORE_CTX_get_error_depth(x509ctx);
727 #ifndef DISABLE_EVENT
728 BOOL dummy_called, optional = FALSE;
729 #endif
730
731 if (!X509_NAME_oneline(X509_get_subject_name(cert), CS dn, sizeof(dn)))
732   {
733   DEBUG(D_tls) debug_printf("X509_NAME_oneline() error\n");
734   log_write(0, LOG_MAIN, "[%s] SSL verify error: internal error",
735     deliver_host_address);
736   return 0;
737   }
738 dn[sizeof(dn)-1] = '\0';
739
740 DEBUG(D_tls) debug_printf("verify_callback_client_dane: %s depth %d %s\n",
741   preverify_ok ? "ok":"BAD", depth, dn);
742
743 #ifndef DISABLE_EVENT
744   if (verify_event(&tls_out, cert, depth, dn,
745           &dummy_called, &optional, US"DANE"))
746     return 0;                           /* reject, with peercert set */
747 #endif
748
749 if (preverify_ok == 1)
750   {
751   tls_out.dane_verified = tls_out.certificate_verified = TRUE;
752 #ifndef DISABLE_OCSP
753   if (client_static_cbinfo->u_ocsp.client.verify_store)
754     {   /* client, wanting stapling  */
755     /* Add the server cert's signing chain as the one
756     for the verification of the OCSP stapled information. */
757
758     if (!X509_STORE_add_cert(client_static_cbinfo->u_ocsp.client.verify_store,
759                              cert))
760       ERR_clear_error();
761     sk_X509_push(client_static_cbinfo->verify_stack, cert);
762     }
763 #endif
764   }
765 else
766   {
767   int err = X509_STORE_CTX_get_error(x509ctx);
768   DEBUG(D_tls)
769     debug_printf(" - err %d '%s'\n", err, X509_verify_cert_error_string(err));
770   if (err == X509_V_ERR_APPLICATION_VERIFICATION)
771     preverify_ok = 1;
772   }
773 return preverify_ok;
774 }
775
776 #endif  /*SUPPORT_DANE*/
777
778
779 /*************************************************
780 *           Information callback                 *
781 *************************************************/
782
783 /* The SSL library functions call this from time to time to indicate what they
784 are doing. We copy the string to the debugging output when TLS debugging has
785 been requested.
786
787 Arguments:
788   s         the SSL connection
789   where
790   ret
791
792 Returns:    nothing
793 */
794
795 static void
796 info_callback(SSL *s, int where, int ret)
797 {
798 DEBUG(D_tls)
799   {
800   const uschar * str;
801
802   if (where & SSL_ST_CONNECT)
803      str = US"SSL_connect";
804   else if (where & SSL_ST_ACCEPT)
805      str = US"SSL_accept";
806   else
807      str = US"SSL info (undefined)";
808
809   if (where & SSL_CB_LOOP)
810      debug_printf("%s: %s\n", str, SSL_state_string_long(s));
811   else if (where & SSL_CB_ALERT)
812     debug_printf("SSL3 alert %s:%s:%s\n",
813           str = where & SSL_CB_READ ? US"read" : US"write",
814           SSL_alert_type_string_long(ret), SSL_alert_desc_string_long(ret));
815   else if (where & SSL_CB_EXIT)
816      if (ret == 0)
817         debug_printf("%s: failed in %s\n", str, SSL_state_string_long(s));
818      else if (ret < 0)
819         debug_printf("%s: error in %s\n", str, SSL_state_string_long(s));
820   else if (where & SSL_CB_HANDSHAKE_START)
821      debug_printf("%s: hshake start: %s\n", str, SSL_state_string_long(s));
822   else if (where & SSL_CB_HANDSHAKE_DONE)
823      debug_printf("%s: hshake done: %s\n", str, SSL_state_string_long(s));
824   }
825 }
826
827 #ifdef OPENSSL_HAVE_KEYLOG_CB
828 static void
829 keylog_callback(const SSL *ssl, const char *line)
830 {
831 DEBUG(D_tls) debug_printf("%.200s\n", line);
832 }
833 #endif
834
835
836 #ifdef EXPERIMENTAL_TLS_RESUME
837 /* Manage the keysets used for encrypting the session tickets, on the server. */
838
839 typedef struct {                        /* Session ticket encryption key */
840   uschar        name[16];
841
842   const EVP_CIPHER *    aes_cipher;
843   uschar                aes_key[16];    /* size needed depends on cipher. aes_128 implies 128/8 = 16? */
844   const EVP_MD *        hmac_hash;
845   uschar                hmac_key[16];
846   time_t                renew;
847   time_t                expire;
848 } exim_stek;
849
850 /*XXX for now just always create/find the one key.
851 Worry about rotation and overlap later. */
852
853 static exim_stek exim_tk;
854 static exim_stek exim_tk_old;
855
856 static void
857 tk_init(void)
858 {
859 if (exim_tk.name[0])
860   {
861   if (exim_tk.renew >= time(NULL)) return;
862   exim_tk_old = exim_tk;
863   }
864
865 if (f.running_in_test_harness) ssl_session_timeout = 6;
866
867 DEBUG(D_tls) debug_printf("OpenSSL: %s STEK\n", exim_tk.name[0] ? "rotating" : "creating");
868 if (RAND_bytes(exim_tk.aes_key, sizeof(exim_tk.aes_key)) <= 0) return;
869 if (RAND_bytes(exim_tk.hmac_key, sizeof(exim_tk.hmac_key)) <= 0) return;
870 if (RAND_bytes(exim_tk.name+1, sizeof(exim_tk.name)-1) <= 0) return;
871
872 exim_tk.name[0] = 'E';
873 exim_tk.aes_cipher = EVP_aes_128_cbc();
874 exim_tk.hmac_hash = EVP_sha256();
875 exim_tk.expire = time(NULL) + ssl_session_timeout;
876 exim_tk.renew = exim_tk.expire - ssl_session_timeout/2;
877 }
878
879 static exim_stek *
880 tk_current(void)
881 {
882 if (!exim_tk.name[0]) return NULL;
883 return &exim_tk;
884 }
885
886 static exim_stek *
887 tk_find(const uschar * name)
888 {
889 return memcmp(name, exim_tk.name, sizeof(exim_tk.name)) == 0 ? &exim_tk
890   : memcmp(name, exim_tk_old.name, sizeof(exim_tk_old.name)) == 0 ? &exim_tk_old
891   : NULL;
892 }
893
894 /* Callback for session tickets, on server */
895 static int
896 ticket_key_callback(SSL * ssl, uschar key_name[16],
897   uschar * iv, EVP_CIPHER_CTX * ctx, HMAC_CTX * hctx, int enc)
898 {
899 tls_support * tlsp = server_static_cbinfo->tlsp;
900 exim_stek * key;
901
902 if (enc)
903   {
904   DEBUG(D_tls) debug_printf("ticket_key_callback: create new session\n");
905   tlsp->resumption |= RESUME_CLIENT_REQUESTED;
906
907   if (RAND_bytes(iv, EVP_MAX_IV_LENGTH) <= 0)
908     return -1; /* insufficient random */
909
910   if (!(key = tk_current()))    /* current key doesn't exist or isn't valid */
911      return 0;                  /* key couldn't be created */
912   memcpy(key_name, key->name, 16);
913   DEBUG(D_tls) debug_printf("STEK expire %ld\n", key->expire - time(NULL));
914
915   /*XXX will want these dependent on the ssl session strength */
916   HMAC_Init_ex(hctx, key->hmac_key, sizeof(key->hmac_key),
917                 key->hmac_hash, NULL);
918   EVP_EncryptInit_ex(ctx, key->aes_cipher, NULL, key->aes_key, iv);
919
920   DEBUG(D_tls) debug_printf("ticket created\n");
921   return 1;
922   }
923 else
924   {
925   time_t now = time(NULL);
926
927   DEBUG(D_tls) debug_printf("ticket_key_callback: retrieve session\n");
928   tlsp->resumption |= RESUME_CLIENT_SUGGESTED;
929
930   if (!(key = tk_find(key_name)) || key->expire < now)
931     {
932     DEBUG(D_tls)
933       {
934       debug_printf("ticket not usable (%s)\n", key ? "expired" : "not found");
935       if (key) debug_printf("STEK expire %ld\n", key->expire - now);
936       }
937     return 0;
938     }
939
940   HMAC_Init_ex(hctx, key->hmac_key, sizeof(key->hmac_key),
941                 key->hmac_hash, NULL);
942   EVP_DecryptInit_ex(ctx, key->aes_cipher, NULL, key->aes_key, iv);
943
944   DEBUG(D_tls) debug_printf("ticket usable, STEK expire %ld\n", key->expire - now);
945   return key->renew < now ? 2 : 1;
946   }
947 }
948 #endif
949
950
951
952 /*************************************************
953 *                Initialize for DH               *
954 *************************************************/
955
956 /* If dhparam is set, expand it, and load up the parameters for DH encryption.
957
958 Arguments:
959   sctx      The current SSL CTX (inbound or outbound)
960   dhparam   DH parameter file or fixed parameter identity string
961   host      connected host, if client; NULL if server
962   errstr    error string pointer
963
964 Returns:    TRUE if OK (nothing to set up, or setup worked)
965 */
966
967 static BOOL
968 init_dh(SSL_CTX *sctx, uschar *dhparam, const host_item *host, uschar ** errstr)
969 {
970 BIO *bio;
971 DH *dh;
972 uschar *dhexpanded;
973 const char *pem;
974 int dh_bitsize;
975
976 if (!expand_check(dhparam, US"tls_dhparam", &dhexpanded, errstr))
977   return FALSE;
978
979 if (!dhexpanded || !*dhexpanded)
980   bio = BIO_new_mem_buf(CS std_dh_prime_default(), -1);
981 else if (dhexpanded[0] == '/')
982   {
983   if (!(bio = BIO_new_file(CS dhexpanded, "r")))
984     {
985     tls_error(string_sprintf("could not read dhparams file %s", dhexpanded),
986           host, US strerror(errno), errstr);
987     return FALSE;
988     }
989   }
990 else
991   {
992   if (Ustrcmp(dhexpanded, "none") == 0)
993     {
994     DEBUG(D_tls) debug_printf("Requested no DH parameters.\n");
995     return TRUE;
996     }
997
998   if (!(pem = std_dh_prime_named(dhexpanded)))
999     {
1000     tls_error(string_sprintf("Unknown standard DH prime \"%s\"", dhexpanded),
1001         host, US strerror(errno), errstr);
1002     return FALSE;
1003     }
1004   bio = BIO_new_mem_buf(CS pem, -1);
1005   }
1006
1007 if (!(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)))
1008   {
1009   BIO_free(bio);
1010   tls_error(string_sprintf("Could not read tls_dhparams \"%s\"", dhexpanded),
1011       host, NULL, errstr);
1012   return FALSE;
1013   }
1014
1015 /* note: our default limit of 2236 is not a multiple of 8; the limit comes from
1016  * an NSS limit, and the GnuTLS APIs handle bit-sizes fine, so we went with
1017  * 2236.  But older OpenSSL can only report in bytes (octets), not bits.
1018  * If someone wants to dance at the edge, then they can raise the limit or use
1019  * current libraries. */
1020 #ifdef EXIM_HAVE_OPENSSL_DH_BITS
1021 /* Added in commit 26c79d5641d; `git describe --contains` says OpenSSL_1_1_0-pre1~1022
1022  * This predates OpenSSL_1_1_0 (before a, b, ...) so is in all 1.1.0 */
1023 dh_bitsize = DH_bits(dh);
1024 #else
1025 dh_bitsize = 8 * DH_size(dh);
1026 #endif
1027
1028 /* Even if it is larger, we silently return success rather than cause things
1029  * to fail out, so that a too-large DH will not knock out all TLS; it's a
1030  * debatable choice. */
1031 if (dh_bitsize > tls_dh_max_bits)
1032   {
1033   DEBUG(D_tls)
1034     debug_printf("dhparams file %d bits, is > tls_dh_max_bits limit of %d\n",
1035         dh_bitsize, tls_dh_max_bits);
1036   }
1037 else
1038   {
1039   SSL_CTX_set_tmp_dh(sctx, dh);
1040   DEBUG(D_tls)
1041     debug_printf("Diffie-Hellman initialized from %s with %d-bit prime\n",
1042       dhexpanded ? dhexpanded : US"default", dh_bitsize);
1043   }
1044
1045 DH_free(dh);
1046 BIO_free(bio);
1047
1048 return TRUE;
1049 }
1050
1051
1052
1053
1054 /*************************************************
1055 *               Initialize for ECDH              *
1056 *************************************************/
1057
1058 /* Load parameters for ECDH encryption.
1059
1060 For now, we stick to NIST P-256 because: it's simple and easy to configure;
1061 it avoids any patent issues that might bite redistributors; despite events in
1062 the news and concerns over curve choices, we're not cryptographers, we're not
1063 pretending to be, and this is "good enough" to be better than no support,
1064 protecting against most adversaries.  Given another year or two, there might
1065 be sufficient clarity about a "right" way forward to let us make an informed
1066 decision, instead of a knee-jerk reaction.
1067
1068 Longer-term, we should look at supporting both various named curves and
1069 external files generated with "openssl ecparam", much as we do for init_dh().
1070 We should also support "none" as a value, to explicitly avoid initialisation.
1071
1072 Patches welcome.
1073
1074 Arguments:
1075   sctx      The current SSL CTX (inbound or outbound)
1076   host      connected host, if client; NULL if server
1077   errstr    error string pointer
1078
1079 Returns:    TRUE if OK (nothing to set up, or setup worked)
1080 */
1081
1082 static BOOL
1083 init_ecdh(SSL_CTX * sctx, host_item * host, uschar ** errstr)
1084 {
1085 #ifdef OPENSSL_NO_ECDH
1086 return TRUE;
1087 #else
1088
1089 EC_KEY * ecdh;
1090 uschar * exp_curve;
1091 int nid;
1092 BOOL rv;
1093
1094 if (host)       /* No ECDH setup for clients, only for servers */
1095   return TRUE;
1096
1097 # ifndef EXIM_HAVE_ECDH
1098 DEBUG(D_tls)
1099   debug_printf("No OpenSSL API to define ECDH parameters, skipping\n");
1100 return TRUE;
1101 # else
1102
1103 if (!expand_check(tls_eccurve, US"tls_eccurve", &exp_curve, errstr))
1104   return FALSE;
1105 if (!exp_curve || !*exp_curve)
1106   return TRUE;
1107
1108 /* "auto" needs to be handled carefully.
1109  * OpenSSL <  1.0.2: we do not select anything, but fallback to prime256v1
1110  * OpenSSL <  1.1.0: we have to call SSL_CTX_set_ecdh_auto
1111  *                   (openssl/ssl.h defines SSL_CTRL_SET_ECDH_AUTO)
1112  * OpenSSL >= 1.1.0: we do not set anything, the libray does autoselection
1113  *                   https://github.com/openssl/openssl/commit/fe6ef2472db933f01b59cad82aa925736935984b
1114  */
1115 if (Ustrcmp(exp_curve, "auto") == 0)
1116   {
1117 #if OPENSSL_VERSION_NUMBER < 0x10002000L
1118   DEBUG(D_tls) debug_printf(
1119     "ECDH OpenSSL < 1.0.2: temp key parameter settings: overriding \"auto\" with \"prime256v1\"\n");
1120   exp_curve = US"prime256v1";
1121 #else
1122 # if defined SSL_CTRL_SET_ECDH_AUTO
1123   DEBUG(D_tls) debug_printf(
1124     "ECDH OpenSSL 1.0.2+ temp key parameter settings: autoselection\n");
1125   SSL_CTX_set_ecdh_auto(sctx, 1);
1126   return TRUE;
1127 # else
1128   DEBUG(D_tls) debug_printf(
1129     "ECDH OpenSSL 1.1.0+ temp key parameter settings: default selection\n");
1130   return TRUE;
1131 # endif
1132 #endif
1133   }
1134
1135 DEBUG(D_tls) debug_printf("ECDH: curve '%s'\n", exp_curve);
1136 if (  (nid = OBJ_sn2nid       (CCS exp_curve)) == NID_undef
1137 #   ifdef EXIM_HAVE_OPENSSL_EC_NIST2NID
1138    && (nid = EC_curve_nist2nid(CCS exp_curve)) == NID_undef
1139 #   endif
1140    )
1141   {
1142   tls_error(string_sprintf("Unknown curve name tls_eccurve '%s'", exp_curve),
1143     host, NULL, errstr);
1144   return FALSE;
1145   }
1146
1147 if (!(ecdh = EC_KEY_new_by_curve_name(nid)))
1148   {
1149   tls_error(US"Unable to create ec curve", host, NULL, errstr);
1150   return FALSE;
1151   }
1152
1153 /* The "tmp" in the name here refers to setting a temporary key
1154 not to the stability of the interface. */
1155
1156 if ((rv = SSL_CTX_set_tmp_ecdh(sctx, ecdh) == 0))
1157   tls_error(string_sprintf("Error enabling '%s' curve", exp_curve), host, NULL, errstr);
1158 else
1159   DEBUG(D_tls) debug_printf("ECDH: enabled '%s' curve\n", exp_curve);
1160
1161 EC_KEY_free(ecdh);
1162 return !rv;
1163
1164 # endif /*EXIM_HAVE_ECDH*/
1165 #endif /*OPENSSL_NO_ECDH*/
1166 }
1167
1168
1169
1170
1171 #ifndef DISABLE_OCSP
1172 /*************************************************
1173 *       Load OCSP information into state         *
1174 *************************************************/
1175 /* Called to load the server OCSP response from the given file into memory, once
1176 caller has determined this is needed.  Checks validity.  Debugs a message
1177 if invalid.
1178
1179 ASSUMES: single response, for single cert.
1180
1181 Arguments:
1182   sctx            the SSL_CTX* to update
1183   cbinfo          various parts of session state
1184   expanded        the filename putatively holding an OCSP response
1185
1186 */
1187
1188 static void
1189 ocsp_load_response(SSL_CTX *sctx, tls_ext_ctx_cb *cbinfo, const uschar *expanded)
1190 {
1191 BIO * bio;
1192 OCSP_RESPONSE * resp;
1193 OCSP_BASICRESP * basic_response;
1194 OCSP_SINGLERESP * single_response;
1195 ASN1_GENERALIZEDTIME * rev, * thisupd, * nextupd;
1196 STACK_OF(X509) * sk;
1197 unsigned long verify_flags;
1198 int status, reason, i;
1199
1200 cbinfo->u_ocsp.server.file_expanded = string_copy(expanded);
1201 if (cbinfo->u_ocsp.server.response)
1202   {
1203   OCSP_RESPONSE_free(cbinfo->u_ocsp.server.response);
1204   cbinfo->u_ocsp.server.response = NULL;
1205   }
1206
1207 if (!(bio = BIO_new_file(CS cbinfo->u_ocsp.server.file_expanded, "rb")))
1208   {
1209   DEBUG(D_tls) debug_printf("Failed to open OCSP response file \"%s\"\n",
1210       cbinfo->u_ocsp.server.file_expanded);
1211   return;
1212   }
1213
1214 resp = d2i_OCSP_RESPONSE_bio(bio, NULL);
1215 BIO_free(bio);
1216 if (!resp)
1217   {
1218   DEBUG(D_tls) debug_printf("Error reading OCSP response.\n");
1219   return;
1220   }
1221
1222 if ((status = OCSP_response_status(resp)) != OCSP_RESPONSE_STATUS_SUCCESSFUL)
1223   {
1224   DEBUG(D_tls) debug_printf("OCSP response not valid: %s (%d)\n",
1225       OCSP_response_status_str(status), status);
1226   goto bad;
1227   }
1228
1229 if (!(basic_response = OCSP_response_get1_basic(resp)))
1230   {
1231   DEBUG(D_tls)
1232     debug_printf("OCSP response parse error: unable to extract basic response.\n");
1233   goto bad;
1234   }
1235
1236 sk = cbinfo->verify_stack;
1237 verify_flags = OCSP_NOVERIFY; /* check sigs, but not purpose */
1238
1239 /* May need to expose ability to adjust those flags?
1240 OCSP_NOSIGS OCSP_NOVERIFY OCSP_NOCHAIN OCSP_NOCHECKS OCSP_NOEXPLICIT
1241 OCSP_TRUSTOTHER OCSP_NOINTERN */
1242
1243 /* This does a full verify on the OCSP proof before we load it for serving
1244 up; possibly overkill - just date-checks might be nice enough.
1245
1246 OCSP_basic_verify takes a "store" arg, but does not
1247 use it for the chain verification, which is all we do
1248 when OCSP_NOVERIFY is set.  The content from the wire
1249 "basic_response" and a cert-stack "sk" are all that is used.
1250
1251 We have a stack, loaded in setup_certs() if tls_verify_certificates
1252 was a file (not a directory, or "system").  It is unfortunate we
1253 cannot used the connection context store, as that would neatly
1254 handle the "system" case too, but there seems to be no library
1255 function for getting a stack from a store.
1256 [ In OpenSSL 1.1 - ?  X509_STORE_CTX_get0_chain(ctx) ? ]
1257 We do not free the stack since it could be needed a second time for
1258 SNI handling.
1259
1260 Separately we might try to replace using OCSP_basic_verify() - which seems to not
1261 be a public interface into the OpenSSL library (there's no manual entry) -
1262 But what with?  We also use OCSP_basic_verify in the client stapling callback.
1263 And there we NEED it; we must verify that status... unless the
1264 library does it for us anyway?  */
1265
1266 if ((i = OCSP_basic_verify(basic_response, sk, NULL, verify_flags)) < 0)
1267   {
1268   DEBUG(D_tls)
1269     {
1270     ERR_error_string_n(ERR_get_error(), ssl_errstring, sizeof(ssl_errstring));
1271     debug_printf("OCSP response verify failure: %s\n", US ssl_errstring);
1272     }
1273   goto bad;
1274   }
1275
1276 /* Here's the simplifying assumption: there's only one response, for the
1277 one certificate we use, and nothing for anything else in a chain.  If this
1278 proves false, we need to extract a cert id from our issued cert
1279 (tls_certificate) and use that for OCSP_resp_find_status() (which finds the
1280 right cert in the stack and then calls OCSP_single_get0_status()).
1281
1282 I'm hoping to avoid reworking a bunch more of how we handle state here. */
1283
1284 if (!(single_response = OCSP_resp_get0(basic_response, 0)))
1285   {
1286   DEBUG(D_tls)
1287     debug_printf("Unable to get first response from OCSP basic response.\n");
1288   goto bad;
1289   }
1290
1291 status = OCSP_single_get0_status(single_response, &reason, &rev, &thisupd, &nextupd);
1292 if (status != V_OCSP_CERTSTATUS_GOOD)
1293   {
1294   DEBUG(D_tls) debug_printf("OCSP response bad cert status: %s (%d) %s (%d)\n",
1295       OCSP_cert_status_str(status), status,
1296       OCSP_crl_reason_str(reason), reason);
1297   goto bad;
1298   }
1299
1300 if (!OCSP_check_validity(thisupd, nextupd, EXIM_OCSP_SKEW_SECONDS, EXIM_OCSP_MAX_AGE))
1301   {
1302   DEBUG(D_tls) debug_printf("OCSP status invalid times.\n");
1303   goto bad;
1304   }
1305
1306 supply_response:
1307   cbinfo->u_ocsp.server.response = resp;        /*XXX stack?*/
1308 return;
1309
1310 bad:
1311   if (f.running_in_test_harness)
1312     {
1313     extern char ** environ;
1314     if (environ) for (uschar ** p = USS environ; *p; p++)
1315       if (Ustrncmp(*p, "EXIM_TESTHARNESS_DISABLE_OCSPVALIDITYCHECK", 42) == 0)
1316         {
1317         DEBUG(D_tls) debug_printf("Supplying known bad OCSP response\n");
1318         goto supply_response;
1319         }
1320     }
1321 return;
1322 }
1323 #endif  /*!DISABLE_OCSP*/
1324
1325
1326
1327
1328 /* Create and install a selfsigned certificate, for use in server mode */
1329
1330 static int
1331 tls_install_selfsign(SSL_CTX * sctx, uschar ** errstr)
1332 {
1333 X509 * x509 = NULL;
1334 EVP_PKEY * pkey;
1335 RSA * rsa;
1336 X509_NAME * name;
1337 uschar * where;
1338
1339 where = US"allocating pkey";
1340 if (!(pkey = EVP_PKEY_new()))
1341   goto err;
1342
1343 where = US"allocating cert";
1344 if (!(x509 = X509_new()))
1345   goto err;
1346
1347 where = US"generating pkey";
1348 if (!(rsa = rsa_callback(NULL, 0, 2048)))
1349   goto err;
1350
1351 where = US"assigning pkey";
1352 if (!EVP_PKEY_assign_RSA(pkey, rsa))
1353   goto err;
1354
1355 X509_set_version(x509, 2);                              /* N+1 - version 3 */
1356 ASN1_INTEGER_set(X509_get_serialNumber(x509), 1);
1357 X509_gmtime_adj(X509_get_notBefore(x509), 0);
1358 X509_gmtime_adj(X509_get_notAfter(x509), (long)60 * 60);        /* 1 hour */
1359 X509_set_pubkey(x509, pkey);
1360
1361 name = X509_get_subject_name(x509);
1362 X509_NAME_add_entry_by_txt(name, "C",
1363                           MBSTRING_ASC, CUS "UK", -1, -1, 0);
1364 X509_NAME_add_entry_by_txt(name, "O",
1365                           MBSTRING_ASC, CUS "Exim Developers", -1, -1, 0);
1366 X509_NAME_add_entry_by_txt(name, "CN",
1367                           MBSTRING_ASC, CUS smtp_active_hostname, -1, -1, 0);
1368 X509_set_issuer_name(x509, name);
1369
1370 where = US"signing cert";
1371 if (!X509_sign(x509, pkey, EVP_md5()))
1372   goto err;
1373
1374 where = US"installing selfsign cert";
1375 if (!SSL_CTX_use_certificate(sctx, x509))
1376   goto err;
1377
1378 where = US"installing selfsign key";
1379 if (!SSL_CTX_use_PrivateKey(sctx, pkey))
1380   goto err;
1381
1382 return OK;
1383
1384 err:
1385   (void) tls_error(where, NULL, NULL, errstr);
1386   if (x509) X509_free(x509);
1387   if (pkey) EVP_PKEY_free(pkey);
1388   return DEFER;
1389 }
1390
1391
1392
1393
1394 static int
1395 tls_add_certfile(SSL_CTX * sctx, tls_ext_ctx_cb * cbinfo, uschar * file,
1396   uschar ** errstr)
1397 {
1398 DEBUG(D_tls) debug_printf("tls_certificate file %s\n", file);
1399 if (!SSL_CTX_use_certificate_chain_file(sctx, CS file))
1400   return tls_error(string_sprintf(
1401     "SSL_CTX_use_certificate_chain_file file=%s", file),
1402       cbinfo->host, NULL, errstr);
1403 return 0;
1404 }
1405
1406 static int
1407 tls_add_pkeyfile(SSL_CTX * sctx, tls_ext_ctx_cb * cbinfo, uschar * file,
1408   uschar ** errstr)
1409 {
1410 DEBUG(D_tls) debug_printf("tls_privatekey file %s\n", file);
1411 if (!SSL_CTX_use_PrivateKey_file(sctx, CS file, SSL_FILETYPE_PEM))
1412   return tls_error(string_sprintf(
1413     "SSL_CTX_use_PrivateKey_file file=%s", file), cbinfo->host, NULL, errstr);
1414 return 0;
1415 }
1416
1417
1418 /*************************************************
1419 *        Expand key and cert file specs          *
1420 *************************************************/
1421
1422 /* Called once during tls_init and possibly again during TLS setup, for a
1423 new context, if Server Name Indication was used and tls_sni was seen in
1424 the certificate string.
1425
1426 Arguments:
1427   sctx            the SSL_CTX* to update
1428   cbinfo          various parts of session state
1429   errstr          error string pointer
1430
1431 Returns:          OK/DEFER/FAIL
1432 */
1433
1434 static int
1435 tls_expand_session_files(SSL_CTX *sctx, tls_ext_ctx_cb *cbinfo,
1436   uschar ** errstr)
1437 {
1438 uschar *expanded;
1439
1440 if (!cbinfo->certificate)
1441   {
1442   if (!cbinfo->is_server)               /* client */
1443     return OK;
1444                                         /* server */
1445   if (tls_install_selfsign(sctx, errstr) != OK)
1446     return DEFER;
1447   }
1448 else
1449   {
1450   int err;
1451
1452   if (Ustrstr(cbinfo->certificate, US"tls_sni") ||
1453       Ustrstr(cbinfo->certificate, US"tls_in_sni") ||
1454       Ustrstr(cbinfo->certificate, US"tls_out_sni")
1455      )
1456     reexpand_tls_files_for_sni = TRUE;
1457
1458   if (!expand_check(cbinfo->certificate, US"tls_certificate", &expanded, errstr))
1459     return DEFER;
1460
1461   if (expanded)
1462     if (cbinfo->is_server)
1463       {
1464       const uschar * file_list = expanded;
1465       int sep = 0;
1466       uschar * file;
1467
1468       while (file = string_nextinlist(&file_list, &sep, NULL, 0))
1469         if ((err = tls_add_certfile(sctx, cbinfo, file, errstr)))
1470           return err;
1471       }
1472     else        /* would there ever be a need for multiple client certs? */
1473       if ((err = tls_add_certfile(sctx, cbinfo, expanded, errstr)))
1474         return err;
1475
1476   if (  cbinfo->privatekey
1477      && !expand_check(cbinfo->privatekey, US"tls_privatekey", &expanded, errstr))
1478     return DEFER;
1479
1480   /* If expansion was forced to fail, key_expanded will be NULL. If the result
1481   of the expansion is an empty string, ignore it also, and assume the private
1482   key is in the same file as the certificate. */
1483
1484   if (expanded && *expanded)
1485     if (cbinfo->is_server)
1486       {
1487       const uschar * file_list = expanded;
1488       int sep = 0;
1489       uschar * file;
1490
1491       while (file = string_nextinlist(&file_list, &sep, NULL, 0))
1492         if ((err = tls_add_pkeyfile(sctx, cbinfo, file, errstr)))
1493           return err;
1494       }
1495     else        /* would there ever be a need for multiple client certs? */
1496       if ((err = tls_add_pkeyfile(sctx, cbinfo, expanded, errstr)))
1497         return err;
1498   }
1499
1500 #ifndef DISABLE_OCSP
1501 if (cbinfo->is_server && cbinfo->u_ocsp.server.file)
1502   {
1503   /*XXX stack*/
1504   if (!expand_check(cbinfo->u_ocsp.server.file, US"tls_ocsp_file", &expanded, errstr))
1505     return DEFER;
1506
1507   if (expanded && *expanded)
1508     {
1509     DEBUG(D_tls) debug_printf("tls_ocsp_file %s\n", expanded);
1510     if (  cbinfo->u_ocsp.server.file_expanded
1511        && (Ustrcmp(expanded, cbinfo->u_ocsp.server.file_expanded) == 0))
1512       {
1513       DEBUG(D_tls) debug_printf(" - value unchanged, using existing values\n");
1514       }
1515     else
1516       ocsp_load_response(sctx, cbinfo, expanded);
1517     }
1518   }
1519 #endif
1520
1521 return OK;
1522 }
1523
1524
1525
1526
1527 /*************************************************
1528 *            Callback to handle SNI              *
1529 *************************************************/
1530
1531 /* Called when acting as server during the TLS session setup if a Server Name
1532 Indication extension was sent by the client.
1533
1534 API documentation is OpenSSL s_server.c implementation.
1535
1536 Arguments:
1537   s               SSL* of the current session
1538   ad              unknown (part of OpenSSL API) (unused)
1539   arg             Callback of "our" registered data
1540
1541 Returns:          SSL_TLSEXT_ERR_{OK,ALERT_WARNING,ALERT_FATAL,NOACK}
1542
1543 XXX might need to change to using ClientHello callback,
1544 per https://www.openssl.org/docs/manmaster/man3/SSL_client_hello_cb_fn.html
1545 */
1546
1547 #ifdef EXIM_HAVE_OPENSSL_TLSEXT
1548 static int
1549 tls_servername_cb(SSL *s, int *ad ARG_UNUSED, void *arg)
1550 {
1551 const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
1552 tls_ext_ctx_cb *cbinfo = (tls_ext_ctx_cb *) arg;
1553 int rc;
1554 int old_pool = store_pool;
1555 uschar * dummy_errstr;
1556
1557 if (!servername)
1558   return SSL_TLSEXT_ERR_OK;
1559
1560 DEBUG(D_tls) debug_printf("Received TLS SNI \"%s\"%s\n", servername,
1561     reexpand_tls_files_for_sni ? "" : " (unused for certificate selection)");
1562
1563 /* Make the extension value available for expansion */
1564 store_pool = POOL_PERM;
1565 tls_in.sni = string_copy(US servername);
1566 store_pool = old_pool;
1567
1568 if (!reexpand_tls_files_for_sni)
1569   return SSL_TLSEXT_ERR_OK;
1570
1571 /* Can't find an SSL_CTX_clone() or equivalent, so we do it manually;
1572 not confident that memcpy wouldn't break some internal reference counting.
1573 Especially since there's a references struct member, which would be off. */
1574
1575 #ifdef EXIM_HAVE_OPENSSL_TLS_METHOD
1576 if (!(server_sni = SSL_CTX_new(TLS_server_method())))
1577 #else
1578 if (!(server_sni = SSL_CTX_new(SSLv23_server_method())))
1579 #endif
1580   {
1581   ERR_error_string_n(ERR_get_error(), ssl_errstring, sizeof(ssl_errstring));
1582   DEBUG(D_tls) debug_printf("SSL_CTX_new() failed: %s\n", ssl_errstring);
1583   goto bad;
1584   }
1585
1586 /* Not sure how many of these are actually needed, since SSL object
1587 already exists.  Might even need this selfsame callback, for reneg? */
1588
1589 SSL_CTX_set_info_callback(server_sni, SSL_CTX_get_info_callback(server_ctx));
1590 SSL_CTX_set_mode(server_sni, SSL_CTX_get_mode(server_ctx));
1591 SSL_CTX_set_options(server_sni, SSL_CTX_get_options(server_ctx));
1592 SSL_CTX_set_timeout(server_sni, SSL_CTX_get_timeout(server_ctx));
1593 SSL_CTX_set_tlsext_servername_callback(server_sni, tls_servername_cb);
1594 SSL_CTX_set_tlsext_servername_arg(server_sni, cbinfo);
1595
1596 if (  !init_dh(server_sni, cbinfo->dhparam, NULL, &dummy_errstr)
1597    || !init_ecdh(server_sni, NULL, &dummy_errstr)
1598    )
1599   goto bad;
1600
1601 if (  cbinfo->server_cipher_list
1602    && !SSL_CTX_set_cipher_list(server_sni, CS cbinfo->server_cipher_list))
1603   goto bad;
1604
1605 #ifndef DISABLE_OCSP
1606 if (cbinfo->u_ocsp.server.file)
1607   {
1608   SSL_CTX_set_tlsext_status_cb(server_sni, tls_server_stapling_cb);
1609   SSL_CTX_set_tlsext_status_arg(server_sni, cbinfo);
1610   }
1611 #endif
1612
1613 if ((rc = setup_certs(server_sni, tls_verify_certificates, tls_crl, NULL, FALSE,
1614                       verify_callback_server, &dummy_errstr)) != OK)
1615   goto bad;
1616
1617 /* do this after setup_certs, because this can require the certs for verifying
1618 OCSP information. */
1619 if ((rc = tls_expand_session_files(server_sni, cbinfo, &dummy_errstr)) != OK)
1620   goto bad;
1621
1622 DEBUG(D_tls) debug_printf("Switching SSL context.\n");
1623 SSL_set_SSL_CTX(s, server_sni);
1624 return SSL_TLSEXT_ERR_OK;
1625
1626 bad: return SSL_TLSEXT_ERR_ALERT_FATAL;
1627 }
1628 #endif /* EXIM_HAVE_OPENSSL_TLSEXT */
1629
1630
1631
1632
1633 #ifndef DISABLE_OCSP
1634
1635 /*************************************************
1636 *        Callback to handle OCSP Stapling        *
1637 *************************************************/
1638
1639 /* Called when acting as server during the TLS session setup if the client
1640 requests OCSP information with a Certificate Status Request.
1641
1642 Documentation via openssl s_server.c and the Apache patch from the OpenSSL
1643 project.
1644
1645 */
1646
1647 static int
1648 tls_server_stapling_cb(SSL *s, void *arg)
1649 {
1650 const tls_ext_ctx_cb *cbinfo = (tls_ext_ctx_cb *) arg;
1651 uschar *response_der;   /*XXX blob */
1652 int response_der_len;
1653
1654 /*XXX stack: use SSL_get_certificate() to see which cert; from that work
1655 out which ocsp blob to send.  Unfortunately, SSL_get_certificate is known
1656 buggy in current OpenSSL; it returns the last cert loaded always rather than
1657 the one actually presented.  So we can't support a stack of OCSP proofs at
1658 this time. */
1659
1660 DEBUG(D_tls)
1661   debug_printf("Received TLS status request (OCSP stapling); %s response\n",
1662     cbinfo->u_ocsp.server.response ? "have" : "lack");
1663
1664 tls_in.ocsp = OCSP_NOT_RESP;
1665 if (!cbinfo->u_ocsp.server.response)
1666   return SSL_TLSEXT_ERR_NOACK;
1667
1668 response_der = NULL;
1669 response_der_len = i2d_OCSP_RESPONSE(cbinfo->u_ocsp.server.response,    /*XXX stack*/
1670                       &response_der);
1671 if (response_der_len <= 0)
1672   return SSL_TLSEXT_ERR_NOACK;
1673
1674 SSL_set_tlsext_status_ocsp_resp(server_ssl, response_der, response_der_len);
1675 tls_in.ocsp = OCSP_VFIED;
1676 return SSL_TLSEXT_ERR_OK;
1677 }
1678
1679
1680 static void
1681 time_print(BIO * bp, const char * str, ASN1_GENERALIZEDTIME * time)
1682 {
1683 BIO_printf(bp, "\t%s: ", str);
1684 ASN1_GENERALIZEDTIME_print(bp, time);
1685 BIO_puts(bp, "\n");
1686 }
1687
1688 static int
1689 tls_client_stapling_cb(SSL *s, void *arg)
1690 {
1691 tls_ext_ctx_cb * cbinfo = arg;
1692 const unsigned char * p;
1693 int len;
1694 OCSP_RESPONSE * rsp;
1695 OCSP_BASICRESP * bs;
1696 int i;
1697
1698 DEBUG(D_tls) debug_printf("Received TLS status response (OCSP stapling):");
1699 len = SSL_get_tlsext_status_ocsp_resp(s, &p);
1700 if(!p)
1701  {
1702   /* Expect this when we requested ocsp but got none */
1703   if (cbinfo->u_ocsp.client.verify_required && LOGGING(tls_cipher))
1704     log_write(0, LOG_MAIN, "Received TLS status callback, null content");
1705   else
1706     DEBUG(D_tls) debug_printf(" null\n");
1707   return cbinfo->u_ocsp.client.verify_required ? 0 : 1;
1708  }
1709
1710 if(!(rsp = d2i_OCSP_RESPONSE(NULL, &p, len)))
1711  {
1712   tls_out.ocsp = OCSP_FAILED;
1713   if (LOGGING(tls_cipher))
1714     log_write(0, LOG_MAIN, "Received TLS cert status response, parse error");
1715   else
1716     DEBUG(D_tls) debug_printf(" parse error\n");
1717   return 0;
1718  }
1719
1720 if(!(bs = OCSP_response_get1_basic(rsp)))
1721   {
1722   tls_out.ocsp = OCSP_FAILED;
1723   if (LOGGING(tls_cipher))
1724     log_write(0, LOG_MAIN, "Received TLS cert status response, error parsing response");
1725   else
1726     DEBUG(D_tls) debug_printf(" error parsing response\n");
1727   OCSP_RESPONSE_free(rsp);
1728   return 0;
1729   }
1730
1731 /* We'd check the nonce here if we'd put one in the request. */
1732 /* However that would defeat cacheability on the server so we don't. */
1733
1734 /* This section of code reworked from OpenSSL apps source;
1735    The OpenSSL Project retains copyright:
1736    Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
1737 */
1738   {
1739     BIO * bp = NULL;
1740     int status, reason;
1741     ASN1_GENERALIZEDTIME *rev, *thisupd, *nextupd;
1742
1743     DEBUG(D_tls) bp = BIO_new_fp(debug_file, BIO_NOCLOSE);
1744
1745     /*OCSP_RESPONSE_print(bp, rsp, 0);   extreme debug: stapling content */
1746
1747     /* Use the chain that verified the server cert to verify the stapled info */
1748     /* DEBUG(D_tls) x509_store_dump_cert_s_names(cbinfo->u_ocsp.client.verify_store); */
1749
1750     if ((i = OCSP_basic_verify(bs, cbinfo->verify_stack,
1751               cbinfo->u_ocsp.client.verify_store, 0)) <= 0)
1752       {
1753       tls_out.ocsp = OCSP_FAILED;
1754       if (LOGGING(tls_cipher)) log_write(0, LOG_MAIN,
1755               "Received TLS cert status response, itself unverifiable: %s",
1756               ERR_reason_error_string(ERR_peek_error()));
1757       BIO_printf(bp, "OCSP response verify failure\n");
1758       ERR_print_errors(bp);
1759       OCSP_RESPONSE_print(bp, rsp, 0);
1760       goto failed;
1761       }
1762
1763     BIO_printf(bp, "OCSP response well-formed and signed OK\n");
1764
1765     /*XXX So we have a good stapled OCSP status.  How do we know
1766     it is for the cert of interest?  OpenSSL 1.1.0 has a routine
1767     OCSP_resp_find_status() which matches on a cert id, which presumably
1768     we should use. Making an id needs OCSP_cert_id_new(), which takes
1769     issuerName, issuerKey, serialNumber.  Are they all in the cert?
1770
1771     For now, carry on blindly accepting the resp. */
1772
1773       {
1774       OCSP_SINGLERESP * single;
1775
1776 #ifdef EXIM_HAVE_OCSP_RESP_COUNT
1777       if (OCSP_resp_count(bs) != 1)
1778 #else
1779       STACK_OF(OCSP_SINGLERESP) * sresp = bs->tbsResponseData->responses;
1780       if (sk_OCSP_SINGLERESP_num(sresp) != 1)
1781 #endif
1782         {
1783         tls_out.ocsp = OCSP_FAILED;
1784         log_write(0, LOG_MAIN, "OCSP stapling "
1785             "with multiple responses not handled");
1786         goto failed;
1787         }
1788       single = OCSP_resp_get0(bs, 0);
1789       status = OCSP_single_get0_status(single, &reason, &rev,
1790                   &thisupd, &nextupd);
1791       }
1792
1793     DEBUG(D_tls) time_print(bp, "This OCSP Update", thisupd);
1794     DEBUG(D_tls) if(nextupd) time_print(bp, "Next OCSP Update", nextupd);
1795     if (!OCSP_check_validity(thisupd, nextupd,
1796           EXIM_OCSP_SKEW_SECONDS, EXIM_OCSP_MAX_AGE))
1797       {
1798       tls_out.ocsp = OCSP_FAILED;
1799       DEBUG(D_tls) ERR_print_errors(bp);
1800       log_write(0, LOG_MAIN, "Server OSCP dates invalid");
1801       }
1802     else
1803       {
1804       DEBUG(D_tls) BIO_printf(bp, "Certificate status: %s\n",
1805                     OCSP_cert_status_str(status));
1806       switch(status)
1807         {
1808         case V_OCSP_CERTSTATUS_GOOD:
1809           tls_out.ocsp = OCSP_VFIED;
1810           i = 1;
1811           goto good;
1812         case V_OCSP_CERTSTATUS_REVOKED:
1813           tls_out.ocsp = OCSP_FAILED;
1814           log_write(0, LOG_MAIN, "Server certificate revoked%s%s",
1815               reason != -1 ? "; reason: " : "",
1816               reason != -1 ? OCSP_crl_reason_str(reason) : "");
1817           DEBUG(D_tls) time_print(bp, "Revocation Time", rev);
1818           break;
1819         default:
1820           tls_out.ocsp = OCSP_FAILED;
1821           log_write(0, LOG_MAIN,
1822               "Server certificate status unknown, in OCSP stapling");
1823           break;
1824         }
1825       }
1826   failed:
1827     i = cbinfo->u_ocsp.client.verify_required ? 0 : 1;
1828   good:
1829     BIO_free(bp);
1830   }
1831
1832 OCSP_RESPONSE_free(rsp);
1833 return i;
1834 }
1835 #endif  /*!DISABLE_OCSP*/
1836
1837
1838 /*************************************************
1839 *            Initialize for TLS                  *
1840 *************************************************/
1841
1842 /* Called from both server and client code, to do preliminary initialization
1843 of the library.  We allocate and return a context structure.
1844
1845 Arguments:
1846   ctxp            returned SSL context
1847   host            connected host, if client; NULL if server
1848   dhparam         DH parameter file
1849   certificate     certificate file
1850   privatekey      private key
1851   ocsp_file       file of stapling info (server); flag for require ocsp (client)
1852   addr            address if client; NULL if server (for some randomness)
1853   cbp             place to put allocated callback context
1854   errstr          error string pointer
1855
1856 Returns:          OK/DEFER/FAIL
1857 */
1858
1859 static int
1860 tls_init(SSL_CTX **ctxp, host_item *host, uschar *dhparam, uschar *certificate,
1861   uschar *privatekey,
1862 #ifndef DISABLE_OCSP
1863   uschar *ocsp_file,    /*XXX stack, in server*/
1864 #endif
1865   address_item *addr, tls_ext_ctx_cb ** cbp,
1866   tls_support * tlsp,
1867   uschar ** errstr)
1868 {
1869 SSL_CTX * ctx;
1870 long init_options;
1871 int rc;
1872 tls_ext_ctx_cb * cbinfo;
1873
1874 cbinfo = store_malloc(sizeof(tls_ext_ctx_cb));
1875 cbinfo->tlsp = tlsp;
1876 cbinfo->certificate = certificate;
1877 cbinfo->privatekey = privatekey;
1878 cbinfo->is_server = host==NULL;
1879 #ifndef DISABLE_OCSP
1880 cbinfo->verify_stack = NULL;
1881 if (!host)
1882   {
1883   cbinfo->u_ocsp.server.file = ocsp_file;
1884   cbinfo->u_ocsp.server.file_expanded = NULL;
1885   cbinfo->u_ocsp.server.response = NULL;
1886   }
1887 else
1888   cbinfo->u_ocsp.client.verify_store = NULL;
1889 #endif
1890 cbinfo->dhparam = dhparam;
1891 cbinfo->server_cipher_list = NULL;
1892 cbinfo->host = host;
1893 #ifndef DISABLE_EVENT
1894 cbinfo->event_action = NULL;
1895 #endif
1896
1897 #ifdef EXIM_NEED_OPENSSL_INIT
1898 SSL_load_error_strings();          /* basic set up */
1899 OpenSSL_add_ssl_algorithms();
1900 #endif
1901
1902 #ifdef EXIM_HAVE_SHA256
1903 /* SHA256 is becoming ever more popular. This makes sure it gets added to the
1904 list of available digests. */
1905 EVP_add_digest(EVP_sha256());
1906 #endif
1907
1908 /* Create a context.
1909 The OpenSSL docs in 1.0.1b have not been updated to clarify TLS variant
1910 negotiation in the different methods; as far as I can tell, the only
1911 *_{server,client}_method which allows negotiation is SSLv23, which exists even
1912 when OpenSSL is built without SSLv2 support.
1913 By disabling with openssl_options, we can let admins re-enable with the
1914 existing knob. */
1915
1916 #ifdef EXIM_HAVE_OPENSSL_TLS_METHOD
1917 if (!(ctx = SSL_CTX_new(host ? TLS_client_method() : TLS_server_method())))
1918 #else
1919 if (!(ctx = SSL_CTX_new(host ? SSLv23_client_method() : SSLv23_server_method())))
1920 #endif
1921   return tls_error(US"SSL_CTX_new", host, NULL, errstr);
1922
1923 /* It turns out that we need to seed the random number generator this early in
1924 order to get the full complement of ciphers to work. It took me roughly a day
1925 of work to discover this by experiment.
1926
1927 On systems that have /dev/urandom, SSL may automatically seed itself from
1928 there. Otherwise, we have to make something up as best we can. Double check
1929 afterwards. */
1930
1931 if (!RAND_status())
1932   {
1933   randstuff r;
1934   gettimeofday(&r.tv, NULL);
1935   r.p = getpid();
1936
1937   RAND_seed(US (&r), sizeof(r));
1938   RAND_seed(US big_buffer, big_buffer_size);
1939   if (addr != NULL) RAND_seed(US addr, sizeof(addr));
1940
1941   if (!RAND_status())
1942     return tls_error(US"RAND_status", host,
1943       US"unable to seed random number generator", errstr);
1944   }
1945
1946 /* Set up the information callback, which outputs if debugging is at a suitable
1947 level. */
1948
1949 DEBUG(D_tls)
1950   {
1951   SSL_CTX_set_info_callback(ctx, (void (*)())info_callback);
1952 #if defined(EXIM_HAVE_OPESSL_TRACE) && !defined(OPENSSL_NO_SSL_TRACE)
1953   /* this needs a debug build of OpenSSL */
1954   SSL_CTX_set_msg_callback(ctx, (void (*)())SSL_trace);
1955 #endif
1956 #ifdef OPENSSL_HAVE_KEYLOG_CB
1957   SSL_CTX_set_keylog_callback(ctx, (void (*)())keylog_callback);
1958 #endif
1959   }
1960
1961 /* Automatically re-try reads/writes after renegotiation. */
1962 (void) SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
1963
1964 /* Apply administrator-supplied work-arounds.
1965 Historically we applied just one requested option,
1966 SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS, but when bug 994 requested a second, we
1967 moved to an administrator-controlled list of options to specify and
1968 grandfathered in the first one as the default value for "openssl_options".
1969
1970 No OpenSSL version number checks: the options we accept depend upon the
1971 availability of the option value macros from OpenSSL.  */
1972
1973 if (!tls_openssl_options_parse(openssl_options, &init_options))
1974   return tls_error(US"openssl_options parsing failed", host, NULL, errstr);
1975
1976 #ifdef EXPERIMENTAL_TLS_RESUME
1977 tlsp->resumption = RESUME_SUPPORTED;
1978 #endif
1979 if (init_options)
1980   {
1981 #ifdef EXPERIMENTAL_TLS_RESUME
1982   /* Should the server offer session resumption? */
1983   if (!host && verify_check_host(&tls_resumption_hosts) == OK)
1984     {
1985     DEBUG(D_tls) debug_printf("tls_resumption_hosts overrides openssl_options\n");
1986     init_options &= ~SSL_OP_NO_TICKET;
1987     tlsp->resumption |= RESUME_SERVER_TICKET; /* server will give ticket on request */
1988     tlsp->host_resumable = TRUE;
1989     }
1990 #endif
1991
1992   DEBUG(D_tls) debug_printf("setting SSL CTX options: %#lx\n", init_options);
1993   if (!(SSL_CTX_set_options(ctx, init_options)))
1994     return tls_error(string_sprintf(
1995           "SSL_CTX_set_option(%#lx)", init_options), host, NULL, errstr);
1996   }
1997 else
1998   DEBUG(D_tls) debug_printf("no SSL CTX options to set\n");
1999
2000 /* We'd like to disable session cache unconditionally, but foolish Outlook
2001 Express clients then give up the first TLS connection and make a second one
2002 (which works).  Only when there is an IMAP service on the same machine.
2003 Presumably OE is trying to use the cache for A on B.  Leave it enabled for
2004 now, until we work out a decent way of presenting control to the config.  It
2005 will never be used because we use a new context every time. */
2006 #ifdef notdef
2007 (void) SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
2008 #endif
2009
2010 /* Initialize with DH parameters if supplied */
2011 /* Initialize ECDH temp key parameter selection */
2012
2013 if (  !init_dh(ctx, dhparam, host, errstr)
2014    || !init_ecdh(ctx, host, errstr)
2015    )
2016   return DEFER;
2017
2018 /* Set up certificate and key (and perhaps OCSP info) */
2019
2020 if ((rc = tls_expand_session_files(ctx, cbinfo, errstr)) != OK)
2021   return rc;
2022
2023 /* If we need to handle SNI or OCSP, do so */
2024
2025 #ifdef EXIM_HAVE_OPENSSL_TLSEXT
2026 # ifndef DISABLE_OCSP
2027   if (!(cbinfo->verify_stack = sk_X509_new_null()))
2028     {
2029     DEBUG(D_tls) debug_printf("failed to create stack for stapling verify\n");
2030     return FAIL;
2031     }
2032 # endif
2033
2034 if (!host)              /* server */
2035   {
2036 # ifndef DISABLE_OCSP
2037   /* We check u_ocsp.server.file, not server.response, because we care about if
2038   the option exists, not what the current expansion might be, as SNI might
2039   change the certificate and OCSP file in use between now and the time the
2040   callback is invoked. */
2041   if (cbinfo->u_ocsp.server.file)
2042     {
2043     SSL_CTX_set_tlsext_status_cb(ctx, tls_server_stapling_cb);
2044     SSL_CTX_set_tlsext_status_arg(ctx, cbinfo);
2045     }
2046 # endif
2047   /* We always do this, so that $tls_sni is available even if not used in
2048   tls_certificate */
2049   SSL_CTX_set_tlsext_servername_callback(ctx, tls_servername_cb);
2050   SSL_CTX_set_tlsext_servername_arg(ctx, cbinfo);
2051   }
2052 # ifndef DISABLE_OCSP
2053 else                    /* client */
2054   if(ocsp_file)         /* wanting stapling */
2055     {
2056     if (!(cbinfo->u_ocsp.client.verify_store = X509_STORE_new()))
2057       {
2058       DEBUG(D_tls) debug_printf("failed to create store for stapling verify\n");
2059       return FAIL;
2060       }
2061     SSL_CTX_set_tlsext_status_cb(ctx, tls_client_stapling_cb);
2062     SSL_CTX_set_tlsext_status_arg(ctx, cbinfo);
2063     }
2064 # endif
2065 #endif
2066
2067 cbinfo->verify_cert_hostnames = NULL;
2068
2069 #ifdef EXIM_HAVE_EPHEM_RSA_KEX
2070 /* Set up the RSA callback */
2071 SSL_CTX_set_tmp_rsa_callback(ctx, rsa_callback);
2072 #endif
2073
2074 /* Finally, set the session cache timeout, and we are done.
2075 The period appears to be also used for (server-generated) session tickets */
2076
2077 SSL_CTX_set_timeout(ctx, ssl_session_timeout);
2078 DEBUG(D_tls) debug_printf("Initialized TLS\n");
2079
2080 *cbp = cbinfo;
2081 *ctxp = ctx;
2082
2083 return OK;
2084 }
2085
2086
2087
2088
2089 /*************************************************
2090 *           Get name of cipher in use            *
2091 *************************************************/
2092
2093 /*
2094 Argument:   pointer to an SSL structure for the connection
2095             pointer to number of bits for cipher
2096 Returns:    pointer to allocated string in perm-pool
2097 */
2098
2099 static uschar *
2100 construct_cipher_name(SSL * ssl, int * bits)
2101 {
2102 int pool = store_pool;
2103 /* With OpenSSL 1.0.0a, 'c' needs to be const but the documentation doesn't
2104 yet reflect that.  It should be a safe change anyway, even 0.9.8 versions have
2105 the accessor functions use const in the prototype. */
2106
2107 const uschar * ver = CUS SSL_get_version(ssl);
2108 const SSL_CIPHER * c = (const SSL_CIPHER *) SSL_get_current_cipher(ssl);
2109 uschar * s;
2110
2111 SSL_CIPHER_get_bits(c, bits);
2112
2113 store_pool = POOL_PERM;
2114 s = string_sprintf("%s:%s:%u", ver, SSL_CIPHER_get_name(c), *bits);
2115 store_pool = pool;
2116 DEBUG(D_tls) debug_printf("Cipher: %s\n", s);
2117 return s;
2118 }
2119
2120
2121 /* Get IETF-standard name for ciphersuite.
2122 Argument:   pointer to an SSL structure for the connection
2123 Returns:    pointer to string
2124 */
2125
2126 static const uschar *
2127 cipher_stdname_ssl(SSL * ssl)
2128 {
2129 #ifdef EXIM_HAVE_OPENSSL_CIPHER_STD_NAME
2130 return CUS SSL_CIPHER_standard_name(SSL_get_current_cipher(ssl));
2131 #else
2132 ushort id = 0xffff & SSL_CIPHER_get_id(SSL_get_current_cipher(ssl));
2133 return cipher_stdname(id >> 8, id & 0xff);
2134 #endif
2135 }
2136
2137
2138 static void
2139 peer_cert(SSL * ssl, tls_support * tlsp, uschar * peerdn, unsigned siz)
2140 {
2141 /*XXX we might consider a list-of-certs variable for the cert chain.
2142 SSL_get_peer_cert_chain(SSL*).  We'd need a new variable type and support
2143 in list-handling functions, also consider the difference between the entire
2144 chain and the elements sent by the peer. */
2145
2146 tlsp->peerdn = NULL;
2147
2148 /* Will have already noted peercert on a verify fail; possibly not the leaf */
2149 if (!tlsp->peercert)
2150   tlsp->peercert = SSL_get_peer_certificate(ssl);
2151 /* Beware anonymous ciphers which lead to server_cert being NULL */
2152 if (tlsp->peercert)
2153   if (!X509_NAME_oneline(X509_get_subject_name(tlsp->peercert), CS peerdn, siz))
2154     { DEBUG(D_tls) debug_printf("X509_NAME_oneline() error\n"); }
2155   else
2156     {
2157     peerdn[siz-1] = '\0';
2158     tlsp->peerdn = peerdn;              /*XXX a static buffer... */
2159     }
2160 }
2161
2162
2163
2164
2165
2166 /*************************************************
2167 *        Set up for verifying certificates       *
2168 *************************************************/
2169
2170 #ifndef DISABLE_OCSP
2171 /* Load certs from file, return TRUE on success */
2172
2173 static BOOL
2174 chain_from_pem_file(const uschar * file, STACK_OF(X509) * verify_stack)
2175 {
2176 BIO * bp;
2177 X509 * x;
2178
2179 while (sk_X509_num(verify_stack) > 0)
2180   X509_free(sk_X509_pop(verify_stack));
2181
2182 if (!(bp = BIO_new_file(CS file, "r"))) return FALSE;
2183 while ((x = PEM_read_bio_X509(bp, NULL, 0, NULL)))
2184   sk_X509_push(verify_stack, x);
2185 BIO_free(bp);
2186 return TRUE;
2187 }
2188 #endif
2189
2190
2191
2192 /* Called by both client and server startup; on the server possibly
2193 repeated after a Server Name Indication.
2194
2195 Arguments:
2196   sctx          SSL_CTX* to initialise
2197   certs         certs file or NULL
2198   crl           CRL file or NULL
2199   host          NULL in a server; the remote host in a client
2200   optional      TRUE if called from a server for a host in tls_try_verify_hosts;
2201                 otherwise passed as FALSE
2202   cert_vfy_cb   Callback function for certificate verification
2203   errstr        error string pointer
2204
2205 Returns:        OK/DEFER/FAIL
2206 */
2207
2208 static int
2209 setup_certs(SSL_CTX *sctx, uschar *certs, uschar *crl, host_item *host, BOOL optional,
2210     int (*cert_vfy_cb)(int, X509_STORE_CTX *), uschar ** errstr)
2211 {
2212 uschar *expcerts, *expcrl;
2213
2214 if (!expand_check(certs, US"tls_verify_certificates", &expcerts, errstr))
2215   return DEFER;
2216 DEBUG(D_tls) debug_printf("tls_verify_certificates: %s\n", expcerts);
2217
2218 if (expcerts && *expcerts)
2219   {
2220   /* Tell the library to use its compiled-in location for the system default
2221   CA bundle. Then add the ones specified in the config, if any. */
2222
2223   if (!SSL_CTX_set_default_verify_paths(sctx))
2224     return tls_error(US"SSL_CTX_set_default_verify_paths", host, NULL, errstr);
2225
2226   if (Ustrcmp(expcerts, "system") != 0)
2227     {
2228     struct stat statbuf;
2229
2230     if (Ustat(expcerts, &statbuf) < 0)
2231       {
2232       log_write(0, LOG_MAIN|LOG_PANIC,
2233         "failed to stat %s for certificates", expcerts);
2234       return DEFER;
2235       }
2236     else
2237       {
2238       uschar *file, *dir;
2239       if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
2240         { file = NULL; dir = expcerts; }
2241       else
2242         {
2243         file = expcerts; dir = NULL;
2244 #ifndef DISABLE_OCSP
2245         /* In the server if we will be offering an OCSP proof, load chain from
2246         file for verifying the OCSP proof at load time. */
2247
2248         if (  !host
2249            && statbuf.st_size > 0
2250            && server_static_cbinfo->u_ocsp.server.file
2251            && !chain_from_pem_file(file, server_static_cbinfo->verify_stack)
2252            )
2253           {
2254           log_write(0, LOG_MAIN|LOG_PANIC,
2255             "failed to load cert chain from %s", file);
2256           return DEFER;
2257           }
2258 #endif
2259         }
2260
2261       /* If a certificate file is empty, the next function fails with an
2262       unhelpful error message. If we skip it, we get the correct behaviour (no
2263       certificates are recognized, but the error message is still misleading (it
2264       says no certificate was supplied).  But this is better. */
2265
2266       if (  (!file || statbuf.st_size > 0)
2267          && !SSL_CTX_load_verify_locations(sctx, CS file, CS dir))
2268         return tls_error(US"SSL_CTX_load_verify_locations", host, NULL, errstr);
2269
2270       /* Load the list of CAs for which we will accept certs, for sending
2271       to the client.  This is only for the one-file tls_verify_certificates
2272       variant.
2273       If a list isn't loaded into the server, but some verify locations are set,
2274       the server end appears to make a wildcard request for client certs.
2275       Meanwhile, the client library as default behaviour *ignores* the list
2276       we send over the wire - see man SSL_CTX_set_client_cert_cb.
2277       Because of this, and that the dir variant is likely only used for
2278       the public-CA bundle (not for a private CA), not worth fixing.  */
2279
2280       if (file)
2281         {
2282         STACK_OF(X509_NAME) * names = SSL_load_client_CA_file(CS file);
2283
2284         SSL_CTX_set_client_CA_list(sctx, names);
2285         DEBUG(D_tls) debug_printf("Added %d certificate authorities.\n",
2286                                     sk_X509_NAME_num(names));
2287         }
2288       }
2289     }
2290
2291   /* Handle a certificate revocation list. */
2292
2293 #if OPENSSL_VERSION_NUMBER > 0x00907000L
2294
2295   /* This bit of code is now the version supplied by Lars Mainka. (I have
2296   merely reformatted it into the Exim code style.)
2297
2298   "From here I changed the code to add support for multiple crl's
2299   in pem format in one file or to support hashed directory entries in
2300   pem format instead of a file. This method now uses the library function
2301   X509_STORE_load_locations to add the CRL location to the SSL context.
2302   OpenSSL will then handle the verify against CA certs and CRLs by
2303   itself in the verify callback." */
2304
2305   if (!expand_check(crl, US"tls_crl", &expcrl, errstr)) return DEFER;
2306   if (expcrl && *expcrl)
2307     {
2308     struct stat statbufcrl;
2309     if (Ustat(expcrl, &statbufcrl) < 0)
2310       {
2311       log_write(0, LOG_MAIN|LOG_PANIC,
2312         "failed to stat %s for certificates revocation lists", expcrl);
2313       return DEFER;
2314       }
2315     else
2316       {
2317       /* is it a file or directory? */
2318       uschar *file, *dir;
2319       X509_STORE *cvstore = SSL_CTX_get_cert_store(sctx);
2320       if ((statbufcrl.st_mode & S_IFMT) == S_IFDIR)
2321         {
2322         file = NULL;
2323         dir = expcrl;
2324         DEBUG(D_tls) debug_printf("SSL CRL value is a directory %s\n", dir);
2325         }
2326       else
2327         {
2328         file = expcrl;
2329         dir = NULL;
2330         DEBUG(D_tls) debug_printf("SSL CRL value is a file %s\n", file);
2331         }
2332       if (X509_STORE_load_locations(cvstore, CS file, CS dir) == 0)
2333         return tls_error(US"X509_STORE_load_locations", host, NULL, errstr);
2334
2335       /* setting the flags to check against the complete crl chain */
2336
2337       X509_STORE_set_flags(cvstore,
2338         X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
2339       }
2340     }
2341
2342 #endif  /* OPENSSL_VERSION_NUMBER > 0x00907000L */
2343
2344   /* If verification is optional, don't fail if no certificate */
2345
2346   SSL_CTX_set_verify(sctx,
2347     SSL_VERIFY_PEER | (optional ? 0 : SSL_VERIFY_FAIL_IF_NO_PEER_CERT),
2348     cert_vfy_cb);
2349   }
2350
2351 return OK;
2352 }
2353
2354
2355
2356 /*************************************************
2357 *       Start a TLS session in a server          *
2358 *************************************************/
2359
2360 /* This is called when Exim is running as a server, after having received
2361 the STARTTLS command. It must respond to that command, and then negotiate
2362 a TLS session.
2363
2364 Arguments:
2365   require_ciphers   allowed ciphers
2366   errstr            pointer to error message
2367
2368 Returns:            OK on success
2369                     DEFER for errors before the start of the negotiation
2370                     FAIL for errors during the negotiation; the server can't
2371                       continue running.
2372 */
2373
2374 int
2375 tls_server_start(const uschar * require_ciphers, uschar ** errstr)
2376 {
2377 int rc;
2378 uschar * expciphers;
2379 tls_ext_ctx_cb * cbinfo;
2380 static uschar peerdn[256];
2381
2382 /* Check for previous activation */
2383
2384 if (tls_in.active.sock >= 0)
2385   {
2386   tls_error(US"STARTTLS received after TLS started", NULL, US"", errstr);
2387   smtp_printf("554 Already in TLS\r\n", FALSE);
2388   return FAIL;
2389   }
2390
2391 /* Initialize the SSL library. If it fails, it will already have logged
2392 the error. */
2393
2394 rc = tls_init(&server_ctx, NULL, tls_dhparam, tls_certificate, tls_privatekey,
2395 #ifndef DISABLE_OCSP
2396     tls_ocsp_file,      /*XXX stack*/
2397 #endif
2398     NULL, &server_static_cbinfo, &tls_in, errstr);
2399 if (rc != OK) return rc;
2400 cbinfo = server_static_cbinfo;
2401
2402 if (!expand_check(require_ciphers, US"tls_require_ciphers", &expciphers, errstr))
2403   return FAIL;
2404
2405 /* In OpenSSL, cipher components are separated by hyphens. In GnuTLS, they
2406 were historically separated by underscores. So that I can use either form in my
2407 tests, and also for general convenience, we turn underscores into hyphens here.
2408
2409 XXX SSL_CTX_set_cipher_list() is replaced by SSL_CTX_set_ciphersuites()
2410 for TLS 1.3 .  Since we do not call it at present we get the default list:
2411 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
2412 */
2413
2414 if (expciphers)
2415   {
2416   for (uschar * s = expciphers; *s; s++ ) if (*s == '_') *s = '-';
2417   DEBUG(D_tls) debug_printf("required ciphers: %s\n", expciphers);
2418   if (!SSL_CTX_set_cipher_list(server_ctx, CS expciphers))
2419     return tls_error(US"SSL_CTX_set_cipher_list", NULL, NULL, errstr);
2420   cbinfo->server_cipher_list = expciphers;
2421   }
2422
2423 /* If this is a host for which certificate verification is mandatory or
2424 optional, set up appropriately. */
2425
2426 tls_in.certificate_verified = FALSE;
2427 #ifdef SUPPORT_DANE
2428 tls_in.dane_verified = FALSE;
2429 #endif
2430 server_verify_callback_called = FALSE;
2431
2432 if (verify_check_host(&tls_verify_hosts) == OK)
2433   {
2434   rc = setup_certs(server_ctx, tls_verify_certificates, tls_crl, NULL,
2435                         FALSE, verify_callback_server, errstr);
2436   if (rc != OK) return rc;
2437   server_verify_optional = FALSE;
2438   }
2439 else if (verify_check_host(&tls_try_verify_hosts) == OK)
2440   {
2441   rc = setup_certs(server_ctx, tls_verify_certificates, tls_crl, NULL,
2442                         TRUE, verify_callback_server, errstr);
2443   if (rc != OK) return rc;
2444   server_verify_optional = TRUE;
2445   }
2446
2447 #ifdef EXPERIMENTAL_TLS_RESUME
2448 SSL_CTX_set_tlsext_ticket_key_cb(server_ctx, ticket_key_callback);
2449 /* despite working, appears to always return failure, so ignoring */
2450 #endif
2451 #ifdef OPENSSL_HAVE_NUM_TICKETS
2452 # ifdef EXPERIMENTAL_TLS_RESUME
2453 SSL_CTX_set_num_tickets(server_ctx, tls_in.host_resumable ? 1 : 0);
2454 # else
2455 SSL_CTX_set_num_tickets(server_ctx, 0); /* send no TLS1.3 stateful-tickets */
2456 # endif
2457 #endif
2458
2459
2460 /* Prepare for new connection */
2461
2462 if (!(server_ssl = SSL_new(server_ctx)))
2463   return tls_error(US"SSL_new", NULL, NULL, errstr);
2464
2465 /* Warning: we used to SSL_clear(ssl) here, it was removed.
2466  *
2467  * With the SSL_clear(), we get strange interoperability bugs with
2468  * OpenSSL 1.0.1b and TLS1.1/1.2.  It looks as though this may be a bug in
2469  * OpenSSL itself, as a clear should not lead to inability to follow protocols.
2470  *
2471  * The SSL_clear() call is to let an existing SSL* be reused, typically after
2472  * session shutdown.  In this case, we have a brand new object and there's no
2473  * obvious reason to immediately clear it.  I'm guessing that this was
2474  * originally added because of incomplete initialisation which the clear fixed,
2475  * in some historic release.
2476  */
2477
2478 /* Set context and tell client to go ahead, except in the case of TLS startup
2479 on connection, where outputting anything now upsets the clients and tends to
2480 make them disconnect. We need to have an explicit fflush() here, to force out
2481 the response. Other smtp_printf() calls do not need it, because in non-TLS
2482 mode, the fflush() happens when smtp_getc() is called. */
2483
2484 SSL_set_session_id_context(server_ssl, sid_ctx, Ustrlen(sid_ctx));
2485 if (!tls_in.on_connect)
2486   {
2487   smtp_printf("220 TLS go ahead\r\n", FALSE);
2488   fflush(smtp_out);
2489   }
2490
2491 /* Now negotiate the TLS session. We put our own timer on it, since it seems
2492 that the OpenSSL library doesn't. */
2493
2494 SSL_set_wfd(server_ssl, fileno(smtp_out));
2495 SSL_set_rfd(server_ssl, fileno(smtp_in));
2496 SSL_set_accept_state(server_ssl);
2497
2498 DEBUG(D_tls) debug_printf("Calling SSL_accept\n");
2499
2500 sigalrm_seen = FALSE;
2501 if (smtp_receive_timeout > 0) ALARM(smtp_receive_timeout);
2502 rc = SSL_accept(server_ssl);
2503 ALARM_CLR(0);
2504
2505 if (rc <= 0)
2506   {
2507   (void) tls_error(US"SSL_accept", NULL, sigalrm_seen ? US"timed out" : NULL, errstr);
2508   return FAIL;
2509   }
2510
2511 DEBUG(D_tls) debug_printf("SSL_accept was successful\n");
2512 ERR_clear_error();      /* Even success can leave errors in the stack. Seen with
2513                         anon-authentication ciphersuite negotiated. */
2514
2515 #ifdef EXPERIMENTAL_TLS_RESUME
2516 if (SSL_session_reused(server_ssl))
2517   {
2518   tls_in.resumption |= RESUME_USED;
2519   DEBUG(D_tls) debug_printf("Session reused\n");
2520   }
2521 #endif
2522
2523 /* TLS has been set up. Adjust the input functions to read via TLS,
2524 and initialize things. */
2525
2526 peer_cert(server_ssl, &tls_in, peerdn, sizeof(peerdn));
2527
2528 tls_in.cipher = construct_cipher_name(server_ssl, &tls_in.bits);
2529 tls_in.cipher_stdname = cipher_stdname_ssl(server_ssl);
2530
2531 DEBUG(D_tls)
2532   {
2533   uschar buf[2048];
2534   if (SSL_get_shared_ciphers(server_ssl, CS buf, sizeof(buf)))
2535     debug_printf("Shared ciphers: %s\n", buf);
2536
2537 #ifdef EXIM_HAVE_OPENSSL_KEYLOG
2538   {
2539   BIO * bp = BIO_new_fp(debug_file, BIO_NOCLOSE);
2540   SSL_SESSION_print_keylog(bp, SSL_get_session(server_ssl));
2541   BIO_free(bp);
2542   }
2543 #endif
2544
2545 #ifdef EXIM_HAVE_SESSION_TICKET
2546   {
2547   SSL_SESSION * ss = SSL_get_session(server_ssl);
2548   if (SSL_SESSION_has_ticket(ss))
2549     debug_printf("The session has a ticket, life %lu seconds\n",
2550       SSL_SESSION_get_ticket_lifetime_hint(ss));
2551   }
2552 #endif
2553   }
2554
2555 /* Record the certificate we presented */
2556   {
2557   X509 * crt = SSL_get_certificate(server_ssl);
2558   tls_in.ourcert = crt ? X509_dup(crt) : NULL;
2559   }
2560
2561 /* Only used by the server-side tls (tls_in), including tls_getc.
2562    Client-side (tls_out) reads (seem to?) go via
2563    smtp_read_response()/ip_recv().
2564    Hence no need to duplicate for _in and _out.
2565  */
2566 if (!ssl_xfer_buffer) ssl_xfer_buffer = store_malloc(ssl_xfer_buffer_size);
2567 ssl_xfer_buffer_lwm = ssl_xfer_buffer_hwm = 0;
2568 ssl_xfer_eof = ssl_xfer_error = FALSE;
2569
2570 receive_getc = tls_getc;
2571 receive_getbuf = tls_getbuf;
2572 receive_get_cache = tls_get_cache;
2573 receive_ungetc = tls_ungetc;
2574 receive_feof = tls_feof;
2575 receive_ferror = tls_ferror;
2576 receive_smtp_buffered = tls_smtp_buffered;
2577
2578 tls_in.active.sock = fileno(smtp_out);
2579 tls_in.active.tls_ctx = NULL;   /* not using explicit ctx for server-side */
2580 return OK;
2581 }
2582
2583
2584
2585
2586 static int
2587 tls_client_basic_ctx_init(SSL_CTX * ctx,
2588     host_item * host, smtp_transport_options_block * ob, tls_ext_ctx_cb * cbinfo,
2589     uschar ** errstr)
2590 {
2591 int rc;
2592 /* stick to the old behaviour for compatibility if tls_verify_certificates is
2593    set but both tls_verify_hosts and tls_try_verify_hosts is not set. Check only
2594    the specified host patterns if one of them is defined */
2595
2596 if (  (  !ob->tls_verify_hosts
2597       && (!ob->tls_try_verify_hosts || !*ob->tls_try_verify_hosts)
2598       )
2599    || verify_check_given_host(CUSS &ob->tls_verify_hosts, host) == OK
2600    )
2601   client_verify_optional = FALSE;
2602 else if (verify_check_given_host(CUSS &ob->tls_try_verify_hosts, host) == OK)
2603   client_verify_optional = TRUE;
2604 else
2605   return OK;
2606
2607 if ((rc = setup_certs(ctx, ob->tls_verify_certificates,
2608       ob->tls_crl, host, client_verify_optional, verify_callback_client,
2609       errstr)) != OK)
2610   return rc;
2611
2612 if (verify_check_given_host(CUSS &ob->tls_verify_cert_hostnames, host) == OK)
2613   {
2614   cbinfo->verify_cert_hostnames =
2615 #ifdef SUPPORT_I18N
2616     string_domain_utf8_to_alabel(host->name, NULL);
2617 #else
2618     host->name;
2619 #endif
2620   DEBUG(D_tls) debug_printf("Cert hostname to check: \"%s\"\n",
2621                     cbinfo->verify_cert_hostnames);
2622   }
2623 return OK;
2624 }
2625
2626
2627 #ifdef SUPPORT_DANE
2628 static int
2629 dane_tlsa_load(SSL * ssl, host_item * host, dns_answer * dnsa, uschar ** errstr)
2630 {
2631 dns_scan dnss;
2632 const char * hostnames[2] = { CS host->name, NULL };
2633 int found = 0;
2634
2635 if (DANESSL_init(ssl, NULL, hostnames) != 1)
2636   return tls_error(US"hostnames load", host, NULL, errstr);
2637
2638 for (dns_record * rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS); rr;
2639      rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)
2640     ) if (rr->type == T_TLSA && rr->size > 3)
2641   {
2642   const uschar * p = rr->data;
2643   uint8_t usage, selector, mtype;
2644   const char * mdname;
2645
2646   usage = *p++;
2647
2648   /* Only DANE-TA(2) and DANE-EE(3) are supported */
2649   if (usage != 2 && usage != 3) continue;
2650
2651   selector = *p++;
2652   mtype = *p++;
2653
2654   switch (mtype)
2655     {
2656     default: continue;  /* Only match-types 0, 1, 2 are supported */
2657     case 0:  mdname = NULL; break;
2658     case 1:  mdname = "sha256"; break;
2659     case 2:  mdname = "sha512"; break;
2660     }
2661
2662   found++;
2663   switch (DANESSL_add_tlsa(ssl, usage, selector, mdname, p, rr->size - 3))
2664     {
2665     default:
2666       return tls_error(US"tlsa load", host, NULL, errstr);
2667     case 0:     /* action not taken */
2668     case 1:     break;
2669     }
2670
2671   tls_out.tlsa_usage |= 1<<usage;
2672   }
2673
2674 if (found)
2675   return OK;
2676
2677 log_write(0, LOG_MAIN, "DANE error: No usable TLSA records");
2678 return DEFER;
2679 }
2680 #endif  /*SUPPORT_DANE*/
2681
2682
2683
2684 #ifdef EXPERIMENTAL_TLS_RESUME
2685 /* On the client, get any stashed session for the given IP from hints db
2686 and apply it to the ssl-connection for attempted resumption. */
2687
2688 static void
2689 tls_retrieve_session(tls_support * tlsp, SSL * ssl, const uschar * key)
2690 {
2691 tlsp->resumption |= RESUME_SUPPORTED;
2692 if (tlsp->host_resumable)
2693   {
2694   dbdata_tls_session * dt;
2695   int len;
2696   open_db dbblock, * dbm_file;
2697
2698   tlsp->resumption |= RESUME_CLIENT_REQUESTED;
2699   DEBUG(D_tls) debug_printf("checking for resumable session for %s\n", key);
2700   if ((dbm_file = dbfn_open(US"tls", O_RDONLY, &dbblock, FALSE, FALSE)))
2701     {
2702     /* key for the db is the IP */
2703     if ((dt = dbfn_read_with_length(dbm_file, key, &len)))
2704       {
2705       SSL_SESSION * ss = NULL;
2706       const uschar * sess_asn1 = dt->session;
2707
2708       len -= sizeof(dbdata_tls_session);
2709       if (!(d2i_SSL_SESSION(&ss, &sess_asn1, (long)len)))
2710         {
2711         DEBUG(D_tls)
2712           {
2713           ERR_error_string_n(ERR_get_error(),
2714             ssl_errstring, sizeof(ssl_errstring));
2715           debug_printf("decoding session: %s\n", ssl_errstring);
2716           }
2717         }
2718       else if (!SSL_set_session(ssl, ss))
2719         {
2720         DEBUG(D_tls)
2721           {
2722           ERR_error_string_n(ERR_get_error(),
2723             ssl_errstring, sizeof(ssl_errstring));
2724           debug_printf("applying session to ssl: %s\n", ssl_errstring);
2725           }
2726         }
2727       else
2728         {
2729         DEBUG(D_tls) debug_printf("good session\n");
2730         tlsp->resumption |= RESUME_CLIENT_SUGGESTED;
2731         }
2732       }
2733     else
2734       DEBUG(D_tls) debug_printf("no session record\n");
2735     dbfn_close(dbm_file);
2736     }
2737   }
2738 }
2739
2740
2741 /* On the client, save the session for later resumption */
2742
2743 static int
2744 tls_save_session_cb(SSL * ssl, SSL_SESSION * ss)
2745 {
2746 tls_ext_ctx_cb * cbinfo = SSL_get_ex_data(ssl, tls_exdata_idx);
2747 tls_support * tlsp;
2748
2749 DEBUG(D_tls) debug_printf("tls_save_session_cb\n");
2750
2751 if (!cbinfo || !(tlsp = cbinfo->tlsp)->host_resumable) return 0;
2752
2753 # ifdef EXIM_HAVE_SESSION_TICKET
2754
2755 if (SSL_SESSION_is_resumable(ss)) 
2756   {
2757   int len = i2d_SSL_SESSION(ss, NULL);
2758   int dlen = sizeof(dbdata_tls_session) + len;
2759   dbdata_tls_session * dt = store_get(dlen);
2760   uschar * s = dt->session;
2761   open_db dbblock, * dbm_file;
2762
2763   DEBUG(D_tls) debug_printf("session is resumable\n");
2764   tlsp->resumption |= RESUME_SERVER_TICKET;     /* server gave us a ticket */
2765
2766   len = i2d_SSL_SESSION(ss, &s);        /* s gets bumped to end */
2767
2768   if ((dbm_file = dbfn_open(US"tls", O_RDWR, &dbblock, FALSE, FALSE)))
2769     {
2770     const uschar * key = cbinfo->host->address;
2771     dbfn_delete(dbm_file, key);
2772     dbfn_write(dbm_file, key, dt, dlen);
2773     dbfn_close(dbm_file);
2774     DEBUG(D_tls) debug_printf("wrote session (len %u) to db\n",
2775                   (unsigned)dlen);
2776     }
2777   }
2778 # endif
2779 return 1;
2780 }
2781
2782
2783 static void
2784 tls_client_ctx_resume_prehandshake(
2785   exim_openssl_client_tls_ctx * exim_client_ctx, tls_support * tlsp,
2786   smtp_transport_options_block * ob, host_item * host)
2787 {
2788 /* Should the client request a session resumption ticket? */
2789 if (verify_check_given_host(CUSS &ob->tls_resumption_hosts, host) == OK)
2790   {
2791   tlsp->host_resumable = TRUE;
2792
2793   SSL_CTX_set_session_cache_mode(exim_client_ctx->ctx,
2794         SSL_SESS_CACHE_CLIENT
2795         | SSL_SESS_CACHE_NO_INTERNAL | SSL_SESS_CACHE_NO_AUTO_CLEAR);
2796   SSL_CTX_sess_set_new_cb(exim_client_ctx->ctx, tls_save_session_cb);
2797   }
2798 }
2799
2800 static BOOL
2801 tls_client_ssl_resume_prehandshake(SSL * ssl, tls_support * tlsp,
2802   host_item * host, uschar ** errstr)
2803 {
2804 if (tlsp->host_resumable)
2805   {
2806   DEBUG(D_tls)
2807     debug_printf("tls_resumption_hosts overrides openssl_options, enabling tickets\n");
2808   SSL_clear_options(ssl, SSL_OP_NO_TICKET);
2809
2810   tls_exdata_idx = SSL_get_ex_new_index(0, 0, 0, 0, 0);
2811   if (!SSL_set_ex_data(ssl, tls_exdata_idx, client_static_cbinfo))
2812     {
2813     tls_error(US"set ex_data", host, NULL, errstr);
2814     return FALSE;
2815     }
2816   debug_printf("tls_exdata_idx %d cbinfo %p\n", tls_exdata_idx, client_static_cbinfo);
2817   }
2818
2819 tlsp->resumption = RESUME_SUPPORTED;
2820 /* Pick up a previous session, saved on an old ticket */
2821 tls_retrieve_session(tlsp, ssl, host->address);
2822 return TRUE;
2823 }
2824
2825 static void
2826 tls_client_resume_posthandshake(exim_openssl_client_tls_ctx * exim_client_ctx,
2827   tls_support * tlsp)
2828 {
2829 if (SSL_session_reused(exim_client_ctx->ssl))
2830   {
2831   DEBUG(D_tls) debug_printf("The session was reused\n");
2832   tlsp->resumption |= RESUME_USED;
2833   }
2834 }
2835 #endif  /* EXPERIMENTAL_TLS_RESUME */
2836
2837
2838 /*************************************************
2839 *    Start a TLS session in a client             *
2840 *************************************************/
2841
2842 /* Called from the smtp transport after STARTTLS has been accepted.
2843
2844 Arguments:
2845   cctx          connection context
2846   conn_args     connection details
2847   cookie        datum for randomness; can be NULL
2848   tlsp          record details of TLS channel configuration here; must be non-NULL
2849   errstr        error string pointer
2850
2851 Returns:        TRUE for success with TLS session context set in connection context,
2852                 FALSE on error
2853 */
2854
2855 BOOL
2856 tls_client_start(client_conn_ctx * cctx, smtp_connect_args * conn_args,
2857   void * cookie, tls_support * tlsp, uschar ** errstr)
2858 {
2859 host_item * host = conn_args->host;             /* for msgs and option-tests */
2860 transport_instance * tb = conn_args->tblock;    /* always smtp or NULL */
2861 smtp_transport_options_block * ob = tb
2862   ? (smtp_transport_options_block *)tb->options_block
2863   : &smtp_transport_option_defaults;
2864 exim_openssl_client_tls_ctx * exim_client_ctx;
2865 uschar * expciphers;
2866 int rc;
2867 static uschar peerdn[256];
2868
2869 #ifndef DISABLE_OCSP
2870 BOOL request_ocsp = FALSE;
2871 BOOL require_ocsp = FALSE;
2872 #endif
2873
2874 rc = store_pool;
2875 store_pool = POOL_PERM;
2876 exim_client_ctx = store_get(sizeof(exim_openssl_client_tls_ctx));
2877 exim_client_ctx->corked = NULL;
2878 store_pool = rc;
2879
2880 #ifdef SUPPORT_DANE
2881 tlsp->tlsa_usage = 0;
2882 #endif
2883
2884 #ifndef DISABLE_OCSP
2885   {
2886 # ifdef SUPPORT_DANE
2887   if (  conn_args->dane
2888      && ob->hosts_request_ocsp[0] == '*'
2889      && ob->hosts_request_ocsp[1] == '\0'
2890      )
2891     {
2892     /* Unchanged from default.  Use a safer one under DANE */
2893     request_ocsp = TRUE;
2894     ob->hosts_request_ocsp = US"${if or { {= {0}{$tls_out_tlsa_usage}} "
2895                                       "   {= {4}{$tls_out_tlsa_usage}} } "
2896                                  " {*}{}}";
2897     }
2898 # endif
2899
2900   if ((require_ocsp =
2901         verify_check_given_host(CUSS &ob->hosts_require_ocsp, host) == OK))
2902     request_ocsp = TRUE;
2903   else
2904 # ifdef SUPPORT_DANE
2905     if (!request_ocsp)
2906 # endif
2907       request_ocsp =
2908         verify_check_given_host(CUSS &ob->hosts_request_ocsp, host) == OK;
2909   }
2910 #endif
2911
2912 rc = tls_init(&exim_client_ctx->ctx, host, NULL,
2913     ob->tls_certificate, ob->tls_privatekey,
2914 #ifndef DISABLE_OCSP
2915     (void *)(long)request_ocsp,
2916 #endif
2917     cookie, &client_static_cbinfo, tlsp, errstr);
2918 if (rc != OK) return FALSE;
2919
2920 tlsp->certificate_verified = FALSE;
2921 client_verify_callback_called = FALSE;
2922
2923 expciphers = NULL;
2924 #ifdef SUPPORT_DANE
2925 if (conn_args->dane)
2926   {
2927   /* We fall back to tls_require_ciphers if unset, empty or forced failure, but
2928   other failures should be treated as problems. */
2929   if (ob->dane_require_tls_ciphers &&
2930       !expand_check(ob->dane_require_tls_ciphers, US"dane_require_tls_ciphers",
2931         &expciphers, errstr))
2932     return FALSE;
2933   if (expciphers && *expciphers == '\0')
2934     expciphers = NULL;
2935   }
2936 #endif
2937 if (!expciphers &&
2938     !expand_check(ob->tls_require_ciphers, US"tls_require_ciphers",
2939       &expciphers, errstr))
2940   return FALSE;
2941
2942 /* In OpenSSL, cipher components are separated by hyphens. In GnuTLS, they
2943 are separated by underscores. So that I can use either form in my tests, and
2944 also for general convenience, we turn underscores into hyphens here. */
2945
2946 if (expciphers)
2947   {
2948   uschar *s = expciphers;
2949   while (*s) { if (*s == '_') *s = '-'; s++; }
2950   DEBUG(D_tls) debug_printf("required ciphers: %s\n", expciphers);
2951   if (!SSL_CTX_set_cipher_list(exim_client_ctx->ctx, CS expciphers))
2952     {
2953     tls_error(US"SSL_CTX_set_cipher_list", host, NULL, errstr);
2954     return FALSE;
2955     }
2956   }
2957
2958 #ifdef SUPPORT_DANE
2959 if (conn_args->dane)
2960   {
2961   SSL_CTX_set_verify(exim_client_ctx->ctx,
2962     SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
2963     verify_callback_client_dane);
2964
2965   if (!DANESSL_library_init())
2966     {
2967     tls_error(US"library init", host, NULL, errstr);
2968     return FALSE;
2969     }
2970   if (DANESSL_CTX_init(exim_client_ctx->ctx) <= 0)
2971     {
2972     tls_error(US"context init", host, NULL, errstr);
2973     return FALSE;
2974     }
2975   }
2976 else
2977
2978 #endif
2979
2980   if (tls_client_basic_ctx_init(exim_client_ctx->ctx, host, ob,
2981         client_static_cbinfo, errstr) != OK)
2982     return FALSE;
2983
2984 #ifdef EXPERIMENTAL_TLS_RESUME
2985 tls_client_ctx_resume_prehandshake(exim_client_ctx, tlsp, ob, host);
2986 #endif
2987
2988
2989 if (!(exim_client_ctx->ssl = SSL_new(exim_client_ctx->ctx)))
2990   {
2991   tls_error(US"SSL_new", host, NULL, errstr);
2992   return FALSE;
2993   }
2994 SSL_set_session_id_context(exim_client_ctx->ssl, sid_ctx, Ustrlen(sid_ctx));
2995
2996 #ifdef EXPERIMENTAL_TLS_RESUME
2997 if (!tls_client_ssl_resume_prehandshake(exim_client_ctx->ssl, tlsp, host,
2998       errstr))
2999   return FALSE;
3000 #endif
3001
3002 SSL_set_fd(exim_client_ctx->ssl, cctx->sock);
3003 SSL_set_connect_state(exim_client_ctx->ssl);
3004
3005 if (ob->tls_sni)
3006   {
3007   if (!expand_check(ob->tls_sni, US"tls_sni", &tlsp->sni, errstr))
3008     return FALSE;
3009   if (!tlsp->sni)
3010     {
3011     DEBUG(D_tls) debug_printf("Setting TLS SNI forced to fail, not sending\n");
3012     }
3013   else if (!Ustrlen(tlsp->sni))
3014     tlsp->sni = NULL;
3015   else
3016     {
3017 #ifdef EXIM_HAVE_OPENSSL_TLSEXT
3018     DEBUG(D_tls) debug_printf("Setting TLS SNI \"%s\"\n", tlsp->sni);
3019     SSL_set_tlsext_host_name(exim_client_ctx->ssl, tlsp->sni);
3020 #else
3021     log_write(0, LOG_MAIN, "SNI unusable with this OpenSSL library version; ignoring \"%s\"\n",
3022           tlsp->sni);
3023 #endif
3024     }
3025   }
3026
3027 #ifdef SUPPORT_DANE
3028 if (conn_args->dane)
3029   if (dane_tlsa_load(exim_client_ctx->ssl, host, &conn_args->tlsa_dnsa, errstr) != OK)
3030     return FALSE;
3031 #endif
3032
3033 #ifndef DISABLE_OCSP
3034 /* Request certificate status at connection-time.  If the server
3035 does OCSP stapling we will get the callback (set in tls_init()) */
3036 # ifdef SUPPORT_DANE
3037 if (request_ocsp)
3038   {
3039   const uschar * s;
3040   if (  ((s = ob->hosts_require_ocsp) && Ustrstr(s, US"tls_out_tlsa_usage"))
3041      || ((s = ob->hosts_request_ocsp) && Ustrstr(s, US"tls_out_tlsa_usage"))
3042      )
3043     {   /* Re-eval now $tls_out_tlsa_usage is populated.  If
3044         this means we avoid the OCSP request, we wasted the setup
3045         cost in tls_init(). */
3046     require_ocsp = verify_check_given_host(CUSS &ob->hosts_require_ocsp, host) == OK;
3047     request_ocsp = require_ocsp
3048       || verify_check_given_host(CUSS &ob->hosts_request_ocsp, host) == OK;
3049     }
3050   }
3051 # endif
3052
3053 if (request_ocsp)
3054   {
3055   SSL_set_tlsext_status_type(exim_client_ctx->ssl, TLSEXT_STATUSTYPE_ocsp);
3056   client_static_cbinfo->u_ocsp.client.verify_required = require_ocsp;
3057   tlsp->ocsp = OCSP_NOT_RESP;
3058   }
3059 #endif
3060
3061 #ifndef DISABLE_EVENT
3062 client_static_cbinfo->event_action = tb ? tb->event_action : NULL;
3063 #endif
3064
3065 /* There doesn't seem to be a built-in timeout on connection. */
3066
3067 DEBUG(D_tls) debug_printf("Calling SSL_connect\n");
3068 sigalrm_seen = FALSE;
3069 ALARM(ob->command_timeout);
3070 rc = SSL_connect(exim_client_ctx->ssl);
3071 ALARM_CLR(0);
3072
3073 #ifdef SUPPORT_DANE
3074 if (conn_args->dane)
3075   DANESSL_cleanup(exim_client_ctx->ssl);
3076 #endif
3077
3078 if (rc <= 0)
3079   {
3080   tls_error(US"SSL_connect", host, sigalrm_seen ? US"timed out" : NULL, errstr);
3081   return FALSE;
3082   }
3083
3084 DEBUG(D_tls)
3085   {
3086   debug_printf("SSL_connect succeeded\n");
3087 #ifdef EXIM_HAVE_OPENSSL_KEYLOG
3088   {
3089   BIO * bp = BIO_new_fp(debug_file, BIO_NOCLOSE);
3090   SSL_SESSION_print_keylog(bp, SSL_get_session(exim_client_ctx->ssl));
3091   BIO_free(bp);
3092   }
3093 #endif
3094   }
3095
3096 #ifdef EXPERIMENTAL_TLS_RESUME
3097 tls_client_resume_posthandshake(exim_client_ctx, tlsp);
3098 #endif
3099
3100 peer_cert(exim_client_ctx->ssl, tlsp, peerdn, sizeof(peerdn));
3101
3102 tlsp->cipher = construct_cipher_name(exim_client_ctx->ssl, &tlsp->bits);
3103 tlsp->cipher_stdname = cipher_stdname_ssl(exim_client_ctx->ssl);
3104
3105 /* Record the certificate we presented */
3106   {
3107   X509 * crt = SSL_get_certificate(exim_client_ctx->ssl);
3108   tlsp->ourcert = crt ? X509_dup(crt) : NULL;
3109   }
3110
3111 tlsp->active.sock = cctx->sock;
3112 tlsp->active.tls_ctx = exim_client_ctx;
3113 cctx->tls_ctx = exim_client_ctx;
3114 return TRUE;
3115 }
3116
3117
3118
3119
3120
3121 static BOOL
3122 tls_refill(unsigned lim)
3123 {
3124 int error;
3125 int inbytes;
3126
3127 DEBUG(D_tls) debug_printf("Calling SSL_read(%p, %p, %u)\n", server_ssl,
3128   ssl_xfer_buffer, ssl_xfer_buffer_size);
3129
3130 if (smtp_receive_timeout > 0) ALARM(smtp_receive_timeout);
3131 inbytes = SSL_read(server_ssl, CS ssl_xfer_buffer,
3132                   MIN(ssl_xfer_buffer_size, lim));
3133 error = SSL_get_error(server_ssl, inbytes);
3134 if (smtp_receive_timeout > 0) ALARM_CLR(0);
3135
3136 if (had_command_timeout)                /* set by signal handler */
3137   smtp_command_timeout_exit();          /* does not return */
3138 if (had_command_sigterm)
3139   smtp_command_sigterm_exit();
3140 if (had_data_timeout)
3141   smtp_data_timeout_exit();
3142 if (had_data_sigint)
3143   smtp_data_sigint_exit();
3144
3145 /* SSL_ERROR_ZERO_RETURN appears to mean that the SSL session has been
3146 closed down, not that the socket itself has been closed down. Revert to
3147 non-SSL handling. */
3148
3149 switch(error)
3150   {
3151   case SSL_ERROR_NONE:
3152     break;
3153
3154   case SSL_ERROR_ZERO_RETURN:
3155     DEBUG(D_tls) debug_printf("Got SSL_ERROR_ZERO_RETURN\n");
3156
3157     receive_getc = smtp_getc;
3158     receive_getbuf = smtp_getbuf;
3159     receive_get_cache = smtp_get_cache;
3160     receive_ungetc = smtp_ungetc;
3161     receive_feof = smtp_feof;
3162     receive_ferror = smtp_ferror;
3163     receive_smtp_buffered = smtp_buffered;
3164
3165     if (SSL_get_shutdown(server_ssl) == SSL_RECEIVED_SHUTDOWN)
3166           SSL_shutdown(server_ssl);
3167
3168 #ifndef DISABLE_OCSP
3169     sk_X509_pop_free(server_static_cbinfo->verify_stack, X509_free);
3170     server_static_cbinfo->verify_stack = NULL;
3171 #endif
3172     SSL_free(server_ssl);
3173     SSL_CTX_free(server_ctx);
3174     server_ctx = NULL;
3175     server_ssl = NULL;
3176     tls_in.active.sock = -1;
3177     tls_in.active.tls_ctx = NULL;
3178     tls_in.bits = 0;
3179     tls_in.cipher = NULL;
3180     tls_in.peerdn = NULL;
3181     tls_in.sni = NULL;
3182
3183     return FALSE;
3184
3185   /* Handle genuine errors */
3186   case SSL_ERROR_SSL:
3187     ERR_error_string_n(ERR_get_error(), ssl_errstring, sizeof(ssl_errstring));
3188     log_write(0, LOG_MAIN, "TLS error (SSL_read): %s", ssl_errstring);
3189     ssl_xfer_error = TRUE;
3190     return FALSE;
3191
3192   default:
3193     DEBUG(D_tls) debug_printf("Got SSL error %d\n", error);
3194     DEBUG(D_tls) if (error == SSL_ERROR_SYSCALL)
3195       debug_printf(" - syscall %s\n", strerror(errno));
3196     ssl_xfer_error = TRUE;
3197     return FALSE;
3198   }
3199
3200 #ifndef DISABLE_DKIM
3201 dkim_exim_verify_feed(ssl_xfer_buffer, inbytes);
3202 #endif
3203 ssl_xfer_buffer_hwm = inbytes;
3204 ssl_xfer_buffer_lwm = 0;
3205 return TRUE;
3206 }
3207
3208
3209 /*************************************************
3210 *            TLS version of getc                 *
3211 *************************************************/
3212
3213 /* This gets the next byte from the TLS input buffer. If the buffer is empty,
3214 it refills the buffer via the SSL reading function.
3215
3216 Arguments:  lim         Maximum amount to read/buffer
3217 Returns:    the next character or EOF
3218
3219 Only used by the server-side TLS.
3220 */
3221
3222 int
3223 tls_getc(unsigned lim)
3224 {
3225 if (ssl_xfer_buffer_lwm >= ssl_xfer_buffer_hwm)
3226   if (!tls_refill(lim))
3227     return ssl_xfer_error ? EOF : smtp_getc(lim);
3228
3229 /* Something in the buffer; return next uschar */
3230
3231 return ssl_xfer_buffer[ssl_xfer_buffer_lwm++];
3232 }
3233
3234 uschar *
3235 tls_getbuf(unsigned * len)
3236 {
3237 unsigned size;
3238 uschar * buf;
3239
3240 if (ssl_xfer_buffer_lwm >= ssl_xfer_buffer_hwm)
3241   if (!tls_refill(*len))
3242     {
3243     if (!ssl_xfer_error) return smtp_getbuf(len);
3244     *len = 0;
3245     return NULL;
3246     }
3247
3248 if ((size = ssl_xfer_buffer_hwm - ssl_xfer_buffer_lwm) > *len)
3249   size = *len;
3250 buf = &ssl_xfer_buffer[ssl_xfer_buffer_lwm];
3251 ssl_xfer_buffer_lwm += size;
3252 *len = size;
3253 return buf;
3254 }
3255
3256
3257 void
3258 tls_get_cache()
3259 {
3260 #ifndef DISABLE_DKIM
3261 int n = ssl_xfer_buffer_hwm - ssl_xfer_buffer_lwm;
3262 if (n > 0)
3263   dkim_exim_verify_feed(ssl_xfer_buffer+ssl_xfer_buffer_lwm, n);
3264 #endif
3265 }
3266
3267
3268 BOOL
3269 tls_could_read(void)
3270 {
3271 return ssl_xfer_buffer_lwm < ssl_xfer_buffer_hwm || SSL_pending(server_ssl) > 0;
3272 }
3273
3274
3275 /*************************************************
3276 *          Read bytes from TLS channel           *
3277 *************************************************/
3278
3279 /*
3280 Arguments:
3281   ct_ctx    client context pointer, or NULL for the one global server context
3282   buff      buffer of data
3283   len       size of buffer
3284
3285 Returns:    the number of bytes read
3286             -1 after a failed read, including EOF
3287
3288 Only used by the client-side TLS.
3289 */
3290
3291 int
3292 tls_read(void * ct_ctx, uschar *buff, size_t len)
3293 {
3294 SSL * ssl = ct_ctx ? ((exim_openssl_client_tls_ctx *)ct_ctx)->ssl : server_ssl;
3295 int inbytes;
3296 int error;
3297
3298 DEBUG(D_tls) debug_printf("Calling SSL_read(%p, %p, %u)\n", ssl,
3299   buff, (unsigned int)len);
3300
3301 inbytes = SSL_read(ssl, CS buff, len);
3302 error = SSL_get_error(ssl, inbytes);
3303
3304 if (error == SSL_ERROR_ZERO_RETURN)
3305   {
3306   DEBUG(D_tls) debug_printf("Got SSL_ERROR_ZERO_RETURN\n");
3307   return -1;
3308   }
3309 else if (error != SSL_ERROR_NONE)
3310   return -1;
3311
3312 return inbytes;
3313 }
3314
3315
3316
3317
3318
3319 /*************************************************
3320 *         Write bytes down TLS channel           *
3321 *************************************************/
3322
3323 /*
3324 Arguments:
3325   ct_ctx    client context pointer, or NULL for the one global server context
3326   buff      buffer of data
3327   len       number of bytes
3328   more      further data expected soon
3329
3330 Returns:    the number of bytes after a successful write,
3331             -1 after a failed write
3332
3333 Used by both server-side and client-side TLS.
3334 */
3335
3336 int
3337 tls_write(void * ct_ctx, const uschar *buff, size_t len, BOOL more)
3338 {
3339 size_t olen = len;
3340 int outbytes, error;
3341 SSL * ssl = ct_ctx
3342   ? ((exim_openssl_client_tls_ctx *)ct_ctx)->ssl : server_ssl;
3343 static gstring * server_corked = NULL;
3344 gstring ** corkedp = ct_ctx
3345   ? &((exim_openssl_client_tls_ctx *)ct_ctx)->corked : &server_corked;
3346 gstring * corked = *corkedp;
3347
3348 DEBUG(D_tls) debug_printf("%s(%p, %lu%s)\n", __FUNCTION__,
3349   buff, (unsigned long)len, more ? ", more" : "");
3350
3351 /* Lacking a CORK or MSG_MORE facility (such as GnuTLS has) we copy data when
3352 "more" is notified.  This hack is only ok if small amounts are involved AND only
3353 one stream does it, in one context (i.e. no store reset).  Currently it is used
3354 for the responses to the received SMTP MAIL , RCPT, DATA sequence, only.
3355 We support callouts done by the server process by using a separate client
3356 context for the stashed information. */
3357 /* + if PIPE_COMMAND, banner & ehlo-resp for smmtp-on-connect. Suspect there's
3358 a store reset there, so use POOL_PERM. */
3359 /* + if CHUNKING, cmds EHLO,MAIL,RCPT(s),BDAT */
3360
3361 if ((more || corked))
3362   {
3363 #ifdef EXPERIMENTAL_PIPE_CONNECT
3364   int save_pool = store_pool;
3365   store_pool = POOL_PERM;
3366 #endif
3367
3368   corked = string_catn(corked, buff, len);
3369
3370 #ifdef EXPERIMENTAL_PIPE_CONNECT
3371   store_pool = save_pool;
3372 #endif
3373
3374   if (more)
3375     {
3376     *corkedp = corked;
3377     return len;
3378     }
3379   buff = CUS corked->s;
3380   len = corked->ptr;
3381   *corkedp = NULL;
3382   }
3383
3384 for (int left = len; left > 0;)
3385   {
3386   DEBUG(D_tls) debug_printf("SSL_write(%p, %p, %d)\n", ssl, buff, left);
3387   outbytes = SSL_write(ssl, CS buff, left);
3388   error = SSL_get_error(ssl, outbytes);
3389   DEBUG(D_tls) debug_printf("outbytes=%d error=%d\n", outbytes, error);
3390   switch (error)
3391     {
3392     case SSL_ERROR_SSL:
3393       ERR_error_string_n(ERR_get_error(), ssl_errstring, sizeof(ssl_errstring));
3394       log_write(0, LOG_MAIN, "TLS error (SSL_write): %s", ssl_errstring);
3395       return -1;
3396
3397     case SSL_ERROR_NONE:
3398       left -= outbytes;
3399       buff += outbytes;
3400       break;
3401
3402     case SSL_ERROR_ZERO_RETURN:
3403       log_write(0, LOG_MAIN, "SSL channel closed on write");
3404       return -1;
3405
3406     case SSL_ERROR_SYSCALL:
3407       log_write(0, LOG_MAIN, "SSL_write: (from %s) syscall: %s",
3408         sender_fullhost ? sender_fullhost : US"<unknown>",
3409         strerror(errno));
3410       return -1;
3411
3412     default:
3413       log_write(0, LOG_MAIN, "SSL_write error %d", error);
3414       return -1;
3415     }
3416   }
3417 return olen;
3418 }
3419
3420
3421
3422 /*************************************************
3423 *         Close down a TLS session               *
3424 *************************************************/
3425
3426 /* This is also called from within a delivery subprocess forked from the
3427 daemon, to shut down the TLS library, without actually doing a shutdown (which
3428 would tamper with the SSL session in the parent process).
3429
3430 Arguments:
3431   ct_ctx        client TLS context pointer, or NULL for the one global server context
3432   shutdown      1 if TLS close-alert is to be sent,
3433                 2 if also response to be waited for
3434
3435 Returns:     nothing
3436
3437 Used by both server-side and client-side TLS.
3438 */
3439
3440 void
3441 tls_close(void * ct_ctx, int shutdown)
3442 {
3443 exim_openssl_client_tls_ctx * o_ctx = ct_ctx;
3444 SSL_CTX **ctxp = o_ctx ? &o_ctx->ctx : &server_ctx;
3445 SSL **sslp =     o_ctx ? &o_ctx->ssl : &server_ssl;
3446 int *fdp = o_ctx ? &tls_out.active.sock : &tls_in.active.sock;
3447
3448 if (*fdp < 0) return;  /* TLS was not active */
3449
3450 if (shutdown)
3451   {
3452   int rc;
3453   DEBUG(D_tls) debug_printf("tls_close(): shutting down TLS%s\n",
3454     shutdown > 1 ? " (with response-wait)" : "");
3455
3456   if (  (rc = SSL_shutdown(*sslp)) == 0 /* send "close notify" alert */
3457      && shutdown > 1)
3458     {
3459     ALARM(2);
3460     rc = SSL_shutdown(*sslp);           /* wait for response */
3461     ALARM_CLR(0);
3462     }
3463
3464   if (rc < 0) DEBUG(D_tls)
3465     {
3466     ERR_error_string_n(ERR_get_error(), ssl_errstring, sizeof(ssl_errstring));
3467     debug_printf("SSL_shutdown: %s\n", ssl_errstring);
3468     }
3469   }
3470
3471 #ifndef DISABLE_OCSP
3472 if (!o_ctx)             /* server side */
3473   {
3474   sk_X509_pop_free(server_static_cbinfo->verify_stack, X509_free);
3475   server_static_cbinfo->verify_stack = NULL;
3476   }
3477 #endif
3478
3479 SSL_CTX_free(*ctxp);
3480 SSL_free(*sslp);
3481 *ctxp = NULL;
3482 *sslp = NULL;
3483 *fdp = -1;
3484 }
3485
3486
3487
3488
3489 /*************************************************
3490 *  Let tls_require_ciphers be checked at startup *
3491 *************************************************/
3492
3493 /* The tls_require_ciphers option, if set, must be something which the
3494 library can parse.
3495
3496 Returns:     NULL on success, or error message
3497 */
3498
3499 uschar *
3500 tls_validate_require_cipher(void)
3501 {
3502 SSL_CTX *ctx;
3503 uschar *s, *expciphers, *err;
3504
3505 /* this duplicates from tls_init(), we need a better "init just global
3506 state, for no specific purpose" singleton function of our own */
3507
3508 #ifdef EXIM_NEED_OPENSSL_INIT
3509 SSL_load_error_strings();
3510 OpenSSL_add_ssl_algorithms();
3511 #endif
3512 #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && !defined(OPENSSL_NO_SHA256)
3513 /* SHA256 is becoming ever more popular. This makes sure it gets added to the
3514 list of available digests. */
3515 EVP_add_digest(EVP_sha256());
3516 #endif
3517
3518 if (!(tls_require_ciphers && *tls_require_ciphers))
3519   return NULL;
3520
3521 if (!expand_check(tls_require_ciphers, US"tls_require_ciphers", &expciphers,
3522                   &err))
3523   return US"failed to expand tls_require_ciphers";
3524
3525 if (!(expciphers && *expciphers))
3526   return NULL;
3527
3528 /* normalisation ripped from above */
3529 s = expciphers;
3530 while (*s != 0) { if (*s == '_') *s = '-'; s++; }
3531
3532 err = NULL;
3533
3534 #ifdef EXIM_HAVE_OPENSSL_TLS_METHOD
3535 if (!(ctx = SSL_CTX_new(TLS_server_method())))
3536 #else
3537 if (!(ctx = SSL_CTX_new(SSLv23_server_method())))
3538 #endif
3539   {
3540   ERR_error_string_n(ERR_get_error(), ssl_errstring, sizeof(ssl_errstring));
3541   return string_sprintf("SSL_CTX_new() failed: %s", ssl_errstring);
3542   }
3543
3544 DEBUG(D_tls)
3545   debug_printf("tls_require_ciphers expands to \"%s\"\n", expciphers);
3546
3547 if (!SSL_CTX_set_cipher_list(ctx, CS expciphers))
3548   {
3549   ERR_error_string_n(ERR_get_error(), ssl_errstring, sizeof(ssl_errstring));
3550   err = string_sprintf("SSL_CTX_set_cipher_list(%s) failed: %s",
3551                       expciphers, ssl_errstring);
3552   }
3553
3554 SSL_CTX_free(ctx);
3555
3556 return err;
3557 }
3558
3559
3560
3561
3562 /*************************************************
3563 *         Report the library versions.           *
3564 *************************************************/
3565
3566 /* There have historically been some issues with binary compatibility in
3567 OpenSSL libraries; if Exim (like many other applications) is built against
3568 one version of OpenSSL but the run-time linker picks up another version,
3569 it can result in serious failures, including crashing with a SIGSEGV.  So
3570 report the version found by the compiler and the run-time version.
3571
3572 Note: some OS vendors backport security fixes without changing the version
3573 number/string, and the version date remains unchanged.  The _build_ date
3574 will change, so we can more usefully assist with version diagnosis by also
3575 reporting the build date.
3576
3577 Arguments:   a FILE* to print the results to
3578 Returns:     nothing
3579 */
3580
3581 void
3582 tls_version_report(FILE *f)
3583 {
3584 fprintf(f, "Library version: OpenSSL: Compile: %s\n"
3585            "                          Runtime: %s\n"
3586            "                                 : %s\n",
3587            OPENSSL_VERSION_TEXT,
3588            SSLeay_version(SSLEAY_VERSION),
3589            SSLeay_version(SSLEAY_BUILT_ON));
3590 /* third line is 38 characters for the %s and the line is 73 chars long;
3591 the OpenSSL output includes a "built on: " prefix already. */
3592 }
3593
3594
3595
3596
3597 /*************************************************
3598 *            Random number generation            *
3599 *************************************************/
3600
3601 /* Pseudo-random number generation.  The result is not expected to be
3602 cryptographically strong but not so weak that someone will shoot themselves
3603 in the foot using it as a nonce in input in some email header scheme or
3604 whatever weirdness they'll twist this into.  The result should handle fork()
3605 and avoid repeating sequences.  OpenSSL handles that for us.
3606
3607 Arguments:
3608   max       range maximum
3609 Returns     a random number in range [0, max-1]
3610 */
3611
3612 int
3613 vaguely_random_number(int max)
3614 {
3615 unsigned int r;
3616 int i, needed_len;
3617 static pid_t pidlast = 0;
3618 pid_t pidnow;
3619 uschar smallbuf[sizeof(r)];
3620
3621 if (max <= 1)
3622   return 0;
3623
3624 pidnow = getpid();
3625 if (pidnow != pidlast)
3626   {
3627   /* Although OpenSSL documents that "OpenSSL makes sure that the PRNG state
3628   is unique for each thread", this doesn't apparently apply across processes,
3629   so our own warning from vaguely_random_number_fallback() applies here too.
3630   Fix per PostgreSQL. */
3631   if (pidlast != 0)
3632     RAND_cleanup();
3633   pidlast = pidnow;
3634   }
3635
3636 /* OpenSSL auto-seeds from /dev/random, etc, but this a double-check. */
3637 if (!RAND_status())
3638   {
3639   randstuff r;
3640   gettimeofday(&r.tv, NULL);
3641   r.p = getpid();
3642
3643   RAND_seed(US (&r), sizeof(r));
3644   }
3645 /* We're after pseudo-random, not random; if we still don't have enough data
3646 in the internal PRNG then our options are limited.  We could sleep and hope
3647 for entropy to come along (prayer technique) but if the system is so depleted
3648 in the first place then something is likely to just keep taking it.  Instead,
3649 we'll just take whatever little bit of pseudo-random we can still manage to
3650 get. */
3651
3652 needed_len = sizeof(r);
3653 /* Don't take 8 times more entropy than needed if int is 8 octets and we were
3654 asked for a number less than 10. */
3655 for (r = max, i = 0; r; ++i)
3656   r >>= 1;
3657 i = (i + 7) / 8;
3658 if (i < needed_len)
3659   needed_len = i;
3660
3661 #ifdef EXIM_HAVE_RAND_PSEUDO
3662 /* We do not care if crypto-strong */
3663 i = RAND_pseudo_bytes(smallbuf, needed_len);
3664 #else
3665 i = RAND_bytes(smallbuf, needed_len);
3666 #endif
3667
3668 if (i < 0)
3669   {
3670   DEBUG(D_all)
3671     debug_printf("OpenSSL RAND_pseudo_bytes() not supported by RAND method, using fallback.\n");
3672   return vaguely_random_number_fallback(max);
3673   }
3674
3675 r = 0;
3676 for (uschar * p = smallbuf; needed_len; --needed_len, ++p)
3677   r = 256 * r + *p;
3678
3679 /* We don't particularly care about weighted results; if someone wants
3680 smooth distribution and cares enough then they should submit a patch then. */
3681 return r % max;
3682 }
3683
3684
3685
3686
3687 /*************************************************
3688 *        OpenSSL option parse                    *
3689 *************************************************/
3690
3691 /* Parse one option for tls_openssl_options_parse below
3692
3693 Arguments:
3694   name    one option name
3695   value   place to store a value for it
3696 Returns   success or failure in parsing
3697 */
3698
3699
3700
3701 static BOOL
3702 tls_openssl_one_option_parse(uschar *name, long *value)
3703 {
3704 int first = 0;
3705 int last = exim_openssl_options_size;
3706 while (last > first)
3707   {
3708   int middle = (first + last)/2;
3709   int c = Ustrcmp(name, exim_openssl_options[middle].name);
3710   if (c == 0)
3711     {
3712     *value = exim_openssl_options[middle].value;
3713     return TRUE;
3714     }
3715   else if (c > 0)
3716     first = middle + 1;
3717   else
3718     last = middle;
3719   }
3720 return FALSE;
3721 }
3722
3723
3724
3725
3726 /*************************************************
3727 *        OpenSSL option parsing logic            *
3728 *************************************************/
3729
3730 /* OpenSSL has a number of compatibility options which an administrator might
3731 reasonably wish to set.  Interpret a list similarly to decode_bits(), so that
3732 we look like log_selector.
3733
3734 Arguments:
3735   option_spec  the administrator-supplied string of options
3736   results      ptr to long storage for the options bitmap
3737 Returns        success or failure
3738 */
3739
3740 BOOL
3741 tls_openssl_options_parse(uschar *option_spec, long *results)
3742 {
3743 long result, item;
3744 uschar *end;
3745 uschar keep_c;
3746 BOOL adding, item_parsed;
3747
3748 /* Server: send no (<= TLS1.2) session tickets */
3749 result = SSL_OP_NO_TICKET;
3750
3751 /* Prior to 4.80 we or'd in SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS; removed
3752  * from default because it increases BEAST susceptibility. */
3753 #ifdef SSL_OP_NO_SSLv2
3754 result |= SSL_OP_NO_SSLv2;
3755 #endif
3756 #ifdef SSL_OP_NO_SSLv3
3757 result |= SSL_OP_NO_SSLv3;
3758 #endif
3759 #ifdef SSL_OP_SINGLE_DH_USE
3760 result |= SSL_OP_SINGLE_DH_USE;
3761 #endif
3762
3763 if (!option_spec)
3764   {
3765   *results = result;
3766   return TRUE;
3767   }
3768
3769 for (uschar * s = option_spec; *s; /**/)
3770   {
3771   while (isspace(*s)) ++s;
3772   if (*s == '\0')
3773     break;
3774   if (*s != '+' && *s != '-')
3775     {
3776     DEBUG(D_tls) debug_printf("malformed openssl option setting: "
3777         "+ or - expected but found \"%s\"\n", s);
3778     return FALSE;
3779     }
3780   adding = *s++ == '+';
3781   for (end = s; (*end != '\0') && !isspace(*end); ++end) /**/ ;
3782   keep_c = *end;
3783   *end = '\0';
3784   item_parsed = tls_openssl_one_option_parse(s, &item);
3785   *end = keep_c;
3786   if (!item_parsed)
3787     {
3788     DEBUG(D_tls) debug_printf("openssl option setting unrecognised: \"%s\"\n", s);
3789     return FALSE;
3790     }
3791   DEBUG(D_tls) debug_printf("openssl option, %s %8lx: %lx (%s)\n",
3792       adding ? "adding to    " : "removing from", result, item, s);
3793   if (adding)
3794     result |= item;
3795   else
3796     result &= ~item;
3797   s = end;
3798   }
3799
3800 *results = result;
3801 return TRUE;
3802 }
3803
3804 #endif  /*!MACRO_PREDEF*/
3805 /* vi: aw ai sw=2
3806 */
3807 /* End of tls-openssl.c */