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