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