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