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