GnuTLS: fix build on older 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 #if defined(EXPERIMENTAL_TLS_RESUME) || defined(SUPPORT_GNUTLS_EXT_RAW_PARSE)
907 /* Callback for certificate-status, on server. We sent stapled OCSP. */
908 static int
909 tls_server_certstatus_cb(gnutls_session_t session, unsigned int htype,
910   unsigned when, unsigned int incoming, const gnutls_datum_t * msg)
911 {
912 DEBUG(D_tls) debug_printf("Sending certificate-status\n");
913 #ifdef SUPPORT_SRV_OCSP_STACK
914 tls_in.ocsp = exim_testharness_disable_ocsp_validity_check
915   ? OCSP_VFY_NOT_TRIED : OCSP_VFIED;    /* We know that GnuTLS verifies responses */
916 #else
917 tls_in.ocsp = OCSP_VFY_NOT_TRIED;
918 #endif
919 return 0;
920 }
921
922 /* Callback for handshake messages, on server */
923 static int
924 tls_server_hook_cb(gnutls_session_t sess, u_int htype, unsigned when,
925   unsigned incoming, const gnutls_datum_t * msg)
926 {
927 switch (htype)
928   {
929 # ifdef SUPPORT_GNUTLS_EXT_RAW_PARSE
930   case GNUTLS_HANDSHAKE_CLIENT_HELLO:
931     return tls_server_clienthello_cb(sess, htype, when, incoming, msg);
932 # endif
933   case GNUTLS_HANDSHAKE_CERTIFICATE_STATUS:
934     return tls_server_certstatus_cb(sess, htype, when, incoming, msg);
935 # ifdef EXPERIMENTAL_TLS_RESUME
936   case GNUTLS_HANDSHAKE_NEW_SESSION_TICKET:
937     return tls_server_ticket_cb(sess, htype, when, incoming, msg);
938 # endif
939   default:
940     return 0;
941   }
942 }
943 #endif
944
945
946 #if !defined(DISABLE_OCSP) && defined(SUPPORT_GNUTLS_EXT_RAW_PARSE)
947 static void
948 tls_server_testharness_ocsp_fiddle(void)
949 {
950 extern char ** environ;
951 if (environ) for (uschar ** p = USS environ; *p; p++)
952   if (Ustrncmp(*p, "EXIM_TESTHARNESS_DISABLE_OCSPVALIDITYCHECK", 42) == 0)
953     {
954     DEBUG(D_tls) debug_printf("Permitting known bad OCSP response\n");
955     exim_testharness_disable_ocsp_validity_check = TRUE;
956     }
957 }
958 #endif
959
960 /*************************************************
961 *       Variables re-expanded post-SNI           *
962 *************************************************/
963
964 /* Called from both server and client code, via tls_init(), and also from
965 the SNI callback after receiving an SNI, if tls_certificate includes "tls_sni".
966
967 We can tell the two apart by state->received_sni being non-NULL in callback.
968
969 The callback should not call us unless state->trigger_sni_changes is true,
970 which we are responsible for setting on the first pass through.
971
972 Arguments:
973   state           exim_gnutls_state_st *
974   errstr          error string pointer
975
976 Returns:          OK/DEFER/FAIL
977 */
978
979 static int
980 tls_expand_session_files(exim_gnutls_state_st * state, uschar ** errstr)
981 {
982 struct stat statbuf;
983 int rc;
984 const host_item *host = state->host;  /* macro should be reconsidered? */
985 uschar *saved_tls_certificate = NULL;
986 uschar *saved_tls_privatekey = NULL;
987 uschar *saved_tls_verify_certificates = NULL;
988 uschar *saved_tls_crl = NULL;
989 int cert_count;
990
991 /* We check for tls_sni *before* expansion. */
992 if (!host)      /* server */
993   if (!state->received_sni)
994     {
995     if (  state->tls_certificate
996        && (  Ustrstr(state->tls_certificate, US"tls_sni")
997           || Ustrstr(state->tls_certificate, US"tls_in_sni")
998           || Ustrstr(state->tls_certificate, US"tls_out_sni")
999        )  )
1000       {
1001       DEBUG(D_tls) debug_printf("We will re-expand TLS session files if we receive SNI.\n");
1002       state->trigger_sni_changes = TRUE;
1003       }
1004     }
1005   else
1006     {
1007     /* useful for debugging */
1008     saved_tls_certificate = state->exp_tls_certificate;
1009     saved_tls_privatekey = state->exp_tls_privatekey;
1010     saved_tls_verify_certificates = state->exp_tls_verify_certificates;
1011     saved_tls_crl = state->exp_tls_crl;
1012     }
1013
1014 if ((rc = gnutls_certificate_allocate_credentials(&state->x509_cred)))
1015   return tls_error_gnu(US"gnutls_certificate_allocate_credentials",
1016             rc, host, errstr);
1017
1018 #ifdef SUPPORT_SRV_OCSP_STACK
1019 gnutls_certificate_set_flags(state->x509_cred, GNUTLS_CERTIFICATE_API_V2);
1020 #endif
1021
1022 /* remember: expand_check_tlsvar() is expand_check() but fiddling with
1023 state members, assuming consistent naming; and expand_check() returns
1024 false if expansion failed, unless expansion was forced to fail. */
1025
1026 /* check if we at least have a certificate, before doing expensive
1027 D-H generation. */
1028
1029 if (!expand_check_tlsvar(tls_certificate, errstr))
1030   return DEFER;
1031
1032 /* certificate is mandatory in server, optional in client */
1033
1034 if (  !state->exp_tls_certificate
1035    || !*state->exp_tls_certificate
1036    )
1037   if (!host)
1038     return tls_install_selfsign(state, errstr);
1039   else
1040     DEBUG(D_tls) debug_printf("TLS: no client certificate specified; okay\n");
1041
1042 if (state->tls_privatekey && !expand_check_tlsvar(tls_privatekey, errstr))
1043   return DEFER;
1044
1045 /* tls_privatekey is optional, defaulting to same file as certificate */
1046
1047 if (state->tls_privatekey == NULL || *state->tls_privatekey == '\0')
1048   {
1049   state->tls_privatekey = state->tls_certificate;
1050   state->exp_tls_privatekey = state->exp_tls_certificate;
1051   }
1052
1053
1054 if (state->exp_tls_certificate && *state->exp_tls_certificate)
1055   {
1056   DEBUG(D_tls) debug_printf("certificate file = %s\nkey file = %s\n",
1057       state->exp_tls_certificate, state->exp_tls_privatekey);
1058
1059   if (state->received_sni)
1060     if (  Ustrcmp(state->exp_tls_certificate, saved_tls_certificate) == 0
1061        && Ustrcmp(state->exp_tls_privatekey,  saved_tls_privatekey)  == 0
1062        )
1063       {
1064       DEBUG(D_tls) debug_printf("TLS SNI: cert and key unchanged\n");
1065       }
1066     else
1067       {
1068       DEBUG(D_tls) debug_printf("TLS SNI: have a changed cert/key pair.\n");
1069       }
1070
1071   if (!host)    /* server */
1072     {
1073     const uschar * clist = state->exp_tls_certificate;
1074     const uschar * klist = state->exp_tls_privatekey;
1075     const uschar * olist;
1076     int csep = 0, ksep = 0, osep = 0, cnt = 0;
1077     uschar * cfile, * kfile, * ofile;
1078
1079 #ifndef DISABLE_OCSP
1080     if (!expand_check(tls_ocsp_file, US"tls_ocsp_file", &ofile, errstr))
1081       return DEFER;
1082     olist = ofile;
1083 #endif
1084
1085     while (cfile = string_nextinlist(&clist, &csep, NULL, 0))
1086
1087       if (!(kfile = string_nextinlist(&klist, &ksep, NULL, 0)))
1088         return tls_error(US"cert/key setup: out of keys", NULL, host, errstr);
1089       else if (0 < (rc = tls_add_certfile(state, host, cfile, kfile, errstr)))
1090         return rc;
1091       else
1092         {
1093         int gnutls_cert_index = -rc;
1094         DEBUG(D_tls) debug_printf("TLS: cert/key %d %s registered\n", gnutls_cert_index, cfile);
1095
1096         /* Set the OCSP stapling server info */
1097
1098 #ifndef DISABLE_OCSP
1099         if (tls_ocsp_file)
1100           {
1101           if (gnutls_buggy_ocsp)
1102             {
1103             DEBUG(D_tls)
1104               debug_printf("GnuTLS library is buggy for OCSP; avoiding\n");
1105             }
1106           else if ((ofile = string_nextinlist(&olist, &osep, NULL, 0)))
1107             {
1108             DEBUG(D_tls) debug_printf("OCSP response file = %s\n", ofile);
1109
1110 # ifdef SUPPORT_GNUTLS_EXT_RAW_PARSE
1111             if (f.running_in_test_harness) tls_server_testharness_ocsp_fiddle();
1112
1113             if (!exim_testharness_disable_ocsp_validity_check)
1114               {
1115               if  ((rc = gnutls_certificate_set_ocsp_status_request_file2(
1116                           state->x509_cred, CCS ofile, gnutls_cert_index,
1117                           GNUTLS_X509_FMT_DER)) < 0)
1118                 return tls_error_gnu(
1119                         US"gnutls_certificate_set_ocsp_status_request_file2",
1120                         rc, host, errstr);
1121
1122               /* Arrange callbacks for OCSP request observability */
1123
1124               gnutls_handshake_set_hook_function(state->session,
1125                 GNUTLS_HANDSHAKE_ANY, GNUTLS_HOOK_POST, tls_server_hook_cb);
1126               }
1127             else
1128 # elif defined(SUPPORT_SRV_OCSP_STACK)
1129             if ((rc = gnutls_certificate_set_ocsp_status_request_function2(
1130                          state->x509_cred, gnutls_cert_index,
1131                          server_ocsp_stapling_cb, ofile)))
1132                 return tls_error_gnu(
1133                       US"gnutls_certificate_set_ocsp_status_request_function2",
1134                       rc, host, errstr);
1135             else
1136 # endif
1137               {
1138               if (cnt++ > 0)
1139                 {
1140                 DEBUG(D_tls)
1141                   debug_printf("oops; multiple OCSP files not supported\n");
1142                 break;
1143                 }
1144                 gnutls_certificate_set_ocsp_status_request_function(
1145                   state->x509_cred, server_ocsp_stapling_cb, ofile);
1146               }
1147             }
1148           else
1149             DEBUG(D_tls) debug_printf("ran out of OCSP response files in list\n");
1150           }
1151 #endif /* DISABLE_OCSP */
1152         }
1153     }
1154   else  /* client */
1155     {
1156     if (0 < (rc = tls_add_certfile(state, host,
1157                 state->exp_tls_certificate, state->exp_tls_privatekey, errstr)))
1158       return rc;
1159     DEBUG(D_tls) debug_printf("TLS: cert/key registered\n");
1160     }
1161
1162   } /* tls_certificate */
1163
1164
1165 /* Set the trusted CAs file if one is provided, and then add the CRL if one is
1166 provided. Experiment shows that, if the certificate file is empty, an unhelpful
1167 error message is provided. However, if we just refrain from setting anything up
1168 in that case, certificate verification fails, which seems to be the correct
1169 behaviour. */
1170
1171 if (state->tls_verify_certificates && *state->tls_verify_certificates)
1172   {
1173   if (!expand_check_tlsvar(tls_verify_certificates, errstr))
1174     return DEFER;
1175 #ifndef SUPPORT_SYSDEFAULT_CABUNDLE
1176   if (Ustrcmp(state->exp_tls_verify_certificates, "system") == 0)
1177     state->exp_tls_verify_certificates = NULL;
1178 #endif
1179   if (state->tls_crl && *state->tls_crl)
1180     if (!expand_check_tlsvar(tls_crl, errstr))
1181       return DEFER;
1182
1183   if (!(state->exp_tls_verify_certificates &&
1184         *state->exp_tls_verify_certificates))
1185     {
1186     DEBUG(D_tls)
1187       debug_printf("TLS: tls_verify_certificates expanded empty, ignoring\n");
1188     /* With no tls_verify_certificates, we ignore tls_crl too */
1189     return OK;
1190     }
1191   }
1192 else
1193   {
1194   DEBUG(D_tls)
1195     debug_printf("TLS: tls_verify_certificates not set or empty, ignoring\n");
1196   return OK;
1197   }
1198
1199 #ifdef SUPPORT_SYSDEFAULT_CABUNDLE
1200 if (Ustrcmp(state->exp_tls_verify_certificates, "system") == 0)
1201   cert_count = gnutls_certificate_set_x509_system_trust(state->x509_cred);
1202 else
1203 #endif
1204   {
1205   if (Ustat(state->exp_tls_verify_certificates, &statbuf) < 0)
1206     {
1207     log_write(0, LOG_MAIN|LOG_PANIC, "could not stat %s "
1208         "(tls_verify_certificates): %s", state->exp_tls_verify_certificates,
1209         strerror(errno));
1210     return DEFER;
1211     }
1212
1213 #ifndef SUPPORT_CA_DIR
1214   /* The test suite passes in /dev/null; we could check for that path explicitly,
1215   but who knows if someone has some weird FIFO which always dumps some certs, or
1216   other weirdness.  The thing we really want to check is that it's not a
1217   directory, since while OpenSSL supports that, GnuTLS does not.
1218   So s/!S_ISREG/S_ISDIR/ and change some messaging ... */
1219   if (S_ISDIR(statbuf.st_mode))
1220     {
1221     DEBUG(D_tls)
1222       debug_printf("verify certificates path is a dir: \"%s\"\n",
1223           state->exp_tls_verify_certificates);
1224     log_write(0, LOG_MAIN|LOG_PANIC,
1225         "tls_verify_certificates \"%s\" is a directory",
1226         state->exp_tls_verify_certificates);
1227     return DEFER;
1228     }
1229 #endif
1230
1231   DEBUG(D_tls) debug_printf("verify certificates = %s size=" OFF_T_FMT "\n",
1232           state->exp_tls_verify_certificates, statbuf.st_size);
1233
1234   if (statbuf.st_size == 0)
1235     {
1236     DEBUG(D_tls)
1237       debug_printf("cert file empty, no certs, no verification, ignoring any CRL\n");
1238     return OK;
1239     }
1240
1241   cert_count =
1242
1243 #ifdef SUPPORT_CA_DIR
1244     (statbuf.st_mode & S_IFMT) == S_IFDIR
1245     ?
1246     gnutls_certificate_set_x509_trust_dir(state->x509_cred,
1247       CS state->exp_tls_verify_certificates, GNUTLS_X509_FMT_PEM)
1248     :
1249 #endif
1250     gnutls_certificate_set_x509_trust_file(state->x509_cred,
1251       CS state->exp_tls_verify_certificates, GNUTLS_X509_FMT_PEM);
1252
1253 #ifdef SUPPORT_CA_DIR
1254   /* Mimic the behaviour with OpenSSL of not advertising a usable-cert list
1255   when using the directory-of-certs config model. */
1256
1257   if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
1258     gnutls_certificate_send_x509_rdn_sequence(state->session, 1);
1259 #endif
1260   }
1261
1262 if (cert_count < 0)
1263   return tls_error_gnu(US"setting certificate trust", cert_count, host, errstr);
1264 DEBUG(D_tls)
1265   debug_printf("Added %d certificate authorities.\n", cert_count);
1266
1267 if (state->tls_crl && *state->tls_crl &&
1268     state->exp_tls_crl && *state->exp_tls_crl)
1269   {
1270   DEBUG(D_tls) debug_printf("loading CRL file = %s\n", state->exp_tls_crl);
1271   if ((cert_count = gnutls_certificate_set_x509_crl_file(state->x509_cred,
1272       CS state->exp_tls_crl, GNUTLS_X509_FMT_PEM)) < 0)
1273     return tls_error_gnu(US"gnutls_certificate_set_x509_crl_file",
1274               cert_count, host, errstr);
1275
1276   DEBUG(D_tls) debug_printf("Processed %d CRLs.\n", cert_count);
1277   }
1278
1279 return OK;
1280 }
1281
1282
1283
1284
1285 /*************************************************
1286 *          Set X.509 state variables             *
1287 *************************************************/
1288
1289 /* In GnuTLS, the registered cert/key are not replaced by a later
1290 set of a cert/key, so for SNI support we need a whole new x509_cred
1291 structure.  Which means various other non-re-expanded pieces of state
1292 need to be re-set in the new struct, so the setting logic is pulled
1293 out to this.
1294
1295 Arguments:
1296   state           exim_gnutls_state_st *
1297   errstr          error string pointer
1298
1299 Returns:          OK/DEFER/FAIL
1300 */
1301
1302 static int
1303 tls_set_remaining_x509(exim_gnutls_state_st *state, uschar ** errstr)
1304 {
1305 int rc;
1306 const host_item *host = state->host;  /* macro should be reconsidered? */
1307
1308 /* Create D-H parameters, or read them from the cache file. This function does
1309 its own SMTP error messaging. This only happens for the server, TLS D-H ignores
1310 client-side params. */
1311
1312 if (!state->host)
1313   {
1314   if (!dh_server_params)
1315     if ((rc = init_server_dh(errstr)) != OK) return rc;
1316   gnutls_certificate_set_dh_params(state->x509_cred, dh_server_params);
1317   }
1318
1319 /* Link the credentials to the session. */
1320
1321 if ((rc = gnutls_credentials_set(state->session,
1322             GNUTLS_CRD_CERTIFICATE, state->x509_cred)))
1323   return tls_error_gnu(US"gnutls_credentials_set", rc, host, errstr);
1324
1325 return OK;
1326 }
1327
1328 /*************************************************
1329 *            Initialize for GnuTLS               *
1330 *************************************************/
1331
1332
1333 #ifndef DISABLE_OCSP
1334
1335 static BOOL
1336 tls_is_buggy_ocsp(void)
1337 {
1338 const uschar * s;
1339 uschar maj, mid, mic;
1340
1341 s = CUS gnutls_check_version(NULL);
1342 maj = atoi(CCS s);
1343 if (maj == 3)
1344   {
1345   while (*s && *s != '.') s++;
1346   mid = atoi(CCS ++s);
1347   if (mid <= 2)
1348     return TRUE;
1349   else if (mid >= 5)
1350     return FALSE;
1351   else
1352     {
1353     while (*s && *s != '.') s++;
1354     mic = atoi(CCS ++s);
1355     return mic <= (mid == 3 ? 16 : 3);
1356     }
1357   }
1358 return FALSE;
1359 }
1360
1361 #endif
1362
1363
1364 /* Called from both server and client code. In the case of a server, errors
1365 before actual TLS negotiation return DEFER.
1366
1367 Arguments:
1368   host            connected host, if client; NULL if server
1369   certificate     certificate file
1370   privatekey      private key file
1371   sni             TLS SNI to send, sometimes when client; else NULL
1372   cas             CA certs file
1373   crl             CRL file
1374   require_ciphers tls_require_ciphers setting
1375   caller_state    returned state-info structure
1376   errstr          error string pointer
1377
1378 Returns:          OK/DEFER/FAIL
1379 */
1380
1381 static int
1382 tls_init(
1383     const host_item *host,
1384     const uschar *certificate,
1385     const uschar *privatekey,
1386     const uschar *sni,
1387     const uschar *cas,
1388     const uschar *crl,
1389     const uschar *require_ciphers,
1390     exim_gnutls_state_st **caller_state,
1391     tls_support * tlsp,
1392     uschar ** errstr)
1393 {
1394 exim_gnutls_state_st * state;
1395 int rc;
1396 size_t sz;
1397 const char * errpos;
1398 const uschar * p;
1399
1400 if (!exim_gnutls_base_init_done)
1401   {
1402   DEBUG(D_tls) debug_printf("GnuTLS global init required.\n");
1403
1404 #ifdef HAVE_GNUTLS_PKCS11
1405   /* By default, gnutls_global_init will init PKCS11 support in auto mode,
1406   which loads modules from a config file, which sounds good and may be wanted
1407   by some sysadmin, but also means in common configurations that GNOME keyring
1408   environment variables are used and so breaks for users calling mailq.
1409   To prevent this, we init PKCS11 first, which is the documented approach. */
1410   if (!gnutls_allow_auto_pkcs11)
1411     if ((rc = gnutls_pkcs11_init(GNUTLS_PKCS11_FLAG_MANUAL, NULL)))
1412       return tls_error_gnu(US"gnutls_pkcs11_init", rc, host, errstr);
1413 #endif
1414
1415   if ((rc = gnutls_global_init()))
1416     return tls_error_gnu(US"gnutls_global_init", rc, host, errstr);
1417
1418 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
1419   DEBUG(D_tls)
1420     {
1421     gnutls_global_set_log_function(exim_gnutls_logger_cb);
1422     /* arbitrarily chosen level; bump up to 9 for more */
1423     gnutls_global_set_log_level(EXIM_GNUTLS_LIBRARY_LOG_LEVEL);
1424     }
1425 #endif
1426
1427 #ifndef DISABLE_OCSP
1428   if (tls_ocsp_file && (gnutls_buggy_ocsp = tls_is_buggy_ocsp()))
1429     log_write(0, LOG_MAIN, "OCSP unusable with this GnuTLS library version");
1430 #endif
1431
1432   exim_gnutls_base_init_done = TRUE;
1433   }
1434
1435 if (host)
1436   {
1437   /* For client-side sessions we allocate a context. This lets us run
1438   several in parallel. */
1439   int old_pool = store_pool;
1440   store_pool = POOL_PERM;
1441   state = store_get(sizeof(exim_gnutls_state_st), FALSE);
1442   store_pool = old_pool;
1443
1444   memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
1445   state->tlsp = tlsp;
1446   DEBUG(D_tls) debug_printf("initialising GnuTLS client session\n");
1447   rc = gnutls_init(&state->session, GNUTLS_CLIENT);
1448   }
1449 else
1450   {
1451   state = &state_server;
1452   memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
1453   state->tlsp = tlsp;
1454   DEBUG(D_tls) debug_printf("initialising GnuTLS server session\n");
1455   rc = gnutls_init(&state->session, GNUTLS_SERVER);
1456   }
1457 if (rc)
1458   return tls_error_gnu(US"gnutls_init", rc, host, errstr);
1459
1460 state->host = host;
1461
1462 state->tls_certificate = certificate;
1463 state->tls_privatekey = privatekey;
1464 state->tls_require_ciphers = require_ciphers;
1465 state->tls_sni = sni;
1466 state->tls_verify_certificates = cas;
1467 state->tls_crl = crl;
1468
1469 /* This handles the variables that might get re-expanded after TLS SNI;
1470 that's tls_certificate, tls_privatekey, tls_verify_certificates, tls_crl */
1471
1472 DEBUG(D_tls)
1473   debug_printf("Expanding various TLS configuration options for session credentials.\n");
1474 if ((rc = tls_expand_session_files(state, errstr)) != OK) return rc;
1475
1476 /* These are all other parts of the x509_cred handling, since SNI in GnuTLS
1477 requires a new structure afterwards. */
1478
1479 if ((rc = tls_set_remaining_x509(state, errstr)) != OK) return rc;
1480
1481 /* set SNI in client, only */
1482 if (host)
1483   {
1484   if (!expand_check(sni, US"tls_out_sni", &state->tlsp->sni, errstr))
1485     return DEFER;
1486   if (state->tlsp->sni && *state->tlsp->sni)
1487     {
1488     DEBUG(D_tls)
1489       debug_printf("Setting TLS client SNI to \"%s\"\n", state->tlsp->sni);
1490     sz = Ustrlen(state->tlsp->sni);
1491     if ((rc = gnutls_server_name_set(state->session,
1492           GNUTLS_NAME_DNS, state->tlsp->sni, sz)))
1493       return tls_error_gnu(US"gnutls_server_name_set", rc, host, errstr);
1494     }
1495   }
1496 else if (state->tls_sni)
1497   DEBUG(D_tls) debug_printf("*** PROBABLY A BUG *** " \
1498       "have an SNI set for a server [%s]\n", state->tls_sni);
1499
1500 /* This is the priority string support,
1501 http://www.gnutls.org/manual/html_node/Priority-Strings.html
1502 and replaces gnutls_require_kx, gnutls_require_mac & gnutls_require_protocols.
1503 This was backwards incompatible, but means Exim no longer needs to track
1504 all algorithms and provide string forms for them. */
1505
1506 p = NULL;
1507 if (state->tls_require_ciphers && *state->tls_require_ciphers)
1508   {
1509   if (!expand_check_tlsvar(tls_require_ciphers, errstr))
1510     return DEFER;
1511   if (state->exp_tls_require_ciphers && *state->exp_tls_require_ciphers)
1512     {
1513     p = state->exp_tls_require_ciphers;
1514     DEBUG(D_tls) debug_printf("GnuTLS session cipher/priority \"%s\"\n", p);
1515     }
1516   }
1517 if (!p)
1518   {
1519   p = exim_default_gnutls_priority;
1520   DEBUG(D_tls)
1521     debug_printf("GnuTLS using default session cipher/priority \"%s\"\n", p);
1522   }
1523
1524 if ((rc = gnutls_priority_init(&state->priority_cache, CCS p, &errpos)))
1525   return tls_error_gnu(string_sprintf(
1526                       "gnutls_priority_init(%s) failed at offset %ld, \"%.6s..\"",
1527                       p, errpos - CS p, errpos),
1528                   rc, host, errstr);
1529
1530 if ((rc = gnutls_priority_set(state->session, state->priority_cache)))
1531   return tls_error_gnu(US"gnutls_priority_set", rc, host, errstr);
1532
1533 /* This also sets the server ticket expiration time to the same, and
1534 the STEK rotation time to 3x. */
1535
1536 gnutls_db_set_cache_expiration(state->session, ssl_session_timeout);
1537
1538 /* Reduce security in favour of increased compatibility, if the admin
1539 decides to make that trade-off. */
1540 if (gnutls_compat_mode)
1541   {
1542 #if LIBGNUTLS_VERSION_NUMBER >= 0x020104
1543   DEBUG(D_tls) debug_printf("lowering GnuTLS security, compatibility mode\n");
1544   gnutls_session_enable_compatibility_mode(state->session);
1545 #else
1546   DEBUG(D_tls) debug_printf("Unable to set gnutls_compat_mode - GnuTLS version too old\n");
1547 #endif
1548   }
1549
1550 *caller_state = state;
1551 return OK;
1552 }
1553
1554
1555
1556 /*************************************************
1557 *            Extract peer information            *
1558 *************************************************/
1559
1560 static const uschar *
1561 cipher_stdname_kcm(gnutls_kx_algorithm_t kx, gnutls_cipher_algorithm_t cipher,
1562   gnutls_mac_algorithm_t mac)
1563 {
1564 uschar cs_id[2];
1565 gnutls_kx_algorithm_t kx_i;
1566 gnutls_cipher_algorithm_t cipher_i;
1567 gnutls_mac_algorithm_t mac_i;
1568
1569 for (size_t i = 0;
1570      gnutls_cipher_suite_info(i, cs_id, &kx_i, &cipher_i, &mac_i, NULL);
1571      i++)
1572   if (kx_i == kx && cipher_i == cipher && mac_i == mac)
1573     return cipher_stdname(cs_id[0], cs_id[1]);
1574 return NULL;
1575 }
1576
1577
1578
1579 /* Called from both server and client code.
1580 Only this is allowed to set state->peerdn and state->have_set_peerdn
1581 and we use that to detect double-calls.
1582
1583 NOTE: the state blocks last while the TLS connection is up, which is fine
1584 for logging in the server side, but for the client side, we log after teardown
1585 in src/deliver.c.  While the session is up, we can twist about states and
1586 repoint tls_* globals, but those variables used for logging or other variable
1587 expansion that happens _after_ delivery need to have a longer life-time.
1588
1589 So for those, we get the data from POOL_PERM; the re-invoke guard keeps us from
1590 doing this more than once per generation of a state context.  We set them in
1591 the state context, and repoint tls_* to them.  After the state goes away, the
1592 tls_* copies of the pointers remain valid and client delivery logging is happy.
1593
1594 tls_certificate_verified is a BOOL, so the tls_peerdn and tls_cipher issues
1595 don't apply.
1596
1597 Arguments:
1598   state           exim_gnutls_state_st *
1599   errstr          pointer to error string
1600
1601 Returns:          OK/DEFER/FAIL
1602 */
1603
1604 static int
1605 peer_status(exim_gnutls_state_st * state, uschar ** errstr)
1606 {
1607 gnutls_session_t session = state->session;
1608 const gnutls_datum_t * cert_list;
1609 int old_pool, rc;
1610 unsigned int cert_list_size = 0;
1611 gnutls_protocol_t protocol;
1612 gnutls_cipher_algorithm_t cipher;
1613 gnutls_kx_algorithm_t kx;
1614 gnutls_mac_algorithm_t mac;
1615 gnutls_certificate_type_t ct;
1616 gnutls_x509_crt_t crt;
1617 uschar * dn_buf;
1618 size_t sz;
1619
1620 if (state->have_set_peerdn)
1621   return OK;
1622 state->have_set_peerdn = TRUE;
1623
1624 state->peerdn = NULL;
1625
1626 /* tls_cipher */
1627 cipher = gnutls_cipher_get(session);
1628 protocol = gnutls_protocol_get_version(session);
1629 mac = gnutls_mac_get(session);
1630 kx =
1631 #ifdef GNUTLS_TLS1_3
1632     protocol >= GNUTLS_TLS1_3 ? 0 :
1633 #endif
1634   gnutls_kx_get(session);
1635
1636 old_pool = store_pool;
1637   {
1638   tls_support * tlsp = state->tlsp;
1639   store_pool = POOL_PERM;
1640
1641 #ifdef SUPPORT_GNUTLS_SESS_DESC
1642     {
1643     gstring * g = NULL;
1644     uschar * s = US gnutls_session_get_desc(session), c;
1645
1646     /* Nikos M suggests we use this by preference.  It returns like:
1647     (TLS1.3)-(ECDHE-SECP256R1)-(RSA-PSS-RSAE-SHA256)-(AES-256-GCM)
1648
1649     For partial back-compat, put a colon after the TLS version, replace the
1650     )-( grouping with __, replace in-group - with _ and append the :keysize. */
1651
1652     /* debug_printf("peer_status: gnutls_session_get_desc %s\n", s); */
1653
1654     for (s++; (c = *s) && c != ')'; s++) g = string_catn(g, s, 1);
1655     g = string_catn(g, US":", 1);
1656     if (*s) s++;                /* now on _ between groups */
1657     while ((c = *s))
1658       {
1659       for (*++s && ++s; (c = *s) && c != ')'; s++) g = string_catn(g, c == '-' ? US"_" : s, 1);
1660       /* now on ) closing group */
1661       if ((c = *s) && *++s == '-') g = string_catn(g, US"__", 2);
1662       /* now on _ between groups */
1663       }
1664     g = string_catn(g, US":", 1);
1665     g = string_cat(g, string_sprintf("%d", (int) gnutls_cipher_get_key_size(cipher) * 8));
1666     state->ciphersuite = string_from_gstring(g);
1667     }
1668 #else
1669   state->ciphersuite = string_sprintf("%s:%s:%d",
1670       gnutls_protocol_get_name(protocol),
1671       gnutls_cipher_suite_get_name(kx, cipher, mac),
1672       (int) gnutls_cipher_get_key_size(cipher) * 8);
1673
1674   /* I don't see a way that spaces could occur, in the current GnuTLS
1675   code base, but it was a concern in the old code and perhaps older GnuTLS
1676   releases did return "TLS 1.0"; play it safe, just in case. */
1677
1678   for (uschar * p = state->ciphersuite; *p; p++) if (isspace(*p)) *p = '-';
1679 #endif
1680
1681 /* debug_printf("peer_status: ciphersuite %s\n", state->ciphersuite); */
1682
1683   tlsp->cipher = state->ciphersuite;
1684   tlsp->bits = gnutls_cipher_get_key_size(cipher) * 8;
1685
1686   tlsp->cipher_stdname = cipher_stdname_kcm(kx, cipher, mac);
1687   }
1688 store_pool = old_pool;
1689
1690 /* tls_peerdn */
1691 cert_list = gnutls_certificate_get_peers(session, &cert_list_size);
1692
1693 if (!cert_list || cert_list_size == 0)
1694   {
1695   DEBUG(D_tls) debug_printf("TLS: no certificate from peer (%p & %d)\n",
1696       cert_list, cert_list_size);
1697   if (state->verify_requirement >= VERIFY_REQUIRED)
1698     return tls_error(US"certificate verification failed",
1699         US"no certificate received from peer", state->host, errstr);
1700   return OK;
1701   }
1702
1703 if ((ct = gnutls_certificate_type_get(session)) != GNUTLS_CRT_X509)
1704   {
1705   const uschar * ctn = US gnutls_certificate_type_get_name(ct);
1706   DEBUG(D_tls)
1707     debug_printf("TLS: peer cert not X.509 but instead \"%s\"\n", ctn);
1708   if (state->verify_requirement >= VERIFY_REQUIRED)
1709     return tls_error(US"certificate verification not possible, unhandled type",
1710         ctn, state->host, errstr);
1711   return OK;
1712   }
1713
1714 #define exim_gnutls_peer_err(Label) \
1715   do { \
1716     if (rc != GNUTLS_E_SUCCESS) \
1717       { \
1718       DEBUG(D_tls) debug_printf("TLS: peer cert problem: %s: %s\n", \
1719         (Label), gnutls_strerror(rc)); \
1720       if (state->verify_requirement >= VERIFY_REQUIRED) \
1721         return tls_error_gnu((Label), rc, state->host, errstr); \
1722       return OK; \
1723       } \
1724     } while (0)
1725
1726 rc = import_cert(&cert_list[0], &crt);
1727 exim_gnutls_peer_err(US"cert 0");
1728
1729 state->tlsp->peercert = state->peercert = crt;
1730
1731 sz = 0;
1732 rc = gnutls_x509_crt_get_dn(crt, NULL, &sz);
1733 if (rc != GNUTLS_E_SHORT_MEMORY_BUFFER)
1734   {
1735   exim_gnutls_peer_err(US"getting size for cert DN failed");
1736   return FAIL; /* should not happen */
1737   }
1738 dn_buf = store_get_perm(sz, TRUE);      /* tainted */
1739 rc = gnutls_x509_crt_get_dn(crt, CS dn_buf, &sz);
1740 exim_gnutls_peer_err(US"failed to extract certificate DN [gnutls_x509_crt_get_dn(cert 0)]");
1741
1742 state->peerdn = dn_buf;
1743
1744 return OK;
1745 #undef exim_gnutls_peer_err
1746 }
1747
1748
1749
1750
1751 /*************************************************
1752 *            Verify peer certificate             *
1753 *************************************************/
1754
1755 /* Called from both server and client code.
1756 *Should* be using a callback registered with
1757 gnutls_certificate_set_verify_function() to fail the handshake if we dislike
1758 the peer information, but that's too new for some OSes.
1759
1760 Arguments:
1761   state         exim_gnutls_state_st *
1762   errstr        where to put an error message
1763
1764 Returns:
1765   FALSE     if the session should be rejected
1766   TRUE      if the cert is okay or we just don't care
1767 */
1768
1769 static BOOL
1770 verify_certificate(exim_gnutls_state_st * state, uschar ** errstr)
1771 {
1772 int rc;
1773 uint verify;
1774
1775 DEBUG(D_tls) debug_printf("TLS: checking peer certificate\n");
1776 *errstr = NULL;
1777 rc = peer_status(state, errstr);
1778
1779 if (state->verify_requirement == VERIFY_NONE)
1780   return TRUE;
1781
1782 if (rc != OK || !state->peerdn)
1783   {
1784   verify = GNUTLS_CERT_INVALID;
1785   *errstr = US"certificate not supplied";
1786   }
1787 else
1788
1789   {
1790 #ifdef SUPPORT_DANE
1791   if (state->verify_requirement == VERIFY_DANE && state->host)
1792     {
1793     /* Using dane_verify_session_crt() would be easy, as it does it all for us
1794     including talking to a DNS resolver.  But we want to do that bit ourselves
1795     as the testsuite intercepts and fakes its own DNS environment. */
1796
1797     dane_state_t s;
1798     dane_query_t r;
1799     uint lsize;
1800     const gnutls_datum_t * certlist =
1801       gnutls_certificate_get_peers(state->session, &lsize);
1802     int usage = tls_out.tlsa_usage;
1803
1804 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
1805     /* Split the TLSA records into two sets, TA and EE selectors.  Run the
1806     dane-verification separately so that we know which selector verified;
1807     then we know whether to do name-verification (needed for TA but not EE). */
1808
1809     if (usage == ((1<<DANESSL_USAGE_DANE_TA) | (1<<DANESSL_USAGE_DANE_EE)))
1810       {                                         /* a mixed-usage bundle */
1811       int i, j, nrec;
1812       const char ** dd;
1813       int * ddl;
1814
1815       for(nrec = 0; state->dane_data_len[nrec]; ) nrec++;
1816       nrec++;
1817
1818       dd = store_get(nrec * sizeof(uschar *), FALSE);
1819       ddl = store_get(nrec * sizeof(int), FALSE);
1820       nrec--;
1821
1822       if ((rc = dane_state_init(&s, 0)))
1823         goto tlsa_prob;
1824
1825       for (usage = DANESSL_USAGE_DANE_EE;
1826            usage >= DANESSL_USAGE_DANE_TA; usage--)
1827         {                               /* take records with this usage */
1828         for (j = i = 0; i < nrec; i++)
1829           if (state->dane_data[i][0] == usage)
1830             {
1831             dd[j] = state->dane_data[i];
1832             ddl[j++] = state->dane_data_len[i];
1833             }
1834         if (j)
1835           {
1836           dd[j] = NULL;
1837           ddl[j] = 0;
1838
1839           if ((rc = dane_raw_tlsa(s, &r, (char * const *)dd, ddl, 1, 0)))
1840             goto tlsa_prob;
1841
1842           if ((rc = dane_verify_crt_raw(s, certlist, lsize,
1843                             gnutls_certificate_type_get(state->session),
1844                             r, 0,
1845                             usage == DANESSL_USAGE_DANE_EE
1846                             ? DANE_VFLAG_ONLY_CHECK_EE_USAGE : 0,
1847                             &verify)))
1848             {
1849             DEBUG(D_tls)
1850               debug_printf("TLSA record problem: %s\n", dane_strerror(rc));
1851             }
1852           else if (verify == 0) /* verification passed */
1853             {
1854             usage = 1 << usage;
1855             break;
1856             }
1857           }
1858         }
1859
1860         if (rc) goto tlsa_prob;
1861       }
1862     else
1863 # endif
1864       {
1865       if (  (rc = dane_state_init(&s, 0))
1866          || (rc = dane_raw_tlsa(s, &r, state->dane_data, state->dane_data_len,
1867                         1, 0))
1868          || (rc = dane_verify_crt_raw(s, certlist, lsize,
1869                         gnutls_certificate_type_get(state->session),
1870                         r, 0,
1871 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
1872                         usage == (1 << DANESSL_USAGE_DANE_EE)
1873                         ? DANE_VFLAG_ONLY_CHECK_EE_USAGE : 0,
1874 # else
1875                         0,
1876 # endif
1877                         &verify))
1878          )
1879         goto tlsa_prob;
1880       }
1881
1882     if (verify != 0)            /* verification failed */
1883       {
1884       gnutls_datum_t str;
1885       (void) dane_verification_status_print(verify, &str, 0);
1886       *errstr = US str.data;    /* don't bother to free */
1887       goto badcert;
1888       }
1889
1890 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
1891     /* If a TA-mode TLSA record was used for verification we must additionally
1892     verify the cert name (but not the CA chain).  For EE-mode, skip it. */
1893
1894     if (usage & (1 << DANESSL_USAGE_DANE_EE))
1895 # endif
1896       {
1897       state->peer_dane_verified = state->peer_cert_verified = TRUE;
1898       goto goodcert;
1899       }
1900 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
1901     /* Assume that the name on the A-record is the one that should be matching
1902     the cert.  An alternate view is that the domain part of the email address
1903     is also permissible. */
1904
1905     if (gnutls_x509_crt_check_hostname(state->tlsp->peercert,
1906           CS state->host->name))
1907       {
1908       state->peer_dane_verified = state->peer_cert_verified = TRUE;
1909       goto goodcert;
1910       }
1911 # endif
1912     }
1913 #endif  /*SUPPORT_DANE*/
1914
1915   rc = gnutls_certificate_verify_peers2(state->session, &verify);
1916   }
1917
1918 /* Handle the result of verification. INVALID is set if any others are. */
1919
1920 if (rc < 0 || verify & (GNUTLS_CERT_INVALID|GNUTLS_CERT_REVOKED))
1921   {
1922   state->peer_cert_verified = FALSE;
1923   if (!*errstr)
1924     {
1925 #ifdef GNUTLS_CERT_VFY_STATUS_PRINT
1926     DEBUG(D_tls)
1927       {
1928       gnutls_datum_t txt;
1929
1930       if (gnutls_certificate_verification_status_print(verify,
1931             gnutls_certificate_type_get(state->session), &txt, 0)
1932           == GNUTLS_E_SUCCESS)
1933         {
1934         debug_printf("%s\n", txt.data);
1935         gnutls_free(txt.data);
1936         }
1937       }
1938 #endif
1939     *errstr = verify & GNUTLS_CERT_REVOKED
1940       ? US"certificate revoked" : US"certificate invalid";
1941     }
1942
1943   DEBUG(D_tls)
1944     debug_printf("TLS certificate verification failed (%s): peerdn=\"%s\"\n",
1945         *errstr, state->peerdn ? state->peerdn : US"<unset>");
1946
1947   if (state->verify_requirement >= VERIFY_REQUIRED)
1948     goto badcert;
1949   DEBUG(D_tls)
1950     debug_printf("TLS verify failure overridden (host in tls_try_verify_hosts)\n");
1951   }
1952
1953 else
1954   {
1955   /* Client side, check the server's certificate name versus the name on the
1956   A-record for the connection we made.  What to do for server side - what name
1957   to use for client?  We document that there is no such checking for server
1958   side. */
1959
1960   if (  state->exp_tls_verify_cert_hostnames
1961      && !gnutls_x509_crt_check_hostname(state->tlsp->peercert,
1962                 CS state->exp_tls_verify_cert_hostnames)
1963      )
1964     {
1965     DEBUG(D_tls)
1966       debug_printf("TLS certificate verification failed: cert name mismatch\n");
1967     if (state->verify_requirement >= VERIFY_REQUIRED)
1968       goto badcert;
1969     return TRUE;
1970     }
1971
1972   state->peer_cert_verified = TRUE;
1973   DEBUG(D_tls) debug_printf("TLS certificate verified: peerdn=\"%s\"\n",
1974       state->peerdn ? state->peerdn : US"<unset>");
1975   }
1976
1977 goodcert:
1978   state->tlsp->peerdn = state->peerdn;
1979   return TRUE;
1980
1981 #ifdef SUPPORT_DANE
1982 tlsa_prob:
1983   *errstr = string_sprintf("TLSA record problem: %s",
1984     rc == DANE_E_REQUESTED_DATA_NOT_AVAILABLE ? "none usable" : dane_strerror(rc));
1985 #endif
1986
1987 badcert:
1988   gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_BAD_CERTIFICATE);
1989   return FALSE;
1990 }
1991
1992
1993
1994
1995 /* ------------------------------------------------------------------------ */
1996 /* Callbacks */
1997
1998 /* Logging function which can be registered with
1999  *   gnutls_global_set_log_function()
2000  *   gnutls_global_set_log_level() 0..9
2001  */
2002 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
2003 static void
2004 exim_gnutls_logger_cb(int level, const char *message)
2005 {
2006   size_t len = strlen(message);
2007   if (len < 1)
2008     {
2009     DEBUG(D_tls) debug_printf("GnuTLS<%d> empty debug message\n", level);
2010     return;
2011     }
2012   DEBUG(D_tls) debug_printf("GnuTLS<%d>: %s%s", level, message,
2013       message[len-1] == '\n' ? "" : "\n");
2014 }
2015 #endif
2016
2017
2018 /* Called after client hello, should handle SNI work.
2019 This will always set tls_sni (state->received_sni) if available,
2020 and may trigger presenting different certificates,
2021 if state->trigger_sni_changes is TRUE.
2022
2023 Should be registered with
2024   gnutls_handshake_set_post_client_hello_function()
2025
2026 "This callback must return 0 on success or a gnutls error code to terminate the
2027 handshake.".
2028
2029 For inability to get SNI information, we return 0.
2030 We only return non-zero if re-setup failed.
2031 Only used for server-side TLS.
2032 */
2033
2034 static int
2035 exim_sni_handling_cb(gnutls_session_t session)
2036 {
2037 char sni_name[MAX_HOST_LEN];
2038 size_t data_len = MAX_HOST_LEN;
2039 exim_gnutls_state_st *state = &state_server;
2040 unsigned int sni_type;
2041 int rc, old_pool;
2042 uschar * dummy_errstr;
2043
2044 rc = gnutls_server_name_get(session, sni_name, &data_len, &sni_type, 0);
2045 if (rc != GNUTLS_E_SUCCESS)
2046   {
2047   DEBUG(D_tls)
2048     if (rc == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
2049       debug_printf("TLS: no SNI presented in handshake.\n");
2050     else
2051       debug_printf("TLS failure: gnutls_server_name_get(): %s [%d]\n",
2052         gnutls_strerror(rc), rc);
2053   return 0;
2054   }
2055
2056 if (sni_type != GNUTLS_NAME_DNS)
2057   {
2058   DEBUG(D_tls) debug_printf("TLS: ignoring SNI of unhandled type %u\n", sni_type);
2059   return 0;
2060   }
2061
2062 /* We now have a UTF-8 string in sni_name */
2063 old_pool = store_pool;
2064 store_pool = POOL_PERM;
2065 state->received_sni = string_copy_taint(US sni_name, TRUE);
2066 store_pool = old_pool;
2067
2068 /* We set this one now so that variable expansions below will work */
2069 state->tlsp->sni = state->received_sni;
2070
2071 DEBUG(D_tls) debug_printf("Received TLS SNI \"%s\"%s\n", sni_name,
2072     state->trigger_sni_changes ? "" : " (unused for certificate selection)");
2073
2074 if (!state->trigger_sni_changes)
2075   return 0;
2076
2077 if ((rc = tls_expand_session_files(state, &dummy_errstr)) != OK)
2078   {
2079   /* If the setup of certs/etc failed before handshake, TLS would not have
2080   been offered.  The best we can do now is abort. */
2081   return GNUTLS_E_APPLICATION_ERROR_MIN;
2082   }
2083
2084 rc = tls_set_remaining_x509(state, &dummy_errstr);
2085 if (rc != OK) return GNUTLS_E_APPLICATION_ERROR_MIN;
2086
2087 return 0;
2088 }
2089
2090
2091
2092 #if !defined(DISABLE_OCSP)
2093
2094 static int
2095 server_ocsp_stapling_cb(gnutls_session_t session, void * ptr,
2096   gnutls_datum_t * ocsp_response)
2097 {
2098 int ret;
2099 DEBUG(D_tls) debug_printf("OCSP stapling callback: %s\n", US ptr);
2100
2101 if ((ret = gnutls_load_file(ptr, ocsp_response)) < 0)
2102   {
2103   DEBUG(D_tls) debug_printf("Failed to load ocsp stapling file %s\n",
2104                               CS ptr);
2105   tls_in.ocsp = OCSP_NOT_RESP;
2106   return GNUTLS_E_NO_CERTIFICATE_STATUS;
2107   }
2108
2109 tls_in.ocsp = OCSP_VFY_NOT_TRIED;
2110 return 0;
2111 }
2112
2113 #endif
2114
2115
2116 #ifndef DISABLE_EVENT
2117 /*
2118 We use this callback to get observability and detail-level control
2119 for an exim TLS connection (either direction), raising a tls:cert event
2120 for each cert in the chain presented by the peer.  Any event
2121 can deny verification.
2122
2123 Return 0 for the handshake to continue or non-zero to terminate.
2124 */
2125
2126 static int
2127 verify_cb(gnutls_session_t session)
2128 {
2129 const gnutls_datum_t * cert_list;
2130 unsigned int cert_list_size = 0;
2131 gnutls_x509_crt_t crt;
2132 int rc;
2133 uschar * yield;
2134 exim_gnutls_state_st * state = gnutls_session_get_ptr(session);
2135
2136 if ((cert_list = gnutls_certificate_get_peers(session, &cert_list_size)))
2137   while (cert_list_size--)
2138   {
2139   if ((rc = import_cert(&cert_list[cert_list_size], &crt)) != GNUTLS_E_SUCCESS)
2140     {
2141     DEBUG(D_tls) debug_printf("TLS: peer cert problem: depth %d: %s\n",
2142       cert_list_size, gnutls_strerror(rc));
2143     break;
2144     }
2145
2146   state->tlsp->peercert = crt;
2147   if ((yield = event_raise(state->event_action,
2148               US"tls:cert", string_sprintf("%d", cert_list_size))))
2149     {
2150     log_write(0, LOG_MAIN,
2151               "SSL verify denied by event-action: depth=%d: %s",
2152               cert_list_size, yield);
2153     return 1;                     /* reject */
2154     }
2155   state->tlsp->peercert = NULL;
2156   }
2157
2158 return 0;
2159 }
2160
2161 #endif
2162
2163
2164 static gstring *
2165 ddump(gnutls_datum_t * d)
2166 {
2167 gstring * g = string_get((d->size+1) * 2);
2168 uschar * s = d->data;
2169 for (unsigned i = d->size; i > 0; i--, s++)
2170   {
2171   g = string_catn(g, US "0123456789abcdef" + (*s >> 4), 1);
2172   g = string_catn(g, US "0123456789abcdef" + (*s & 0xf), 1);
2173   }
2174 return g;
2175 }
2176
2177 static void
2178 post_handshake_debug(exim_gnutls_state_st * state)
2179 {
2180 #ifdef SUPPORT_GNUTLS_SESS_DESC
2181 debug_printf("%s\n", gnutls_session_get_desc(state->session));
2182 #endif
2183 #ifdef SUPPORT_GNUTLS_KEYLOG
2184 # ifdef GNUTLS_TLS1_3
2185 if (gnutls_protocol_get_version(state->session) < GNUTLS_TLS1_3)
2186 #else
2187 if (TRUE)
2188 #endif
2189   {
2190   gnutls_datum_t c, s;
2191   gstring * gc, * gs;
2192   /* we only want the client random and the master secret */
2193   gnutls_session_get_random(state->session, &c, &s);
2194   gnutls_session_get_master_secret(state->session, &s);
2195   gc = ddump(&c);
2196   gs = ddump(&s);
2197   debug_printf("CLIENT_RANDOM %.*s %.*s\n", (int)gc->ptr, gc->s, (int)gs->ptr, gs->s);
2198   }
2199 else
2200   debug_printf("To get keying info for TLS1.3 is hard:\n"
2201     " set environment variable SSLKEYLOGFILE to a filename writable by uid exim\n"
2202     " add SSLKEYLOGFILE to keep_environment in the exim config\n"
2203     " run exim as root\n"
2204     " if using sudo, add SSLKEYLOGFILE to env_keep in /etc/sudoers\n");
2205 #endif
2206 }
2207
2208
2209 #ifdef EXPERIMENTAL_TLS_RESUME
2210 static int
2211 tls_server_ticket_cb(gnutls_session_t sess, u_int htype, unsigned when,
2212   unsigned incoming, const gnutls_datum_t * msg)
2213 {
2214 DEBUG(D_tls) debug_printf("newticket cb\n");
2215 tls_in.resumption |= RESUME_CLIENT_REQUESTED;
2216 return 0;
2217 }
2218
2219 static void
2220 tls_server_resume_prehandshake(exim_gnutls_state_st * state)
2221 {
2222 /* Should the server offer session resumption? */
2223 tls_in.resumption = RESUME_SUPPORTED;
2224 if (verify_check_host(&tls_resumption_hosts) == OK)
2225   {
2226   int rc;
2227   /* GnuTLS appears to not do ticket overlap, but does emit a fresh ticket when
2228   an offered resumption is unacceptable.  We lose one resumption per ticket
2229   lifetime, and sessions cannot be indefinitely re-used.  There seems to be no
2230   way (3.6.7) of changing the default number of 2 TLS1.3 tickets issued, but at
2231   least they go out in a single packet. */
2232
2233   if (!(rc = gnutls_session_ticket_enable_server(state->session,
2234               &server_sessticket_key)))
2235     tls_in.resumption |= RESUME_SERVER_TICKET;
2236   else
2237     DEBUG(D_tls)
2238       debug_printf("enabling session tickets: %s\n", US gnutls_strerror(rc));
2239
2240   /* Try to tell if we see a ticket request */
2241   gnutls_handshake_set_hook_function(state->session,
2242     GNUTLS_HANDSHAKE_ANY, GNUTLS_HOOK_POST, tls_server_hook_cb);
2243   }
2244 }
2245
2246 static void
2247 tls_server_resume_posthandshake(exim_gnutls_state_st * state)
2248 {
2249 if (gnutls_session_resumption_requested(state->session))
2250   {
2251   /* This tells us the client sent a full ticket.  We use a
2252   callback on session-ticket request, elsewhere, to tell
2253   if a client asked for a ticket. */
2254
2255   tls_in.resumption |= RESUME_CLIENT_SUGGESTED;
2256   DEBUG(D_tls) debug_printf("client requested resumption\n");
2257   }
2258 if (gnutls_session_is_resumed(state->session))
2259   {
2260   tls_in.resumption |= RESUME_USED;
2261   DEBUG(D_tls) debug_printf("Session resumed\n");
2262   }
2263 }
2264 #endif
2265 /* ------------------------------------------------------------------------ */
2266 /* Exported functions */
2267
2268
2269
2270
2271 /*************************************************
2272 *       Start a TLS session in a server          *
2273 *************************************************/
2274
2275 /* This is called when Exim is running as a server, after having received
2276 the STARTTLS command. It must respond to that command, and then negotiate
2277 a TLS session.
2278
2279 Arguments:
2280   require_ciphers  list of allowed ciphers or NULL
2281   errstr           pointer to error string
2282
2283 Returns:           OK on success
2284                    DEFER for errors before the start of the negotiation
2285                    FAIL for errors during the negotiation; the server can't
2286                      continue running.
2287 */
2288
2289 int
2290 tls_server_start(const uschar * require_ciphers, uschar ** errstr)
2291 {
2292 int rc;
2293 exim_gnutls_state_st * state = NULL;
2294
2295 /* Check for previous activation */
2296 if (tls_in.active.sock >= 0)
2297   {
2298   tls_error(US"STARTTLS received after TLS started", US "", NULL, errstr);
2299   smtp_printf("554 Already in TLS\r\n", FALSE);
2300   return FAIL;
2301   }
2302
2303 /* Initialize the library. If it fails, it will already have logged the error
2304 and sent an SMTP response. */
2305
2306 DEBUG(D_tls) debug_printf("initialising GnuTLS as a server\n");
2307
2308 if ((rc = tls_init(NULL, tls_certificate, tls_privatekey,
2309     NULL, tls_verify_certificates, tls_crl,
2310     require_ciphers, &state, &tls_in, errstr)) != OK) return rc;
2311
2312 #ifdef EXPERIMENTAL_TLS_RESUME
2313 tls_server_resume_prehandshake(state);
2314 #endif
2315
2316 /* If this is a host for which certificate verification is mandatory or
2317 optional, set up appropriately. */
2318
2319 if (verify_check_host(&tls_verify_hosts) == OK)
2320   {
2321   DEBUG(D_tls)
2322     debug_printf("TLS: a client certificate will be required.\n");
2323   state->verify_requirement = VERIFY_REQUIRED;
2324   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
2325   }
2326 else if (verify_check_host(&tls_try_verify_hosts) == OK)
2327   {
2328   DEBUG(D_tls)
2329     debug_printf("TLS: a client certificate will be requested but not required.\n");
2330   state->verify_requirement = VERIFY_OPTIONAL;
2331   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
2332   }
2333 else
2334   {
2335   DEBUG(D_tls)
2336     debug_printf("TLS: a client certificate will not be requested.\n");
2337   state->verify_requirement = VERIFY_NONE;
2338   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
2339   }
2340
2341 #ifndef DISABLE_EVENT
2342 if (event_action)
2343   {
2344   state->event_action = event_action;
2345   gnutls_session_set_ptr(state->session, state);
2346   gnutls_certificate_set_verify_function(state->x509_cred, verify_cb);
2347   }
2348 #endif
2349
2350 /* Register SNI handling; always, even if not in tls_certificate, so that the
2351 expansion variable $tls_sni is always available. */
2352
2353 gnutls_handshake_set_post_client_hello_function(state->session,
2354     exim_sni_handling_cb);
2355
2356 /* Set context and tell client to go ahead, except in the case of TLS startup
2357 on connection, where outputting anything now upsets the clients and tends to
2358 make them disconnect. We need to have an explicit fflush() here, to force out
2359 the response. Other smtp_printf() calls do not need it, because in non-TLS
2360 mode, the fflush() happens when smtp_getc() is called. */
2361
2362 if (!state->tlsp->on_connect)
2363   {
2364   smtp_printf("220 TLS go ahead\r\n", FALSE);
2365   fflush(smtp_out);
2366   }
2367
2368 /* Now negotiate the TLS session. We put our own timer on it, since it seems
2369 that the GnuTLS library doesn't.
2370 From 3.1.0 there is gnutls_handshake_set_timeout() - but it requires you
2371 to set (and clear down afterwards) up a pull-timeout callback function that does
2372 a select, so we're no better off unless avoiding signals becomes an issue. */
2373
2374 gnutls_transport_set_ptr2(state->session,
2375     (gnutls_transport_ptr_t)(long) fileno(smtp_in),
2376     (gnutls_transport_ptr_t)(long) fileno(smtp_out));
2377 state->fd_in = fileno(smtp_in);
2378 state->fd_out = fileno(smtp_out);
2379
2380 sigalrm_seen = FALSE;
2381 if (smtp_receive_timeout > 0) ALARM(smtp_receive_timeout);
2382 do
2383   rc = gnutls_handshake(state->session);
2384 while (rc == GNUTLS_E_AGAIN ||  rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen);
2385 ALARM_CLR(0);
2386
2387 if (rc != GNUTLS_E_SUCCESS)
2388   {
2389   /* It seems that, except in the case of a timeout, we have to close the
2390   connection right here; otherwise if the other end is running OpenSSL it hangs
2391   until the server times out. */
2392
2393   if (sigalrm_seen)
2394     {
2395     tls_error(US"gnutls_handshake", US"timed out", NULL, errstr);
2396     gnutls_db_remove_session(state->session);
2397     }
2398   else
2399     {
2400     tls_error_gnu(US"gnutls_handshake", rc, NULL, errstr);
2401     (void) gnutls_alert_send_appropriate(state->session, rc);
2402     gnutls_deinit(state->session);
2403     gnutls_certificate_free_credentials(state->x509_cred);
2404     millisleep(500);
2405     shutdown(state->fd_out, SHUT_WR);
2406     for (int i = 1024; fgetc(smtp_in) != EOF && i > 0; ) i--;   /* drain skt */
2407     (void)fclose(smtp_out);
2408     (void)fclose(smtp_in);
2409     smtp_out = smtp_in = NULL;
2410     }
2411
2412   return FAIL;
2413   }
2414
2415 #ifdef EXPERIMENTAL_TLS_RESUME
2416 tls_server_resume_posthandshake(state);
2417 #endif
2418
2419 DEBUG(D_tls) post_handshake_debug(state);
2420
2421 /* Verify after the fact */
2422
2423 if (!verify_certificate(state, errstr))
2424   {
2425   if (state->verify_requirement != VERIFY_OPTIONAL)
2426     {
2427     (void) tls_error(US"certificate verification failed", *errstr, NULL, errstr);
2428     return FAIL;
2429     }
2430   DEBUG(D_tls)
2431     debug_printf("TLS: continuing on only because verification was optional, after: %s\n",
2432         *errstr);
2433   }
2434
2435 /* Sets various Exim expansion variables; always safe within server */
2436
2437 extract_exim_vars_from_tls_state(state);
2438
2439 /* TLS has been set up. Adjust the input functions to read via TLS,
2440 and initialize appropriately. */
2441
2442 state->xfer_buffer = store_malloc(ssl_xfer_buffer_size);
2443
2444 receive_getc = tls_getc;
2445 receive_getbuf = tls_getbuf;
2446 receive_get_cache = tls_get_cache;
2447 receive_ungetc = tls_ungetc;
2448 receive_feof = tls_feof;
2449 receive_ferror = tls_ferror;
2450 receive_smtp_buffered = tls_smtp_buffered;
2451
2452 return OK;
2453 }
2454
2455
2456
2457
2458 static void
2459 tls_client_setup_hostname_checks(host_item * host, exim_gnutls_state_st * state,
2460   smtp_transport_options_block * ob)
2461 {
2462 if (verify_check_given_host(CUSS &ob->tls_verify_cert_hostnames, host) == OK)
2463   {
2464   state->exp_tls_verify_cert_hostnames =
2465 #ifdef SUPPORT_I18N
2466     string_domain_utf8_to_alabel(host->name, NULL);
2467 #else
2468     host->name;
2469 #endif
2470   DEBUG(D_tls)
2471     debug_printf("TLS: server cert verification includes hostname: \"%s\".\n",
2472                     state->exp_tls_verify_cert_hostnames);
2473   }
2474 }
2475
2476
2477
2478
2479 #ifdef SUPPORT_DANE
2480 /* Given our list of RRs from the TLSA lookup, build a lookup block in
2481 GnuTLS-DANE's preferred format.  Hang it on the state str for later
2482 use in DANE verification.
2483
2484 We point at the dnsa data not copy it, so it must remain valid until
2485 after verification is done.*/
2486
2487 static BOOL
2488 dane_tlsa_load(exim_gnutls_state_st * state, dns_answer * dnsa)
2489 {
2490 dns_scan dnss;
2491 int i;
2492 const char **   dane_data;
2493 int *           dane_data_len;
2494
2495 i = 1;
2496 for (dns_record * rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS); rr;
2497      rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)
2498     ) if (rr->type == T_TLSA) i++;
2499
2500 dane_data = store_get(i * sizeof(uschar *), FALSE);
2501 dane_data_len = store_get(i * sizeof(int), FALSE);
2502
2503 i = 0;
2504 for (dns_record * rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS); rr;
2505      rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)
2506     ) if (rr->type == T_TLSA && rr->size > 3)
2507   {
2508   const uschar * p = rr->data;
2509 /*XXX need somehow to mark rr and its data as tainted.  Doues this mean copying it? */
2510   uint8_t usage = p[0], sel = p[1], type = p[2];
2511
2512   DEBUG(D_tls)
2513     debug_printf("TLSA: %d %d %d size %d\n", usage, sel, type, rr->size);
2514
2515   if (  (usage != DANESSL_USAGE_DANE_TA && usage != DANESSL_USAGE_DANE_EE)
2516      || (sel != 0 && sel != 1)
2517      )
2518     continue;
2519   switch(type)
2520     {
2521     case 0:     /* Full: cannot check at present */
2522                 break;
2523     case 1:     if (rr->size != 3 + 256/8) continue;    /* sha2-256 */
2524                 break;
2525     case 2:     if (rr->size != 3 + 512/8) continue;    /* sha2-512 */
2526                 break;
2527     default:    continue;
2528     }
2529
2530   tls_out.tlsa_usage |= 1<<usage;
2531   dane_data[i] = CS p;
2532   dane_data_len[i++] = rr->size;
2533   }
2534
2535 if (!i) return FALSE;
2536
2537 dane_data[i] = NULL;
2538 dane_data_len[i] = 0;
2539
2540 state->dane_data = (char * const *)dane_data;
2541 state->dane_data_len = dane_data_len;
2542 return TRUE;
2543 }
2544 #endif
2545
2546
2547
2548 #ifdef EXPERIMENTAL_TLS_RESUME
2549 /* On the client, get any stashed session for the given IP from hints db
2550 and apply it to the ssl-connection for attempted resumption.  Although
2551 there is a gnutls_session_ticket_enable_client() interface it is
2552 documented as unnecessary (as of 3.6.7) as "session tickets are emabled
2553 by deafult".  There seems to be no way to disable them, so even hosts not
2554 enabled by the transport option will be sent a ticket request.  We will
2555 however avoid storing and retrieving session information. */
2556
2557 static void
2558 tls_retrieve_session(tls_support * tlsp, gnutls_session_t session,
2559   host_item * host, smtp_transport_options_block * ob)
2560 {
2561 tlsp->resumption = RESUME_SUPPORTED;
2562 if (verify_check_given_host(CUSS &ob->tls_resumption_hosts, host) == OK)
2563   {
2564   dbdata_tls_session * dt;
2565   int len, rc;
2566   open_db dbblock, * dbm_file;
2567
2568   DEBUG(D_tls)
2569     debug_printf("check for resumable session for %s\n", host->address);
2570   tlsp->host_resumable = TRUE;
2571   tlsp->resumption |= RESUME_CLIENT_REQUESTED;
2572   if ((dbm_file = dbfn_open(US"tls", O_RDONLY, &dbblock, FALSE, FALSE)))
2573     {
2574     /* Key for the db is the IP.  We'd like to filter the retrieved session
2575     for ticket advisory expiry, but 3.6.1 seems to give no access to that */
2576
2577     if ((dt = dbfn_read_with_length(dbm_file, host->address, &len)))
2578       if (!(rc = gnutls_session_set_data(session,
2579                     CUS dt->session, (size_t)len - sizeof(dbdata_tls_session))))
2580         {
2581         DEBUG(D_tls) debug_printf("good session\n");
2582         tlsp->resumption |= RESUME_CLIENT_SUGGESTED;
2583         }
2584       else DEBUG(D_tls) debug_printf("setting session resumption data: %s\n",
2585             US gnutls_strerror(rc));
2586     dbfn_close(dbm_file);
2587     }
2588   }
2589 }
2590
2591
2592 static void
2593 tls_save_session(tls_support * tlsp, gnutls_session_t session, const host_item * host)
2594 {
2595 /* TLS 1.2 - we get both the callback and the direct posthandshake call,
2596 but this flag is not set until the second.  TLS 1.3 it's the other way about.
2597 Keep both calls as the session data cannot be extracted before handshake
2598 completes. */
2599
2600 if (gnutls_session_get_flags(session) & GNUTLS_SFLAGS_SESSION_TICKET)
2601   {
2602   gnutls_datum_t tkt;
2603   int rc;
2604
2605   DEBUG(D_tls) debug_printf("server offered session ticket\n");
2606   tlsp->ticket_received = TRUE;
2607   tlsp->resumption |= RESUME_SERVER_TICKET;
2608
2609   if (tlsp->host_resumable)
2610     if (!(rc = gnutls_session_get_data2(session, &tkt)))
2611       {
2612       open_db dbblock, * dbm_file;
2613       int dlen = sizeof(dbdata_tls_session) + tkt.size;
2614       dbdata_tls_session * dt = store_get(dlen, TRUE);
2615
2616       DEBUG(D_tls) debug_printf("session data size %u\n", (unsigned)tkt.size);
2617       memcpy(dt->session, tkt.data, tkt.size);
2618       gnutls_free(tkt.data);
2619
2620       if ((dbm_file = dbfn_open(US"tls", O_RDWR, &dbblock, FALSE, FALSE)))
2621         {
2622         /* key for the db is the IP */
2623         dbfn_delete(dbm_file, host->address);
2624         dbfn_write(dbm_file, host->address, dt, dlen);
2625         dbfn_close(dbm_file);
2626
2627         DEBUG(D_tls)
2628           debug_printf("wrote session db (len %u)\n", (unsigned)dlen);
2629         }
2630       }
2631     else DEBUG(D_tls)
2632       debug_printf("extract session data: %s\n", US gnutls_strerror(rc));
2633   }
2634 }
2635
2636
2637 /* With a TLS1.3 session, the ticket(s) are not seen until
2638 the first data read is attempted.  And there's often two of them.
2639 Pick them up with this callback.  We are also called for 1.2
2640 but we do nothing.
2641 */
2642 static int
2643 tls_client_ticket_cb(gnutls_session_t sess, u_int htype, unsigned when,
2644   unsigned incoming, const gnutls_datum_t * msg)
2645 {
2646 exim_gnutls_state_st * state = gnutls_session_get_ptr(sess);
2647 tls_support * tlsp = state->tlsp;
2648
2649 DEBUG(D_tls) debug_printf("newticket cb\n");
2650
2651 if (!tlsp->ticket_received)
2652   tls_save_session(tlsp, sess, state->host);
2653 return 0;
2654 }
2655
2656
2657 static void
2658 tls_client_resume_prehandshake(exim_gnutls_state_st * state,
2659   tls_support * tlsp, host_item * host,
2660   smtp_transport_options_block * ob)
2661 {
2662 gnutls_session_set_ptr(state->session, state);
2663 gnutls_handshake_set_hook_function(state->session,
2664   GNUTLS_HANDSHAKE_NEW_SESSION_TICKET, GNUTLS_HOOK_POST, tls_client_ticket_cb);
2665
2666 tls_retrieve_session(tlsp, state->session, host, ob);
2667 }
2668
2669 static void
2670 tls_client_resume_posthandshake(exim_gnutls_state_st * state,
2671   tls_support * tlsp, host_item * host)
2672 {
2673 if (gnutls_session_is_resumed(state->session))
2674   {
2675   DEBUG(D_tls) debug_printf("Session resumed\n");
2676   tlsp->resumption |= RESUME_USED;
2677   }
2678
2679 tls_save_session(tlsp, state->session, host);
2680 }
2681 #endif  /* EXPERIMENTAL_TLS_RESUME */
2682
2683
2684 /*************************************************
2685 *    Start a TLS session in a client             *
2686 *************************************************/
2687
2688 /* Called from the smtp transport after STARTTLS has been accepted.
2689
2690 Arguments:
2691   cctx          connection context
2692   conn_args     connection details
2693   cookie        datum for randomness (not used)
2694   tlsp          record details of channel configuration here; must be non-NULL
2695   errstr        error string pointer
2696
2697 Returns:        TRUE for success with TLS session context set in smtp context,
2698                 FALSE on error
2699 */
2700
2701 BOOL
2702 tls_client_start(client_conn_ctx * cctx, smtp_connect_args * conn_args,
2703   void * cookie ARG_UNUSED,
2704   tls_support * tlsp, uschar ** errstr)
2705 {
2706 host_item * host = conn_args->host;          /* for msgs and option-tests */
2707 transport_instance * tb = conn_args->tblock; /* always smtp or NULL */
2708 smtp_transport_options_block * ob = tb
2709   ? (smtp_transport_options_block *)tb->options_block
2710   : &smtp_transport_option_defaults;
2711 int rc;
2712 exim_gnutls_state_st * state = NULL;
2713 uschar * cipher_list = NULL;
2714
2715 #ifndef DISABLE_OCSP
2716 BOOL require_ocsp =
2717   verify_check_given_host(CUSS &ob->hosts_require_ocsp, host) == OK;
2718 BOOL request_ocsp = require_ocsp ? TRUE
2719   : verify_check_given_host(CUSS &ob->hosts_request_ocsp, host) == OK;
2720 #endif
2721
2722 DEBUG(D_tls) debug_printf("initialising GnuTLS as a client on fd %d\n", cctx->sock);
2723
2724 #ifdef SUPPORT_DANE
2725 /* If dane is flagged, have either request or require dane for this host, and
2726 a TLSA record found.  Therefore, dane verify required.  Which implies cert must
2727 be requested and supplied, dane verify must pass, and cert verify irrelevant
2728 (incl.  hostnames), and (caller handled) require_tls */
2729
2730 if (conn_args->dane && ob->dane_require_tls_ciphers)
2731   {
2732   /* not using expand_check_tlsvar because not yet in state */
2733   if (!expand_check(ob->dane_require_tls_ciphers, US"dane_require_tls_ciphers",
2734       &cipher_list, errstr))
2735     return FALSE;
2736   cipher_list = cipher_list && *cipher_list
2737     ? ob->dane_require_tls_ciphers : ob->tls_require_ciphers;
2738   }
2739 #endif
2740
2741 if (!cipher_list)
2742   cipher_list = ob->tls_require_ciphers;
2743
2744 if (tls_init(host, ob->tls_certificate, ob->tls_privatekey,
2745     ob->tls_sni, ob->tls_verify_certificates, ob->tls_crl,
2746     cipher_list, &state, tlsp, errstr) != OK)
2747   return FALSE;
2748
2749   {
2750   int dh_min_bits = ob->tls_dh_min_bits;
2751   if (dh_min_bits < EXIM_CLIENT_DH_MIN_MIN_BITS)
2752     {
2753     DEBUG(D_tls)
2754       debug_printf("WARNING: tls_dh_min_bits far too low,"
2755                     " clamping %d up to %d\n",
2756           dh_min_bits, EXIM_CLIENT_DH_MIN_MIN_BITS);
2757     dh_min_bits = EXIM_CLIENT_DH_MIN_MIN_BITS;
2758     }
2759
2760   DEBUG(D_tls) debug_printf("Setting D-H prime minimum"
2761                     " acceptable bits to %d\n",
2762       dh_min_bits);
2763   gnutls_dh_set_prime_bits(state->session, dh_min_bits);
2764   }
2765
2766 /* Stick to the old behaviour for compatibility if tls_verify_certificates is
2767 set but both tls_verify_hosts and tls_try_verify_hosts are unset. Check only
2768 the specified host patterns if one of them is defined */
2769
2770 #ifdef SUPPORT_DANE
2771 if (conn_args->dane && dane_tlsa_load(state, &conn_args->tlsa_dnsa))
2772   {
2773   DEBUG(D_tls)
2774     debug_printf("TLS: server certificate DANE required.\n");
2775   state->verify_requirement = VERIFY_DANE;
2776   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
2777   }
2778 else
2779 #endif
2780     if (  (  state->exp_tls_verify_certificates
2781           && !ob->tls_verify_hosts
2782           && (!ob->tls_try_verify_hosts || !*ob->tls_try_verify_hosts)
2783           )
2784         || verify_check_given_host(CUSS &ob->tls_verify_hosts, host) == OK
2785        )
2786   {
2787   tls_client_setup_hostname_checks(host, state, ob);
2788   DEBUG(D_tls)
2789     debug_printf("TLS: server certificate verification required.\n");
2790   state->verify_requirement = VERIFY_REQUIRED;
2791   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
2792   }
2793 else if (verify_check_given_host(CUSS &ob->tls_try_verify_hosts, host) == OK)
2794   {
2795   tls_client_setup_hostname_checks(host, state, ob);
2796   DEBUG(D_tls)
2797     debug_printf("TLS: server certificate verification optional.\n");
2798   state->verify_requirement = VERIFY_OPTIONAL;
2799   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
2800   }
2801 else
2802   {
2803   DEBUG(D_tls)
2804     debug_printf("TLS: server certificate verification not required.\n");
2805   state->verify_requirement = VERIFY_NONE;
2806   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
2807   }
2808
2809 #ifndef DISABLE_OCSP
2810                         /* supported since GnuTLS 3.1.3 */
2811 if (request_ocsp)
2812   {
2813   DEBUG(D_tls) debug_printf("TLS: will request OCSP stapling\n");
2814   if ((rc = gnutls_ocsp_status_request_enable_client(state->session,
2815                     NULL, 0, NULL)) != OK)
2816     {
2817     tls_error_gnu(US"cert-status-req", rc, state->host, errstr);
2818     return FALSE;
2819     }
2820   tlsp->ocsp = OCSP_NOT_RESP;
2821   }
2822 #endif
2823
2824 #ifdef EXPERIMENTAL_TLS_RESUME
2825 tls_client_resume_prehandshake(state, tlsp, host, ob);
2826 #endif
2827
2828 #ifndef DISABLE_EVENT
2829 if (tb && tb->event_action)
2830   {
2831   state->event_action = tb->event_action;
2832   gnutls_session_set_ptr(state->session, state);
2833   gnutls_certificate_set_verify_function(state->x509_cred, verify_cb);
2834   }
2835 #endif
2836
2837 gnutls_transport_set_ptr(state->session, (gnutls_transport_ptr_t)(long) cctx->sock);
2838 state->fd_in = cctx->sock;
2839 state->fd_out = cctx->sock;
2840
2841 DEBUG(D_tls) debug_printf("about to gnutls_handshake\n");
2842 /* There doesn't seem to be a built-in timeout on connection. */
2843
2844 sigalrm_seen = FALSE;
2845 ALARM(ob->command_timeout);
2846 do
2847   rc = gnutls_handshake(state->session);
2848 while (rc == GNUTLS_E_AGAIN || rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen);
2849 ALARM_CLR(0);
2850
2851 if (rc != GNUTLS_E_SUCCESS)
2852   {
2853   if (sigalrm_seen)
2854     {
2855     gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_USER_CANCELED);
2856     tls_error(US"gnutls_handshake", US"timed out", state->host, errstr);
2857     }
2858   else
2859     tls_error_gnu(US"gnutls_handshake", rc, state->host, errstr);
2860   return FALSE;
2861   }
2862
2863 DEBUG(D_tls) post_handshake_debug(state);
2864
2865 /* Verify late */
2866
2867 if (!verify_certificate(state, errstr))
2868   {
2869   tls_error(US"certificate verification failed", *errstr, state->host, errstr);
2870   return FALSE;
2871   }
2872
2873 #ifndef DISABLE_OCSP
2874 if (request_ocsp)
2875   {
2876   DEBUG(D_tls)
2877     {
2878     gnutls_datum_t stapling;
2879     gnutls_ocsp_resp_t resp;
2880     gnutls_datum_t printed;
2881     if (  (rc= gnutls_ocsp_status_request_get(state->session, &stapling)) == 0
2882        && (rc= gnutls_ocsp_resp_init(&resp)) == 0
2883        && (rc= gnutls_ocsp_resp_import(resp, &stapling)) == 0
2884        && (rc= gnutls_ocsp_resp_print(resp, GNUTLS_OCSP_PRINT_FULL, &printed)) == 0
2885        )
2886       {
2887       debug_printf("%.4096s", printed.data);
2888       gnutls_free(printed.data);
2889       }
2890     else
2891       (void) tls_error_gnu(US"ocsp decode", rc, state->host, errstr);
2892     }
2893
2894   if (gnutls_ocsp_status_request_is_checked(state->session, 0) == 0)
2895     {
2896     tlsp->ocsp = OCSP_FAILED;
2897     tls_error(US"certificate status check failed", NULL, state->host, errstr);
2898     if (require_ocsp)
2899       return FALSE;
2900     }
2901   else
2902     {
2903     DEBUG(D_tls) debug_printf("Passed OCSP checking\n");
2904     tlsp->ocsp = OCSP_VFIED;
2905     }
2906   }
2907 #endif
2908
2909 #ifdef EXPERIMENTAL_TLS_RESUME
2910 tls_client_resume_posthandshake(state, tlsp, host);
2911 #endif
2912
2913 /* Sets various Exim expansion variables; may need to adjust for ACL callouts */
2914
2915 extract_exim_vars_from_tls_state(state);
2916
2917 cctx->tls_ctx = state;
2918 return TRUE;
2919 }
2920
2921
2922
2923
2924 /*************************************************
2925 *         Close down a TLS session               *
2926 *************************************************/
2927
2928 /* This is also called from within a delivery subprocess forked from the
2929 daemon, to shut down the TLS library, without actually doing a shutdown (which
2930 would tamper with the TLS session in the parent process).
2931
2932 Arguments:
2933   ct_ctx        client context pointer, or NULL for the one global server context
2934   shutdown      1 if TLS close-alert is to be sent,
2935                 2 if also response to be waited for
2936
2937 Returns:     nothing
2938 */
2939
2940 void
2941 tls_close(void * ct_ctx, int shutdown)
2942 {
2943 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
2944 tls_support * tlsp = state->tlsp;
2945
2946 if (!tlsp || tlsp->active.sock < 0) return;  /* TLS was not active */
2947
2948 if (shutdown)
2949   {
2950   DEBUG(D_tls) debug_printf("tls_close(): shutting down TLS%s\n",
2951     shutdown > 1 ? " (with response-wait)" : "");
2952
2953   ALARM(2);
2954   gnutls_bye(state->session, shutdown > 1 ? GNUTLS_SHUT_RDWR : GNUTLS_SHUT_WR);
2955   ALARM_CLR(0);
2956   }
2957
2958 if (!ct_ctx)    /* server */
2959   {
2960   receive_getc =        smtp_getc;
2961   receive_getbuf =      smtp_getbuf;
2962   receive_get_cache =   smtp_get_cache;
2963   receive_ungetc =      smtp_ungetc;
2964   receive_feof =        smtp_feof;
2965   receive_ferror =      smtp_ferror;
2966   receive_smtp_buffered = smtp_buffered;
2967   }
2968
2969 gnutls_deinit(state->session);
2970 gnutls_certificate_free_credentials(state->x509_cred);
2971
2972 tlsp->active.sock = -1;
2973 tlsp->active.tls_ctx = NULL;
2974 /* Leave bits, peercert, cipher, peerdn, certificate_verified set, for logging */
2975 tls_channelbinding_b64 = NULL;
2976
2977
2978 if (state->xfer_buffer) store_free(state->xfer_buffer);
2979 memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
2980 }
2981
2982
2983
2984
2985 static BOOL
2986 tls_refill(unsigned lim)
2987 {
2988 exim_gnutls_state_st * state = &state_server;
2989 ssize_t inbytes;
2990
2991 DEBUG(D_tls) debug_printf("Calling gnutls_record_recv(%p, %p, %u)\n",
2992   state->session, state->xfer_buffer, ssl_xfer_buffer_size);
2993
2994 sigalrm_seen = FALSE;
2995 if (smtp_receive_timeout > 0) ALARM(smtp_receive_timeout);
2996
2997 do
2998   inbytes = gnutls_record_recv(state->session, state->xfer_buffer,
2999     MIN(ssl_xfer_buffer_size, lim));
3000 while (inbytes == GNUTLS_E_AGAIN);
3001
3002 if (smtp_receive_timeout > 0) ALARM_CLR(0);
3003
3004 if (had_command_timeout)                /* set by signal handler */
3005   smtp_command_timeout_exit();          /* does not return */
3006 if (had_command_sigterm)
3007   smtp_command_sigterm_exit();
3008 if (had_data_timeout)
3009   smtp_data_timeout_exit();
3010 if (had_data_sigint)
3011   smtp_data_sigint_exit();
3012
3013 /* Timeouts do not get this far.  A zero-byte return appears to mean that the
3014 TLS session has been closed down, not that the socket itself has been closed
3015 down. Revert to non-TLS handling. */
3016
3017 if (sigalrm_seen)
3018   {
3019   DEBUG(D_tls) debug_printf("Got tls read timeout\n");
3020   state->xfer_error = TRUE;
3021   return FALSE;
3022   }
3023
3024 else if (inbytes == 0)
3025   {
3026   DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
3027   tls_close(NULL, TLS_NO_SHUTDOWN);
3028   return FALSE;
3029   }
3030
3031 /* Handle genuine errors */
3032
3033 else if (inbytes < 0)
3034   {
3035   DEBUG(D_tls) debug_printf("%s: err from gnutls_record_recv\n", __FUNCTION__);
3036   record_io_error(state, (int) inbytes, US"recv", NULL);
3037   state->xfer_error = TRUE;
3038   return FALSE;
3039   }
3040 #ifndef DISABLE_DKIM
3041 dkim_exim_verify_feed(state->xfer_buffer, inbytes);
3042 #endif
3043 state->xfer_buffer_hwm = (int) inbytes;
3044 state->xfer_buffer_lwm = 0;
3045 return TRUE;
3046 }
3047
3048 /*************************************************
3049 *            TLS version of getc                 *
3050 *************************************************/
3051
3052 /* This gets the next byte from the TLS input buffer. If the buffer is empty,
3053 it refills the buffer via the GnuTLS reading function.
3054 Only used by the server-side TLS.
3055
3056 This feeds DKIM and should be used for all message-body reads.
3057
3058 Arguments:  lim         Maximum amount to read/buffer
3059 Returns:    the next character or EOF
3060 */
3061
3062 int
3063 tls_getc(unsigned lim)
3064 {
3065 exim_gnutls_state_st * state = &state_server;
3066
3067 if (state->xfer_buffer_lwm >= state->xfer_buffer_hwm)
3068   if (!tls_refill(lim))
3069     return state->xfer_error ? EOF : smtp_getc(lim);
3070
3071 /* Something in the buffer; return next uschar */
3072
3073 return state->xfer_buffer[state->xfer_buffer_lwm++];
3074 }
3075
3076 uschar *
3077 tls_getbuf(unsigned * len)
3078 {
3079 exim_gnutls_state_st * state = &state_server;
3080 unsigned size;
3081 uschar * buf;
3082
3083 if (state->xfer_buffer_lwm >= state->xfer_buffer_hwm)
3084   if (!tls_refill(*len))
3085     {
3086     if (!state->xfer_error) return smtp_getbuf(len);
3087     *len = 0;
3088     return NULL;
3089     }
3090
3091 if ((size = state->xfer_buffer_hwm - state->xfer_buffer_lwm) > *len)
3092   size = *len;
3093 buf = &state->xfer_buffer[state->xfer_buffer_lwm];
3094 state->xfer_buffer_lwm += size;
3095 *len = size;
3096 return buf;
3097 }
3098
3099
3100 void
3101 tls_get_cache()
3102 {
3103 #ifndef DISABLE_DKIM
3104 exim_gnutls_state_st * state = &state_server;
3105 int n = state->xfer_buffer_hwm - state->xfer_buffer_lwm;
3106 if (n > 0)
3107   dkim_exim_verify_feed(state->xfer_buffer+state->xfer_buffer_lwm, n);
3108 #endif
3109 }
3110
3111
3112 BOOL
3113 tls_could_read(void)
3114 {
3115 return state_server.xfer_buffer_lwm < state_server.xfer_buffer_hwm
3116  || gnutls_record_check_pending(state_server.session) > 0;
3117 }
3118
3119
3120
3121
3122 /*************************************************
3123 *          Read bytes from TLS channel           *
3124 *************************************************/
3125
3126 /* This does not feed DKIM, so if the caller uses this for reading message body,
3127 then the caller must feed DKIM.
3128
3129 Arguments:
3130   ct_ctx    client context pointer, or NULL for the one global server context
3131   buff      buffer of data
3132   len       size of buffer
3133
3134 Returns:    the number of bytes read
3135             -1 after a failed read, including EOF
3136 */
3137
3138 int
3139 tls_read(void * ct_ctx, uschar *buff, size_t len)
3140 {
3141 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
3142 ssize_t inbytes;
3143
3144 if (len > INT_MAX)
3145   len = INT_MAX;
3146
3147 if (state->xfer_buffer_lwm < state->xfer_buffer_hwm)
3148   DEBUG(D_tls)
3149     debug_printf("*** PROBABLY A BUG *** " \
3150         "tls_read() called with data in the tls_getc() buffer, %d ignored\n",
3151         state->xfer_buffer_hwm - state->xfer_buffer_lwm);
3152
3153 DEBUG(D_tls)
3154   debug_printf("Calling gnutls_record_recv(%p, %p, " SIZE_T_FMT ")\n",
3155       state->session, buff, len);
3156
3157 do
3158   inbytes = gnutls_record_recv(state->session, buff, len);
3159 while (inbytes == GNUTLS_E_AGAIN);
3160
3161 if (inbytes > 0) return inbytes;
3162 if (inbytes == 0)
3163   {
3164   DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
3165   }
3166 else
3167   {
3168   DEBUG(D_tls) debug_printf("%s: err from gnutls_record_recv\n", __FUNCTION__);
3169   record_io_error(state, (int)inbytes, US"recv", NULL);
3170   }
3171
3172 return -1;
3173 }
3174
3175
3176
3177
3178 /*************************************************
3179 *         Write bytes down TLS channel           *
3180 *************************************************/
3181
3182 /*
3183 Arguments:
3184   ct_ctx    client context pointer, or NULL for the one global server context
3185   buff      buffer of data
3186   len       number of bytes
3187   more      more data expected soon
3188
3189 Returns:    the number of bytes after a successful write,
3190             -1 after a failed write
3191 */
3192
3193 int
3194 tls_write(void * ct_ctx, const uschar * buff, size_t len, BOOL more)
3195 {
3196 ssize_t outbytes;
3197 size_t left = len;
3198 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
3199 #ifdef SUPPORT_CORK
3200 static BOOL corked = FALSE;
3201
3202 if (more && !corked) gnutls_record_cork(state->session);
3203 #endif
3204
3205 DEBUG(D_tls) debug_printf("%s(%p, " SIZE_T_FMT "%s)\n", __FUNCTION__,
3206   buff, left, more ? ", more" : "");
3207
3208 while (left > 0)
3209   {
3210   DEBUG(D_tls) debug_printf("gnutls_record_send(SSL, %p, " SIZE_T_FMT ")\n",
3211       buff, left);
3212
3213   do
3214     outbytes = gnutls_record_send(state->session, buff, left);
3215   while (outbytes == GNUTLS_E_AGAIN);
3216
3217   DEBUG(D_tls) debug_printf("outbytes=" SSIZE_T_FMT "\n", outbytes);
3218   if (outbytes < 0)
3219     {
3220     DEBUG(D_tls) debug_printf("%s: gnutls_record_send err\n", __FUNCTION__);
3221     record_io_error(state, outbytes, US"send", NULL);
3222     return -1;
3223     }
3224   if (outbytes == 0)
3225     {
3226     record_io_error(state, 0, US"send", US"TLS channel closed on write");
3227     return -1;
3228     }
3229
3230   left -= outbytes;
3231   buff += outbytes;
3232   }
3233
3234 if (len > INT_MAX)
3235   {
3236   DEBUG(D_tls)
3237     debug_printf("Whoops!  Wrote more bytes (" SIZE_T_FMT ") than INT_MAX\n",
3238         len);
3239   len = INT_MAX;
3240   }
3241
3242 #ifdef SUPPORT_CORK
3243 if (more != corked)
3244   {
3245   if (!more) (void) gnutls_record_uncork(state->session, 0);
3246   corked = more;
3247   }
3248 #endif
3249
3250 return (int) len;
3251 }
3252
3253
3254
3255
3256 /*************************************************
3257 *            Random number generation            *
3258 *************************************************/
3259
3260 /* Pseudo-random number generation.  The result is not expected to be
3261 cryptographically strong but not so weak that someone will shoot themselves
3262 in the foot using it as a nonce in input in some email header scheme or
3263 whatever weirdness they'll twist this into.  The result should handle fork()
3264 and avoid repeating sequences.  OpenSSL handles that for us.
3265
3266 Arguments:
3267   max       range maximum
3268 Returns     a random number in range [0, max-1]
3269 */
3270
3271 #ifdef HAVE_GNUTLS_RND
3272 int
3273 vaguely_random_number(int max)
3274 {
3275 unsigned int r;
3276 int i, needed_len;
3277 uschar smallbuf[sizeof(r)];
3278
3279 if (max <= 1)
3280   return 0;
3281
3282 needed_len = sizeof(r);
3283 /* Don't take 8 times more entropy than needed if int is 8 octets and we were
3284 asked for a number less than 10. */
3285
3286 for (r = max, i = 0; r; ++i)
3287   r >>= 1;
3288 i = (i + 7) / 8;
3289 if (i < needed_len)
3290   needed_len = i;
3291
3292 i = gnutls_rnd(GNUTLS_RND_NONCE, smallbuf, needed_len);
3293 if (i < 0)
3294   {
3295   DEBUG(D_all) debug_printf("gnutls_rnd() failed, using fallback.\n");
3296   return vaguely_random_number_fallback(max);
3297   }
3298 r = 0;
3299 for (uschar * p = smallbuf; needed_len; --needed_len, ++p)
3300   r = r * 256 + *p;
3301
3302 /* We don't particularly care about weighted results; if someone wants
3303  * smooth distribution and cares enough then they should submit a patch then. */
3304 return r % max;
3305 }
3306 #else /* HAVE_GNUTLS_RND */
3307 int
3308 vaguely_random_number(int max)
3309 {
3310   return vaguely_random_number_fallback(max);
3311 }
3312 #endif /* HAVE_GNUTLS_RND */
3313
3314
3315
3316
3317 /*************************************************
3318 *  Let tls_require_ciphers be checked at startup *
3319 *************************************************/
3320
3321 /* The tls_require_ciphers option, if set, must be something which the
3322 library can parse.
3323
3324 Returns:     NULL on success, or error message
3325 */
3326
3327 uschar *
3328 tls_validate_require_cipher(void)
3329 {
3330 int rc;
3331 uschar *expciphers = NULL;
3332 gnutls_priority_t priority_cache;
3333 const char *errpos;
3334 uschar * dummy_errstr;
3335
3336 #define validate_check_rc(Label) do { \
3337   if (rc != GNUTLS_E_SUCCESS) { if (exim_gnutls_base_init_done) gnutls_global_deinit(); \
3338   return string_sprintf("%s failed: %s", (Label), gnutls_strerror(rc)); } } while (0)
3339 #define return_deinit(Label) do { gnutls_global_deinit(); return (Label); } while (0)
3340
3341 if (exim_gnutls_base_init_done)
3342   log_write(0, LOG_MAIN|LOG_PANIC,
3343       "already initialised GnuTLS, Exim developer bug");
3344
3345 #ifdef HAVE_GNUTLS_PKCS11
3346 if (!gnutls_allow_auto_pkcs11)
3347   {
3348   rc = gnutls_pkcs11_init(GNUTLS_PKCS11_FLAG_MANUAL, NULL);
3349   validate_check_rc(US"gnutls_pkcs11_init");
3350   }
3351 #endif
3352 rc = gnutls_global_init();
3353 validate_check_rc(US"gnutls_global_init()");
3354 exim_gnutls_base_init_done = TRUE;
3355
3356 if (!(tls_require_ciphers && *tls_require_ciphers))
3357   return_deinit(NULL);
3358
3359 if (!expand_check(tls_require_ciphers, US"tls_require_ciphers", &expciphers,
3360                   &dummy_errstr))
3361   return_deinit(US"failed to expand tls_require_ciphers");
3362
3363 if (!(expciphers && *expciphers))
3364   return_deinit(NULL);
3365
3366 DEBUG(D_tls)
3367   debug_printf("tls_require_ciphers expands to \"%s\"\n", expciphers);
3368
3369 rc = gnutls_priority_init(&priority_cache, CS expciphers, &errpos);
3370 validate_check_rc(string_sprintf(
3371       "gnutls_priority_init(%s) failed at offset %ld, \"%.8s..\"",
3372       expciphers, errpos - CS expciphers, errpos));
3373
3374 #undef return_deinit
3375 #undef validate_check_rc
3376 gnutls_global_deinit();
3377
3378 return NULL;
3379 }
3380
3381
3382
3383
3384 /*************************************************
3385 *         Report the library versions.           *
3386 *************************************************/
3387
3388 /* See a description in tls-openssl.c for an explanation of why this exists.
3389
3390 Arguments:   a FILE* to print the results to
3391 Returns:     nothing
3392 */
3393
3394 void
3395 tls_version_report(FILE *f)
3396 {
3397 fprintf(f, "Library version: GnuTLS: Compile: %s\n"
3398            "                         Runtime: %s\n",
3399            LIBGNUTLS_VERSION,
3400            gnutls_check_version(NULL));
3401 }
3402
3403 #endif  /*!MACRO_PREDEF*/
3404 /* vi: aw ai sw=2
3405 */
3406 /* End of tls-gnu.c */