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