GnuTLS: Do not free the cached creds on transport connection close. Bug 2886
[exim.git] / src / src / tls-gnu.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) The Exim Maintainers 2020 - 2022 */
6 /* Copyright (c) University of Cambridge 1995 - 2018 */
7 /* Copyright (c) Phil Pennock 2012 */
8 /* See the file NOTICE for conditions of use and distribution. */
9
10 /* This file provides TLS/SSL support for Exim using the GnuTLS library,
11 one of the available supported implementations.  This file is #included into
12 tls.c when USE_GNUTLS has been set.
13
14 The code herein is a revamp of GnuTLS integration using the current APIs; the
15 original tls-gnu.c was based on a patch which was contributed by Nikos
16 Mavrogiannopoulos.  The revamp is partially a rewrite, partially cut&paste as
17 appropriate.
18
19 APIs current as of GnuTLS 2.12.18; note that the GnuTLS manual is for GnuTLS 3,
20 which is not widely deployed by OS vendors.  Will note issues below, which may
21 assist in updating the code in the future.  Another sources of hints is
22 mod_gnutls for Apache (SNI callback registration and handling).
23
24 Keeping client and server variables more split than before and is currently
25 the norm, in anticipation of TLS in ACL callouts.
26
27 I wanted to switch to gnutls_certificate_set_verify_function() so that
28 certificate rejection could happen during handshake where it belongs, rather
29 than being dropped afterwards, but that was introduced in 2.10.0 and Debian
30 (6.0.5) is still on 2.8.6.  So for now we have to stick with sub-par behaviour.
31
32 (I wasn't looking for libraries quite that old, when updating to get rid of
33 compiler warnings of deprecated APIs.  If it turns out that a lot of the rest
34 require current GnuTLS, then we'll drop support for the ancient libraries).
35 */
36
37 #include <gnutls/gnutls.h>
38 /* needed for cert checks in verification and DN extraction: */
39 #include <gnutls/x509.h>
40 /* man-page is incorrect, gnutls_rnd() is not in gnutls.h: */
41 #include <gnutls/crypto.h>
42
43 /* needed to disable PKCS11 autoload unless requested */
44 #if GNUTLS_VERSION_NUMBER >= 0x020c00
45 # include <gnutls/pkcs11.h>
46 # define SUPPORT_PARAM_TO_PK_BITS
47 #endif
48 #if GNUTLS_VERSION_NUMBER < 0x030103 && !defined(DISABLE_OCSP)
49 # warning "GnuTLS library version too old; define DISABLE_OCSP in Makefile"
50 # define DISABLE_OCSP
51 #endif
52 #if GNUTLS_VERSION_NUMBER < 0x020a00 && !defined(DISABLE_EVENT)
53 # warning "GnuTLS library version too old; tls:cert event unsupported"
54 # define DISABLE_EVENT
55 #endif
56 #if GNUTLS_VERSION_NUMBER >= 0x030000
57 # define SUPPORT_SELFSIGN       /* Uncertain what version is first usable but 2.12.23 is not */
58 #endif
59 #if GNUTLS_VERSION_NUMBER >= 0x030306
60 # define SUPPORT_CA_DIR
61 #else
62 # undef  SUPPORT_CA_DIR
63 #endif
64 #if GNUTLS_VERSION_NUMBER >= 0x030014
65 # define SUPPORT_SYSDEFAULT_CABUNDLE
66 #endif
67 #if GNUTLS_VERSION_NUMBER >= 0x030104
68 # define GNUTLS_CERT_VFY_STATUS_PRINT
69 #endif
70 #if GNUTLS_VERSION_NUMBER >= 0x030109
71 # define SUPPORT_CORK
72 #endif
73 #if GNUTLS_VERSION_NUMBER >= 0x03010a
74 # define SUPPORT_GNUTLS_SESS_DESC
75 #endif
76 #if GNUTLS_VERSION_NUMBER >= 0x030300
77 # define GNUTLS_AUTO_GLOBAL_INIT
78 # define GNUTLS_AUTO_PKCS11_MANUAL
79 #endif
80 #if (GNUTLS_VERSION_NUMBER >= 0x030404) \
81   || (GNUTLS_VERSION_NUMBER >= 0x030311) && (GNUTLS_VERSION_NUMBER & 0xffff00 == 0x030300)
82 # ifndef DISABLE_OCSP
83 #  define EXIM_HAVE_OCSP
84 # endif
85 #endif
86 #if GNUTLS_VERSION_NUMBER >= 0x030500
87 # define SUPPORT_GNUTLS_KEYLOG
88 #endif
89 #if GNUTLS_VERSION_NUMBER >= 0x030506 && !defined(DISABLE_OCSP)
90 # define SUPPORT_SRV_OCSP_STACK
91 #endif
92 #if GNUTLS_VERSION_NUMBER >= 0x030603
93 # define EXIM_HAVE_TLS1_3
94 # define SUPPORT_GNUTLS_EXT_RAW_PARSE
95 # define GNUTLS_OCSP_STATUS_REQUEST_GET2
96 #endif
97
98 #ifdef SUPPORT_DANE
99 # if GNUTLS_VERSION_NUMBER >= 0x030000
100 #  define DANESSL_USAGE_DANE_TA 2
101 #  define DANESSL_USAGE_DANE_EE 3
102 # else
103 #  error GnuTLS version too early for DANE
104 # endif
105 # if GNUTLS_VERSION_NUMBER < 0x999999
106 #  define GNUTLS_BROKEN_DANE_VALIDATION
107 # endif
108 #endif
109
110 #ifndef DISABLE_TLS_RESUME
111 # if GNUTLS_VERSION_NUMBER >= 0x030603
112 #  define EXIM_HAVE_TLS_RESUME
113 # else
114 #  warning "GnuTLS library version too old; resumption unsupported"
115 # endif
116 #endif
117
118 #if GNUTLS_VERSION_NUMBER >= 0x030200
119 # ifdef SUPPORT_GNUTLS_EXT_RAW_PARSE
120 #  define EXIM_HAVE_ALPN
121 # endif
122 #endif
123
124 #ifndef DISABLE_OCSP
125 # include <gnutls/ocsp.h>
126 #endif
127 #ifdef SUPPORT_DANE
128 # include <gnutls/dane.h>
129 #endif
130
131 #include "tls-cipher-stdname.c"
132
133
134 #ifdef MACRO_PREDEF
135 void
136 options_tls(void)
137 {
138 # ifndef DISABLE_TLS_RESUME
139 builtin_macro_create_var(US"_RESUME_DECODE", RESUME_DECODE_STRING );
140 # endif
141 # ifdef EXIM_HAVE_TLS1_3
142 builtin_macro_create(US"_HAVE_TLS1_3");
143 # endif
144 # ifdef EXIM_HAVE_OCSP
145 builtin_macro_create(US"_HAVE_TLS_OCSP");
146 # endif
147 # ifdef SUPPORT_SRV_OCSP_STACK
148 builtin_macro_create(US"_HAVE_TLS_OCSP_LIST");
149 # endif
150 #if defined(EXIM_HAVE_INOTIFY) || defined(EXIM_HAVE_KEVENT)
151 builtin_macro_create(US"_HAVE_TLS_CA_CACHE");
152 # endif
153 # ifdef EXIM_HAVE_ALPN
154 builtin_macro_create(US"_HAVE_TLS_ALPN");
155 # endif
156 }
157 #else
158
159
160 /* GnuTLS 2 vs 3
161
162 GnuTLS 3 only:
163   gnutls_global_set_audit_log_function()
164
165 Changes:
166   gnutls_certificate_verify_peers2(): is new, drop the 2 for old version
167 */
168
169 /* Local static variables for GnuTLS */
170
171 /* Values for verify_requirement */
172
173 enum peer_verify_requirement
174   { VERIFY_NONE, VERIFY_OPTIONAL, VERIFY_REQUIRED, VERIFY_DANE };
175
176 /* This holds most state for server or client; with this, we can set up an
177 outbound TLS-enabled connection in an ACL callout, while not stomping all
178 over the TLS variables available for expansion.
179
180 Some of these correspond to variables in globals.c; those variables will
181 be set to point to content in one of these instances, as appropriate for
182 the stage of the process lifetime.
183
184 Not handled here: global tlsp->tls_channelbinding.
185 */
186
187 typedef struct exim_gnutls_state {
188   gnutls_session_t      session;
189
190   exim_tlslib_state     lib_state;
191 #define x509_cred               libdata0
192 #define pri_cache               libdata1
193
194   enum peer_verify_requirement verify_requirement;
195   int                   fd_in;
196   int                   fd_out;
197
198   BOOL                  peer_cert_verified:1;
199   BOOL                  peer_dane_verified:1;
200   BOOL                  trigger_sni_changes:1;
201   BOOL                  have_set_peerdn:1;
202   BOOL                  xfer_eof:1;     /*XXX never gets set! */
203   BOOL                  xfer_error:1;
204 #ifdef SUPPORT_CORK
205   BOOL                  corked:1;
206 #endif
207
208   const struct host_item *host;         /* NULL if server */
209   gnutls_x509_crt_t     peercert;
210   uschar                *peerdn;
211   uschar                *ciphersuite;
212   uschar                *received_sni;
213
214   const uschar *tls_certificate;
215   const uschar *tls_privatekey;
216   const uschar *tls_sni; /* client send only, not received */
217   const uschar *tls_verify_certificates;
218   const uschar *tls_crl;
219   const uschar *tls_require_ciphers;
220
221   uschar *exp_tls_certificate;
222   uschar *exp_tls_privatekey;
223   uschar *exp_tls_verify_certificates;
224   uschar *exp_tls_crl;
225   uschar *exp_tls_require_ciphers;
226   const uschar *exp_tls_verify_cert_hostnames;
227 #ifndef DISABLE_EVENT
228   uschar *event_action;
229 #endif
230 #ifdef SUPPORT_DANE
231   char * const *        dane_data;
232   const int *           dane_data_len;
233 #endif
234
235   tls_support *tlsp;    /* set in tls_init() */
236
237   uschar *xfer_buffer;
238   int xfer_buffer_lwm;
239   int xfer_buffer_hwm;
240 } exim_gnutls_state_st;
241
242 static const exim_gnutls_state_st exim_gnutls_state_init = {
243   /* all elements not explicitly intialised here get 0/NULL/FALSE */
244   .fd_in =              -1,
245   .fd_out =             -1,
246 };
247
248 /* Not only do we have our own APIs which don't pass around state, assuming
249 it's held in globals, GnuTLS doesn't appear to let us register callback data
250 for callbacks, or as part of the session, so we have to keep a "this is the
251 context we're currently dealing with" pointer and rely upon being
252 single-threaded to keep from processing data on an inbound TLS connection while
253 talking to another TLS connection for an outbound check.  This does mean that
254 there's no way for heart-beats to be responded to, for the duration of the
255 second connection.
256 XXX But see gnutls_session_get_ptr()
257 */
258
259 static exim_gnutls_state_st state_server = {
260   /* all elements not explicitly intialised here get 0/NULL/FALSE */
261   .fd_in =              -1,
262   .fd_out =             -1,
263 };
264
265 /* dh_params are initialised once within the lifetime of a process using TLS;
266 if we used TLS in a long-lived daemon, we'd have to reconsider this.  But we
267 don't want to repeat this. */
268
269 static gnutls_dh_params_t dh_server_params = NULL;
270
271 static int ssl_session_timeout = 7200;  /* Two hours */
272
273 static const uschar * const exim_default_gnutls_priority = US"NORMAL";
274
275 /* Guard library core initialisation */
276
277 static BOOL exim_gnutls_base_init_done = FALSE;
278
279 #ifndef DISABLE_OCSP
280 static BOOL gnutls_buggy_ocsp = FALSE;
281 static BOOL exim_testharness_disable_ocsp_validity_check = FALSE;
282 #endif
283
284 #ifdef EXIM_HAVE_ALPN
285 static int server_seen_alpn = -1;       /* count of names */
286 #endif
287 #ifdef EXIM_HAVE_TLS_RESUME
288 static gnutls_datum_t server_sessticket_key;
289 #endif
290
291
292 /* ------------------------------------------------------------------------ */
293 /* macros */
294
295 #define MAX_HOST_LEN 255
296
297 /* Set this to control gnutls_global_set_log_level(); values 0 to 9 will setup
298 the library logging; a value less than 0 disables the calls to set up logging
299 callbacks.  GNuTLS also looks for an environment variable - except not for
300 setuid binaries, making it useless - "GNUTLS_DEBUG_LEVEL".
301 Allegedly the testscript line "GNUTLS_DEBUG_LEVEL=9 sudo exim ..." would work,
302 but the env var must be added to /etc/sudoers too. */
303 #ifndef EXIM_GNUTLS_LIBRARY_LOG_LEVEL
304 # define EXIM_GNUTLS_LIBRARY_LOG_LEVEL -1
305 #endif
306
307 #ifndef EXIM_CLIENT_DH_MIN_BITS
308 # define EXIM_CLIENT_DH_MIN_BITS 1024
309 #endif
310
311 /* With GnuTLS 2.12.x+ we have gnutls_sec_param_to_pk_bits() with which we
312 can ask for a bit-strength.  Without that, we stick to the constant we had
313 before, for now. */
314 #ifndef EXIM_SERVER_DH_BITS_PRE2_12
315 # define EXIM_SERVER_DH_BITS_PRE2_12 1024
316 #endif
317
318 #define Expand_check_tlsvar(Varname, errstr) \
319   expand_check(state->Varname, US #Varname, &state->exp_##Varname, errstr)
320
321 #if GNUTLS_VERSION_NUMBER >= 0x020c00
322 # define HAVE_GNUTLS_SESSION_CHANNEL_BINDING
323 # define HAVE_GNUTLS_SEC_PARAM_CONSTANTS
324 # define HAVE_GNUTLS_RND
325 /* The security fix we provide with the gnutls_allow_auto_pkcs11 option
326  * (4.82 PP/09) introduces a compatibility regression. The symbol simply
327  * isn't available sometimes, so this needs to become a conditional
328  * compilation; the sanest way to deal with this being a problem on
329  * older OSes is to block it in the Local/Makefile with this compiler
330  * definition  */
331 # ifndef AVOID_GNUTLS_PKCS11
332 #  define HAVE_GNUTLS_PKCS11
333 # endif /* AVOID_GNUTLS_PKCS11 */
334 #endif
335
336 #if GNUTLS_VERSION_NUMBER >= 0x030404
337 # define HAVE_GNUTLS_PRF_RFC5705
338 #endif
339
340
341
342 /* ------------------------------------------------------------------------ */
343 /* Callback declarations */
344
345 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
346 static void exim_gnutls_logger_cb(int level, const char *message);
347 #endif
348
349 static int exim_sni_handling_cb(gnutls_session_t session);
350
351 #ifdef EXIM_HAVE_TLS_RESUME
352 static int
353 tls_server_ticket_cb(gnutls_session_t sess, u_int htype, unsigned when,
354   unsigned incoming, const gnutls_datum_t * msg);
355 #endif
356
357
358 /*************************************************
359 *               Handle TLS error                 *
360 *************************************************/
361
362 /* Called from lots of places when errors occur before actually starting to do
363 the TLS handshake, that is, while the session is still in clear. Always returns
364 DEFER for a server and FAIL for a client so that most calls can use "return
365 tls_error(...)" to do this processing and then give an appropriate return. A
366 single function is used for both server and client, because it is called from
367 some shared functions.
368
369 Argument:
370   prefix    text to include in the logged error
371   msg       additional error string (may be NULL)
372             usually obtained from gnutls_strerror()
373   host      NULL if setting up a server;
374             the connected host if setting up a client
375   errstr    pointer to returned error string
376
377 Returns:    OK/DEFER/FAIL
378 */
379
380 static int
381 tls_error(const uschar *prefix, const uschar *msg, const host_item *host,
382   uschar ** errstr)
383 {
384 if (errstr)
385   *errstr = string_sprintf("(%s)%s%s", prefix, msg ? ": " : "", msg ? msg : US"");
386 return host ? FAIL : DEFER;
387 }
388
389
390 static int
391 tls_error_gnu(exim_gnutls_state_st * state, const uschar *prefix, int err,
392   uschar ** errstr)
393 {
394 return tls_error(prefix,
395   state && err == GNUTLS_E_FATAL_ALERT_RECEIVED
396   ? US gnutls_alert_get_name(gnutls_alert_get(state->session))
397   : US gnutls_strerror(err),
398   state ? state->host : NULL,
399   errstr);
400 }
401
402 static int
403 tls_error_sys(const uschar *prefix, int err, const host_item *host,
404   uschar ** errstr)
405 {
406 return tls_error(prefix, US strerror(err), host, errstr);
407 }
408
409
410 /* ------------------------------------------------------------------------ */
411 /* Initialisation */
412
413 #ifndef DISABLE_OCSP
414
415 static BOOL
416 tls_is_buggy_ocsp(void)
417 {
418 const uschar * s;
419 uschar maj, mid, mic;
420
421 s = CUS gnutls_check_version(NULL);
422 maj = atoi(CCS s);
423 if (maj == 3)
424   {
425   while (*s && *s != '.') s++;
426   mid = atoi(CCS ++s);
427   if (mid <= 2)
428     return TRUE;
429   else if (mid >= 5)
430     return FALSE;
431   else
432     {
433     while (*s && *s != '.') s++;
434     mic = atoi(CCS ++s);
435     return mic <= (mid == 3 ? 16 : 3);
436     }
437   }
438 return FALSE;
439 }
440
441 #endif
442
443
444 static int
445 tls_g_init(uschar ** errstr)
446 {
447 int rc;
448 DEBUG(D_tls) debug_printf("GnuTLS global init required\n");
449
450 #if defined(HAVE_GNUTLS_PKCS11) && !defined(GNUTLS_AUTO_PKCS11_MANUAL)
451 /* By default, gnutls_global_init will init PKCS11 support in auto mode,
452 which loads modules from a config file, which sounds good and may be wanted
453 by some sysadmin, but also means in common configurations that GNOME keyring
454 environment variables are used and so breaks for users calling mailq.
455 To prevent this, we init PKCS11 first, which is the documented approach. */
456
457 if (!gnutls_allow_auto_pkcs11)
458   if ((rc = gnutls_pkcs11_init(GNUTLS_PKCS11_FLAG_MANUAL, NULL)))
459     return tls_error_gnu(NULL, US"gnutls_pkcs11_init", rc, errstr);
460 #endif
461
462 #ifndef GNUTLS_AUTO_GLOBAL_INIT
463 if ((rc = gnutls_global_init()))
464   return tls_error_gnu(NULL, US"gnutls_global_init", rc, errstr);
465 #endif
466
467 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
468 DEBUG(D_tls)
469   {
470   gnutls_global_set_log_function(exim_gnutls_logger_cb);
471   /* arbitrarily chosen level; bump up to 9 for more */
472   gnutls_global_set_log_level(EXIM_GNUTLS_LIBRARY_LOG_LEVEL);
473   }
474 #endif
475
476 #ifndef DISABLE_OCSP
477 if (tls_ocsp_file && (gnutls_buggy_ocsp = tls_is_buggy_ocsp()))
478   log_write(0, LOG_MAIN, "OCSP unusable with this GnuTLS library version");
479 #endif
480
481 exim_gnutls_base_init_done = TRUE;
482 return OK;
483 }
484
485
486
487 /* Daemon-call before each connection.  Nothing to do for GnuTLS. */
488
489 static void
490 tls_per_lib_daemon_tick(void)
491 {
492 }
493
494 /* Daemon one-time initialisation */
495
496 static void
497 tls_per_lib_daemon_init(void)
498 {
499 uschar * dummy_errstr;
500 static BOOL once = FALSE;
501
502 if (!exim_gnutls_base_init_done)
503   tls_g_init(&dummy_errstr);
504
505 if (!once)
506   {
507   once = TRUE;
508
509 #ifdef EXIM_HAVE_TLS_RESUME
510   /* We are dependent on the GnuTLS implementation of the Session Ticket
511   encryption; both the strength and the key rotation period.  We hope that
512   the strength at least matches that of the ciphersuite (but GnuTLS does not
513   document this). */
514
515   gnutls_session_ticket_key_generate(&server_sessticket_key);   /* >= 2.10.0 */
516   if (f.running_in_test_harness) ssl_session_timeout = 6;
517 #endif
518
519   tls_daemon_creds_reload();
520   }
521 }
522
523 /* ------------------------------------------------------------------------ */
524
525 /*************************************************
526 *    Deal with logging errors during I/O         *
527 *************************************************/
528
529 /* We have to get the identity of the peer from saved data.
530
531 Argument:
532   state    the current GnuTLS exim state container
533   rc       the GnuTLS error code, or 0 if it's a local error
534   when     text identifying read or write
535   text     local error text when rc is 0
536
537 Returns:   nothing
538 */
539
540 static void
541 record_io_error(exim_gnutls_state_st *state, int rc, uschar *when, uschar *text)
542 {
543 const uschar * msg;
544 uschar * errstr;
545
546 msg = rc == GNUTLS_E_FATAL_ALERT_RECEIVED
547   ? string_sprintf("A TLS fatal alert has been received: %s",
548       US gnutls_alert_get_name(gnutls_alert_get(state->session)))
549 #ifdef GNUTLS_E_PREMATURE_TERMINATION
550   : rc == GNUTLS_E_PREMATURE_TERMINATION && errno
551   ? string_sprintf("%s: syscall: %s", US gnutls_strerror(rc), strerror(errno))
552 #endif
553   : US gnutls_strerror(rc);
554
555 (void) tls_error(when, msg, state->host, &errstr);
556
557 if (state->host)
558   log_write(0, LOG_MAIN, "H=%s [%s] TLS error on connection %s",
559     state->host->name, state->host->address, errstr);
560 else
561   {
562   uschar * conn_info = smtp_get_connection_info();
563   if (Ustrncmp(conn_info, US"SMTP ", 5) == 0) conn_info += 5;
564   /* I'd like to get separated H= here, but too hard for now */
565   log_write(0, LOG_MAIN, "TLS error on %s %s", conn_info, errstr);
566   }
567 }
568
569
570
571
572 /*************************************************
573 *        Set various Exim expansion vars         *
574 *************************************************/
575
576 #define exim_gnutls_cert_err(Label) \
577   do \
578     { \
579     if (rc != GNUTLS_E_SUCCESS) \
580       { \
581       DEBUG(D_tls) debug_printf("TLS: cert problem: %s: %s\n", \
582         (Label), gnutls_strerror(rc)); \
583       return rc; \
584       } \
585     } while (0)
586
587 static int
588 import_cert(const gnutls_datum_t * cert, gnutls_x509_crt_t * crtp)
589 {
590 int rc;
591
592 rc = gnutls_x509_crt_init(crtp);
593 exim_gnutls_cert_err(US"gnutls_x509_crt_init (crt)");
594
595 rc = gnutls_x509_crt_import(*crtp, cert, GNUTLS_X509_FMT_DER);
596 exim_gnutls_cert_err(US"failed to import certificate [gnutls_x509_crt_import(cert)]");
597
598 return rc;
599 }
600
601 #undef exim_gnutls_cert_err
602
603
604 /* We set various Exim global variables from the state, once a session has
605 been established.  With TLS callouts, may need to change this to stack
606 variables, or just re-call it with the server state after client callout
607 has finished.
608
609 Make sure anything set here is unset in tls_getc().
610
611 Sets:
612   tls_active                fd
613   tls_bits                  strength indicator
614   tls_certificate_verified  bool indicator
615   tls_channelbinding        for some SASL mechanisms
616   tls_ver                   a string
617   tls_cipher                a string
618   tls_peercert              pointer to library internal
619   tls_peerdn                a string
620   tls_sni                   a (UTF-8) string
621   tls_ourcert               pointer to library internal
622
623 Argument:
624   state      the relevant exim_gnutls_state_st *
625 */
626
627 static void
628 extract_exim_vars_from_tls_state(exim_gnutls_state_st * state)
629 {
630 tls_support * tlsp = state->tlsp;
631
632 tlsp->active.sock = state->fd_out;
633 tlsp->active.tls_ctx = state;
634
635 DEBUG(D_tls) debug_printf("cipher: %s\n", state->ciphersuite);
636
637 tlsp->certificate_verified = state->peer_cert_verified;
638 #ifdef SUPPORT_DANE
639 tlsp->dane_verified = state->peer_dane_verified;
640 #endif
641
642 /* note that tls_channelbinding is not saved to the spool file, since it's
643 only available for use for authenticators while this TLS session is running. */
644
645 tlsp->channelbinding = NULL;
646 #ifdef HAVE_GNUTLS_SESSION_CHANNEL_BINDING
647   {
648   gnutls_datum_t channel = {.data = NULL, .size = 0};
649   uschar * buf;
650   int rc;
651
652 # ifdef HAVE_GNUTLS_PRF_RFC5705
653   /* Older libraries may not have GNUTLS_TLS1_3 defined! */
654   if (gnutls_protocol_get_version(state->session) > GNUTLS_TLS1_2)
655     {
656     buf = store_get(32, state->host ? GET_TAINTED : GET_UNTAINTED);
657     rc = gnutls_prf_rfc5705(state->session,
658                                 (size_t)24,  "EXPORTER-Channel-Binding", (size_t)0, "",
659                                 32, CS buf);
660     channel.data = buf;
661     channel.size = 32;
662     }
663   else
664 # endif
665     rc = gnutls_session_channel_binding(state->session, GNUTLS_CB_TLS_UNIQUE, &channel);
666
667   if (rc)
668     { DEBUG(D_tls) debug_printf("extracting channel binding: %s\n", gnutls_strerror(rc)); }
669   else
670     {
671     int old_pool = store_pool;
672     /* Declare the taintedness of the binding info.  On server, untainted; on
673     client, tainted - being the Finish msg from the server. */
674
675     store_pool = POOL_PERM;
676     tlsp->channelbinding = b64encode_taint(CUS channel.data, (int)channel.size,
677                                             state->host ? GET_TAINTED : GET_UNTAINTED);
678     store_pool = old_pool;
679     DEBUG(D_tls) debug_printf("Have channel bindings cached for possible auth usage\n");
680     }
681   }
682 #endif
683
684 /* peercert is set in peer_status() */
685 tlsp->peerdn = state->peerdn;
686
687 /* do not corrupt sni sent by client; record sni rxd by server */
688 if (!state->host)
689   tlsp->sni = state->received_sni;
690
691 /* record our certificate */
692   {
693   const gnutls_datum_t * cert = gnutls_certificate_get_ours(state->session);
694   gnutls_x509_crt_t crt;
695
696   tlsp->ourcert = cert && import_cert(cert, &crt)==0 ? crt : NULL;
697   }
698 }
699
700
701
702
703 /*************************************************
704 *            Setup up DH parameters              *
705 *************************************************/
706
707 /* Generating the D-H parameters may take a long time. They only need to
708 be re-generated every so often, depending on security policy. What we do is to
709 keep these parameters in a file in the spool directory. If the file does not
710 exist, we generate them. This means that it is easy to cause a regeneration.
711
712 The new file is written as a temporary file and renamed, so that an incomplete
713 file is never present. If two processes both compute some new parameters, you
714 waste a bit of effort, but it doesn't seem worth messing around with locking to
715 prevent this.
716
717 Returns:     OK/DEFER/FAIL
718 */
719
720 static int
721 init_server_dh(uschar ** errstr)
722 {
723 int fd, rc;
724 unsigned int dh_bits;
725 gnutls_datum_t m;
726 uschar filename_buf[PATH_MAX];
727 uschar *filename = NULL;
728 size_t sz;
729 uschar *exp_tls_dhparam;
730 BOOL use_file_in_spool = FALSE;
731 host_item *host = NULL; /* dummy for macros */
732
733 DEBUG(D_tls) debug_printf("Initialising GnuTLS server params\n");
734
735 if ((rc = gnutls_dh_params_init(&dh_server_params)))
736   return tls_error_gnu(NULL, US"gnutls_dh_params_init", rc, errstr);
737
738 m.data = NULL;
739 m.size = 0;
740
741 if (!expand_check(tls_dhparam, US"tls_dhparam", &exp_tls_dhparam, errstr))
742   return DEFER;
743
744 if (!exp_tls_dhparam)
745   {
746   DEBUG(D_tls) debug_printf("Loading default hard-coded DH params\n");
747   m.data = US std_dh_prime_default();
748   m.size = Ustrlen(m.data);
749   }
750 else if (Ustrcmp(exp_tls_dhparam, "historic") == 0)
751   use_file_in_spool = TRUE;
752 else if (Ustrcmp(exp_tls_dhparam, "none") == 0)
753   {
754   DEBUG(D_tls) debug_printf("Requested no DH parameters\n");
755   return OK;
756   }
757 else if (exp_tls_dhparam[0] != '/')
758   {
759   if (!(m.data = US std_dh_prime_named(exp_tls_dhparam)))
760     return tls_error(US"No standard prime named", exp_tls_dhparam, NULL, errstr);
761   m.size = Ustrlen(m.data);
762   }
763 else
764   filename = exp_tls_dhparam;
765
766 if (m.data)
767   {
768   if ((rc = gnutls_dh_params_import_pkcs3(dh_server_params, &m, GNUTLS_X509_FMT_PEM)))
769     return tls_error_gnu(NULL, US"gnutls_dh_params_import_pkcs3", rc, errstr);
770   DEBUG(D_tls) debug_printf("Loaded fixed standard D-H parameters\n");
771   return OK;
772   }
773
774 #ifdef HAVE_GNUTLS_SEC_PARAM_CONSTANTS
775 /* If you change this constant, also change dh_param_fn_ext so that we can use a
776 different filename and ensure we have sufficient bits. */
777
778 if (!(dh_bits = gnutls_sec_param_to_pk_bits(GNUTLS_PK_DH, GNUTLS_SEC_PARAM_NORMAL)))
779   return tls_error(US"gnutls_sec_param_to_pk_bits() failed", NULL, NULL, errstr);
780 DEBUG(D_tls)
781   debug_printf("GnuTLS tells us that for D-H PK, NORMAL is %d bits\n",
782       dh_bits);
783 #else
784 dh_bits = EXIM_SERVER_DH_BITS_PRE2_12;
785 DEBUG(D_tls)
786   debug_printf("GnuTLS lacks gnutls_sec_param_to_pk_bits(), using %d bits\n",
787       dh_bits);
788 #endif
789
790 /* Some clients have hard-coded limits. */
791 if (dh_bits > tls_dh_max_bits)
792   {
793   DEBUG(D_tls)
794     debug_printf("tls_dh_max_bits clamping override, using %d bits instead\n",
795         tls_dh_max_bits);
796   dh_bits = tls_dh_max_bits;
797   }
798
799 if (use_file_in_spool)
800   {
801   if (!string_format(filename_buf, sizeof(filename_buf),
802         "%s/gnutls-params-%d", spool_directory, dh_bits))
803     return tls_error(US"overlong filename", NULL, NULL, errstr);
804   filename = filename_buf;
805   }
806
807 /* Open the cache file for reading and if successful, read it and set up the
808 parameters. */
809
810 if ((fd = Uopen(filename, O_RDONLY, 0)) >= 0)
811   {
812   struct stat statbuf;
813   FILE *fp;
814   int saved_errno;
815
816   if (fstat(fd, &statbuf) < 0)  /* EIO */
817     {
818     saved_errno = errno;
819     (void)close(fd);
820     return tls_error_sys(US"TLS cache stat failed", saved_errno, NULL, errstr);
821     }
822   if (!S_ISREG(statbuf.st_mode))
823     {
824     (void)close(fd);
825     return tls_error(US"TLS cache not a file", NULL, NULL, errstr);
826     }
827   if (!(fp = fdopen(fd, "rb")))
828     {
829     saved_errno = errno;
830     (void)close(fd);
831     return tls_error_sys(US"fdopen(TLS cache stat fd) failed",
832         saved_errno, NULL, errstr);
833     }
834
835   m.size = statbuf.st_size;
836   if (!(m.data = store_malloc(m.size)))
837     {
838     fclose(fp);
839     return tls_error_sys(US"malloc failed", errno, NULL, errstr);
840     }
841   if (!(sz = fread(m.data, m.size, 1, fp)))
842     {
843     saved_errno = errno;
844     fclose(fp);
845     store_free(m.data);
846     return tls_error_sys(US"fread failed", saved_errno, NULL, errstr);
847     }
848   fclose(fp);
849
850   rc = gnutls_dh_params_import_pkcs3(dh_server_params, &m, GNUTLS_X509_FMT_PEM);
851   store_free(m.data);
852   if (rc)
853     return tls_error_gnu(NULL, US"gnutls_dh_params_import_pkcs3", rc, errstr);
854   DEBUG(D_tls) debug_printf("read D-H parameters from file \"%s\"\n", filename);
855   }
856
857 /* If the file does not exist, fall through to compute new data and cache it.
858 If there was any other opening error, it is serious. */
859
860 else if (errno == ENOENT)
861   {
862   rc = -1;
863   DEBUG(D_tls)
864     debug_printf("D-H parameter cache file \"%s\" does not exist\n", filename);
865   }
866 else
867   return tls_error(string_open_failed("\"%s\" for reading", filename),
868       NULL, NULL, errstr);
869
870 /* If ret < 0, either the cache file does not exist, or the data it contains
871 is not useful. One particular case of this is when upgrading from an older
872 release of Exim in which the data was stored in a different format. We don't
873 try to be clever and support both formats; we just regenerate new data in this
874 case. */
875
876 if (rc < 0)
877   {
878   uschar *temp_fn;
879   unsigned int dh_bits_gen = dh_bits;
880
881   if ((PATH_MAX - Ustrlen(filename)) < 10)
882     return tls_error(US"Filename too long to generate replacement",
883         filename, NULL, errstr);
884
885   temp_fn = string_copy(US"exim-dh.XXXXXXX");
886   if ((fd = mkstemp(CS temp_fn)) < 0)   /* modifies temp_fn */
887     return tls_error_sys(US"Unable to open temp file", errno, NULL, errstr);
888   (void)exim_chown(temp_fn, exim_uid, exim_gid);   /* Probably not necessary */
889
890   /* GnuTLS overshoots!
891    * If we ask for 2236, we might get 2237 or more.
892    * But there's no way to ask GnuTLS how many bits there really are.
893    * We can ask how many bits were used in a TLS session, but that's it!
894    * The prime itself is hidden behind too much abstraction.
895    * So we ask for less, and proceed on a wing and a prayer.
896    * First attempt, subtracted 3 for 2233 and got 2240.
897    */
898   if (dh_bits >= EXIM_CLIENT_DH_MIN_BITS + 10)
899     {
900     dh_bits_gen = dh_bits - 10;
901     DEBUG(D_tls)
902       debug_printf("being paranoid about DH generation, make it '%d' bits'\n",
903           dh_bits_gen);
904     }
905
906   DEBUG(D_tls)
907     debug_printf("requesting generation of %d bit Diffie-Hellman prime ...\n",
908         dh_bits_gen);
909   if ((rc = gnutls_dh_params_generate2(dh_server_params, dh_bits_gen)))
910     return tls_error_gnu(NULL, US"gnutls_dh_params_generate2", rc, errstr);
911
912   /* gnutls_dh_params_export_pkcs3() will tell us the exact size, every time,
913   and I confirmed that a NULL call to get the size first is how the GnuTLS
914   sample apps handle this. */
915
916   sz = 0;
917   m.data = NULL;
918   if (  (rc = gnutls_dh_params_export_pkcs3(dh_server_params,
919                 GNUTLS_X509_FMT_PEM, m.data, &sz))
920      && rc != GNUTLS_E_SHORT_MEMORY_BUFFER)
921     return tls_error_gnu(NULL, US"gnutls_dh_params_export_pkcs3(NULL) sizing",
922               rc, errstr);
923   m.size = sz;
924   if (!(m.data = store_malloc(m.size)))
925     return tls_error_sys(US"memory allocation failed", errno, NULL, errstr);
926
927   /* this will return a size 1 less than the allocation size above */
928   if ((rc = gnutls_dh_params_export_pkcs3(dh_server_params, GNUTLS_X509_FMT_PEM,
929       m.data, &sz)))
930     {
931     store_free(m.data);
932     return tls_error_gnu(NULL, US"gnutls_dh_params_export_pkcs3() real", rc, errstr);
933     }
934   m.size = sz; /* shrink by 1, probably */
935
936   if ((sz = write_to_fd_buf(fd, m.data, (size_t) m.size)) != m.size)
937     {
938     store_free(m.data);
939     return tls_error_sys(US"TLS cache write D-H params failed",
940         errno, NULL, errstr);
941     }
942   store_free(m.data);
943   if ((sz = write_to_fd_buf(fd, US"\n", 1)) != 1)
944     return tls_error_sys(US"TLS cache write D-H params final newline failed",
945         errno, NULL, errstr);
946
947   if ((rc = close(fd)))
948     return tls_error_sys(US"TLS cache write close() failed", errno, NULL, errstr);
949
950   if (Urename(temp_fn, filename) < 0)
951     return tls_error_sys(string_sprintf("failed to rename \"%s\" as \"%s\"",
952           temp_fn, filename), errno, NULL, errstr);
953
954   DEBUG(D_tls) debug_printf("wrote D-H parameters to file \"%s\"\n", filename);
955   }
956
957 DEBUG(D_tls) debug_printf("initialized server D-H parameters\n");
958 return OK;
959 }
960
961
962
963
964 /* Create and install a selfsigned certificate, for use in server mode. */
965
966 static int
967 tls_install_selfsign(exim_gnutls_state_st * state, uschar ** errstr)
968 {
969 gnutls_x509_crt_t cert = NULL;
970 time_t now;
971 gnutls_x509_privkey_t pkey = NULL;
972 const uschar * where;
973 int rc;
974
975 #ifndef SUPPORT_SELFSIGN
976 where = US"library too old";
977 rc = GNUTLS_E_NO_CERTIFICATE_FOUND;
978 if (TRUE) goto err;
979 #endif
980
981 DEBUG(D_tls) debug_printf("TLS: generating selfsigned server cert\n");
982 where = US"initialising pkey";
983 if ((rc = gnutls_x509_privkey_init(&pkey))) goto err;
984
985 where = US"initialising cert";
986 if ((rc = gnutls_x509_crt_init(&cert))) goto err;
987
988 where = US"generating pkey";    /* Hangs on 2.12.23 */
989 if ((rc = gnutls_x509_privkey_generate(pkey, GNUTLS_PK_RSA,
990 #ifdef SUPPORT_PARAM_TO_PK_BITS
991 # ifndef GNUTLS_SEC_PARAM_MEDIUM
992 #  define GNUTLS_SEC_PARAM_MEDIUM GNUTLS_SEC_PARAM_HIGH
993 # endif
994             gnutls_sec_param_to_pk_bits(GNUTLS_PK_RSA, GNUTLS_SEC_PARAM_MEDIUM),
995 #else
996             2048,
997 #endif
998             0)))
999   goto err;
1000
1001 where = US"configuring cert";
1002 now = 1;
1003 if (  (rc = gnutls_x509_crt_set_version(cert, 3))
1004    || (rc = gnutls_x509_crt_set_serial(cert, &now, sizeof(now)))
1005    || (rc = gnutls_x509_crt_set_activation_time(cert, now = time(NULL)))
1006    || (rc = gnutls_x509_crt_set_expiration_time(cert, (long)2 * 60 * 60))       /* 2 hour */
1007    || (rc = gnutls_x509_crt_set_key(cert, pkey))
1008
1009    || (rc = gnutls_x509_crt_set_dn_by_oid(cert,
1010               GNUTLS_OID_X520_COUNTRY_NAME, 0, "UK", 2))
1011    || (rc = gnutls_x509_crt_set_dn_by_oid(cert,
1012               GNUTLS_OID_X520_ORGANIZATION_NAME, 0, "Exim Developers", 15))
1013    || (rc = gnutls_x509_crt_set_dn_by_oid(cert,
1014               GNUTLS_OID_X520_COMMON_NAME, 0,
1015               smtp_active_hostname, Ustrlen(smtp_active_hostname)))
1016    )
1017   goto err;
1018
1019 where = US"signing cert";
1020 if ((rc = gnutls_x509_crt_sign(cert, cert, pkey))) goto err;
1021
1022 where = US"installing selfsign cert";
1023                                         /* Since: 2.4.0 */
1024 if ((rc = gnutls_certificate_set_x509_key(state->lib_state.x509_cred,
1025     &cert, 1, pkey)))
1026   goto err;
1027
1028 rc = OK;
1029
1030 out:
1031   if (cert) gnutls_x509_crt_deinit(cert);
1032   if (pkey) gnutls_x509_privkey_deinit(pkey);
1033   return rc;
1034
1035 err:
1036   rc = tls_error_gnu(state, where, rc, errstr);
1037   goto out;
1038 }
1039
1040
1041
1042
1043 /* Add certificate and key, from files.
1044
1045 Return:
1046   Zero or negative: good.  Negate value for certificate index if < 0.
1047   Greater than zero: FAIL or DEFER code.
1048 */
1049
1050 static int
1051 tls_add_certfile(exim_gnutls_state_st * state, const host_item * host,
1052   const uschar * certfile, const uschar * keyfile, uschar ** errstr)
1053 {
1054 int rc = gnutls_certificate_set_x509_key_file(state->lib_state.x509_cred,
1055     CCS certfile, CCS keyfile, GNUTLS_X509_FMT_PEM);
1056 if (rc < 0)
1057   return tls_error_gnu(state,
1058     string_sprintf("cert/key setup: cert=%s key=%s", certfile, keyfile),
1059     rc, errstr);
1060 return -rc;
1061 }
1062
1063
1064 #if !defined(DISABLE_OCSP) && !defined(SUPPORT_GNUTLS_EXT_RAW_PARSE)
1065 /* Load an OCSP proof from file for sending by the server.  Called
1066 on getting a status-request handshake message, for earlier versions
1067 of GnuTLS. */
1068
1069 static int
1070 server_ocsp_stapling_cb(gnutls_session_t session, void * ptr,
1071   gnutls_datum_t * ocsp_response)
1072 {
1073 int ret;
1074 DEBUG(D_tls) debug_printf("OCSP stapling callback: %s\n", US ptr);
1075
1076 if ((ret = gnutls_load_file(ptr, ocsp_response)) < 0)
1077   {
1078   DEBUG(D_tls) debug_printf("Failed to load ocsp stapling file %s\n",
1079                               CS ptr);
1080   tls_in.ocsp = OCSP_NOT_RESP;
1081   return GNUTLS_E_NO_CERTIFICATE_STATUS;
1082   }
1083
1084 tls_in.ocsp = OCSP_VFY_NOT_TRIED;
1085 return 0;
1086 }
1087 #endif
1088
1089
1090 #ifdef SUPPORT_GNUTLS_EXT_RAW_PARSE
1091 /* Make a note that we saw a status-request */
1092 static int
1093 tls_server_clienthello_ext(void * ctx, unsigned tls_id,
1094   const uschar * data, unsigned size)
1095 {
1096 /* The values for tls_id are documented here:
1097 https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml */
1098 switch (tls_id)
1099   {
1100   case 5:       /* Status Request */
1101     DEBUG(D_tls) debug_printf("Seen status_request extension from client\n");
1102     tls_in.ocsp = OCSP_NOT_RESP;
1103     break;
1104 #ifdef EXIM_HAVE_ALPN
1105   case 16:      /* Application Layer Protocol Notification */
1106     /* The format of "data" here doesn't seem to be documented, but appears
1107     to be a 2-byte field with a (redundant, given the "size" arg) total length
1108     then a sequence of one-byte size then string (not nul-term) names.  The
1109     latter is as described in OpenSSL documentation. */
1110
1111     DEBUG(D_tls) debug_printf("Seen ALPN extension from client (s=%u):", size);
1112     for (const uschar * s = data+2; s-data < size-1; s += *s + 1)
1113       {
1114       server_seen_alpn++;
1115       DEBUG(D_tls) debug_printf(" '%.*s'", (int)*s, s+1);
1116       }
1117     DEBUG(D_tls) debug_printf("\n");
1118     if (server_seen_alpn > 1)
1119       {
1120       DEBUG(D_tls) debug_printf("TLS: too many ALPNs presented in handshake\n");
1121       return GNUTLS_E_NO_APPLICATION_PROTOCOL;
1122       }
1123     break;
1124 #endif
1125   }
1126 return 0;
1127 }
1128
1129 /* Callback for client-hello, on server, if we think we might serve stapled-OCSP */
1130 static int
1131 tls_server_clienthello_cb(gnutls_session_t session, unsigned int htype,
1132   unsigned when, unsigned int incoming, const gnutls_datum_t * msg)
1133 {
1134 /* Call fn for each extension seen.  3.6.3 onwards */
1135 return gnutls_ext_raw_parse(NULL, tls_server_clienthello_ext, msg,
1136                            GNUTLS_EXT_RAW_FLAG_TLS_CLIENT_HELLO);
1137 }
1138
1139
1140 # ifdef notdef_crashes
1141 /* Make a note that we saw a status-response */
1142 static int
1143 tls_server_servercerts_ext(void * ctx, unsigned tls_id,
1144   const unsigned char *data, unsigned size)
1145 {
1146 /* debug_printf("%s %u\n", __FUNCTION__, tls_id); */
1147 /* https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml */
1148 if (FALSE && tls_id == 5)       /* status_request */
1149   {
1150   DEBUG(D_tls) debug_printf("Seen status_request extension\n");
1151   tls_in.ocsp = exim_testharness_disable_ocsp_validity_check
1152     ? OCSP_VFY_NOT_TRIED : OCSP_VFIED;  /* We know that GnuTLS verifies responses */
1153   }
1154 return 0;
1155 }
1156 # endif
1157
1158 /* Callback for certificates packet, on server, if we think we might serve stapled-OCSP */
1159 static int
1160 tls_server_servercerts_cb(gnutls_session_t session, unsigned int htype,
1161   unsigned when, unsigned int incoming, const gnutls_datum_t * msg)
1162 {
1163 /* Call fn for each extension seen.  3.6.3 onwards */
1164 # ifdef notdef_crashes
1165                                 /*XXX crashes */
1166 return gnutls_ext_raw_parse(NULL, tls_server_servercerts_ext, msg, 0);
1167 # endif
1168 }
1169 #endif /*SUPPORT_GNUTLS_EXT_RAW_PARSE*/
1170
1171 /*XXX in tls1.3 the cert-status travel as an extension next to the cert, in the
1172  "Handshake Protocol: Certificate" record.
1173 So we need to spot the Certificate handshake message, parse it and spot any status_request extension(s)
1174
1175 This is different to tls1.2 - where it is a separate record (wireshark term) / handshake message (gnutls term).
1176 */
1177
1178 #if defined(EXIM_HAVE_TLS_RESUME) || defined(SUPPORT_GNUTLS_EXT_RAW_PARSE)
1179 /* Callback for certificate-status, on server. We sent stapled OCSP. */
1180 static int
1181 tls_server_certstatus_cb(gnutls_session_t session, unsigned int htype,
1182   unsigned when, unsigned int incoming, const gnutls_datum_t * msg)
1183 {
1184 DEBUG(D_tls) debug_printf("Sending certificate-status\n");              /*XXX we get this for tls1.2 but not for 1.3 */
1185 # ifdef SUPPORT_SRV_OCSP_STACK
1186 tls_in.ocsp = exim_testharness_disable_ocsp_validity_check
1187   ? OCSP_VFY_NOT_TRIED : OCSP_VFIED;    /* We know that GnuTLS verifies responses */
1188 # else
1189 tls_in.ocsp = OCSP_VFY_NOT_TRIED;
1190 # endif
1191 return 0;
1192 }
1193
1194 /* Callback for handshake messages, on server */
1195 static int
1196 tls_server_hook_cb(gnutls_session_t sess, u_int htype, unsigned when,
1197   unsigned incoming, const gnutls_datum_t * msg)
1198 {
1199 /* debug_printf("%s: htype %u\n", __FUNCTION__, htype); */
1200 switch (htype)
1201   {
1202 # ifdef SUPPORT_GNUTLS_EXT_RAW_PARSE
1203   case GNUTLS_HANDSHAKE_CLIENT_HELLO:
1204     return tls_server_clienthello_cb(sess, htype, when, incoming, msg);
1205   case GNUTLS_HANDSHAKE_CERTIFICATE_PKT:
1206     return tls_server_servercerts_cb(sess, htype, when, incoming, msg);
1207 # endif
1208   case GNUTLS_HANDSHAKE_CERTIFICATE_STATUS:
1209     return tls_server_certstatus_cb(sess, htype, when, incoming, msg);
1210 # ifdef EXIM_HAVE_TLS_RESUME
1211   case GNUTLS_HANDSHAKE_NEW_SESSION_TICKET:
1212     return tls_server_ticket_cb(sess, htype, when, incoming, msg);
1213 # endif
1214   default:
1215     return 0;
1216   }
1217 }
1218 #endif
1219
1220
1221 #if !defined(DISABLE_OCSP) && defined(SUPPORT_GNUTLS_EXT_RAW_PARSE)
1222 static void
1223 tls_server_testharness_ocsp_fiddle(void)
1224 {
1225 extern char ** environ;
1226 if (environ) for (uschar ** p = USS environ; *p; p++)
1227   if (Ustrncmp(*p, "EXIM_TESTHARNESS_DISABLE_OCSPVALIDITYCHECK", 42) == 0)
1228     {
1229     DEBUG(D_tls) debug_printf("Permitting known bad OCSP response\n");
1230     exim_testharness_disable_ocsp_validity_check = TRUE;
1231     }
1232 }
1233 #endif
1234
1235 /**************************************************
1236 * One-time init credentials for server and client *
1237 **************************************************/
1238
1239 static void
1240 creds_basic_init(gnutls_certificate_credentials_t x509_cred, BOOL server)
1241 {
1242 #ifdef SUPPORT_SRV_OCSP_STACK
1243 gnutls_certificate_set_flags(x509_cred, GNUTLS_CERTIFICATE_API_V2);
1244
1245 # if !defined(DISABLE_OCSP) && defined(SUPPORT_GNUTLS_EXT_RAW_PARSE)
1246 if (server && tls_ocsp_file)
1247   {
1248   if (f.running_in_test_harness)
1249     tls_server_testharness_ocsp_fiddle();
1250
1251   if (exim_testharness_disable_ocsp_validity_check)
1252     gnutls_certificate_set_flags(x509_cred,
1253       GNUTLS_CERTIFICATE_API_V2 | GNUTLS_CERTIFICATE_SKIP_OCSP_RESPONSE_CHECK);
1254   }
1255 # endif
1256 #endif
1257 DEBUG(D_tls)
1258   debug_printf("TLS: basic cred init, %s\n", server ? "server" : "client");
1259 }
1260
1261 static int
1262 creds_load_server_certs(exim_gnutls_state_st * state, const uschar * cert,
1263   const uschar * pkey, const uschar * ocsp, uschar ** errstr)
1264 {
1265 const uschar * clist = cert;
1266 const uschar * klist = pkey;
1267 const uschar * olist;
1268 int csep = 0, ksep = 0, osep = 0, cnt = 0, rc;
1269 uschar * cfile, * kfile, * ofile;
1270 #ifndef DISABLE_OCSP
1271 # ifdef SUPPORT_GNUTLS_EXT_RAW_PARSE
1272 gnutls_x509_crt_fmt_t ocsp_fmt = GNUTLS_X509_FMT_DER;
1273 # endif
1274
1275 if (!expand_check(ocsp, US"tls_ocsp_file", &ofile, errstr))
1276   return DEFER;
1277 olist = ofile;
1278 #endif
1279
1280 while (cfile = string_nextinlist(&clist, &csep, NULL, 0))
1281
1282   if (!(kfile = string_nextinlist(&klist, &ksep, NULL, 0)))
1283     return tls_error(US"cert/key setup: out of keys", NULL, NULL, errstr);
1284   else if ((rc = tls_add_certfile(state, NULL, cfile, kfile, errstr)) > 0)
1285     return rc;
1286   else
1287     {
1288     int gnutls_cert_index = -rc;
1289     DEBUG(D_tls) debug_printf("TLS: cert/key %d %s registered\n",
1290                               gnutls_cert_index, cfile);
1291
1292 #ifndef DISABLE_OCSP
1293     if (ocsp)
1294       {
1295       /* Set the OCSP stapling server info */
1296       if (gnutls_buggy_ocsp)
1297         {
1298         DEBUG(D_tls)
1299           debug_printf("GnuTLS library is buggy for OCSP; avoiding\n");
1300         }
1301       else if ((ofile = string_nextinlist(&olist, &osep, NULL, 0)))
1302         {
1303         DEBUG(D_tls) debug_printf("OCSP response file %d  = %s\n",
1304                                   gnutls_cert_index, ofile);
1305 # ifdef SUPPORT_GNUTLS_EXT_RAW_PARSE
1306         if (Ustrncmp(ofile, US"PEM ", 4) == 0)
1307           {
1308           ocsp_fmt = GNUTLS_X509_FMT_PEM;
1309           ofile += 4;
1310           }
1311         else if (Ustrncmp(ofile, US"DER ", 4) == 0)
1312           {
1313           ocsp_fmt = GNUTLS_X509_FMT_DER;
1314           ofile += 4;
1315           }
1316
1317         if  ((rc = gnutls_certificate_set_ocsp_status_request_file2(
1318                   state->lib_state.x509_cred, CCS ofile, gnutls_cert_index,
1319                   ocsp_fmt)) < 0)
1320           return tls_error_gnu(state,
1321                   US"gnutls_certificate_set_ocsp_status_request_file2",
1322                   rc, errstr);
1323         DEBUG(D_tls)
1324           debug_printf(" %d response%s loaded\n", rc, rc>1 ? "s":"");
1325
1326         /* Arrange callbacks for OCSP request observability */
1327
1328         if (state->session)
1329           gnutls_handshake_set_hook_function(state->session,
1330             GNUTLS_HANDSHAKE_ANY, GNUTLS_HOOK_POST, tls_server_hook_cb);
1331         else
1332           state->lib_state.ocsp_hook = TRUE;
1333
1334
1335 # else
1336 #  if defined(SUPPORT_SRV_OCSP_STACK)
1337         if ((rc = gnutls_certificate_set_ocsp_status_request_function2(
1338                      state->lib_state.x509_cred, gnutls_cert_index,
1339                      server_ocsp_stapling_cb, ofile)))
1340             return tls_error_gnu(state,
1341                   US"gnutls_certificate_set_ocsp_status_request_function2",
1342                   rc, errstr);
1343         else
1344 #  endif
1345           {
1346           if (cnt++ > 0)
1347             {
1348             DEBUG(D_tls)
1349               debug_printf("oops; multiple OCSP files not supported\n");
1350             break;
1351             }
1352           gnutls_certificate_set_ocsp_status_request_function(
1353             state->lib_state.x509_cred, server_ocsp_stapling_cb, ofile);
1354           }
1355 # endif /* SUPPORT_GNUTLS_EXT_RAW_PARSE */
1356         }
1357       else
1358         DEBUG(D_tls) debug_printf("ran out of OCSP response files in list\n");
1359       }
1360 #endif /* DISABLE_OCSP */
1361     }
1362 return 0;
1363 }
1364
1365 static int
1366 creds_load_client_certs(exim_gnutls_state_st * state, const host_item * host,
1367   const uschar * cert, const uschar * pkey, uschar ** errstr)
1368 {
1369 int rc = tls_add_certfile(state, host, cert, pkey, errstr);
1370 if (rc > 0) return rc;
1371 DEBUG(D_tls) debug_printf("TLS: cert/key registered\n");
1372 return 0;
1373 }
1374
1375 static int
1376 creds_load_cabundle(exim_gnutls_state_st * state, const uschar * bundle,
1377   const host_item * host, uschar ** errstr)
1378 {
1379 int cert_count;
1380 struct stat statbuf;
1381
1382 #ifdef SUPPORT_SYSDEFAULT_CABUNDLE
1383 if (Ustrcmp(bundle, "system") == 0 || Ustrncmp(bundle, "system,", 7) == 0)
1384   cert_count = gnutls_certificate_set_x509_system_trust(state->lib_state.x509_cred);
1385 else
1386 #endif
1387   {
1388   if (Ustat(bundle, &statbuf) < 0)
1389     {
1390     log_write(0, LOG_MAIN|LOG_PANIC, "could not stat '%s' "
1391         "(tls_verify_certificates): %s", bundle, strerror(errno));
1392     return DEFER;
1393     }
1394
1395 #ifndef SUPPORT_CA_DIR
1396   /* The test suite passes in /dev/null; we could check for that path explicitly,
1397   but who knows if someone has some weird FIFO which always dumps some certs, or
1398   other weirdness.  The thing we really want to check is that it's not a
1399   directory, since while OpenSSL supports that, GnuTLS does not.
1400   So s/!S_ISREG/S_ISDIR/ and change some messaging ... */
1401   if (S_ISDIR(statbuf.st_mode))
1402     {
1403     log_write(0, LOG_MAIN|LOG_PANIC,
1404         "tls_verify_certificates \"%s\" is a directory", bundle);
1405     return DEFER;
1406     }
1407 #endif
1408
1409   DEBUG(D_tls) debug_printf("verify certificates = %s size=" OFF_T_FMT "\n",
1410           bundle, statbuf.st_size);
1411
1412   if (statbuf.st_size == 0)
1413     {
1414     DEBUG(D_tls)
1415       debug_printf("cert file empty, no certs, no verification, ignoring any CRL\n");
1416     return OK;
1417     }
1418
1419   cert_count =
1420
1421 #ifdef SUPPORT_CA_DIR
1422     (statbuf.st_mode & S_IFMT) == S_IFDIR
1423     ?
1424     gnutls_certificate_set_x509_trust_dir(state->lib_state.x509_cred,
1425       CS bundle, GNUTLS_X509_FMT_PEM)
1426     :
1427 #endif
1428     gnutls_certificate_set_x509_trust_file(state->lib_state.x509_cred,
1429       CS bundle, GNUTLS_X509_FMT_PEM);
1430
1431 #ifdef SUPPORT_CA_DIR
1432   /* Mimic the behaviour with OpenSSL of not advertising a usable-cert list
1433   when using the directory-of-certs config model. */
1434
1435   if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
1436     if (state->session)
1437       gnutls_certificate_send_x509_rdn_sequence(state->session, 1);
1438     else
1439       state->lib_state.ca_rdn_emulate = TRUE;
1440 #endif
1441   }
1442
1443 if (cert_count < 0)
1444   return tls_error_gnu(state, US"setting certificate trust", cert_count, errstr);
1445 DEBUG(D_tls)
1446   debug_printf("Added %d certificate authorities\n", cert_count);
1447
1448 return OK;
1449 }
1450
1451
1452 static int
1453 creds_load_crl(exim_gnutls_state_st * state, const uschar * crl, uschar ** errstr)
1454 {
1455 int cert_count;
1456 DEBUG(D_tls) debug_printf("loading CRL file = %s\n", crl);
1457 if ((cert_count = gnutls_certificate_set_x509_crl_file(state->lib_state.x509_cred,
1458     CS crl, GNUTLS_X509_FMT_PEM)) < 0)
1459   return tls_error_gnu(state, US"gnutls_certificate_set_x509_crl_file",
1460             cert_count, errstr);
1461
1462 DEBUG(D_tls) debug_printf("Processed %d CRLs\n", cert_count);
1463 return OK;
1464 }
1465
1466
1467 static int
1468 creds_load_pristring(exim_gnutls_state_st * state, const uschar * p,
1469   const char ** errpos)
1470 {
1471 if (!p)
1472   {
1473   p = exim_default_gnutls_priority;
1474   DEBUG(D_tls)
1475     debug_printf("GnuTLS using default session cipher/priority \"%s\"\n", p);
1476   }
1477 return gnutls_priority_init( (gnutls_priority_t *) &state->lib_state.pri_cache,
1478   CCS p, errpos);
1479 }
1480
1481 static unsigned
1482 tls_server_creds_init(void)
1483 {
1484 uschar * dummy_errstr;
1485 unsigned lifetime = 0;
1486
1487 state_server.lib_state = null_tls_preload;
1488 if (gnutls_certificate_allocate_credentials(
1489       (gnutls_certificate_credentials_t *) &state_server.lib_state.x509_cred))
1490   {
1491   state_server.lib_state.x509_cred = NULL;
1492   return lifetime;
1493   }
1494 creds_basic_init(state_server.lib_state.x509_cred, TRUE);
1495
1496 #if defined(EXIM_HAVE_INOTIFY) || defined(EXIM_HAVE_KEVENT)
1497 /* If tls_certificate has any $ indicating expansions, it is not good.
1498 If tls_privatekey is set but has $, not good.  Likewise for tls_ocsp_file.
1499 If all good (and tls_certificate set), load the cert(s). */
1500
1501 if (  opt_set_and_noexpand(tls_certificate)
1502 # ifndef DISABLE_OCSP
1503    && opt_unset_or_noexpand(tls_ocsp_file)
1504 # endif
1505    && opt_unset_or_noexpand(tls_privatekey))
1506   {
1507   /* Set watches on the filenames.  The implementation does de-duplication
1508   so we can just blindly do them all.
1509   */
1510
1511   if (  tls_set_watch(tls_certificate, TRUE)
1512 # ifndef DISABLE_OCSP
1513      && tls_set_watch(tls_ocsp_file, TRUE)
1514 # endif
1515      && tls_set_watch(tls_privatekey, TRUE))
1516     {
1517     DEBUG(D_tls) debug_printf("TLS: preloading server certs\n");
1518     if (creds_load_server_certs(&state_server, tls_certificate,
1519           tls_privatekey && *tls_privatekey ? tls_privatekey : tls_certificate,
1520 # ifdef DISABLE_OCSP
1521           NULL,
1522 # else
1523           tls_ocsp_file,
1524 # endif
1525           &dummy_errstr) == 0)
1526       state_server.lib_state.conn_certs = TRUE;
1527     }
1528   }
1529 else if (  !tls_certificate && !tls_privatekey
1530 # ifndef DISABLE_OCSP
1531         && !tls_ocsp_file
1532 # endif
1533         )
1534   {             /* Generate & preload a selfsigned cert. No files to watch. */
1535   if ((tls_install_selfsign(&state_server, &dummy_errstr)) == OK)
1536     {
1537     state_server.lib_state.conn_certs = TRUE;
1538     lifetime = f.running_in_test_harness ? 2 : 60 * 60;         /* 1 hour */
1539     }
1540   }
1541 else
1542   DEBUG(D_tls) debug_printf("TLS: not preloading server certs\n");
1543
1544 /* If tls_verify_certificates is non-empty and has no $, load CAs.
1545 If none was configured and we can't handle "system", treat as empty. */
1546
1547 if (  opt_set_and_noexpand(tls_verify_certificates)
1548 #ifndef SUPPORT_SYSDEFAULT_CABUNDLE
1549    && Ustrcmp(tls_verify_certificates, "system") != 0
1550 #endif
1551    )
1552   {
1553   if (tls_set_watch(tls_verify_certificates, FALSE))
1554     {
1555     DEBUG(D_tls) debug_printf("TLS: preloading CA bundle for server\n");
1556     if (creds_load_cabundle(&state_server, tls_verify_certificates,
1557                             NULL, &dummy_errstr) != OK)
1558       return lifetime;
1559     state_server.lib_state.cabundle = TRUE;
1560
1561     /* If CAs loaded and tls_crl is non-empty and has no $, load it */
1562
1563     if (opt_set_and_noexpand(tls_crl))
1564       {
1565       if (tls_set_watch(tls_crl, FALSE))
1566         {
1567         DEBUG(D_tls) debug_printf("TLS: preloading CRL for server\n");
1568         if (creds_load_crl(&state_server, tls_crl, &dummy_errstr) != OK)
1569           return lifetime;
1570         state_server.lib_state.crl = TRUE;
1571         }
1572       }
1573     else
1574       DEBUG(D_tls) debug_printf("TLS: not preloading CRL for server\n");
1575     }
1576   }
1577 else
1578   DEBUG(D_tls) debug_printf("TLS: not preloading CA bundle for server\n");
1579 #endif  /* EXIM_HAVE_INOTIFY */
1580
1581 /* If tls_require_ciphers is non-empty and has no $, load the
1582 ciphers priority cache.  If unset, load with the default.
1583 (server-only as the client one depends on non/DANE) */
1584
1585 if (!tls_require_ciphers || opt_set_and_noexpand(tls_require_ciphers))
1586   {
1587   const char * dummy_errpos;
1588   DEBUG(D_tls) debug_printf("TLS: preloading cipher list for server: %s\n",
1589                   tls_require_ciphers);
1590   if (  creds_load_pristring(&state_server, tls_require_ciphers, &dummy_errpos)
1591      == OK)
1592     state_server.lib_state.pri_string = TRUE;
1593   }
1594 else
1595   DEBUG(D_tls) debug_printf("TLS: not preloading cipher list for server\n");
1596 return lifetime;
1597 }
1598
1599
1600 /* Preload whatever creds are static, onto a transport.  The client can then
1601 just copy the pointer as it starts up. */
1602
1603 /*XXX this is not called for a cmdline send. But one needing to use >1 conn would benefit,
1604 and there seems little downside. */
1605
1606 static void
1607 tls_client_creds_init(transport_instance * t, BOOL watch)
1608 {
1609 smtp_transport_options_block * ob = t->options_block;
1610 exim_gnutls_state_st tpt_dummy_state;
1611 host_item * dummy_host = (host_item *)1;
1612 uschar * dummy_errstr;
1613
1614 if (  !exim_gnutls_base_init_done
1615    && tls_g_init(&dummy_errstr) != OK)
1616   return;
1617
1618 ob->tls_preload = null_tls_preload;
1619 if (gnutls_certificate_allocate_credentials(
1620   (struct gnutls_certificate_credentials_st **)&ob->tls_preload.x509_cred))
1621   {
1622   ob->tls_preload.x509_cred = NULL;
1623   return;
1624   }
1625 creds_basic_init(ob->tls_preload.x509_cred, FALSE);
1626
1627 tpt_dummy_state.session = NULL;
1628 tpt_dummy_state.lib_state = ob->tls_preload;
1629
1630 #if defined(EXIM_HAVE_INOTIFY) || defined(EXIM_HAVE_KEVENT)
1631 if (  opt_set_and_noexpand(ob->tls_certificate)
1632    && opt_unset_or_noexpand(ob->tls_privatekey))
1633   {
1634   if (  !watch
1635      || (  tls_set_watch(ob->tls_certificate, FALSE)
1636         && tls_set_watch(ob->tls_privatekey, FALSE)
1637      )  )
1638     {
1639     const uschar * pkey = ob->tls_privatekey;
1640
1641     DEBUG(D_tls)
1642       debug_printf("TLS: preloading client certs for transport '%s'\n", t->name);
1643
1644     /* The state->lib_state.x509_cred is used for the certs load, and is the sole
1645     structure element used.  So we can set up a dummy.  The hoat arg only
1646     selects a retcode in case of fail, so any value */
1647
1648     if (creds_load_client_certs(&tpt_dummy_state, dummy_host,
1649           ob->tls_certificate, pkey ? pkey : ob->tls_certificate,
1650           &dummy_errstr) == OK)
1651       ob->tls_preload.conn_certs = TRUE;
1652     }
1653   }
1654 else
1655   DEBUG(D_tls)
1656     debug_printf("TLS: not preloading client certs, for transport '%s'\n", t->name);
1657
1658 /* If tls_verify_certificates is non-empty and has no $, load CAs.
1659 If none was configured and we can't handle "system", treat as empty. */
1660
1661 if (  opt_set_and_noexpand(ob->tls_verify_certificates)
1662 #ifndef SUPPORT_SYSDEFAULT_CABUNDLE
1663    && Ustrcmp(ob->tls_verify_certificates, "system") != 0
1664 #endif
1665    )
1666   {
1667   if (!watch || tls_set_watch(ob->tls_verify_certificates, FALSE))
1668     {
1669     DEBUG(D_tls)
1670       debug_printf("TLS: preloading CA bundle for transport '%s'\n", t->name);
1671     if (creds_load_cabundle(&tpt_dummy_state, ob->tls_verify_certificates,
1672                             dummy_host, &dummy_errstr) != OK)
1673       return;
1674     ob->tls_preload.cabundle = TRUE;
1675
1676     if (opt_set_and_noexpand(ob->tls_crl))
1677       {
1678       if (!watch || tls_set_watch(ob->tls_crl, FALSE))
1679         {
1680         DEBUG(D_tls) debug_printf("TLS: preloading CRL for transport '%s'\n", t->name);
1681         if (creds_load_crl(&tpt_dummy_state, ob->tls_crl, &dummy_errstr) != OK)
1682           return;
1683         ob->tls_preload.crl = TRUE;
1684         }
1685       }
1686     else
1687       DEBUG(D_tls) debug_printf("TLS: not preloading CRL, for transport '%s'\n", t->name);
1688     }
1689   }
1690 else
1691   DEBUG(D_tls)
1692       debug_printf("TLS: not preloading CA bundle, for transport '%s'\n", t->name);
1693
1694 /* We do not preload tls_require_ciphers to to the transport as it implicitly
1695 depends on DANE or plain usage. */
1696
1697 #endif
1698 }
1699
1700
1701 #if defined(EXIM_HAVE_INOTIFY) || defined(EXIM_HAVE_KEVENT)
1702 /* Invalidate the creds cached, by dropping the current ones.
1703 Call when we notice one of the source files has changed. */
1704  
1705 static void
1706 tls_server_creds_invalidate(void)
1707 {
1708 if (state_server.lib_state.pri_cache)
1709   gnutls_priority_deinit(state_server.lib_state.pri_cache);
1710 state_server.lib_state.pri_cache = NULL;
1711
1712 if (state_server.lib_state.x509_cred)
1713   gnutls_certificate_free_credentials(state_server.lib_state.x509_cred);
1714 state_server.lib_state = null_tls_preload;
1715 }
1716
1717
1718 static void
1719 tls_client_creds_invalidate(transport_instance * t)
1720 {
1721 smtp_transport_options_block * ob = t->options_block;
1722 if (ob->tls_preload.x509_cred)
1723   gnutls_certificate_free_credentials(ob->tls_preload.x509_cred);
1724 ob->tls_preload = null_tls_preload;
1725 }
1726 #endif
1727
1728
1729 /*************************************************
1730 *       Variables re-expanded post-SNI           *
1731 *************************************************/
1732
1733 /* Called from both server and client code, via tls_init(), and also from
1734 the SNI callback after receiving an SNI, if tls_certificate includes "tls_sni".
1735
1736 We can tell the two apart by state->received_sni being non-NULL in callback.
1737
1738 The callback should not call us unless state->trigger_sni_changes is true,
1739 which we are responsible for setting on the first pass through.
1740
1741 Arguments:
1742   state           exim_gnutls_state_st *
1743   errstr          error string pointer
1744
1745 Returns:          OK/DEFER/FAIL
1746 */
1747
1748 static int
1749 tls_expand_session_files(exim_gnutls_state_st * state, uschar ** errstr)
1750 {
1751 int rc;
1752 const host_item *host = state->host;  /* macro should be reconsidered? */
1753 const uschar *saved_tls_certificate = NULL;
1754 const uschar *saved_tls_privatekey = NULL;
1755 const uschar *saved_tls_verify_certificates = NULL;
1756 const uschar *saved_tls_crl = NULL;
1757 int cert_count;
1758
1759 /* We check for tls_sni *before* expansion. */
1760 if (!host)      /* server */
1761   if (!state->received_sni)
1762     {
1763     if (  state->tls_certificate
1764        && (  Ustrstr(state->tls_certificate, US"tls_sni")
1765           || Ustrstr(state->tls_certificate, US"tls_in_sni")
1766           || Ustrstr(state->tls_certificate, US"tls_out_sni")
1767        )  )
1768       {
1769       DEBUG(D_tls) debug_printf("We will re-expand TLS session files if we receive SNI\n");
1770       state->trigger_sni_changes = TRUE;
1771       }
1772     }
1773   else  /* SNI callback case */
1774     {
1775     /* useful for debugging */
1776     saved_tls_certificate = state->exp_tls_certificate;
1777     saved_tls_privatekey = state->exp_tls_privatekey;
1778     saved_tls_verify_certificates = state->exp_tls_verify_certificates;
1779     saved_tls_crl = state->exp_tls_crl;
1780     }
1781
1782 if (!state->lib_state.x509_cred)
1783   {
1784   if ((rc = gnutls_certificate_allocate_credentials(
1785         (gnutls_certificate_credentials_t *) &state->lib_state.x509_cred)))
1786     return tls_error_gnu(state, US"gnutls_certificate_allocate_credentials",
1787             rc, errstr);
1788   creds_basic_init(state->lib_state.x509_cred, !host);
1789   }
1790
1791
1792 /* remember: Expand_check_tlsvar() is expand_check() but fiddling with
1793 state members, assuming consistent naming; and expand_check() returns
1794 false if expansion failed, unless expansion was forced to fail. */
1795
1796 /* check if we at least have a certificate, before doing expensive
1797 D-H generation. */
1798
1799 if (!state->lib_state.conn_certs)
1800   {
1801   if (!Expand_check_tlsvar(tls_certificate, errstr))
1802     return DEFER;
1803
1804   /* certificate is mandatory in server, optional in client */
1805
1806   if (  !state->exp_tls_certificate
1807      || !*state->exp_tls_certificate
1808      )
1809     if (!host)
1810       return tls_install_selfsign(state, errstr);
1811     else
1812       DEBUG(D_tls) debug_printf("TLS: no client certificate specified; okay\n");
1813
1814   if (state->tls_privatekey && !Expand_check_tlsvar(tls_privatekey, errstr))
1815     return DEFER;
1816
1817   /* tls_privatekey is optional, defaulting to same file as certificate */
1818
1819   if (!state->tls_privatekey || !*state->tls_privatekey)
1820     {
1821     state->tls_privatekey = state->tls_certificate;
1822     state->exp_tls_privatekey = state->exp_tls_certificate;
1823     }
1824
1825   if (state->exp_tls_certificate && *state->exp_tls_certificate)
1826     {
1827     BOOL load = TRUE;
1828     DEBUG(D_tls) debug_printf("certificate file = %s\nkey file = %s\n",
1829         state->exp_tls_certificate, state->exp_tls_privatekey);
1830
1831     if (state->received_sni)
1832       if (  Ustrcmp(state->exp_tls_certificate, saved_tls_certificate) == 0
1833          && Ustrcmp(state->exp_tls_privatekey,  saved_tls_privatekey)  == 0
1834          )
1835         {
1836         DEBUG(D_tls) debug_printf("TLS SNI: cert and key unchanged\n");
1837         load = FALSE;   /* avoid re-loading the same certs */
1838         }
1839       else              /* unload the pre-SNI certs before loading new ones */
1840         {
1841         DEBUG(D_tls) debug_printf("TLS SNI: have a changed cert/key pair\n");
1842         gnutls_certificate_free_keys(state->lib_state.x509_cred);
1843         }
1844
1845     if (  load
1846        && (rc = host
1847           ? creds_load_client_certs(state, host, state->exp_tls_certificate,
1848                               state->exp_tls_privatekey, errstr)
1849           : creds_load_server_certs(state, state->exp_tls_certificate,
1850                               state->exp_tls_privatekey,
1851 #ifdef DISABLE_OCSP
1852                               NULL,
1853 #else
1854                               tls_ocsp_file,
1855 #endif
1856                               errstr)
1857        )  ) return rc;
1858     }
1859   }
1860 else
1861   {
1862   DEBUG(D_tls)
1863     debug_printf("%s certs were preloaded\n", host ? "client" : "server");
1864
1865   if (!state->tls_privatekey) state->tls_privatekey = state->tls_certificate;
1866   state->exp_tls_certificate = US state->tls_certificate;
1867   state->exp_tls_privatekey = US state->tls_privatekey;
1868
1869 #ifdef SUPPORT_GNUTLS_EXT_RAW_PARSE
1870   if (state->lib_state.ocsp_hook)
1871      gnutls_handshake_set_hook_function(state->session,
1872        GNUTLS_HANDSHAKE_ANY, GNUTLS_HOOK_POST, tls_server_hook_cb);
1873 #endif
1874   }
1875
1876
1877 /* Set the trusted CAs file if one is provided, and then add the CRL if one is
1878 provided. Experiment shows that, if the certificate file is empty, an unhelpful
1879 error message is provided. However, if we just refrain from setting anything up
1880 in that case, certificate verification fails, which seems to be the correct
1881 behaviour.
1882 If none was configured and we can't handle "system", treat as empty. */
1883
1884 if (!state->lib_state.cabundle)
1885   {
1886   if (state->tls_verify_certificates && *state->tls_verify_certificates)
1887     {
1888     if (!Expand_check_tlsvar(tls_verify_certificates, errstr))
1889       return DEFER;
1890 #ifndef SUPPORT_SYSDEFAULT_CABUNDLE
1891     if (Ustrcmp(state->exp_tls_verify_certificates, "system") == 0)
1892       state->exp_tls_verify_certificates = NULL;
1893 #endif
1894     if (state->tls_crl && *state->tls_crl)
1895       if (!Expand_check_tlsvar(tls_crl, errstr))
1896         return DEFER;
1897
1898     if (!(state->exp_tls_verify_certificates &&
1899           *state->exp_tls_verify_certificates))
1900       {
1901       DEBUG(D_tls)
1902         debug_printf("TLS: tls_verify_certificates expanded empty, ignoring\n");
1903       /* With no tls_verify_certificates, we ignore tls_crl too */
1904       return OK;
1905       }
1906     }
1907   else
1908     {
1909     DEBUG(D_tls)
1910       debug_printf("TLS: tls_verify_certificates not set or empty, ignoring\n");
1911     return OK;
1912     }
1913   rc = creds_load_cabundle(state, state->exp_tls_verify_certificates, host, errstr);
1914   if (rc != OK) return rc;
1915   }
1916 else
1917   {
1918   DEBUG(D_tls)
1919     debug_printf("%s CA bundle was preloaded\n", host ? "client" : "server");
1920   state->exp_tls_verify_certificates = US state->tls_verify_certificates;
1921
1922 #ifdef SUPPORT_CA_DIR
1923 /* Mimic the behaviour with OpenSSL of not advertising a usable-cert list
1924 when using the directory-of-certs config model. */
1925     if (state->lib_state.ca_rdn_emulate)
1926       gnutls_certificate_send_x509_rdn_sequence(state->session, 1);
1927 #endif
1928   }
1929
1930
1931 if (!state->lib_state.crl)
1932   {
1933   if (  state->tls_crl && *state->tls_crl
1934      && state->exp_tls_crl && *state->exp_tls_crl)
1935     return creds_load_crl(state, state->exp_tls_crl, errstr);
1936   }
1937 else
1938   {
1939   DEBUG(D_tls)
1940       debug_printf("%s CRL was preloaded\n", host ? "client" : "server");
1941   state->exp_tls_crl = US state->tls_crl;
1942   }
1943
1944 return OK;
1945 }
1946
1947
1948
1949
1950 /*************************************************
1951 *          Set X.509 state variables             *
1952 *************************************************/
1953
1954 /* In GnuTLS, the registered cert/key are not replaced by a later
1955 set of a cert/key, so for SNI support we need a whole new x509_cred
1956 structure.  Which means various other non-re-expanded pieces of state
1957 need to be re-set in the new struct, so the setting logic is pulled
1958 out to this.
1959
1960 Arguments:
1961   state           exim_gnutls_state_st *
1962   errstr          error string pointer
1963
1964 Returns:          OK/DEFER/FAIL
1965 */
1966
1967 static int
1968 tls_set_remaining_x509(exim_gnutls_state_st *state, uschar ** errstr)
1969 {
1970 int rc;
1971 const host_item *host = state->host;  /* macro should be reconsidered? */
1972
1973 /* Create D-H parameters, or read them from the cache file. This function does
1974 its own SMTP error messaging. This only happens for the server, TLS D-H ignores
1975 client-side params. */
1976
1977 if (!state->host)
1978   {
1979   if (!dh_server_params)
1980     if ((rc = init_server_dh(errstr)) != OK) return rc;
1981
1982   /* Unnecessary & discouraged with 3.6.0 or later, according to docs.  But without it,
1983   no DHE- ciphers are advertised. */
1984   gnutls_certificate_set_dh_params(state->lib_state.x509_cred, dh_server_params);
1985   }
1986
1987 /* Link the credentials to the session. */
1988
1989 if ((rc = gnutls_credentials_set(state->session,
1990             GNUTLS_CRD_CERTIFICATE, state->lib_state.x509_cred)))
1991   return tls_error_gnu(state, US"gnutls_credentials_set", rc, errstr);
1992
1993 return OK;
1994 }
1995
1996 /*************************************************
1997 *            Initialize for GnuTLS               *
1998 *************************************************/
1999
2000
2001 /* Called from both server and client code. In the case of a server, errors
2002 before actual TLS negotiation return DEFER.
2003
2004 Arguments:
2005   host            connected host, if client; NULL if server
2006   ob              tranport options block, if client; NULL if server
2007   require_ciphers tls_require_ciphers setting
2008   caller_state    returned state-info structure
2009   errstr          error string pointer
2010
2011 Returns:          OK/DEFER/FAIL
2012 */
2013
2014 static int
2015 tls_init(
2016     const host_item *host,
2017     smtp_transport_options_block * ob,
2018     const uschar * require_ciphers,
2019     exim_gnutls_state_st **caller_state,
2020     tls_support * tlsp,
2021     uschar ** errstr)
2022 {
2023 exim_gnutls_state_st * state;
2024 int rc;
2025 size_t sz;
2026
2027 if (  !exim_gnutls_base_init_done
2028    && (rc = tls_g_init(errstr)) != OK)
2029   return rc;
2030
2031 if (host)
2032   {
2033   /* For client-side sessions we allocate a context. This lets us run
2034   several in parallel. */
2035
2036   int old_pool = store_pool;
2037   store_pool = POOL_PERM;
2038   state = store_get(sizeof(exim_gnutls_state_st), GET_UNTAINTED);
2039   store_pool = old_pool;
2040
2041   memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
2042   state->lib_state = ob->tls_preload;
2043   state->tlsp = tlsp;
2044   DEBUG(D_tls) debug_printf("initialising GnuTLS client session\n");
2045   rc = gnutls_init(&state->session, GNUTLS_CLIENT);
2046
2047   state->tls_certificate =      ob->tls_certificate;
2048   state->tls_privatekey =       ob->tls_privatekey;
2049   state->tls_sni =              ob->tls_sni;
2050   state->tls_verify_certificates = ob->tls_verify_certificates;
2051   state->tls_crl =              ob->tls_crl;
2052   }
2053 else
2054   {
2055   /* Server operations always use the one state_server context.  It is not
2056   shared because we have forked a fresh process for every receive.  However it
2057   can get re-used for successive TLS sessions on a single TCP connection. */
2058
2059   state = &state_server;
2060   state->tlsp = tlsp;
2061   DEBUG(D_tls) debug_printf("initialising GnuTLS server session\n");
2062   rc = gnutls_init(&state->session, GNUTLS_SERVER);
2063
2064   state->tls_certificate =      tls_certificate;
2065   state->tls_privatekey =       tls_privatekey;
2066   state->tls_sni =              NULL;
2067   state->tls_verify_certificates = tls_verify_certificates;
2068   state->tls_crl =              tls_crl;
2069   }
2070 if (rc)
2071   return tls_error_gnu(state, US"gnutls_init", rc, errstr);
2072
2073 state->tls_require_ciphers =    require_ciphers;
2074 state->host = host;
2075
2076 /* This handles the variables that might get re-expanded after TLS SNI;
2077 tls_certificate, tls_privatekey, tls_verify_certificates, tls_crl */
2078
2079 DEBUG(D_tls)
2080   debug_printf("Expanding various TLS configuration options for session credentials\n");
2081 if ((rc = tls_expand_session_files(state, errstr)) != OK) return rc;
2082
2083 /* These are all other parts of the x509_cred handling, since SNI in GnuTLS
2084 requires a new structure afterwards. */
2085
2086 if ((rc = tls_set_remaining_x509(state, errstr)) != OK) return rc;
2087
2088 /* set SNI in client, only */
2089 if (host)
2090   {
2091   if (!expand_check(state->tls_sni, US"tls_out_sni", &state->tlsp->sni, errstr))
2092     return DEFER;
2093   if (state->tlsp->sni && *state->tlsp->sni)
2094     {
2095     DEBUG(D_tls)
2096       debug_printf("Setting TLS client SNI to \"%s\"\n", state->tlsp->sni);
2097     sz = Ustrlen(state->tlsp->sni);
2098     if ((rc = gnutls_server_name_set(state->session,
2099           GNUTLS_NAME_DNS, state->tlsp->sni, sz)))
2100       return tls_error_gnu(state, US"gnutls_server_name_set", rc, errstr);
2101     }
2102   }
2103 else if (state->tls_sni)
2104   DEBUG(D_tls) debug_printf("*** PROBABLY A BUG *** " \
2105       "have an SNI set for a server [%s]\n", state->tls_sni);
2106
2107 if (!state->lib_state.pri_string)
2108   {
2109   const uschar * p = NULL;
2110   const char * errpos;
2111
2112   /* This is the priority string support,
2113   http://www.gnutls.org/manual/html_node/Priority-Strings.html
2114   and replaces gnutls_require_kx, gnutls_require_mac & gnutls_require_protocols.
2115   This was backwards incompatible, but means Exim no longer needs to track
2116   all algorithms and provide string forms for them. */
2117
2118   if (state->tls_require_ciphers && *state->tls_require_ciphers)
2119     {
2120     if (!Expand_check_tlsvar(tls_require_ciphers, errstr))
2121       return DEFER;
2122     if (state->exp_tls_require_ciphers && *state->exp_tls_require_ciphers)
2123       {
2124       p = state->exp_tls_require_ciphers;
2125       DEBUG(D_tls) debug_printf("GnuTLS session cipher/priority \"%s\"\n", p);
2126       }
2127     }
2128
2129   if ((rc = creds_load_pristring(state, p, &errpos)))
2130     return tls_error_gnu(state, string_sprintf(
2131                         "gnutls_priority_init(%s) failed at offset %ld, \"%.6s..\"",
2132                         p, (long)(errpos - CS p), errpos),
2133                     rc, errstr);
2134   }
2135 else
2136   {
2137   DEBUG(D_tls) debug_printf("cipher list preloaded\n");
2138   state->exp_tls_require_ciphers = US state->tls_require_ciphers;
2139   }
2140
2141
2142 if ((rc = gnutls_priority_set(state->session, state->lib_state.pri_cache)))
2143   return tls_error_gnu(state, US"gnutls_priority_set", rc, errstr);
2144
2145 /* This also sets the server ticket expiration time to the same, and
2146 the STEK rotation time to 3x. */
2147
2148 gnutls_db_set_cache_expiration(state->session, ssl_session_timeout);
2149
2150 /* Reduce security in favour of increased compatibility, if the admin
2151 decides to make that trade-off. */
2152 if (gnutls_compat_mode)
2153   {
2154 #if LIBGNUTLS_VERSION_NUMBER >= 0x020104
2155   DEBUG(D_tls) debug_printf("lowering GnuTLS security, compatibility mode\n");
2156   gnutls_session_enable_compatibility_mode(state->session);
2157 #else
2158   DEBUG(D_tls) debug_printf("Unable to set gnutls_compat_mode - GnuTLS version too old\n");
2159 #endif
2160   }
2161
2162 *caller_state = state;
2163 return OK;
2164 }
2165
2166
2167
2168 /*************************************************
2169 *            Extract peer information            *
2170 *************************************************/
2171
2172 static const uschar *
2173 cipher_stdname_kcm(gnutls_kx_algorithm_t kx, gnutls_cipher_algorithm_t cipher,
2174   gnutls_mac_algorithm_t mac)
2175 {
2176 uschar cs_id[2];
2177 gnutls_kx_algorithm_t kx_i;
2178 gnutls_cipher_algorithm_t cipher_i;
2179 gnutls_mac_algorithm_t mac_i;
2180
2181 for (size_t i = 0;
2182      gnutls_cipher_suite_info(i, cs_id, &kx_i, &cipher_i, &mac_i, NULL);
2183      i++)
2184   if (kx_i == kx && cipher_i == cipher && mac_i == mac)
2185     return cipher_stdname(cs_id[0], cs_id[1]);
2186 return NULL;
2187 }
2188
2189
2190
2191 /* Called from both server and client code.
2192 Only this is allowed to set state->peerdn and state->have_set_peerdn
2193 and we use that to detect double-calls.
2194
2195 NOTE: the state blocks last while the TLS connection is up, which is fine
2196 for logging in the server side, but for the client side, we log after teardown
2197 in src/deliver.c.  While the session is up, we can twist about states and
2198 repoint tls_* globals, but those variables used for logging or other variable
2199 expansion that happens _after_ delivery need to have a longer life-time.
2200
2201 So for those, we get the data from POOL_PERM; the re-invoke guard keeps us from
2202 doing this more than once per generation of a state context.  We set them in
2203 the state context, and repoint tls_* to them.  After the state goes away, the
2204 tls_* copies of the pointers remain valid and client delivery logging is happy.
2205
2206 tls_certificate_verified is a BOOL, so the tls_peerdn and tls_cipher issues
2207 don't apply.
2208
2209 Arguments:
2210   state           exim_gnutls_state_st *
2211   errstr          pointer to error string
2212
2213 Returns:          OK/DEFER/FAIL
2214 */
2215
2216 static int
2217 peer_status(exim_gnutls_state_st * state, uschar ** errstr)
2218 {
2219 gnutls_session_t session = state->session;
2220 const gnutls_datum_t * cert_list;
2221 int old_pool, rc;
2222 unsigned int cert_list_size = 0;
2223 gnutls_protocol_t protocol;
2224 gnutls_cipher_algorithm_t cipher;
2225 gnutls_kx_algorithm_t kx;
2226 gnutls_mac_algorithm_t mac;
2227 gnutls_certificate_type_t ct;
2228 gnutls_x509_crt_t crt;
2229 uschar * dn_buf;
2230 size_t sz;
2231
2232 if (state->have_set_peerdn)
2233   return OK;
2234 state->have_set_peerdn = TRUE;
2235
2236 state->peerdn = NULL;
2237
2238 /* tls_cipher */
2239 cipher = gnutls_cipher_get(session);
2240 protocol = gnutls_protocol_get_version(session);
2241 mac = gnutls_mac_get(session);
2242 kx =
2243 #ifdef GNUTLS_TLS1_3
2244     protocol >= GNUTLS_TLS1_3 ? 0 :
2245 #endif
2246   gnutls_kx_get(session);
2247
2248 old_pool = store_pool;
2249   {
2250   tls_support * tlsp = state->tlsp;
2251   store_pool = POOL_PERM;
2252
2253 #ifdef SUPPORT_GNUTLS_SESS_DESC
2254     {
2255     gstring * g = NULL;
2256     uschar * s = US gnutls_session_get_desc(session), c;
2257
2258     /* Nikos M suggests we use this by preference.  It returns like:
2259     (TLS1.3)-(ECDHE-SECP256R1)-(RSA-PSS-RSAE-SHA256)-(AES-256-GCM)
2260
2261     For partial back-compat, put a colon after the TLS version, replace the
2262     )-( grouping with __, replace in-group - with _ and append the :keysize. */
2263
2264     /* debug_printf("peer_status: gnutls_session_get_desc %s\n", s); */
2265
2266     for (s++; (c = *s) && c != ')'; s++) g = string_catn(g, s, 1);
2267
2268     tlsp->ver = string_copyn(g->s, g->ptr);
2269     for (uschar * p = US tlsp->ver; *p; p++)
2270       if (*p == '-') { *p = '\0'; break; }      /* TLS1.0-PKIX -> TLS1.0 */
2271
2272     g = string_catn(g, US":", 1);
2273     if (*s) s++;                /* now on _ between groups */
2274     while ((c = *s))
2275       {
2276       for (*++s && ++s; (c = *s) && c != ')'; s++)
2277         g = string_catn(g, c == '-' ? US"_" : s, 1);
2278       /* now on ) closing group */
2279       if ((c = *s) && *++s == '-') g = string_catn(g, US"__", 2);
2280       /* now on _ between groups */
2281       }
2282     g = string_catn(g, US":", 1);
2283     g = string_cat(g, string_sprintf("%d", (int) gnutls_cipher_get_key_size(cipher) * 8));
2284     state->ciphersuite = string_from_gstring(g);
2285     }
2286 #else
2287   state->ciphersuite = string_sprintf("%s:%s:%d",
2288       gnutls_protocol_get_name(protocol),
2289       gnutls_cipher_suite_get_name(kx, cipher, mac),
2290       (int) gnutls_cipher_get_key_size(cipher) * 8);
2291
2292   /* I don't see a way that spaces could occur, in the current GnuTLS
2293   code base, but it was a concern in the old code and perhaps older GnuTLS
2294   releases did return "TLS 1.0"; play it safe, just in case. */
2295
2296   for (uschar * p = state->ciphersuite; *p; p++) if (isspace(*p)) *p = '-';
2297   tlsp->ver = string_copyn(state->ciphersuite,
2298                         Ustrchr(state->ciphersuite, ':') - state->ciphersuite);
2299 #endif
2300
2301 /* debug_printf("peer_status: ciphersuite %s\n", state->ciphersuite); */
2302
2303   tlsp->cipher = state->ciphersuite;
2304   tlsp->bits = gnutls_cipher_get_key_size(cipher) * 8;
2305
2306   tlsp->cipher_stdname = cipher_stdname_kcm(kx, cipher, mac);
2307   }
2308 store_pool = old_pool;
2309
2310 /* tls_peerdn */
2311 cert_list = gnutls_certificate_get_peers(session, &cert_list_size);
2312
2313 if (!cert_list || cert_list_size == 0)
2314   {
2315   DEBUG(D_tls) debug_printf("TLS: no certificate from peer (%p & %d)\n",
2316       cert_list, cert_list_size);
2317   if (state->verify_requirement >= VERIFY_REQUIRED)
2318     return tls_error(US"certificate verification failed",
2319         US"no certificate received from peer", state->host, errstr);
2320   return OK;
2321   }
2322
2323 if ((ct = gnutls_certificate_type_get(session)) != GNUTLS_CRT_X509)
2324   {
2325   const uschar * ctn = US gnutls_certificate_type_get_name(ct);
2326   DEBUG(D_tls)
2327     debug_printf("TLS: peer cert not X.509 but instead \"%s\"\n", ctn);
2328   if (state->verify_requirement >= VERIFY_REQUIRED)
2329     return tls_error(US"certificate verification not possible, unhandled type",
2330         ctn, state->host, errstr);
2331   return OK;
2332   }
2333
2334 #define exim_gnutls_peer_err(Label) \
2335   do { \
2336     if (rc != GNUTLS_E_SUCCESS) \
2337       { \
2338       DEBUG(D_tls) debug_printf("TLS: peer cert problem: %s: %s\n", \
2339         (Label), gnutls_strerror(rc)); \
2340       if (state->verify_requirement >= VERIFY_REQUIRED) \
2341         return tls_error_gnu(state, (Label), rc, errstr); \
2342       return OK; \
2343       } \
2344     } while (0)
2345
2346 rc = import_cert(&cert_list[0], &crt);
2347 exim_gnutls_peer_err(US"cert 0");
2348
2349 state->tlsp->peercert = state->peercert = crt;
2350
2351 sz = 0;
2352 rc = gnutls_x509_crt_get_dn(crt, NULL, &sz);
2353 if (rc != GNUTLS_E_SHORT_MEMORY_BUFFER)
2354   {
2355   exim_gnutls_peer_err(US"getting size for cert DN failed");
2356   return FAIL; /* should not happen */
2357   }
2358 dn_buf = store_get_perm(sz, GET_TAINTED);
2359 rc = gnutls_x509_crt_get_dn(crt, CS dn_buf, &sz);
2360 exim_gnutls_peer_err(US"failed to extract certificate DN [gnutls_x509_crt_get_dn(cert 0)]");
2361
2362 state->peerdn = dn_buf;
2363
2364 return OK;
2365 #undef exim_gnutls_peer_err
2366 }
2367
2368
2369
2370
2371 /*************************************************
2372 *            Verify peer certificate             *
2373 *************************************************/
2374
2375 /* Called from both server and client code.
2376 *Should* be using a callback registered with
2377 gnutls_certificate_set_verify_function() to fail the handshake if we dislike
2378 the peer information, but that's too new for some OSes.
2379
2380 Arguments:
2381   state         exim_gnutls_state_st *
2382   errstr        where to put an error message
2383
2384 Returns:
2385   FALSE     if the session should be rejected
2386   TRUE      if the cert is okay or we just don't care
2387 */
2388
2389 static BOOL
2390 verify_certificate(exim_gnutls_state_st * state, uschar ** errstr)
2391 {
2392 int rc;
2393 uint verify;
2394
2395 DEBUG(D_tls) debug_printf("TLS: checking peer certificate\n");
2396 *errstr = NULL;
2397 rc = peer_status(state, errstr);
2398
2399 if (state->verify_requirement == VERIFY_NONE)
2400   return TRUE;
2401
2402 if (rc != OK || !state->peerdn)
2403   {
2404   verify = GNUTLS_CERT_INVALID;
2405   *errstr = US"certificate not supplied";
2406   }
2407 else
2408
2409   {
2410 #ifdef SUPPORT_DANE
2411   if (state->verify_requirement == VERIFY_DANE && state->host)
2412     {
2413     /* Using dane_verify_session_crt() would be easy, as it does it all for us
2414     including talking to a DNS resolver.  But we want to do that bit ourselves
2415     as the testsuite intercepts and fakes its own DNS environment. */
2416
2417     dane_state_t s;
2418     dane_query_t r;
2419     uint lsize;
2420     const gnutls_datum_t * certlist =
2421       gnutls_certificate_get_peers(state->session, &lsize);
2422     int usage = tls_out.tlsa_usage;
2423
2424 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
2425     /* Split the TLSA records into two sets, TA and EE selectors.  Run the
2426     dane-verification separately so that we know which selector verified;
2427     then we know whether to do name-verification (needed for TA but not EE). */
2428
2429     if (usage == ((1<<DANESSL_USAGE_DANE_TA) | (1<<DANESSL_USAGE_DANE_EE)))
2430       {                                         /* a mixed-usage bundle */
2431       int i, j, nrec;
2432       const char ** dd;
2433       int * ddl;
2434
2435       for (nrec = 0; state->dane_data_len[nrec]; ) nrec++;
2436       nrec++;
2437
2438       dd = store_get(nrec * sizeof(uschar *), GET_UNTAINTED);
2439       ddl = store_get(nrec * sizeof(int), GET_UNTAINTED);
2440       nrec--;
2441
2442       if ((rc = dane_state_init(&s, 0)))
2443         goto tlsa_prob;
2444
2445       for (usage = DANESSL_USAGE_DANE_EE;
2446            usage >= DANESSL_USAGE_DANE_TA; usage--)
2447         {                               /* take records with this usage */
2448         for (j = i = 0; i < nrec; i++)
2449           if (state->dane_data[i][0] == usage)
2450             {
2451             dd[j] = state->dane_data[i];
2452             ddl[j++] = state->dane_data_len[i];
2453             }
2454         if (j)
2455           {
2456           dd[j] = NULL;
2457           ddl[j] = 0;
2458
2459           if ((rc = dane_raw_tlsa(s, &r, (char * const *)dd, ddl, 1, 0)))
2460             goto tlsa_prob;
2461
2462           if ((rc = dane_verify_crt_raw(s, certlist, lsize,
2463                             gnutls_certificate_type_get(state->session),
2464                             r, 0,
2465                             usage == DANESSL_USAGE_DANE_EE
2466                             ? DANE_VFLAG_ONLY_CHECK_EE_USAGE : 0,
2467                             &verify)))
2468             {
2469             DEBUG(D_tls)
2470               debug_printf("TLSA record problem: %s\n", dane_strerror(rc));
2471             }
2472           else if (verify == 0) /* verification passed */
2473             {
2474             usage = 1 << usage;
2475             break;
2476             }
2477           }
2478         }
2479
2480         if (rc) goto tlsa_prob;
2481       }
2482     else
2483 # endif
2484       {
2485       if (  (rc = dane_state_init(&s, 0))
2486          || (rc = dane_raw_tlsa(s, &r, state->dane_data, state->dane_data_len,
2487                         1, 0))
2488          || (rc = dane_verify_crt_raw(s, certlist, lsize,
2489                         gnutls_certificate_type_get(state->session),
2490                         r, 0,
2491 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
2492                         usage == (1 << DANESSL_USAGE_DANE_EE)
2493                         ? DANE_VFLAG_ONLY_CHECK_EE_USAGE : 0,
2494 # else
2495                         0,
2496 # endif
2497                         &verify))
2498          )
2499         goto tlsa_prob;
2500       }
2501
2502     if (verify != 0)            /* verification failed */
2503       {
2504       gnutls_datum_t str;
2505       (void) dane_verification_status_print(verify, &str, 0);
2506       *errstr = US str.data;    /* don't bother to free */
2507       goto badcert;
2508       }
2509
2510 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
2511     /* If a TA-mode TLSA record was used for verification we must additionally
2512     verify the cert name (but not the CA chain).  For EE-mode, skip it. */
2513
2514     if (usage & (1 << DANESSL_USAGE_DANE_EE))
2515 # endif
2516       {
2517       state->peer_dane_verified = state->peer_cert_verified = TRUE;
2518       goto goodcert;
2519       }
2520 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
2521     /* Assume that the name on the A-record is the one that should be matching
2522     the cert.  An alternate view is that the domain part of the email address
2523     is also permissible. */
2524
2525     if (gnutls_x509_crt_check_hostname(state->tlsp->peercert,
2526           CS state->host->name))
2527       {
2528       state->peer_dane_verified = state->peer_cert_verified = TRUE;
2529       goto goodcert;
2530       }
2531 # endif
2532     }
2533 #endif  /*SUPPORT_DANE*/
2534
2535   rc = gnutls_certificate_verify_peers2(state->session, &verify);
2536   }
2537
2538 /* Handle the result of verification. INVALID is set if any others are. */
2539
2540 if (rc < 0 || verify & (GNUTLS_CERT_INVALID|GNUTLS_CERT_REVOKED))
2541   {
2542   state->peer_cert_verified = FALSE;
2543   if (!*errstr)
2544     {
2545 #ifdef GNUTLS_CERT_VFY_STATUS_PRINT
2546     DEBUG(D_tls)
2547       {
2548       gnutls_datum_t txt;
2549
2550       if (gnutls_certificate_verification_status_print(verify,
2551             gnutls_certificate_type_get(state->session), &txt, 0)
2552           == GNUTLS_E_SUCCESS)
2553         {
2554         debug_printf("%s\n", txt.data);
2555         gnutls_free(txt.data);
2556         }
2557       }
2558 #endif
2559     *errstr = verify & GNUTLS_CERT_REVOKED
2560       ? US"certificate revoked" : US"certificate invalid";
2561     }
2562
2563   DEBUG(D_tls)
2564     debug_printf("TLS certificate verification failed (%s): peerdn=\"%s\"\n",
2565         *errstr, state->peerdn ? state->peerdn : US"<unset>");
2566
2567   if (state->verify_requirement >= VERIFY_REQUIRED)
2568     goto badcert;
2569   DEBUG(D_tls)
2570     debug_printf("TLS verify failure overridden (host in tls_try_verify_hosts)\n");
2571   }
2572
2573 else
2574   {
2575   /* Client side, check the server's certificate name versus the name on the
2576   A-record for the connection we made.  What to do for server side - what name
2577   to use for client?  We document that there is no such checking for server
2578   side. */
2579
2580   if (  state->exp_tls_verify_cert_hostnames
2581      && !gnutls_x509_crt_check_hostname(state->tlsp->peercert,
2582                 CS state->exp_tls_verify_cert_hostnames)
2583      )
2584     {
2585     DEBUG(D_tls)
2586       debug_printf("TLS certificate verification failed: cert name mismatch\n");
2587     if (state->verify_requirement >= VERIFY_REQUIRED)
2588       goto badcert;
2589     return TRUE;
2590     }
2591
2592   state->peer_cert_verified = TRUE;
2593   DEBUG(D_tls) debug_printf("TLS certificate verified: peerdn=\"%s\"\n",
2594       state->peerdn ? state->peerdn : US"<unset>");
2595   }
2596
2597 goodcert:
2598   state->tlsp->peerdn = state->peerdn;
2599   return TRUE;
2600
2601 #ifdef SUPPORT_DANE
2602 tlsa_prob:
2603   *errstr = string_sprintf("TLSA record problem: %s",
2604     rc == DANE_E_REQUESTED_DATA_NOT_AVAILABLE ? "none usable" : dane_strerror(rc));
2605 #endif
2606
2607 badcert:
2608   gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_BAD_CERTIFICATE);
2609   return FALSE;
2610 }
2611
2612
2613
2614
2615 /* ------------------------------------------------------------------------ */
2616 /* Callbacks */
2617
2618 /* Logging function which can be registered with
2619  *   gnutls_global_set_log_function()
2620  *   gnutls_global_set_log_level() 0..9
2621  */
2622 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
2623 static void
2624 exim_gnutls_logger_cb(int level, const char *message)
2625 {
2626   size_t len = strlen(message);
2627   if (len < 1)
2628     {
2629     DEBUG(D_tls) debug_printf("GnuTLS<%d> empty debug message\n", level);
2630     return;
2631     }
2632   DEBUG(D_tls) debug_printf("GnuTLS<%d>: %s%s", level, message,
2633       message[len-1] == '\n' ? "" : "\n");
2634 }
2635 #endif
2636
2637
2638 /* Called after client hello, should handle SNI work.
2639 This will always set tls_sni (state->received_sni) if available,
2640 and may trigger presenting different certificates,
2641 if state->trigger_sni_changes is TRUE.
2642
2643 Should be registered with
2644   gnutls_handshake_set_post_client_hello_function()
2645
2646 "This callback must return 0 on success or a gnutls error code to terminate the
2647 handshake.".
2648
2649 For inability to get SNI information, we return 0.
2650 We only return non-zero if re-setup failed.
2651 Only used for server-side TLS.
2652 */
2653
2654 static int
2655 exim_sni_handling_cb(gnutls_session_t session)
2656 {
2657 char sni_name[MAX_HOST_LEN];
2658 size_t data_len = MAX_HOST_LEN;
2659 exim_gnutls_state_st *state = &state_server;
2660 unsigned int sni_type;
2661 int rc, old_pool;
2662 uschar * dummy_errstr;
2663
2664 rc = gnutls_server_name_get(session, sni_name, &data_len, &sni_type, 0);
2665 if (rc != GNUTLS_E_SUCCESS)
2666   {
2667   DEBUG(D_tls)
2668     if (rc == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
2669       debug_printf("TLS: no SNI presented in handshake\n");
2670     else
2671       debug_printf("TLS failure: gnutls_server_name_get(): %s [%d]\n",
2672         gnutls_strerror(rc), rc);
2673   return 0;
2674   }
2675
2676 if (sni_type != GNUTLS_NAME_DNS)
2677   {
2678   DEBUG(D_tls) debug_printf("TLS: ignoring SNI of unhandled type %u\n", sni_type);
2679   return 0;
2680   }
2681
2682 /* We now have a UTF-8 string in sni_name */
2683 old_pool = store_pool;
2684 store_pool = POOL_PERM;
2685 state->received_sni = string_copy_taint(US sni_name, GET_TAINTED);
2686 store_pool = old_pool;
2687
2688 /* We set this one now so that variable expansions below will work */
2689 state->tlsp->sni = state->received_sni;
2690
2691 DEBUG(D_tls) debug_printf("Received TLS SNI \"%s\"%s\n", sni_name,
2692     state->trigger_sni_changes ? "" : " (unused for certificate selection)");
2693
2694 if (!state->trigger_sni_changes)
2695   return 0;
2696
2697 if ((rc = tls_expand_session_files(state, &dummy_errstr)) != OK)
2698   {
2699   /* If the setup of certs/etc failed before handshake, TLS would not have
2700   been offered.  The best we can do now is abort. */
2701   return GNUTLS_E_APPLICATION_ERROR_MIN;
2702   }
2703
2704 rc = tls_set_remaining_x509(state, &dummy_errstr);
2705 if (rc != OK) return GNUTLS_E_APPLICATION_ERROR_MIN;
2706
2707 return 0;
2708 }
2709
2710
2711
2712 #ifndef DISABLE_EVENT
2713 /*
2714 We use this callback to get observability and detail-level control
2715 for an exim TLS connection (either direction), raising a tls:cert event
2716 for each cert in the chain presented by the peer.  Any event
2717 can deny verification.
2718
2719 Return 0 for the handshake to continue or non-zero to terminate.
2720 */
2721
2722 static int
2723 verify_cb(gnutls_session_t session)
2724 {
2725 const gnutls_datum_t * cert_list;
2726 unsigned int cert_list_size = 0;
2727 gnutls_x509_crt_t crt;
2728 int rc;
2729 uschar * yield;
2730 exim_gnutls_state_st * state = gnutls_session_get_ptr(session);
2731
2732 if ((cert_list = gnutls_certificate_get_peers(session, &cert_list_size)))
2733   while (cert_list_size--)
2734   {
2735   if ((rc = import_cert(&cert_list[cert_list_size], &crt)) != GNUTLS_E_SUCCESS)
2736     {
2737     DEBUG(D_tls) debug_printf("TLS: peer cert problem: depth %d: %s\n",
2738       cert_list_size, gnutls_strerror(rc));
2739     break;
2740     }
2741
2742   state->tlsp->peercert = crt;
2743   if ((yield = event_raise(state->event_action,
2744               US"tls:cert", string_sprintf("%d", cert_list_size), &errno)))
2745     {
2746     log_write(0, LOG_MAIN,
2747               "SSL verify denied by event-action: depth=%d: %s",
2748               cert_list_size, yield);
2749     return 1;                     /* reject */
2750     }
2751   state->tlsp->peercert = NULL;
2752   }
2753
2754 return 0;
2755 }
2756
2757 #endif
2758
2759
2760 static gstring *
2761 ddump(gnutls_datum_t * d)
2762 {
2763 gstring * g = string_get((d->size+1) * 2);
2764 uschar * s = d->data;
2765 for (unsigned i = d->size; i > 0; i--, s++)
2766   {
2767   g = string_catn(g, US "0123456789abcdef" + (*s >> 4), 1);
2768   g = string_catn(g, US "0123456789abcdef" + (*s & 0xf), 1);
2769   }
2770 return g;
2771 }
2772
2773 static void
2774 post_handshake_debug(exim_gnutls_state_st * state)
2775 {
2776 #ifdef SUPPORT_GNUTLS_SESS_DESC
2777 debug_printf("%s\n", gnutls_session_get_desc(state->session));
2778 #endif
2779
2780 #ifdef SUPPORT_GNUTLS_KEYLOG
2781 # ifdef EXIM_HAVE_TLS1_3
2782 if (gnutls_protocol_get_version(state->session) < GNUTLS_TLS1_3)
2783 # else
2784 if (TRUE)
2785 # endif
2786   {
2787   gnutls_datum_t c, s;
2788   gstring * gc, * gs;
2789   /* For TLS1.2 we only want the client random and the master secret */
2790   gnutls_session_get_random(state->session, &c, &s);
2791   gnutls_session_get_master_secret(state->session, &s);
2792   gc = ddump(&c);
2793   gs = ddump(&s);
2794   debug_printf("CLIENT_RANDOM %.*s %.*s\n", (int)gc->ptr, gc->s, (int)gs->ptr, gs->s);
2795   }
2796 else
2797   debug_printf("To get keying info for TLS1.3 is hard:\n"
2798     " Set environment variable SSLKEYLOGFILE to a filename relative to the spool directory,\n"
2799     " and make sure it is writable by the Exim runtime user.\n"
2800     " Add SSLKEYLOGFILE to keep_environment in the exim config.\n"
2801     " Start Exim as root.\n"
2802     " If using sudo, add SSLKEYLOGFILE to env_keep in /etc/sudoers\n"
2803     " (works for TLS1.2 also, and saves cut-paste into file).\n"
2804     " Trying to use add_environment for this will not work\n");
2805 #endif
2806 }
2807
2808
2809 #ifdef EXIM_HAVE_TLS_RESUME
2810 static int
2811 tls_server_ticket_cb(gnutls_session_t sess, u_int htype, unsigned when,
2812   unsigned incoming, const gnutls_datum_t * msg)
2813 {
2814 DEBUG(D_tls) debug_printf("newticket cb\n");
2815 tls_in.resumption |= RESUME_CLIENT_REQUESTED;
2816 return 0;
2817 }
2818
2819 static void
2820 tls_server_resume_prehandshake(exim_gnutls_state_st * state)
2821 {
2822 /* Should the server offer session resumption? */
2823 tls_in.resumption = RESUME_SUPPORTED;
2824 if (verify_check_host(&tls_resumption_hosts) == OK)
2825   {
2826   int rc;
2827   /* GnuTLS appears to not do ticket overlap, but does emit a fresh ticket when
2828   an offered resumption is unacceptable.  We lose one resumption per ticket
2829   lifetime, and sessions cannot be indefinitely re-used.  There seems to be no
2830   way (3.6.7) of changing the default number of 2 TLS1.3 tickets issued, but at
2831   least they go out in a single packet. */
2832
2833   if (!(rc = gnutls_session_ticket_enable_server(state->session,
2834               &server_sessticket_key)))
2835     tls_in.resumption |= RESUME_SERVER_TICKET;
2836   else
2837     DEBUG(D_tls)
2838       debug_printf("enabling session tickets: %s\n", US gnutls_strerror(rc));
2839
2840   /* Try to tell if we see a ticket request */
2841   gnutls_handshake_set_hook_function(state->session,
2842     GNUTLS_HANDSHAKE_ANY, GNUTLS_HOOK_POST, tls_server_hook_cb);
2843   }
2844 }
2845
2846 static void
2847 tls_server_resume_posthandshake(exim_gnutls_state_st * state)
2848 {
2849 if (gnutls_session_resumption_requested(state->session))
2850   {
2851   /* This tells us the client sent a full ticket.  We use a
2852   callback on session-ticket request, elsewhere, to tell
2853   if a client asked for a ticket. */
2854
2855   tls_in.resumption |= RESUME_CLIENT_SUGGESTED;
2856   DEBUG(D_tls) debug_printf("client requested resumption\n");
2857   }
2858 if (gnutls_session_is_resumed(state->session))
2859   {
2860   tls_in.resumption |= RESUME_USED;
2861   DEBUG(D_tls) debug_printf("Session resumed\n");
2862   }
2863 }
2864 #endif  /* EXIM_HAVE_TLS_RESUME */
2865
2866
2867 #ifdef EXIM_HAVE_ALPN
2868 /* Expand and convert an Exim list to a gnutls_datum list.  False return for fail.
2869 NULL plist return for silent no-ALPN.
2870 */
2871
2872 static BOOL
2873 tls_alpn_plist(uschar ** tls_alpn, const gnutls_datum_t ** plist, unsigned * plen,
2874   uschar ** errstr)
2875 {
2876 uschar * exp_alpn;
2877
2878 if (!expand_check(*tls_alpn, US"tls_alpn", &exp_alpn, errstr))
2879   return FALSE;
2880
2881 if (!exp_alpn)
2882   {
2883   DEBUG(D_tls) debug_printf("Setting TLS ALPN forced to fail, not sending\n");
2884   *plist = NULL;
2885   }
2886 else
2887   {
2888   const uschar * list = exp_alpn;
2889   int sep = 0;
2890   unsigned cnt = 0;
2891   gnutls_datum_t * p;
2892   uschar * s;
2893
2894   while (string_nextinlist(&list, &sep, NULL, 0)) cnt++;
2895
2896   p = store_get(sizeof(gnutls_datum_t) * cnt, exp_alpn);
2897   list = exp_alpn;
2898   for (int i = 0; s = string_nextinlist(&list, &sep, NULL, 0); i++)
2899     { p[i].data = s; p[i].size = Ustrlen(s); }
2900   *plist = (*plen = cnt) ? p : NULL;
2901   }
2902 return TRUE;
2903 }
2904
2905 static void
2906 tls_server_set_acceptable_alpns(exim_gnutls_state_st * state, uschar ** errstr)
2907 {
2908 uschar * local_alpn = string_copy(tls_alpn);
2909 int rc;
2910 const gnutls_datum_t * plist;
2911 unsigned plen;
2912
2913 if (tls_alpn_plist(&local_alpn, &plist, &plen, errstr) && plist)
2914   {
2915   /* This seems to be only mandatory if the client sends an ALPN extension;
2916   not trying ALPN is ok. Need to decide how to support server-side must-alpn. */
2917
2918   server_seen_alpn = 0;
2919   if (!(rc = gnutls_alpn_set_protocols(state->session, plist, plen,
2920                                         GNUTLS_ALPN_MANDATORY)))
2921     gnutls_handshake_set_hook_function(state->session,
2922       GNUTLS_HANDSHAKE_ANY, GNUTLS_HOOK_POST, tls_server_hook_cb);
2923   else
2924     DEBUG(D_tls)
2925       debug_printf("setting alpn protocols: %s\n", US gnutls_strerror(rc));
2926   }
2927 }
2928 #endif  /* EXIM_HAVE_ALPN */
2929
2930 /* ------------------------------------------------------------------------ */
2931 /* Exported functions */
2932
2933
2934
2935
2936 /*************************************************
2937 *       Start a TLS session in a server          *
2938 *************************************************/
2939
2940 /* This is called when Exim is running as a server, after having received
2941 the STARTTLS command. It must respond to that command, and then negotiate
2942 a TLS session.
2943
2944 Arguments:
2945   errstr           pointer to error string
2946
2947 Returns:           OK on success
2948                    DEFER for errors before the start of the negotiation
2949                    FAIL for errors during the negotiation; the server can't
2950                      continue running.
2951 */
2952
2953 int
2954 tls_server_start(uschar ** errstr)
2955 {
2956 int rc;
2957 exim_gnutls_state_st * state = NULL;
2958
2959 /* Check for previous activation */
2960 if (tls_in.active.sock >= 0)
2961   {
2962   tls_error(US"STARTTLS received after TLS started", US "", NULL, errstr);
2963   smtp_printf("554 Already in TLS\r\n", FALSE);
2964   return FAIL;
2965   }
2966
2967 /* Initialize the library. If it fails, it will already have logged the error
2968 and sent an SMTP response. */
2969
2970 DEBUG(D_tls) debug_printf("initialising GnuTLS as a server\n");
2971
2972   {
2973 #ifdef MEASURE_TIMING
2974   struct timeval t0;
2975   gettimeofday(&t0, NULL);
2976 #endif
2977
2978   if ((rc = tls_init(NULL, NULL,
2979       tls_require_ciphers, &state, &tls_in, errstr)) != OK) return rc;
2980
2981 #ifdef MEASURE_TIMING
2982   report_time_since(&t0, US"server tls_init (delta)");
2983 #endif
2984   }
2985
2986 #ifdef EXIM_HAVE_ALPN
2987 tls_server_set_acceptable_alpns(state, errstr);
2988 #endif
2989
2990 #ifdef EXIM_HAVE_TLS_RESUME
2991 tls_server_resume_prehandshake(state);
2992 #endif
2993
2994 /* If this is a host for which certificate verification is mandatory or
2995 optional, set up appropriately. */
2996
2997 if (verify_check_host(&tls_verify_hosts) == OK)
2998   {
2999   DEBUG(D_tls)
3000     debug_printf("TLS: a client certificate will be required\n");
3001   state->verify_requirement = VERIFY_REQUIRED;
3002   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
3003   }
3004 else if (verify_check_host(&tls_try_verify_hosts) == OK)
3005   {
3006   DEBUG(D_tls)
3007     debug_printf("TLS: a client certificate will be requested but not required\n");
3008   state->verify_requirement = VERIFY_OPTIONAL;
3009   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
3010   }
3011 else
3012   {
3013   DEBUG(D_tls)
3014     debug_printf("TLS: a client certificate will not be requested\n");
3015   state->verify_requirement = VERIFY_NONE;
3016   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
3017   }
3018
3019 #ifndef DISABLE_EVENT
3020 if (event_action)
3021   {
3022   state->event_action = event_action;
3023   gnutls_session_set_ptr(state->session, state);
3024   gnutls_certificate_set_verify_function(state->lib_state.x509_cred, verify_cb);
3025   }
3026 #endif
3027
3028 /* Register SNI handling; always, even if not in tls_certificate, so that the
3029 expansion variable $tls_sni is always available. */
3030
3031 gnutls_handshake_set_post_client_hello_function(state->session,
3032     exim_sni_handling_cb);
3033
3034 /* Set context and tell client to go ahead, except in the case of TLS startup
3035 on connection, where outputting anything now upsets the clients and tends to
3036 make them disconnect. We need to have an explicit fflush() here, to force out
3037 the response. Other smtp_printf() calls do not need it, because in non-TLS
3038 mode, the fflush() happens when smtp_getc() is called. */
3039
3040 if (!state->tlsp->on_connect)
3041   {
3042   smtp_printf("220 TLS go ahead\r\n", FALSE);
3043   fflush(smtp_out);
3044   }
3045
3046 /* Now negotiate the TLS session. We put our own timer on it, since it seems
3047 that the GnuTLS library doesn't.
3048 From 3.1.0 there is gnutls_handshake_set_timeout() - but it requires you
3049 to set (and clear down afterwards) up a pull-timeout callback function that does
3050 a select, so we're no better off unless avoiding signals becomes an issue. */
3051
3052 gnutls_transport_set_ptr2(state->session,
3053     (gnutls_transport_ptr_t)(long) fileno(smtp_in),
3054     (gnutls_transport_ptr_t)(long) fileno(smtp_out));
3055 state->fd_in = fileno(smtp_in);
3056 state->fd_out = fileno(smtp_out);
3057
3058 sigalrm_seen = FALSE;
3059 if (smtp_receive_timeout > 0) ALARM(smtp_receive_timeout);
3060 do
3061   rc = gnutls_handshake(state->session);
3062 while (rc == GNUTLS_E_AGAIN ||  rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen);
3063 ALARM_CLR(0);
3064
3065 if (rc != GNUTLS_E_SUCCESS)
3066   {
3067   DEBUG(D_tls) debug_printf(" error %d from gnutls_handshake: %s\n",
3068     rc, gnutls_strerror(rc));
3069
3070   /* It seems that, except in the case of a timeout, we have to close the
3071   connection right here; otherwise if the other end is running OpenSSL it hangs
3072   until the server times out. */
3073
3074   if (sigalrm_seen)
3075     {
3076     tls_error(US"gnutls_handshake", US"timed out", NULL, errstr);
3077 #ifndef DISABLE_EVENT
3078     (void) event_raise(event_action, US"tls:fail:connect", *errstr, NULL);
3079 #endif
3080     gnutls_db_remove_session(state->session);
3081     }
3082   else
3083     {
3084     tls_error_gnu(state, US"gnutls_handshake", rc, errstr);
3085 #ifndef DISABLE_EVENT
3086     (void) event_raise(event_action, US"tls:fail:connect", *errstr, NULL);
3087 #endif
3088     (void) gnutls_alert_send_appropriate(state->session, rc);
3089     gnutls_deinit(state->session);
3090     millisleep(500);
3091     shutdown(state->fd_out, SHUT_WR);
3092     for (int i = 1024; fgetc(smtp_in) != EOF && i > 0; ) i--;   /* drain skt */
3093     (void)fclose(smtp_out);
3094     (void)fclose(smtp_in);
3095     smtp_out = smtp_in = NULL;
3096     }
3097
3098   return FAIL;
3099   }
3100
3101 #ifdef GNUTLS_SFLAGS_EXT_MASTER_SECRET
3102 if (gnutls_session_get_flags(state->session) & GNUTLS_SFLAGS_EXT_MASTER_SECRET)
3103   tls_in.ext_master_secret = TRUE;
3104 #endif
3105
3106 #ifdef EXIM_HAVE_TLS_RESUME
3107 tls_server_resume_posthandshake(state);
3108 #endif
3109
3110 DEBUG(D_tls) post_handshake_debug(state);
3111
3112 #ifdef EXIM_HAVE_ALPN
3113 if (server_seen_alpn > 0)
3114   {
3115   DEBUG(D_tls)
3116     {           /* The client offered ALPN.  See what was negotiated. */
3117     gnutls_datum_t p = {.size = 0};
3118     int rc = gnutls_alpn_get_selected_protocol(state->session, &p);
3119     if (!rc)
3120         debug_printf("ALPN negotiated: %.*s\n", (int)p.size, p.data);
3121     else
3122         debug_printf("getting alpn protocol: %s\n", US gnutls_strerror(rc));
3123
3124     }
3125   }
3126 else if (server_seen_alpn == 0)
3127   if (verify_check_host(&hosts_require_alpn) == OK)
3128     {
3129     gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_NO_APPLICATION_PROTOCOL);
3130     tls_error(US"handshake", US"ALPN required but not negotiated", NULL, errstr);
3131     return FAIL;
3132     }
3133   else
3134     DEBUG(D_tls) debug_printf("TLS: no ALPN presented in handshake\n");
3135 else
3136   DEBUG(D_tls) debug_printf("TLS: was not watching for ALPN\n");
3137 #endif
3138
3139 /* Verify after the fact */
3140
3141 if (!verify_certificate(state, errstr))
3142   {
3143   if (state->verify_requirement != VERIFY_OPTIONAL)
3144     {
3145     (void) tls_error(US"certificate verification failed", *errstr, NULL, errstr);
3146     return FAIL;
3147     }
3148   DEBUG(D_tls)
3149     debug_printf("TLS: continuing on only because verification was optional, after: %s\n",
3150         *errstr);
3151   }
3152
3153 /* Sets various Exim expansion variables; always safe within server */
3154
3155 extract_exim_vars_from_tls_state(state);
3156
3157 /* TLS has been set up. Adjust the input functions to read via TLS,
3158 and initialize appropriately. */
3159
3160 state->xfer_buffer = store_malloc(ssl_xfer_buffer_size);
3161
3162 receive_getc = tls_getc;
3163 receive_getbuf = tls_getbuf;
3164 receive_get_cache = tls_get_cache;
3165 receive_hasc = tls_hasc;
3166 receive_ungetc = tls_ungetc;
3167 receive_feof = tls_feof;
3168 receive_ferror = tls_ferror;
3169
3170 return OK;
3171 }
3172
3173
3174
3175
3176 static void
3177 tls_client_setup_hostname_checks(host_item * host, exim_gnutls_state_st * state,
3178   smtp_transport_options_block * ob)
3179 {
3180 if (verify_check_given_host(CUSS &ob->tls_verify_cert_hostnames, host) == OK)
3181   {
3182   state->exp_tls_verify_cert_hostnames =
3183 #ifdef SUPPORT_I18N
3184     string_domain_utf8_to_alabel(host->certname, NULL);
3185 #else
3186     host->certname;
3187 #endif
3188   DEBUG(D_tls)
3189     debug_printf("TLS: server cert verification includes hostname: \"%s\"\n",
3190                     state->exp_tls_verify_cert_hostnames);
3191   }
3192 }
3193
3194
3195
3196
3197 #ifdef SUPPORT_DANE
3198 /* Given our list of RRs from the TLSA lookup, build a lookup block in
3199 GnuTLS-DANE's preferred format.  Hang it on the state str for later
3200 use in DANE verification.
3201
3202 We point at the dnsa data not copy it, so it must remain valid until
3203 after verification is done.*/
3204
3205 static BOOL
3206 dane_tlsa_load(exim_gnutls_state_st * state, dns_answer * dnsa)
3207 {
3208 dns_scan dnss;
3209 int i;
3210 const char **   dane_data;
3211 int *           dane_data_len;
3212
3213 i = 1;
3214 for (dns_record * rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS); rr;
3215      rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)
3216     ) if (rr->type == T_TLSA) i++;
3217
3218 dane_data = store_get(i * sizeof(uschar *), GET_UNTAINTED);
3219 dane_data_len = store_get(i * sizeof(int), GET_UNTAINTED);
3220
3221 i = 0;
3222 for (dns_record * rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS); rr;
3223      rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)
3224     ) if (rr->type == T_TLSA && rr->size > 3)
3225   {
3226   const uschar * p = rr->data;
3227 /*XXX need somehow to mark rr and its data as tainted.  Doues this mean copying it? */
3228   uint8_t usage = p[0], sel = p[1], type = p[2];
3229
3230   DEBUG(D_tls)
3231     debug_printf("TLSA: %d %d %d size %d\n", usage, sel, type, rr->size);
3232
3233   if (  (usage != DANESSL_USAGE_DANE_TA && usage != DANESSL_USAGE_DANE_EE)
3234      || (sel != 0 && sel != 1)
3235      )
3236     continue;
3237   switch(type)
3238     {
3239     case 0:     /* Full: cannot check at present */
3240                 break;
3241     case 1:     if (rr->size != 3 + 256/8) continue;    /* sha2-256 */
3242                 break;
3243     case 2:     if (rr->size != 3 + 512/8) continue;    /* sha2-512 */
3244                 break;
3245     default:    continue;
3246     }
3247
3248   tls_out.tlsa_usage |= 1<<usage;
3249   dane_data[i] = CS p;
3250   dane_data_len[i++] = rr->size;
3251   }
3252
3253 if (!i) return FALSE;
3254
3255 dane_data[i] = NULL;
3256 dane_data_len[i] = 0;
3257
3258 state->dane_data = (char * const *)dane_data;
3259 state->dane_data_len = dane_data_len;
3260 return TRUE;
3261 }
3262 #endif
3263
3264
3265
3266 #ifdef EXIM_HAVE_TLS_RESUME
3267 /* On the client, get any stashed session for the given IP from hints db
3268 and apply it to the ssl-connection for attempted resumption.  Although
3269 there is a gnutls_session_ticket_enable_client() interface it is
3270 documented as unnecessary (as of 3.6.7) as "session tickets are emabled
3271 by deafult".  There seems to be no way to disable them, so even hosts not
3272 enabled by the transport option will be sent a ticket request.  We will
3273 however avoid storing and retrieving session information. */
3274
3275 static void
3276 tls_retrieve_session(tls_support * tlsp, gnutls_session_t session,
3277   smtp_connect_args * conn_args, smtp_transport_options_block * ob)
3278 {
3279 tlsp->resumption = RESUME_SUPPORTED;
3280 if (verify_check_given_host(CUSS &ob->tls_resumption_hosts, conn_args->host) == OK)
3281   {
3282   dbdata_tls_session * dt;
3283   int len, rc;
3284   open_db dbblock, * dbm_file;
3285
3286   tlsp->host_resumable = TRUE;
3287   tls_client_resmption_key(tlsp, conn_args, ob);
3288
3289   tlsp->resumption |= RESUME_CLIENT_REQUESTED;
3290   if ((dbm_file = dbfn_open(US"tls", O_RDONLY, &dbblock, FALSE, FALSE)))
3291     {
3292     /* We'd like to filter the retrieved session for ticket advisory expiry,
3293     but 3.6.1 seems to give no access to that */
3294
3295     if ((dt = dbfn_read_with_length(dbm_file, tlsp->resume_index, &len)))
3296       if (!(rc = gnutls_session_set_data(session,
3297                     CUS dt->session, (size_t)len - sizeof(dbdata_tls_session))))
3298         {
3299         DEBUG(D_tls) debug_printf("good session\n");
3300         tlsp->resumption |= RESUME_CLIENT_SUGGESTED;
3301         }
3302       else DEBUG(D_tls) debug_printf("setting session resumption data: %s\n",
3303             US gnutls_strerror(rc));
3304     dbfn_close(dbm_file);
3305     }
3306   }
3307 }
3308
3309
3310 static void
3311 tls_save_session(tls_support * tlsp, gnutls_session_t session, const host_item * host)
3312 {
3313 /* TLS 1.2 - we get both the callback and the direct posthandshake call,
3314 but this flag is not set until the second.  TLS 1.3 it's the other way about.
3315 Keep both calls as the session data cannot be extracted before handshake
3316 completes. */
3317
3318 if (gnutls_session_get_flags(session) & GNUTLS_SFLAGS_SESSION_TICKET)
3319   {
3320   gnutls_datum_t tkt;
3321   int rc;
3322
3323   DEBUG(D_tls) debug_printf("server offered session ticket\n");
3324   tlsp->ticket_received = TRUE;
3325   tlsp->resumption |= RESUME_SERVER_TICKET;
3326
3327   if (tlsp->host_resumable)
3328     if (!(rc = gnutls_session_get_data2(session, &tkt)))
3329       {
3330       open_db dbblock, * dbm_file;
3331       int dlen = sizeof(dbdata_tls_session) + tkt.size;
3332       dbdata_tls_session * dt = store_get(dlen, GET_TAINTED);
3333
3334       DEBUG(D_tls) debug_printf("session data size %u\n", (unsigned)tkt.size);
3335       memcpy(dt->session, tkt.data, tkt.size);
3336       gnutls_free(tkt.data);
3337
3338       if ((dbm_file = dbfn_open(US"tls", O_RDWR, &dbblock, FALSE, FALSE)))
3339         {
3340         /* key for the db is the IP */
3341         dbfn_write(dbm_file, tlsp->resume_index, dt, dlen);
3342         dbfn_close(dbm_file);
3343
3344         DEBUG(D_tls)
3345           debug_printf("wrote session db (len %u)\n", (unsigned)dlen);
3346         }
3347       }
3348     else DEBUG(D_tls)
3349       debug_printf("extract session data: %s\n", US gnutls_strerror(rc));
3350   }
3351 }
3352
3353
3354 /* With a TLS1.3 session, the ticket(s) are not seen until
3355 the first data read is attempted.  And there's often two of them.
3356 Pick them up with this callback.  We are also called for 1.2
3357 but we do nothing.
3358 */
3359 static int
3360 tls_client_ticket_cb(gnutls_session_t sess, u_int htype, unsigned when,
3361   unsigned incoming, const gnutls_datum_t * msg)
3362 {
3363 exim_gnutls_state_st * state = gnutls_session_get_ptr(sess);
3364 tls_support * tlsp = state->tlsp;
3365
3366 DEBUG(D_tls) debug_printf("newticket cb\n");
3367
3368 if (!tlsp->ticket_received)
3369   tls_save_session(tlsp, sess, state->host);
3370 return 0;
3371 }
3372
3373
3374 static void
3375 tls_client_resume_prehandshake(exim_gnutls_state_st * state,
3376   tls_support * tlsp, smtp_connect_args * conn_args,
3377   smtp_transport_options_block * ob)
3378 {
3379 gnutls_session_set_ptr(state->session, state);
3380 gnutls_handshake_set_hook_function(state->session,
3381   GNUTLS_HANDSHAKE_NEW_SESSION_TICKET, GNUTLS_HOOK_POST, tls_client_ticket_cb);
3382
3383 tls_retrieve_session(tlsp, state->session, conn_args, ob);
3384 }
3385
3386 static void
3387 tls_client_resume_posthandshake(exim_gnutls_state_st * state,
3388   tls_support * tlsp, host_item * host)
3389 {
3390 if (gnutls_session_is_resumed(state->session))
3391   {
3392   DEBUG(D_tls) debug_printf("Session resumed\n");
3393   tlsp->resumption |= RESUME_USED;
3394   }
3395
3396 tls_save_session(tlsp, state->session, host);
3397 }
3398 #endif  /* !DISABLE_TLS_RESUME */
3399
3400
3401 /*************************************************
3402 *    Start a TLS session in a client             *
3403 *************************************************/
3404
3405 /* Called from the smtp transport after STARTTLS has been accepted.
3406
3407 Arguments:
3408   cctx          connection context
3409   conn_args     connection details
3410   cookie        datum for randomness (not used)
3411   tlsp          record details of channel configuration here; must be non-NULL
3412   errstr        error string pointer
3413
3414 Returns:        TRUE for success with TLS session context set in smtp context,
3415                 FALSE on error
3416 */
3417
3418 BOOL
3419 tls_client_start(client_conn_ctx * cctx, smtp_connect_args * conn_args,
3420   void * cookie ARG_UNUSED,
3421   tls_support * tlsp, uschar ** errstr)
3422 {
3423 host_item * host = conn_args->host;          /* for msgs and option-tests */
3424 transport_instance * tb = conn_args->tblock; /* always smtp or NULL */
3425 smtp_transport_options_block * ob = tb
3426   ? (smtp_transport_options_block *)tb->options_block
3427   : &smtp_transport_option_defaults;
3428 int rc;
3429 exim_gnutls_state_st * state = NULL;
3430 uschar * cipher_list = NULL;
3431
3432 #ifndef DISABLE_OCSP
3433 BOOL require_ocsp =
3434   verify_check_given_host(CUSS &ob->hosts_require_ocsp, host) == OK;
3435 BOOL request_ocsp = require_ocsp ? TRUE
3436   : verify_check_given_host(CUSS &ob->hosts_request_ocsp, host) == OK;
3437 #endif
3438
3439 DEBUG(D_tls) debug_printf("initialising GnuTLS as a client on fd %d\n", cctx->sock);
3440
3441 #ifdef SUPPORT_DANE
3442 /* If dane is flagged, have either request or require dane for this host, and
3443 a TLSA record found.  Therefore, dane verify required.  Which implies cert must
3444 be requested and supplied, dane verify must pass, and cert verify irrelevant
3445 (incl.  hostnames), and (caller handled) require_tls and sni=$domain */
3446
3447 if (conn_args->dane && ob->dane_require_tls_ciphers)
3448   {
3449   /* not using Expand_check_tlsvar because not yet in state */
3450   if (!expand_check(ob->dane_require_tls_ciphers, US"dane_require_tls_ciphers",
3451       &cipher_list, errstr))
3452     return FALSE;
3453   cipher_list = cipher_list && *cipher_list
3454     ? ob->dane_require_tls_ciphers : ob->tls_require_ciphers;
3455   }
3456 #endif
3457
3458 if (!cipher_list)
3459   cipher_list = ob->tls_require_ciphers;
3460
3461   {
3462 #ifdef MEASURE_TIMING
3463   struct timeval t0;
3464   gettimeofday(&t0, NULL);
3465 #endif
3466
3467   if (tls_init(host, ob, cipher_list, &state, tlsp, errstr) != OK)
3468     return FALSE;
3469
3470 #ifdef MEASURE_TIMING
3471   report_time_since(&t0, US"client tls_init (delta)");
3472 #endif
3473   }
3474
3475 if (ob->tls_alpn)
3476 #ifdef EXIM_HAVE_ALPN
3477   {
3478   const gnutls_datum_t * plist;
3479   unsigned plen;
3480
3481   if (!tls_alpn_plist(&ob->tls_alpn, &plist, &plen, errstr))
3482     return FALSE;
3483   if (plist)
3484     if (gnutls_alpn_set_protocols(state->session, plist, plen, 0) != 0)
3485       {
3486       tls_error(US"alpn init", NULL, state->host, errstr);
3487       return FALSE;
3488       }
3489     else
3490       DEBUG(D_tls) debug_printf("Setting TLS ALPN '%s'\n", ob->tls_alpn);
3491   }
3492 #else
3493   log_write(0, LOG_MAIN, "ALPN unusable with this GnuTLS library version; ignoring \"%s\"\n",
3494           ob->tls_alpn);
3495 #endif
3496
3497   {
3498   int dh_min_bits = ob->tls_dh_min_bits;
3499   if (dh_min_bits < EXIM_CLIENT_DH_MIN_MIN_BITS)
3500     {
3501     DEBUG(D_tls)
3502       debug_printf("WARNING: tls_dh_min_bits far too low,"
3503                     " clamping %d up to %d\n",
3504           dh_min_bits, EXIM_CLIENT_DH_MIN_MIN_BITS);
3505     dh_min_bits = EXIM_CLIENT_DH_MIN_MIN_BITS;
3506     }
3507
3508   DEBUG(D_tls) debug_printf("Setting D-H prime minimum"
3509                     " acceptable bits to %d\n",
3510       dh_min_bits);
3511   gnutls_dh_set_prime_bits(state->session, dh_min_bits);
3512   }
3513
3514 /* Stick to the old behaviour for compatibility if tls_verify_certificates is
3515 set but both tls_verify_hosts and tls_try_verify_hosts are unset. Check only
3516 the specified host patterns if one of them is defined */
3517
3518 #ifdef SUPPORT_DANE
3519 if (conn_args->dane && dane_tlsa_load(state, &conn_args->tlsa_dnsa))
3520   {
3521   DEBUG(D_tls)
3522     debug_printf("TLS: server certificate DANE required\n");
3523   state->verify_requirement = VERIFY_DANE;
3524   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
3525   }
3526 else
3527 #endif
3528     if (  (  state->exp_tls_verify_certificates
3529           && !ob->tls_verify_hosts
3530           && (!ob->tls_try_verify_hosts || !*ob->tls_try_verify_hosts)
3531           )
3532         || verify_check_given_host(CUSS &ob->tls_verify_hosts, host) == OK
3533        )
3534   {
3535   tls_client_setup_hostname_checks(host, state, ob);
3536   DEBUG(D_tls)
3537     debug_printf("TLS: server certificate verification required\n");
3538   state->verify_requirement = VERIFY_REQUIRED;
3539   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
3540   }
3541 else if (verify_check_given_host(CUSS &ob->tls_try_verify_hosts, host) == OK)
3542   {
3543   tls_client_setup_hostname_checks(host, state, ob);
3544   DEBUG(D_tls)
3545     debug_printf("TLS: server certificate verification optional\n");
3546   state->verify_requirement = VERIFY_OPTIONAL;
3547   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
3548   }
3549 else
3550   {
3551   DEBUG(D_tls)
3552     debug_printf("TLS: server certificate verification not required\n");
3553   state->verify_requirement = VERIFY_NONE;
3554   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
3555   }
3556
3557 #ifndef DISABLE_OCSP
3558                         /* supported since GnuTLS 3.1.3 */
3559 if (request_ocsp)
3560   {
3561   DEBUG(D_tls) debug_printf("TLS: will request OCSP stapling\n");
3562   if ((rc = gnutls_ocsp_status_request_enable_client(state->session,
3563                     NULL, 0, NULL)) != OK)
3564     {
3565     tls_error_gnu(state, US"cert-status-req", rc, errstr);
3566     return FALSE;
3567     }
3568   tlsp->ocsp = OCSP_NOT_RESP;
3569   }
3570 #endif
3571
3572 #ifdef EXIM_HAVE_TLS_RESUME
3573 tls_client_resume_prehandshake(state, tlsp, conn_args, ob);
3574 #endif
3575
3576 #ifndef DISABLE_EVENT
3577 if (tb && tb->event_action)
3578   {
3579   state->event_action = tb->event_action;
3580   gnutls_session_set_ptr(state->session, state);
3581   gnutls_certificate_set_verify_function(state->lib_state.x509_cred, verify_cb);
3582   }
3583 #endif
3584
3585 gnutls_transport_set_ptr(state->session, (gnutls_transport_ptr_t)(long) cctx->sock);
3586 state->fd_in = cctx->sock;
3587 state->fd_out = cctx->sock;
3588
3589 DEBUG(D_tls) debug_printf("about to gnutls_handshake\n");
3590 /* There doesn't seem to be a built-in timeout on connection. */
3591
3592 sigalrm_seen = FALSE;
3593 ALARM(ob->command_timeout);
3594 do
3595   rc = gnutls_handshake(state->session);
3596 while (rc == GNUTLS_E_AGAIN || rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen);
3597 ALARM_CLR(0);
3598
3599 if (rc != GNUTLS_E_SUCCESS)
3600   {
3601   if (sigalrm_seen)
3602     {
3603     gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_USER_CANCELED);
3604     tls_error(US"gnutls_handshake", US"timed out", state->host, errstr);
3605     }
3606   else
3607     tls_error_gnu(state, US"gnutls_handshake", rc, errstr);
3608   return FALSE;
3609   }
3610
3611 DEBUG(D_tls) post_handshake_debug(state);
3612
3613 /* Verify late */
3614
3615 if (!verify_certificate(state, errstr))
3616   {
3617   tls_error(US"certificate verification failed", *errstr, state->host, errstr);
3618   return FALSE;
3619   }
3620
3621 #ifdef GNUTLS_SFLAGS_EXT_MASTER_SECRET
3622 if (gnutls_session_get_flags(state->session) & GNUTLS_SFLAGS_EXT_MASTER_SECRET)
3623   tlsp->ext_master_secret = TRUE;
3624 #endif
3625
3626 #ifndef DISABLE_OCSP
3627 if (request_ocsp)
3628   {
3629   DEBUG(D_tls)
3630     {
3631     gnutls_datum_t stapling;
3632     gnutls_ocsp_resp_t resp;
3633     gnutls_datum_t printed;
3634     unsigned idx = 0;
3635
3636     for (;
3637 # ifdef GNUTLS_OCSP_STATUS_REQUEST_GET2
3638          (rc = gnutls_ocsp_status_request_get2(state->session, idx, &stapling)) == 0;
3639 #else
3640          (rc = gnutls_ocsp_status_request_get(state->session, &stapling)) == 0;
3641 #endif
3642          idx++)
3643       if (  (rc= gnutls_ocsp_resp_init(&resp)) == 0
3644          && (rc= gnutls_ocsp_resp_import(resp, &stapling)) == 0
3645          && (rc= gnutls_ocsp_resp_print(resp, GNUTLS_OCSP_PRINT_COMPACT, &printed)) == 0
3646          )
3647         {
3648         debug_printf("%.4096s", printed.data);
3649         gnutls_free(printed.data);
3650         }
3651       else
3652         (void) tls_error_gnu(state, US"ocsp decode", rc, errstr);
3653     if (idx == 0 && rc)
3654       (void) tls_error_gnu(state, US"ocsp decode", rc, errstr);
3655     }
3656
3657   if (gnutls_ocsp_status_request_is_checked(state->session, 0) == 0)
3658     {
3659     tlsp->ocsp = OCSP_FAILED;
3660     tls_error(US"certificate status check failed", NULL, state->host, errstr);
3661     if (require_ocsp)
3662       return FALSE;
3663     }
3664   else
3665     {
3666     DEBUG(D_tls) debug_printf("Passed OCSP checking\n");
3667     tlsp->ocsp = OCSP_VFIED;
3668     }
3669   }
3670 #endif
3671
3672 #ifdef EXIM_HAVE_TLS_RESUME
3673 tls_client_resume_posthandshake(state, tlsp, host);
3674 #endif
3675
3676 #ifdef EXIM_HAVE_ALPN
3677 if (ob->tls_alpn)       /* We requested. See what was negotiated. */
3678   {
3679   gnutls_datum_t p = {.size = 0};
3680
3681   if (gnutls_alpn_get_selected_protocol(state->session, &p) == 0)
3682     { DEBUG(D_tls) debug_printf("ALPN negotiated: '%.*s'\n", (int)p.size, p.data); }
3683   else if (verify_check_given_host(CUSS &ob->hosts_require_alpn, host) == OK)
3684     {
3685     gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_NO_APPLICATION_PROTOCOL);
3686     tls_error(US"handshake", US"ALPN required but not negotiated", state->host, errstr);
3687     return FALSE;
3688     }
3689   else
3690     DEBUG(D_tls) debug_printf("No ALPN negotiated");
3691   }
3692 #endif
3693
3694 /* Sets various Exim expansion variables; may need to adjust for ACL callouts */
3695
3696 extract_exim_vars_from_tls_state(state);
3697
3698 cctx->tls_ctx = state;
3699 return TRUE;
3700 }
3701
3702
3703
3704
3705 /*
3706 Arguments:
3707   ct_ctx        client TLS context pointer, or NULL for the one global server context
3708 */
3709
3710 void
3711 tls_shutdown_wr(void * ct_ctx)
3712 {
3713 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
3714 tls_support * tlsp = state->tlsp;
3715
3716 if (!tlsp || tlsp->active.sock < 0) return;  /* TLS was not active */
3717
3718 tls_write(ct_ctx, NULL, 0, FALSE);      /* flush write buffer */
3719
3720 HDEBUG(D_transport|D_tls|D_acl|D_v) debug_printf_indent("  SMTP(TLS shutdown)>>\n");
3721 gnutls_bye(state->session, GNUTLS_SHUT_WR);
3722 }
3723
3724 /*************************************************
3725 *         Close down a TLS session               *
3726 *************************************************/
3727
3728 /* This is also called from within a delivery subprocess forked from the
3729 daemon, to shut down the TLS library, without actually doing a shutdown (which
3730 would tamper with the TLS session in the parent process).
3731
3732 Arguments:
3733   ct_ctx        client context pointer, or NULL for the one global server context
3734   do_shutdown   0 no data-flush or TLS close-alert
3735                 1 if TLS close-alert is to be sent,
3736                 2 if also response to be waited for (2s timeout)
3737
3738 Returns:     nothing
3739 */
3740
3741 void
3742 tls_close(void * ct_ctx, int do_shutdown)
3743 {
3744 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
3745 tls_support * tlsp = state->tlsp;
3746
3747 if (!tlsp || tlsp->active.sock < 0) return;  /* TLS was not active */
3748
3749 if (do_shutdown)
3750   {
3751   DEBUG(D_tls) debug_printf("tls_close(): shutting down TLS%s\n",
3752     do_shutdown > TLS_SHUTDOWN_NOWAIT ? " (with response-wait)" : "");
3753
3754   tls_write(ct_ctx, NULL, 0, FALSE);    /* flush write buffer */
3755
3756 #ifdef EXIM_TCP_CORK
3757   if (do_shutdown == TLS_SHUTDOWN_WAIT)
3758     (void) setsockopt(tlsp->active.sock, IPPROTO_TCP, EXIM_TCP_CORK, US &off, sizeof(off));
3759 #endif
3760
3761   /* The library seems to have no way to only wait for a peer's
3762   shutdown, so handle the same as TLS_SHUTDOWN_WAIT */
3763
3764   ALARM(2);
3765   gnutls_bye(state->session,
3766       do_shutdown > TLS_SHUTDOWN_NOWAIT ? GNUTLS_SHUT_RDWR : GNUTLS_SHUT_WR);
3767   ALARM_CLR(0);
3768   }
3769
3770 if (!ct_ctx)    /* server */
3771   {
3772   receive_getc =        smtp_getc;
3773   receive_getbuf =      smtp_getbuf;
3774   receive_get_cache =   smtp_get_cache;
3775   receive_hasc =        smtp_hasc;
3776   receive_ungetc =      smtp_ungetc;
3777   receive_feof =        smtp_feof;
3778   receive_ferror =      smtp_ferror;
3779   }
3780
3781 gnutls_deinit(state->session);
3782 tlsp->active.sock = -1;
3783 tlsp->active.tls_ctx = NULL;
3784 /* Leave bits, peercert, cipher, peerdn, certificate_verified set, for logging */
3785 tlsp->channelbinding = NULL;
3786
3787
3788 if (state->xfer_buffer) store_free(state->xfer_buffer);
3789 }
3790
3791
3792
3793
3794 static BOOL
3795 tls_refill(unsigned lim)
3796 {
3797 exim_gnutls_state_st * state = &state_server;
3798 ssize_t inbytes;
3799
3800 DEBUG(D_tls) debug_printf("Calling gnutls_record_recv(session=%p, buffer=%p, buffersize=%u)\n",
3801   state->session, state->xfer_buffer, ssl_xfer_buffer_size);
3802
3803 sigalrm_seen = FALSE;
3804 if (smtp_receive_timeout > 0) ALARM(smtp_receive_timeout);
3805
3806 errno = 0;
3807 do
3808   inbytes = gnutls_record_recv(state->session, state->xfer_buffer,
3809     MIN(ssl_xfer_buffer_size, lim));
3810 while (inbytes == GNUTLS_E_AGAIN);
3811
3812 if (smtp_receive_timeout > 0) ALARM_CLR(0);
3813
3814 if (had_command_timeout)                /* set by signal handler */
3815   smtp_command_timeout_exit();          /* does not return */
3816 if (had_command_sigterm)
3817   smtp_command_sigterm_exit();
3818 if (had_data_timeout)
3819   smtp_data_timeout_exit();
3820 if (had_data_sigint)
3821   smtp_data_sigint_exit();
3822
3823 /* Timeouts do not get this far.  A zero-byte return appears to mean that the
3824 TLS session has been closed down, not that the socket itself has been closed
3825 down. Revert to non-TLS handling. */
3826
3827 if (sigalrm_seen)
3828   {
3829   DEBUG(D_tls) debug_printf("Got tls read timeout\n");
3830   state->xfer_error = TRUE;
3831   return FALSE;
3832   }
3833
3834 else if (inbytes == 0)
3835   {
3836   DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
3837   tls_close(NULL, TLS_NO_SHUTDOWN);
3838   return FALSE;
3839   }
3840
3841 /* Handle genuine errors */
3842
3843 else if (inbytes < 0)
3844   {
3845   DEBUG(D_tls) debug_printf("%s: err from gnutls_record_recv\n", __FUNCTION__);
3846   record_io_error(state, (int) inbytes, US"recv", NULL);
3847   state->xfer_error = TRUE;
3848   return FALSE;
3849   }
3850 #ifndef DISABLE_DKIM
3851 dkim_exim_verify_feed(state->xfer_buffer, inbytes);
3852 #endif
3853 state->xfer_buffer_hwm = (int) inbytes;
3854 state->xfer_buffer_lwm = 0;
3855 return TRUE;
3856 }
3857
3858 /*************************************************
3859 *            TLS version of getc                 *
3860 *************************************************/
3861
3862 /* This gets the next byte from the TLS input buffer. If the buffer is empty,
3863 it refills the buffer via the GnuTLS reading function.
3864 Only used by the server-side TLS.
3865
3866 This feeds DKIM and should be used for all message-body reads.
3867
3868 Arguments:  lim         Maximum amount to read/buffer
3869 Returns:    the next character or EOF
3870 */
3871
3872 int
3873 tls_getc(unsigned lim)
3874 {
3875 exim_gnutls_state_st * state = &state_server;
3876
3877 if (state->xfer_buffer_lwm >= state->xfer_buffer_hwm)
3878   if (!tls_refill(lim))
3879     return state->xfer_error ? EOF : smtp_getc(lim);
3880
3881 /* Something in the buffer; return next uschar */
3882
3883 return state->xfer_buffer[state->xfer_buffer_lwm++];
3884 }
3885
3886 BOOL
3887 tls_hasc(void)
3888 {
3889 exim_gnutls_state_st * state = &state_server;
3890 return state->xfer_buffer_lwm < state->xfer_buffer_hwm;
3891 }
3892
3893 uschar *
3894 tls_getbuf(unsigned * len)
3895 {
3896 exim_gnutls_state_st * state = &state_server;
3897 unsigned size;
3898 uschar * buf;
3899
3900 if (state->xfer_buffer_lwm >= state->xfer_buffer_hwm)
3901   if (!tls_refill(*len))
3902     {
3903     if (!state->xfer_error) return smtp_getbuf(len);
3904     *len = 0;
3905     return NULL;
3906     }
3907
3908 if ((size = state->xfer_buffer_hwm - state->xfer_buffer_lwm) > *len)
3909   size = *len;
3910 buf = &state->xfer_buffer[state->xfer_buffer_lwm];
3911 state->xfer_buffer_lwm += size;
3912 *len = size;
3913 return buf;
3914 }
3915
3916
3917 /* Get up to the given number of bytes from any cached data, and feed to dkim. */
3918 void
3919 tls_get_cache(unsigned lim)
3920 {
3921 #ifndef DISABLE_DKIM
3922 exim_gnutls_state_st * state = &state_server;
3923 int n = state->xfer_buffer_hwm - state->xfer_buffer_lwm;
3924 if (n > lim)
3925   n = lim;
3926 if (n > 0)
3927   dkim_exim_verify_feed(state->xfer_buffer+state->xfer_buffer_lwm, n);
3928 #endif
3929 }
3930
3931
3932 BOOL
3933 tls_could_getc(void)
3934 {
3935 return state_server.xfer_buffer_lwm < state_server.xfer_buffer_hwm
3936  || gnutls_record_check_pending(state_server.session) > 0;
3937 }
3938
3939
3940 /*************************************************
3941 *          Read bytes from TLS channel           *
3942 *************************************************/
3943
3944 /* This does not feed DKIM, so if the caller uses this for reading message body,
3945 then the caller must feed DKIM.
3946
3947 Arguments:
3948   ct_ctx    client context pointer, or NULL for the one global server context
3949   buff      buffer of data
3950   len       size of buffer
3951
3952 Returns:    the number of bytes read
3953             -1 after a failed read, including EOF
3954 */
3955
3956 int
3957 tls_read(void * ct_ctx, uschar *buff, size_t len)
3958 {
3959 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
3960 ssize_t inbytes;
3961
3962 if (len > INT_MAX)
3963   len = INT_MAX;
3964
3965 if (state->xfer_buffer_lwm < state->xfer_buffer_hwm)
3966   DEBUG(D_tls)
3967     debug_printf("*** PROBABLY A BUG *** " \
3968         "tls_read() called with data in the tls_getc() buffer, %d ignored\n",
3969         state->xfer_buffer_hwm - state->xfer_buffer_lwm);
3970
3971 DEBUG(D_tls)
3972   debug_printf("Calling gnutls_record_recv(session=%p, buffer=%p, len=" SIZE_T_FMT ")\n",
3973       state->session, buff, len);
3974
3975 errno = 0;
3976 do
3977   inbytes = gnutls_record_recv(state->session, buff, len);
3978 while (inbytes == GNUTLS_E_AGAIN);
3979
3980 if (inbytes > 0) return inbytes;
3981 if (inbytes == 0)
3982   {
3983   DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
3984   }
3985 else
3986   {
3987   DEBUG(D_tls) debug_printf("%s: err from gnutls_record_recv\n", __FUNCTION__);
3988   record_io_error(state, (int)inbytes, US"recv", NULL);
3989   }
3990
3991 return -1;
3992 }
3993
3994
3995
3996
3997 /*************************************************
3998 *         Write bytes down TLS channel           *
3999 *************************************************/
4000
4001 /*
4002 Arguments:
4003   ct_ctx    client context pointer, or NULL for the one global server context
4004   buff      buffer of data
4005   len       number of bytes
4006   more      more data expected soon
4007
4008 Calling with len zero and more unset will flush buffered writes.  The buff
4009 argument can be null for that case.
4010
4011 Returns:    the number of bytes after a successful write,
4012             -1 after a failed write
4013 */
4014
4015 int
4016 tls_write(void * ct_ctx, const uschar * buff, size_t len, BOOL more)
4017 {
4018 ssize_t outbytes;
4019 size_t left = len;
4020 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
4021
4022 #ifdef SUPPORT_CORK
4023 if (more && !state->corked)
4024   {
4025   DEBUG(D_tls) debug_printf("gnutls_record_cork(session=%p)\n", state->session);
4026   gnutls_record_cork(state->session);
4027   state->corked = TRUE;
4028   }
4029 #endif
4030
4031 DEBUG(D_tls) debug_printf("%s(%p, " SIZE_T_FMT "%s)\n", __FUNCTION__,
4032   buff, left, more ? ", more" : "");
4033
4034 while (left > 0)
4035   {
4036   DEBUG(D_tls) debug_printf("gnutls_record_send(session=%p, buffer=%p, left=" SIZE_T_FMT ")\n",
4037       state->session, buff, left);
4038
4039   errno = 0;
4040   do
4041     outbytes = gnutls_record_send(state->session, buff, left);
4042   while (outbytes == GNUTLS_E_AGAIN);
4043
4044   DEBUG(D_tls) debug_printf("outbytes=" SSIZE_T_FMT "\n", outbytes);
4045
4046   if (outbytes < 0)
4047     {
4048 #ifdef GNUTLS_E_PREMATURE_TERMINATION
4049     if (  outbytes == GNUTLS_E_PREMATURE_TERMINATION && errno == ECONNRESET
4050        && !ct_ctx && f.smtp_in_quit
4051        )
4052       {                                 /* Outlook, dammit */
4053       if (LOGGING(protocol_detail))
4054         log_write(0, LOG_MAIN, "[%s] after QUIT, client reset TCP before"
4055           " SMTP response and TLS close\n", sender_host_address);
4056       else
4057         DEBUG(D_tls) debug_printf("[%s] SSL_write: after QUIT,"
4058           " client reset TCP before TLS close\n", sender_host_address);
4059       }
4060     else
4061 #endif
4062       {
4063       DEBUG(D_tls) debug_printf("%s: gnutls_record_send err\n", __FUNCTION__);
4064       record_io_error(state, outbytes, US"send", NULL);
4065       }
4066     return -1;
4067     }
4068   if (outbytes == 0)
4069     {
4070     record_io_error(state, 0, US"send", US"TLS channel closed on write");
4071     return -1;
4072     }
4073
4074   left -= outbytes;
4075   buff += outbytes;
4076   }
4077
4078 if (len > INT_MAX)
4079   {
4080   DEBUG(D_tls)
4081     debug_printf("Whoops!  Wrote more bytes (" SIZE_T_FMT ") than INT_MAX\n",
4082         len);
4083   len = INT_MAX;
4084   }
4085
4086 #ifdef SUPPORT_CORK
4087 if (!more && state->corked)
4088   {
4089   DEBUG(D_tls) debug_printf("gnutls_record_uncork(session=%p)\n", state->session);
4090   do
4091     /* We can't use GNUTLS_RECORD_WAIT here, as it retries on
4092     GNUTLS_E_AGAIN || GNUTLS_E_INTR, which would break our timeout set by alarm().
4093     The GNUTLS_E_AGAIN should not happen ever, as our sockets are blocking anyway.
4094     But who knows. (That all relies on the fact that GNUTLS_E_INTR and GNUTLS_E_AGAIN
4095     match the EINTR and EAGAIN errno values.) */
4096     outbytes = gnutls_record_uncork(state->session, 0);
4097   while (outbytes == GNUTLS_E_AGAIN);
4098
4099   if (outbytes < 0)
4100     {
4101     record_io_error(state, len, US"uncork", NULL);
4102     return -1;
4103     }
4104
4105   state->corked = FALSE;
4106   }
4107 #endif
4108
4109 return (int) len;
4110 }
4111
4112
4113
4114
4115 /*************************************************
4116 *            Random number generation            *
4117 *************************************************/
4118
4119 /* Pseudo-random number generation.  The result is not expected to be
4120 cryptographically strong but not so weak that someone will shoot themselves
4121 in the foot using it as a nonce in input in some email header scheme or
4122 whatever weirdness they'll twist this into.  The result should handle fork()
4123 and avoid repeating sequences.  OpenSSL handles that for us.
4124
4125 Arguments:
4126   max       range maximum
4127 Returns     a random number in range [0, max-1]
4128 */
4129
4130 #ifdef HAVE_GNUTLS_RND
4131 int
4132 vaguely_random_number(int max)
4133 {
4134 unsigned int r;
4135 int i, needed_len;
4136 uschar smallbuf[sizeof(r)];
4137
4138 if (max <= 1)
4139   return 0;
4140
4141 needed_len = sizeof(r);
4142 /* Don't take 8 times more entropy than needed if int is 8 octets and we were
4143 asked for a number less than 10. */
4144
4145 for (r = max, i = 0; r; ++i)
4146   r >>= 1;
4147 i = (i + 7) / 8;
4148 if (i < needed_len)
4149   needed_len = i;
4150
4151 i = gnutls_rnd(GNUTLS_RND_NONCE, smallbuf, needed_len);
4152 if (i < 0)
4153   {
4154   DEBUG(D_all) debug_printf("gnutls_rnd() failed, using fallback\n");
4155   return vaguely_random_number_fallback(max);
4156   }
4157 r = 0;
4158 for (uschar * p = smallbuf; needed_len; --needed_len, ++p)
4159   r = r * 256 + *p;
4160
4161 /* We don't particularly care about weighted results; if someone wants
4162  * smooth distribution and cares enough then they should submit a patch then. */
4163 return r % max;
4164 }
4165 #else /* HAVE_GNUTLS_RND */
4166 int
4167 vaguely_random_number(int max)
4168 {
4169   return vaguely_random_number_fallback(max);
4170 }
4171 #endif /* HAVE_GNUTLS_RND */
4172
4173
4174
4175
4176 /*************************************************
4177 *  Let tls_require_ciphers be checked at startup *
4178 *************************************************/
4179
4180 /* The tls_require_ciphers option, if set, must be something which the
4181 library can parse.
4182
4183 Returns:     NULL on success, or error message
4184 */
4185
4186 uschar *
4187 tls_validate_require_cipher(void)
4188 {
4189 int rc;
4190 uschar *expciphers = NULL;
4191 gnutls_priority_t priority_cache;
4192 const char *errpos;
4193 uschar * dummy_errstr;
4194
4195 #ifdef GNUTLS_AUTO_GLOBAL_INIT
4196 # define validate_check_rc(Label) do { \
4197   if (rc != GNUTLS_E_SUCCESS) { if (exim_gnutls_base_init_done) \
4198     return string_sprintf("%s failed: %s", (Label), gnutls_strerror(rc)); } } while (0)
4199 # define return_deinit(Label) do { return (Label); } while (0)
4200 #else
4201 # define validate_check_rc(Label) do { \
4202   if (rc != GNUTLS_E_SUCCESS) { if (exim_gnutls_base_init_done) gnutls_global_deinit(); \
4203     return string_sprintf("%s failed: %s", (Label), gnutls_strerror(rc)); } } while (0)
4204 # define return_deinit(Label) do { gnutls_global_deinit(); return (Label); } while (0)
4205 #endif
4206
4207 if (exim_gnutls_base_init_done)
4208   log_write(0, LOG_MAIN|LOG_PANIC,
4209       "already initialised GnuTLS, Exim developer bug");
4210
4211 #if defined(HAVE_GNUTLS_PKCS11) && !defined(GNUTLS_AUTO_PKCS11_MANUAL)
4212 if (!gnutls_allow_auto_pkcs11)
4213   {
4214   rc = gnutls_pkcs11_init(GNUTLS_PKCS11_FLAG_MANUAL, NULL);
4215   validate_check_rc(US"gnutls_pkcs11_init");
4216   }
4217 #endif
4218 #ifndef GNUTLS_AUTO_GLOBAL_INIT
4219 rc = gnutls_global_init();
4220 validate_check_rc(US"gnutls_global_init()");
4221 #endif
4222 exim_gnutls_base_init_done = TRUE;
4223
4224 if (!(tls_require_ciphers && *tls_require_ciphers))
4225   return_deinit(NULL);
4226
4227 if (!expand_check(tls_require_ciphers, US"tls_require_ciphers", &expciphers,
4228                   &dummy_errstr))
4229   return_deinit(US"failed to expand tls_require_ciphers");
4230
4231 if (!(expciphers && *expciphers))
4232   return_deinit(NULL);
4233
4234 DEBUG(D_tls)
4235   debug_printf("tls_require_ciphers expands to \"%s\"\n", expciphers);
4236
4237 rc = gnutls_priority_init(&priority_cache, CS expciphers, &errpos);
4238 validate_check_rc(string_sprintf(
4239       "gnutls_priority_init(%s) failed at offset %ld, \"%.8s..\"",
4240       expciphers, (long)(errpos - CS expciphers), errpos));
4241
4242 #undef return_deinit
4243 #undef validate_check_rc
4244 #ifndef GNUTLS_AUTO_GLOBAL_INIT
4245 gnutls_global_deinit();
4246 #endif
4247
4248 return NULL;
4249 }
4250
4251
4252
4253
4254 /*************************************************
4255 *         Report the library versions.           *
4256 *************************************************/
4257
4258 /* See a description in tls-openssl.c for an explanation of why this exists.
4259
4260 Arguments:   string to append to
4261 Returns:     string
4262 */
4263
4264 gstring *
4265 tls_version_report(gstring * g)
4266 {
4267 return string_fmt_append(g,
4268     "Library version: GnuTLS: Compile: %s\n"
4269     "                         Runtime: %s\n",
4270              LIBGNUTLS_VERSION,
4271              gnutls_check_version(NULL));
4272 }
4273
4274 #endif  /*!MACRO_PREDEF*/
4275 /* vi: aw ai sw=2
4276 */
4277 /* End of tls-gnu.c */