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