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