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