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