Fix buffer overflow in string_vformat. Bug 2449
[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 #ifdef SUPPORT_CA_DIR
1141   /* Mimic the behaviour with OpenSSL of not advertising a usable-cert list
1142   when using the directory-of-certs config model. */
1143
1144   if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
1145     gnutls_certificate_send_x509_rdn_sequence(state->session, 1);
1146 #endif
1147   }
1148
1149 if (cert_count < 0)
1150   {
1151   rc = cert_count;
1152   exim_gnutls_err_check(rc, US"setting certificate trust");
1153   }
1154 DEBUG(D_tls) debug_printf("Added %d certificate authorities.\n", cert_count);
1155
1156 if (state->tls_crl && *state->tls_crl &&
1157     state->exp_tls_crl && *state->exp_tls_crl)
1158   {
1159   DEBUG(D_tls) debug_printf("loading CRL file = %s\n", state->exp_tls_crl);
1160   cert_count = gnutls_certificate_set_x509_crl_file(state->x509_cred,
1161       CS state->exp_tls_crl, GNUTLS_X509_FMT_PEM);
1162   if (cert_count < 0)
1163     {
1164     rc = cert_count;
1165     exim_gnutls_err_check(rc, US"gnutls_certificate_set_x509_crl_file");
1166     }
1167   DEBUG(D_tls) debug_printf("Processed %d CRLs.\n", cert_count);
1168   }
1169
1170 return OK;
1171 }
1172
1173
1174
1175
1176 /*************************************************
1177 *          Set X.509 state variables             *
1178 *************************************************/
1179
1180 /* In GnuTLS, the registered cert/key are not replaced by a later
1181 set of a cert/key, so for SNI support we need a whole new x509_cred
1182 structure.  Which means various other non-re-expanded pieces of state
1183 need to be re-set in the new struct, so the setting logic is pulled
1184 out to this.
1185
1186 Arguments:
1187   state           exim_gnutls_state_st *
1188   errstr          error string pointer
1189
1190 Returns:          OK/DEFER/FAIL
1191 */
1192
1193 static int
1194 tls_set_remaining_x509(exim_gnutls_state_st *state, uschar ** errstr)
1195 {
1196 int rc;
1197 const host_item *host = state->host;  /* macro should be reconsidered? */
1198
1199 /* Create D-H parameters, or read them from the cache file. This function does
1200 its own SMTP error messaging. This only happens for the server, TLS D-H ignores
1201 client-side params. */
1202
1203 if (!state->host)
1204   {
1205   if (!dh_server_params)
1206     {
1207     rc = init_server_dh(errstr);
1208     if (rc != OK) return rc;
1209     }
1210   gnutls_certificate_set_dh_params(state->x509_cred, dh_server_params);
1211   }
1212
1213 /* Link the credentials to the session. */
1214
1215 rc = gnutls_credentials_set(state->session, GNUTLS_CRD_CERTIFICATE, state->x509_cred);
1216 exim_gnutls_err_check(rc, US"gnutls_credentials_set");
1217
1218 return OK;
1219 }
1220
1221 /*************************************************
1222 *            Initialize for GnuTLS               *
1223 *************************************************/
1224
1225
1226 #ifndef DISABLE_OCSP
1227
1228 static BOOL
1229 tls_is_buggy_ocsp(void)
1230 {
1231 const uschar * s;
1232 uschar maj, mid, mic;
1233
1234 s = CUS gnutls_check_version(NULL);
1235 maj = atoi(CCS s);
1236 if (maj == 3)
1237   {
1238   while (*s && *s != '.') s++;
1239   mid = atoi(CCS ++s);
1240   if (mid <= 2)
1241     return TRUE;
1242   else if (mid >= 5)
1243     return FALSE;
1244   else
1245     {
1246     while (*s && *s != '.') s++;
1247     mic = atoi(CCS ++s);
1248     return mic <= (mid == 3 ? 16 : 3);
1249     }
1250   }
1251 return FALSE;
1252 }
1253
1254 #endif
1255
1256
1257 /* Called from both server and client code. In the case of a server, errors
1258 before actual TLS negotiation return DEFER.
1259
1260 Arguments:
1261   host            connected host, if client; NULL if server
1262   certificate     certificate file
1263   privatekey      private key file
1264   sni             TLS SNI to send, sometimes when client; else NULL
1265   cas             CA certs file
1266   crl             CRL file
1267   require_ciphers tls_require_ciphers setting
1268   caller_state    returned state-info structure
1269   errstr          error string pointer
1270
1271 Returns:          OK/DEFER/FAIL
1272 */
1273
1274 static int
1275 tls_init(
1276     const host_item *host,
1277     const uschar *certificate,
1278     const uschar *privatekey,
1279     const uschar *sni,
1280     const uschar *cas,
1281     const uschar *crl,
1282     const uschar *require_ciphers,
1283     exim_gnutls_state_st **caller_state,
1284     tls_support * tlsp,
1285     uschar ** errstr)
1286 {
1287 exim_gnutls_state_st *state;
1288 int rc;
1289 size_t sz;
1290 const char *errpos;
1291 uschar *p;
1292
1293 if (!exim_gnutls_base_init_done)
1294   {
1295   DEBUG(D_tls) debug_printf("GnuTLS global init required.\n");
1296
1297 #ifdef HAVE_GNUTLS_PKCS11
1298   /* By default, gnutls_global_init will init PKCS11 support in auto mode,
1299   which loads modules from a config file, which sounds good and may be wanted
1300   by some sysadmin, but also means in common configurations that GNOME keyring
1301   environment variables are used and so breaks for users calling mailq.
1302   To prevent this, we init PKCS11 first, which is the documented approach. */
1303   if (!gnutls_allow_auto_pkcs11)
1304     {
1305     rc = gnutls_pkcs11_init(GNUTLS_PKCS11_FLAG_MANUAL, NULL);
1306     exim_gnutls_err_check(rc, US"gnutls_pkcs11_init");
1307     }
1308 #endif
1309
1310   rc = gnutls_global_init();
1311   exim_gnutls_err_check(rc, US"gnutls_global_init");
1312
1313 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
1314   DEBUG(D_tls)
1315     {
1316     gnutls_global_set_log_function(exim_gnutls_logger_cb);
1317     /* arbitrarily chosen level; bump up to 9 for more */
1318     gnutls_global_set_log_level(EXIM_GNUTLS_LIBRARY_LOG_LEVEL);
1319     }
1320 #endif
1321
1322 #ifndef DISABLE_OCSP
1323   if (tls_ocsp_file && (gnutls_buggy_ocsp = tls_is_buggy_ocsp()))
1324     log_write(0, LOG_MAIN, "OCSP unusable with this GnuTLS library version");
1325 #endif
1326
1327   exim_gnutls_base_init_done = TRUE;
1328   }
1329
1330 if (host)
1331   {
1332   /* For client-side sessions we allocate a context. This lets us run
1333   several in parallel. */
1334   int old_pool = store_pool;
1335   store_pool = POOL_PERM;
1336   state = store_get(sizeof(exim_gnutls_state_st));
1337   store_pool = old_pool;
1338
1339   memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
1340   state->tlsp = tlsp;
1341   DEBUG(D_tls) debug_printf("initialising GnuTLS client session\n");
1342   rc = gnutls_init(&state->session, GNUTLS_CLIENT);
1343   }
1344 else
1345   {
1346   state = &state_server;
1347   memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
1348   state->tlsp = tlsp;
1349   DEBUG(D_tls) debug_printf("initialising GnuTLS server session\n");
1350   rc = gnutls_init(&state->session, GNUTLS_SERVER);
1351   }
1352 exim_gnutls_err_check(rc, US"gnutls_init");
1353
1354 state->host = host;
1355
1356 state->tls_certificate = certificate;
1357 state->tls_privatekey = privatekey;
1358 state->tls_require_ciphers = require_ciphers;
1359 state->tls_sni = sni;
1360 state->tls_verify_certificates = cas;
1361 state->tls_crl = crl;
1362
1363 /* This handles the variables that might get re-expanded after TLS SNI;
1364 that's tls_certificate, tls_privatekey, tls_verify_certificates, tls_crl */
1365
1366 DEBUG(D_tls)
1367   debug_printf("Expanding various TLS configuration options for session credentials.\n");
1368 if ((rc = tls_expand_session_files(state, errstr)) != OK) return rc;
1369
1370 /* These are all other parts of the x509_cred handling, since SNI in GnuTLS
1371 requires a new structure afterwards. */
1372
1373 if ((rc = tls_set_remaining_x509(state, errstr)) != OK) return rc;
1374
1375 /* set SNI in client, only */
1376 if (host)
1377   {
1378   if (!expand_check(sni, US"tls_out_sni", &state->tlsp->sni, errstr))
1379     return DEFER;
1380   if (state->tlsp->sni && *state->tlsp->sni)
1381     {
1382     DEBUG(D_tls)
1383       debug_printf("Setting TLS client SNI to \"%s\"\n", state->tlsp->sni);
1384     sz = Ustrlen(state->tlsp->sni);
1385     rc = gnutls_server_name_set(state->session,
1386         GNUTLS_NAME_DNS, state->tlsp->sni, sz);
1387     exim_gnutls_err_check(rc, US"gnutls_server_name_set");
1388     }
1389   }
1390 else if (state->tls_sni)
1391   DEBUG(D_tls) debug_printf("*** PROBABLY A BUG *** " \
1392       "have an SNI set for a server [%s]\n", state->tls_sni);
1393
1394 /* This is the priority string support,
1395 http://www.gnutls.org/manual/html_node/Priority-Strings.html
1396 and replaces gnutls_require_kx, gnutls_require_mac & gnutls_require_protocols.
1397 This was backwards incompatible, but means Exim no longer needs to track
1398 all algorithms and provide string forms for them. */
1399
1400 p = NULL;
1401 if (state->tls_require_ciphers && *state->tls_require_ciphers)
1402   {
1403   if (!expand_check_tlsvar(tls_require_ciphers, errstr))
1404     return DEFER;
1405   if (state->exp_tls_require_ciphers && *state->exp_tls_require_ciphers)
1406     {
1407     p = state->exp_tls_require_ciphers;
1408     DEBUG(D_tls) debug_printf("GnuTLS session cipher/priority \"%s\"\n", p);
1409     }
1410   }
1411 if (!p)
1412   {
1413   p = exim_default_gnutls_priority;
1414   DEBUG(D_tls)
1415     debug_printf("GnuTLS using default session cipher/priority \"%s\"\n", p);
1416   }
1417 rc = gnutls_priority_init(&state->priority_cache, CCS p, &errpos);
1418
1419 exim_gnutls_err_check(rc, string_sprintf(
1420       "gnutls_priority_init(%s) failed at offset %ld, \"%.6s..\"",
1421       p, errpos - CS p, errpos));
1422
1423 rc = gnutls_priority_set(state->session, state->priority_cache);
1424 exim_gnutls_err_check(rc, US"gnutls_priority_set");
1425
1426 gnutls_db_set_cache_expiration(state->session, ssl_session_timeout);
1427
1428 /* Reduce security in favour of increased compatibility, if the admin
1429 decides to make that trade-off. */
1430 if (gnutls_compat_mode)
1431   {
1432 #if LIBGNUTLS_VERSION_NUMBER >= 0x020104
1433   DEBUG(D_tls) debug_printf("lowering GnuTLS security, compatibility mode\n");
1434   gnutls_session_enable_compatibility_mode(state->session);
1435 #else
1436   DEBUG(D_tls) debug_printf("Unable to set gnutls_compat_mode - GnuTLS version too old\n");
1437 #endif
1438   }
1439
1440 *caller_state = state;
1441 return OK;
1442 }
1443
1444
1445
1446 /*************************************************
1447 *            Extract peer information            *
1448 *************************************************/
1449
1450 /* Called from both server and client code.
1451 Only this is allowed to set state->peerdn and state->have_set_peerdn
1452 and we use that to detect double-calls.
1453
1454 NOTE: the state blocks last while the TLS connection is up, which is fine
1455 for logging in the server side, but for the client side, we log after teardown
1456 in src/deliver.c.  While the session is up, we can twist about states and
1457 repoint tls_* globals, but those variables used for logging or other variable
1458 expansion that happens _after_ delivery need to have a longer life-time.
1459
1460 So for those, we get the data from POOL_PERM; the re-invoke guard keeps us from
1461 doing this more than once per generation of a state context.  We set them in
1462 the state context, and repoint tls_* to them.  After the state goes away, the
1463 tls_* copies of the pointers remain valid and client delivery logging is happy.
1464
1465 tls_certificate_verified is a BOOL, so the tls_peerdn and tls_cipher issues
1466 don't apply.
1467
1468 Arguments:
1469   state           exim_gnutls_state_st *
1470   errstr          pointer to error string
1471
1472 Returns:          OK/DEFER/FAIL
1473 */
1474
1475 static int
1476 peer_status(exim_gnutls_state_st *state, uschar ** errstr)
1477 {
1478 uschar cipherbuf[256];
1479 const gnutls_datum_t *cert_list;
1480 int old_pool, rc;
1481 unsigned int cert_list_size = 0;
1482 gnutls_protocol_t protocol;
1483 gnutls_cipher_algorithm_t cipher;
1484 gnutls_kx_algorithm_t kx;
1485 gnutls_mac_algorithm_t mac;
1486 gnutls_certificate_type_t ct;
1487 gnutls_x509_crt_t crt;
1488 uschar *p, *dn_buf;
1489 size_t sz;
1490
1491 if (state->have_set_peerdn)
1492   return OK;
1493 state->have_set_peerdn = TRUE;
1494
1495 state->peerdn = NULL;
1496
1497 /* tls_cipher */
1498 cipher = gnutls_cipher_get(state->session);
1499 protocol = gnutls_protocol_get_version(state->session);
1500 mac = gnutls_mac_get(state->session);
1501 kx =
1502 #ifdef GNUTLS_TLS1_3
1503     protocol >= GNUTLS_TLS1_3 ? 0 :
1504 #endif
1505   gnutls_kx_get(state->session);
1506
1507 old_pool = store_pool;
1508   {
1509   store_pool = POOL_PERM;
1510
1511 #ifdef SUPPORT_GNUTLS_SESS_DESC
1512     {
1513     gstring * g = NULL;
1514     uschar * s = US gnutls_session_get_desc(state->session), c;
1515
1516     /* Nikos M suggests we use this by preference.  It returns like:
1517     (TLS1.3)-(ECDHE-SECP256R1)-(RSA-PSS-RSAE-SHA256)-(AES-256-GCM)
1518
1519     For partial back-compat, put a colon after the TLS version, replace the
1520     )-( grouping with __, replace in-group - with _ and append the :keysize. */
1521
1522     /* debug_printf("peer_status: gnutls_session_get_desc %s\n", s); */
1523
1524     for (s++; (c = *s) && c != ')'; s++) g = string_catn(g, s, 1);
1525     g = string_catn(g, US":", 1);
1526     if (*s) s++;                /* now on _ between groups */
1527     while ((c = *s))
1528       {
1529       for (*++s && ++s; (c = *s) && c != ')'; s++) g = string_catn(g, c == '-' ? US"_" : s, 1);
1530       /* now on ) closing group */
1531       if ((c = *s) && *++s == '-') g = string_catn(g, US"__", 2);
1532       /* now on _ between groups */
1533       }
1534     g = string_catn(g, US":", 1);
1535     g = string_cat(g, string_sprintf("%d", (int) gnutls_cipher_get_key_size(cipher) * 8));
1536     state->ciphersuite = string_from_gstring(g);
1537     }
1538 #else
1539   state->ciphersuite = string_sprintf("%s:%s:%d",
1540       gnutls_protocol_get_name(protocol),
1541       gnutls_cipher_suite_get_name(kx, cipher, mac),
1542       (int) gnutls_cipher_get_key_size(cipher) * 8);
1543
1544   /* I don't see a way that spaces could occur, in the current GnuTLS
1545   code base, but it was a concern in the old code and perhaps older GnuTLS
1546   releases did return "TLS 1.0"; play it safe, just in case. */
1547
1548   for (uschar * p = state->ciphersuite; *p; p++) if (isspace(*p)) *p = '-';
1549 #endif
1550
1551 /* debug_printf("peer_status: ciphersuite %s\n", state->ciphersuite); */
1552
1553   state->tlsp->cipher = state->ciphersuite;
1554   state->tlsp->bits = gnutls_cipher_get_key_size(cipher) * 8;
1555   }
1556 store_pool = old_pool;
1557 state->tlsp->cipher = state->ciphersuite;
1558
1559 /* tls_peerdn */
1560 cert_list = gnutls_certificate_get_peers(state->session, &cert_list_size);
1561
1562 if (cert_list == NULL || cert_list_size == 0)
1563   {
1564   DEBUG(D_tls) debug_printf("TLS: no certificate from peer (%p & %d)\n",
1565       cert_list, cert_list_size);
1566   if (state->verify_requirement >= VERIFY_REQUIRED)
1567     return tls_error(US"certificate verification failed",
1568         US"no certificate received from peer", state->host, errstr);
1569   return OK;
1570   }
1571
1572 ct = gnutls_certificate_type_get(state->session);
1573 if (ct != GNUTLS_CRT_X509)
1574   {
1575   const uschar *ctn = US gnutls_certificate_type_get_name(ct);
1576   DEBUG(D_tls)
1577     debug_printf("TLS: peer cert not X.509 but instead \"%s\"\n", ctn);
1578   if (state->verify_requirement >= VERIFY_REQUIRED)
1579     return tls_error(US"certificate verification not possible, unhandled type",
1580         ctn, state->host, errstr);
1581   return OK;
1582   }
1583
1584 #define exim_gnutls_peer_err(Label) \
1585   do { \
1586     if (rc != GNUTLS_E_SUCCESS) \
1587       { \
1588       DEBUG(D_tls) debug_printf("TLS: peer cert problem: %s: %s\n", \
1589         (Label), gnutls_strerror(rc)); \
1590       if (state->verify_requirement >= VERIFY_REQUIRED) \
1591         return tls_error((Label), US gnutls_strerror(rc), state->host, errstr); \
1592       return OK; \
1593       } \
1594     } while (0)
1595
1596 rc = import_cert(&cert_list[0], &crt);
1597 exim_gnutls_peer_err(US"cert 0");
1598
1599 state->tlsp->peercert = state->peercert = crt;
1600
1601 sz = 0;
1602 rc = gnutls_x509_crt_get_dn(crt, NULL, &sz);
1603 if (rc != GNUTLS_E_SHORT_MEMORY_BUFFER)
1604   {
1605   exim_gnutls_peer_err(US"getting size for cert DN failed");
1606   return FAIL; /* should not happen */
1607   }
1608 dn_buf = store_get_perm(sz);
1609 rc = gnutls_x509_crt_get_dn(crt, CS dn_buf, &sz);
1610 exim_gnutls_peer_err(US"failed to extract certificate DN [gnutls_x509_crt_get_dn(cert 0)]");
1611
1612 state->peerdn = dn_buf;
1613
1614 return OK;
1615 #undef exim_gnutls_peer_err
1616 }
1617
1618
1619
1620
1621 /*************************************************
1622 *            Verify peer certificate             *
1623 *************************************************/
1624
1625 /* Called from both server and client code.
1626 *Should* be using a callback registered with
1627 gnutls_certificate_set_verify_function() to fail the handshake if we dislike
1628 the peer information, but that's too new for some OSes.
1629
1630 Arguments:
1631   state         exim_gnutls_state_st *
1632   errstr        where to put an error message
1633
1634 Returns:
1635   FALSE     if the session should be rejected
1636   TRUE      if the cert is okay or we just don't care
1637 */
1638
1639 static BOOL
1640 verify_certificate(exim_gnutls_state_st * state, uschar ** errstr)
1641 {
1642 int rc;
1643 uint verify;
1644
1645 if (state->verify_requirement == VERIFY_NONE)
1646   return TRUE;
1647
1648 DEBUG(D_tls) debug_printf("TLS: checking peer certificate\n");
1649 *errstr = NULL;
1650
1651 if ((rc = peer_status(state, errstr)) != OK)
1652   {
1653   verify = GNUTLS_CERT_INVALID;
1654   *errstr = US"certificate not supplied";
1655   }
1656 else
1657
1658   {
1659 #ifdef SUPPORT_DANE
1660   if (state->verify_requirement == VERIFY_DANE && state->host)
1661     {
1662     /* Using dane_verify_session_crt() would be easy, as it does it all for us
1663     including talking to a DNS resolver.  But we want to do that bit ourselves
1664     as the testsuite intercepts and fakes its own DNS environment. */
1665
1666     dane_state_t s;
1667     dane_query_t r;
1668     uint lsize;
1669     const gnutls_datum_t * certlist =
1670       gnutls_certificate_get_peers(state->session, &lsize);
1671     int usage = tls_out.tlsa_usage;
1672
1673 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
1674     /* Split the TLSA records into two sets, TA and EE selectors.  Run the
1675     dane-verification separately so that we know which selector verified;
1676     then we know whether to do name-verification (needed for TA but not EE). */
1677
1678     if (usage == ((1<<DANESSL_USAGE_DANE_TA) | (1<<DANESSL_USAGE_DANE_EE)))
1679       {                                         /* a mixed-usage bundle */
1680       int i, j, nrec;
1681       const char ** dd;
1682       int * ddl;
1683
1684       for(nrec = 0; state->dane_data_len[nrec]; ) nrec++;
1685       nrec++;
1686
1687       dd = store_get(nrec * sizeof(uschar *));
1688       ddl = store_get(nrec * sizeof(int));
1689       nrec--;
1690
1691       if ((rc = dane_state_init(&s, 0)))
1692         goto tlsa_prob;
1693
1694       for (usage = DANESSL_USAGE_DANE_EE;
1695            usage >= DANESSL_USAGE_DANE_TA; usage--)
1696         {                               /* take records with this usage */
1697         for (j = i = 0; i < nrec; i++)
1698           if (state->dane_data[i][0] == usage)
1699             {
1700             dd[j] = state->dane_data[i];
1701             ddl[j++] = state->dane_data_len[i];
1702             }
1703         if (j)
1704           {
1705           dd[j] = NULL;
1706           ddl[j] = 0;
1707
1708           if ((rc = dane_raw_tlsa(s, &r, (char * const *)dd, ddl, 1, 0)))
1709             goto tlsa_prob;
1710
1711           if ((rc = dane_verify_crt_raw(s, certlist, lsize,
1712                             gnutls_certificate_type_get(state->session),
1713                             r, 0,
1714                             usage == DANESSL_USAGE_DANE_EE
1715                             ? DANE_VFLAG_ONLY_CHECK_EE_USAGE : 0,
1716                             &verify)))
1717             {
1718             DEBUG(D_tls)
1719               debug_printf("TLSA record problem: %s\n", dane_strerror(rc));
1720             }
1721           else if (verify == 0) /* verification passed */
1722             {
1723             usage = 1 << usage;
1724             break;
1725             }
1726           }
1727         }
1728
1729         if (rc) goto tlsa_prob;
1730       }
1731     else
1732 # endif
1733       {
1734       if (  (rc = dane_state_init(&s, 0))
1735          || (rc = dane_raw_tlsa(s, &r, state->dane_data, state->dane_data_len,
1736                         1, 0))
1737          || (rc = dane_verify_crt_raw(s, certlist, lsize,
1738                         gnutls_certificate_type_get(state->session),
1739                         r, 0,
1740 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
1741                         usage == (1 << DANESSL_USAGE_DANE_EE)
1742                         ? DANE_VFLAG_ONLY_CHECK_EE_USAGE : 0,
1743 # else
1744                         0,
1745 # endif
1746                         &verify))
1747          )
1748         goto tlsa_prob;
1749       }
1750
1751     if (verify != 0)            /* verification failed */
1752       {
1753       gnutls_datum_t str;
1754       (void) dane_verification_status_print(verify, &str, 0);
1755       *errstr = US str.data;    /* don't bother to free */
1756       goto badcert;
1757       }
1758
1759 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
1760     /* If a TA-mode TLSA record was used for verification we must additionally
1761     verify the cert name (but not the CA chain).  For EE-mode, skip it. */
1762
1763     if (usage & (1 << DANESSL_USAGE_DANE_EE))
1764 # endif
1765       {
1766       state->peer_dane_verified = state->peer_cert_verified = TRUE;
1767       goto goodcert;
1768       }
1769 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
1770     /* Assume that the name on the A-record is the one that should be matching
1771     the cert.  An alternate view is that the domain part of the email address
1772     is also permissible. */
1773
1774     if (gnutls_x509_crt_check_hostname(state->tlsp->peercert,
1775           CS state->host->name))
1776       {
1777       state->peer_dane_verified = state->peer_cert_verified = TRUE;
1778       goto goodcert;
1779       }
1780 # endif
1781     }
1782 #endif  /*SUPPORT_DANE*/
1783
1784   rc = gnutls_certificate_verify_peers2(state->session, &verify);
1785   }
1786
1787 /* Handle the result of verification. INVALID is set if any others are. */
1788
1789 if (rc < 0 || verify & (GNUTLS_CERT_INVALID|GNUTLS_CERT_REVOKED))
1790   {
1791   state->peer_cert_verified = FALSE;
1792   if (!*errstr)
1793     {
1794 #ifdef GNUTLS_CERT_VFY_STATUS_PRINT
1795     DEBUG(D_tls)
1796       {
1797       gnutls_datum_t txt;
1798
1799       if (gnutls_certificate_verification_status_print(verify,
1800             gnutls_certificate_type_get(state->session), &txt, 0)
1801           == GNUTLS_E_SUCCESS)
1802         {
1803         debug_printf("%s\n", txt.data);
1804         gnutls_free(txt.data);
1805         }
1806       }
1807 #endif
1808     *errstr = verify & GNUTLS_CERT_REVOKED
1809       ? US"certificate revoked" : US"certificate invalid";
1810     }
1811
1812   DEBUG(D_tls)
1813     debug_printf("TLS certificate verification failed (%s): peerdn=\"%s\"\n",
1814         *errstr, state->peerdn ? state->peerdn : US"<unset>");
1815
1816   if (state->verify_requirement >= VERIFY_REQUIRED)
1817     goto badcert;
1818   DEBUG(D_tls)
1819     debug_printf("TLS verify failure overridden (host in tls_try_verify_hosts)\n");
1820   }
1821
1822 else
1823   {
1824   /* Client side, check the server's certificate name versus the name on the
1825   A-record for the connection we made.  What to do for server side - what name
1826   to use for client?  We document that there is no such checking for server
1827   side. */
1828
1829   if (  state->exp_tls_verify_cert_hostnames
1830      && !gnutls_x509_crt_check_hostname(state->tlsp->peercert,
1831                 CS state->exp_tls_verify_cert_hostnames)
1832      )
1833     {
1834     DEBUG(D_tls)
1835       debug_printf("TLS certificate verification failed: cert name mismatch\n");
1836     if (state->verify_requirement >= VERIFY_REQUIRED)
1837       goto badcert;
1838     return TRUE;
1839     }
1840
1841   state->peer_cert_verified = TRUE;
1842   DEBUG(D_tls) debug_printf("TLS certificate verified: peerdn=\"%s\"\n",
1843       state->peerdn ? state->peerdn : US"<unset>");
1844   }
1845
1846 goodcert:
1847   state->tlsp->peerdn = state->peerdn;
1848   return TRUE;
1849
1850 #ifdef SUPPORT_DANE
1851 tlsa_prob:
1852   *errstr = string_sprintf("TLSA record problem: %s",
1853     rc == DANE_E_REQUESTED_DATA_NOT_AVAILABLE ? "none usable" : dane_strerror(rc));
1854 #endif
1855
1856 badcert:
1857   gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_BAD_CERTIFICATE);
1858   return FALSE;
1859 }
1860
1861
1862
1863
1864 /* ------------------------------------------------------------------------ */
1865 /* Callbacks */
1866
1867 /* Logging function which can be registered with
1868  *   gnutls_global_set_log_function()
1869  *   gnutls_global_set_log_level() 0..9
1870  */
1871 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
1872 static void
1873 exim_gnutls_logger_cb(int level, const char *message)
1874 {
1875   size_t len = strlen(message);
1876   if (len < 1)
1877     {
1878     DEBUG(D_tls) debug_printf("GnuTLS<%d> empty debug message\n", level);
1879     return;
1880     }
1881   DEBUG(D_tls) debug_printf("GnuTLS<%d>: %s%s", level, message,
1882       message[len-1] == '\n' ? "" : "\n");
1883 }
1884 #endif
1885
1886
1887 /* Called after client hello, should handle SNI work.
1888 This will always set tls_sni (state->received_sni) if available,
1889 and may trigger presenting different certificates,
1890 if state->trigger_sni_changes is TRUE.
1891
1892 Should be registered with
1893   gnutls_handshake_set_post_client_hello_function()
1894
1895 "This callback must return 0 on success or a gnutls error code to terminate the
1896 handshake.".
1897
1898 For inability to get SNI information, we return 0.
1899 We only return non-zero if re-setup failed.
1900 Only used for server-side TLS.
1901 */
1902
1903 static int
1904 exim_sni_handling_cb(gnutls_session_t session)
1905 {
1906 char sni_name[MAX_HOST_LEN];
1907 size_t data_len = MAX_HOST_LEN;
1908 exim_gnutls_state_st *state = &state_server;
1909 unsigned int sni_type;
1910 int rc, old_pool;
1911 uschar * dummy_errstr;
1912
1913 rc = gnutls_server_name_get(session, sni_name, &data_len, &sni_type, 0);
1914 if (rc != GNUTLS_E_SUCCESS)
1915   {
1916   DEBUG(D_tls) {
1917     if (rc == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
1918       debug_printf("TLS: no SNI presented in handshake.\n");
1919     else
1920       debug_printf("TLS failure: gnutls_server_name_get(): %s [%d]\n",
1921         gnutls_strerror(rc), rc);
1922     }
1923   return 0;
1924   }
1925
1926 if (sni_type != GNUTLS_NAME_DNS)
1927   {
1928   DEBUG(D_tls) debug_printf("TLS: ignoring SNI of unhandled type %u\n", sni_type);
1929   return 0;
1930   }
1931
1932 /* We now have a UTF-8 string in sni_name */
1933 old_pool = store_pool;
1934 store_pool = POOL_PERM;
1935 state->received_sni = string_copyn(US sni_name, data_len);
1936 store_pool = old_pool;
1937
1938 /* We set this one now so that variable expansions below will work */
1939 state->tlsp->sni = state->received_sni;
1940
1941 DEBUG(D_tls) debug_printf("Received TLS SNI \"%s\"%s\n", sni_name,
1942     state->trigger_sni_changes ? "" : " (unused for certificate selection)");
1943
1944 if (!state->trigger_sni_changes)
1945   return 0;
1946
1947 if ((rc = tls_expand_session_files(state, &dummy_errstr)) != OK)
1948   {
1949   /* If the setup of certs/etc failed before handshake, TLS would not have
1950   been offered.  The best we can do now is abort. */
1951   return GNUTLS_E_APPLICATION_ERROR_MIN;
1952   }
1953
1954 rc = tls_set_remaining_x509(state, &dummy_errstr);
1955 if (rc != OK) return GNUTLS_E_APPLICATION_ERROR_MIN;
1956
1957 return 0;
1958 }
1959
1960
1961
1962 #ifndef DISABLE_OCSP
1963
1964 static int
1965 server_ocsp_stapling_cb(gnutls_session_t session, void * ptr,
1966   gnutls_datum_t * ocsp_response)
1967 {
1968 int ret;
1969 DEBUG(D_tls) debug_printf("OCSP stapling callback: %s\n", US ptr);
1970
1971 if ((ret = gnutls_load_file(ptr, ocsp_response)) < 0)
1972   {
1973   DEBUG(D_tls) debug_printf("Failed to load ocsp stapling file %s\n",
1974                               CS ptr);
1975   tls_in.ocsp = OCSP_NOT_RESP;
1976   return GNUTLS_E_NO_CERTIFICATE_STATUS;
1977   }
1978
1979 tls_in.ocsp = OCSP_VFY_NOT_TRIED;
1980 return 0;
1981 }
1982
1983 #endif
1984
1985
1986 #ifndef DISABLE_EVENT
1987 /*
1988 We use this callback to get observability and detail-level control
1989 for an exim TLS connection (either direction), raising a tls:cert event
1990 for each cert in the chain presented by the peer.  Any event
1991 can deny verification.
1992
1993 Return 0 for the handshake to continue or non-zero to terminate.
1994 */
1995
1996 static int
1997 verify_cb(gnutls_session_t session)
1998 {
1999 const gnutls_datum_t * cert_list;
2000 unsigned int cert_list_size = 0;
2001 gnutls_x509_crt_t crt;
2002 int rc;
2003 uschar * yield;
2004 exim_gnutls_state_st * state = gnutls_session_get_ptr(session);
2005
2006 if ((cert_list = gnutls_certificate_get_peers(session, &cert_list_size)))
2007   while (cert_list_size--)
2008   {
2009   if ((rc = import_cert(&cert_list[cert_list_size], &crt)) != GNUTLS_E_SUCCESS)
2010     {
2011     DEBUG(D_tls) debug_printf("TLS: peer cert problem: depth %d: %s\n",
2012       cert_list_size, gnutls_strerror(rc));
2013     break;
2014     }
2015
2016   state->tlsp->peercert = crt;
2017   if ((yield = event_raise(state->event_action,
2018               US"tls:cert", string_sprintf("%d", cert_list_size))))
2019     {
2020     log_write(0, LOG_MAIN,
2021               "SSL verify denied by event-action: depth=%d: %s",
2022               cert_list_size, yield);
2023     return 1;                     /* reject */
2024     }
2025   state->tlsp->peercert = NULL;
2026   }
2027
2028 return 0;
2029 }
2030
2031 #endif
2032
2033
2034
2035 /* ------------------------------------------------------------------------ */
2036 /* Exported functions */
2037
2038
2039
2040
2041 /*************************************************
2042 *       Start a TLS session in a server          *
2043 *************************************************/
2044
2045 /* This is called when Exim is running as a server, after having received
2046 the STARTTLS command. It must respond to that command, and then negotiate
2047 a TLS session.
2048
2049 Arguments:
2050   require_ciphers  list of allowed ciphers or NULL
2051   errstr           pointer to error string
2052
2053 Returns:           OK on success
2054                    DEFER for errors before the start of the negotiation
2055                    FAIL for errors during the negotiation; the server can't
2056                      continue running.
2057 */
2058
2059 int
2060 tls_server_start(const uschar * require_ciphers, uschar ** errstr)
2061 {
2062 int rc;
2063 exim_gnutls_state_st * state = NULL;
2064
2065 /* Check for previous activation */
2066 if (tls_in.active.sock >= 0)
2067   {
2068   tls_error(US"STARTTLS received after TLS started", US "", NULL, errstr);
2069   smtp_printf("554 Already in TLS\r\n", FALSE);
2070   return FAIL;
2071   }
2072
2073 /* Initialize the library. If it fails, it will already have logged the error
2074 and sent an SMTP response. */
2075
2076 DEBUG(D_tls) debug_printf("initialising GnuTLS as a server\n");
2077
2078 if ((rc = tls_init(NULL, tls_certificate, tls_privatekey,
2079     NULL, tls_verify_certificates, tls_crl,
2080     require_ciphers, &state, &tls_in, errstr)) != OK) return rc;
2081
2082 /* If this is a host for which certificate verification is mandatory or
2083 optional, set up appropriately. */
2084
2085 if (verify_check_host(&tls_verify_hosts) == OK)
2086   {
2087   DEBUG(D_tls)
2088     debug_printf("TLS: a client certificate will be required.\n");
2089   state->verify_requirement = VERIFY_REQUIRED;
2090   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
2091   }
2092 else if (verify_check_host(&tls_try_verify_hosts) == OK)
2093   {
2094   DEBUG(D_tls)
2095     debug_printf("TLS: a client certificate will be requested but not required.\n");
2096   state->verify_requirement = VERIFY_OPTIONAL;
2097   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
2098   }
2099 else
2100   {
2101   DEBUG(D_tls)
2102     debug_printf("TLS: a client certificate will not be requested.\n");
2103   state->verify_requirement = VERIFY_NONE;
2104   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
2105   }
2106
2107 #ifndef DISABLE_EVENT
2108 if (event_action)
2109   {
2110   state->event_action = event_action;
2111   gnutls_session_set_ptr(state->session, state);
2112   gnutls_certificate_set_verify_function(state->x509_cred, verify_cb);
2113   }
2114 #endif
2115
2116 /* Register SNI handling; always, even if not in tls_certificate, so that the
2117 expansion variable $tls_sni is always available. */
2118
2119 gnutls_handshake_set_post_client_hello_function(state->session,
2120     exim_sni_handling_cb);
2121
2122 /* Set context and tell client to go ahead, except in the case of TLS startup
2123 on connection, where outputting anything now upsets the clients and tends to
2124 make them disconnect. We need to have an explicit fflush() here, to force out
2125 the response. Other smtp_printf() calls do not need it, because in non-TLS
2126 mode, the fflush() happens when smtp_getc() is called. */
2127
2128 if (!state->tlsp->on_connect)
2129   {
2130   smtp_printf("220 TLS go ahead\r\n", FALSE);
2131   fflush(smtp_out);
2132   }
2133
2134 /* Now negotiate the TLS session. We put our own timer on it, since it seems
2135 that the GnuTLS library doesn't.
2136 From 3.1.0 there is gnutls_handshake_set_timeout() - but it requires you
2137 to set (and clear down afterwards) up a pull-timeout callback function that does
2138 a select, so we're no better off unless avoiding signals becomes an issue. */
2139
2140 gnutls_transport_set_ptr2(state->session,
2141     (gnutls_transport_ptr_t)(long) fileno(smtp_in),
2142     (gnutls_transport_ptr_t)(long) fileno(smtp_out));
2143 state->fd_in = fileno(smtp_in);
2144 state->fd_out = fileno(smtp_out);
2145
2146 sigalrm_seen = FALSE;
2147 if (smtp_receive_timeout > 0) ALARM(smtp_receive_timeout);
2148 do
2149   rc = gnutls_handshake(state->session);
2150 while (rc == GNUTLS_E_AGAIN ||  rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen);
2151 ALARM_CLR(0);
2152
2153 if (rc != GNUTLS_E_SUCCESS)
2154   {
2155   /* It seems that, except in the case of a timeout, we have to close the
2156   connection right here; otherwise if the other end is running OpenSSL it hangs
2157   until the server times out. */
2158
2159   if (sigalrm_seen)
2160     {
2161     tls_error(US"gnutls_handshake", US"timed out", NULL, errstr);
2162     gnutls_db_remove_session(state->session);
2163     }
2164   else
2165     {
2166     tls_error(US"gnutls_handshake", US gnutls_strerror(rc), NULL, errstr);
2167     (void) gnutls_alert_send_appropriate(state->session, rc);
2168     gnutls_deinit(state->session);
2169     gnutls_certificate_free_credentials(state->x509_cred);
2170     millisleep(500);
2171     shutdown(state->fd_out, SHUT_WR);
2172     for (rc = 1024; fgetc(smtp_in) != EOF && rc > 0; ) rc--;    /* drain skt */
2173     (void)fclose(smtp_out);
2174     (void)fclose(smtp_in);
2175     smtp_out = smtp_in = NULL;
2176     }
2177
2178   return FAIL;
2179   }
2180
2181 DEBUG(D_tls) debug_printf("gnutls_handshake was successful\n");
2182
2183 /* Verify after the fact */
2184
2185 if (!verify_certificate(state, errstr))
2186   {
2187   if (state->verify_requirement != VERIFY_OPTIONAL)
2188     {
2189     (void) tls_error(US"certificate verification failed", *errstr, NULL, errstr);
2190     return FAIL;
2191     }
2192   DEBUG(D_tls)
2193     debug_printf("TLS: continuing on only because verification was optional, after: %s\n",
2194         *errstr);
2195   }
2196
2197 /* Figure out peer DN, and if authenticated, etc. */
2198
2199 if ((rc = peer_status(state, NULL)) != OK) return rc;
2200
2201 /* Sets various Exim expansion variables; always safe within server */
2202
2203 extract_exim_vars_from_tls_state(state);
2204
2205 /* TLS has been set up. Adjust the input functions to read via TLS,
2206 and initialize appropriately. */
2207
2208 state->xfer_buffer = store_malloc(ssl_xfer_buffer_size);
2209
2210 receive_getc = tls_getc;
2211 receive_getbuf = tls_getbuf;
2212 receive_get_cache = tls_get_cache;
2213 receive_ungetc = tls_ungetc;
2214 receive_feof = tls_feof;
2215 receive_ferror = tls_ferror;
2216 receive_smtp_buffered = tls_smtp_buffered;
2217
2218 return OK;
2219 }
2220
2221
2222
2223
2224 static void
2225 tls_client_setup_hostname_checks(host_item * host, exim_gnutls_state_st * state,
2226   smtp_transport_options_block * ob)
2227 {
2228 if (verify_check_given_host(CUSS &ob->tls_verify_cert_hostnames, host) == OK)
2229   {
2230   state->exp_tls_verify_cert_hostnames =
2231 #ifdef SUPPORT_I18N
2232     string_domain_utf8_to_alabel(host->name, NULL);
2233 #else
2234     host->name;
2235 #endif
2236   DEBUG(D_tls)
2237     debug_printf("TLS: server cert verification includes hostname: \"%s\".\n",
2238                     state->exp_tls_verify_cert_hostnames);
2239   }
2240 }
2241
2242
2243
2244
2245 #ifdef SUPPORT_DANE
2246 /* Given our list of RRs from the TLSA lookup, build a lookup block in
2247 GnuTLS-DANE's preferred format.  Hang it on the state str for later
2248 use in DANE verification.
2249
2250 We point at the dnsa data not copy it, so it must remain valid until
2251 after verification is done.*/
2252
2253 static BOOL
2254 dane_tlsa_load(exim_gnutls_state_st * state, dns_answer * dnsa)
2255 {
2256 dns_record * rr;
2257 dns_scan dnss;
2258 int i;
2259 const char **   dane_data;
2260 int *           dane_data_len;
2261
2262 for (rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS), i = 1;
2263      rr;
2264      rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)
2265     ) if (rr->type == T_TLSA) i++;
2266
2267 dane_data = store_get(i * sizeof(uschar *));
2268 dane_data_len = store_get(i * sizeof(int));
2269
2270 for (rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS), i = 0;
2271      rr;
2272      rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)
2273     ) if (rr->type == T_TLSA && rr->size > 3)
2274   {
2275   const uschar * p = rr->data;
2276   uint8_t usage = p[0], sel = p[1], type = p[2];
2277
2278   DEBUG(D_tls)
2279     debug_printf("TLSA: %d %d %d size %d\n", usage, sel, type, rr->size);
2280
2281   if (  (usage != DANESSL_USAGE_DANE_TA && usage != DANESSL_USAGE_DANE_EE)
2282      || (sel != 0 && sel != 1)
2283      )
2284     continue;
2285   switch(type)
2286     {
2287     case 0:     /* Full: cannot check at present */
2288                 break;
2289     case 1:     if (rr->size != 3 + 256/8) continue;    /* sha2-256 */
2290                 break;
2291     case 2:     if (rr->size != 3 + 512/8) continue;    /* sha2-512 */
2292                 break;
2293     default:    continue;
2294     }
2295
2296   tls_out.tlsa_usage |= 1<<usage;
2297   dane_data[i] = CS p;
2298   dane_data_len[i++] = rr->size;
2299   }
2300
2301 if (!i) return FALSE;
2302
2303 dane_data[i] = NULL;
2304 dane_data_len[i] = 0;
2305
2306 state->dane_data = (char * const *)dane_data;
2307 state->dane_data_len = dane_data_len;
2308 return TRUE;
2309 }
2310 #endif
2311
2312
2313
2314 /*************************************************
2315 *    Start a TLS session in a client             *
2316 *************************************************/
2317
2318 /* Called from the smtp transport after STARTTLS has been accepted.
2319
2320 Arguments:
2321   fd                the fd of the connection
2322   host              connected host (for messages and option-tests)
2323   addr              the first address (not used)
2324   tb                transport (always smtp)
2325   tlsa_dnsa         non-NULL, either request or require dane for this host, and
2326                     a TLSA record found.  Therefore, dane verify required.
2327                     Which implies cert must be requested and supplied, dane
2328                     verify must pass, and cert verify irrelevant (incl.
2329                     hostnames), and (caller handled) require_tls
2330   tlsp              record details of channel configuration
2331   errstr            error string pointer
2332
2333 Returns:            Pointer to TLS session context, or NULL on error
2334 */
2335
2336 void *
2337 tls_client_start(int fd, host_item *host,
2338     address_item *addr ARG_UNUSED,
2339     transport_instance * tb,
2340 #ifdef SUPPORT_DANE
2341     dns_answer * tlsa_dnsa,
2342 #endif
2343     tls_support * tlsp, uschar ** errstr)
2344 {
2345 smtp_transport_options_block *ob = tb
2346   ? (smtp_transport_options_block *)tb->options_block
2347   : &smtp_transport_option_defaults;
2348 int rc;
2349 exim_gnutls_state_st * state = NULL;
2350 uschar *cipher_list = NULL;
2351
2352 #ifndef DISABLE_OCSP
2353 BOOL require_ocsp =
2354   verify_check_given_host(CUSS &ob->hosts_require_ocsp, host) == OK;
2355 BOOL request_ocsp = require_ocsp ? TRUE
2356   : verify_check_given_host(CUSS &ob->hosts_request_ocsp, host) == OK;
2357 #endif
2358
2359 DEBUG(D_tls) debug_printf("initialising GnuTLS as a client on fd %d\n", fd);
2360
2361 #ifdef SUPPORT_DANE
2362 if (tlsa_dnsa && ob->dane_require_tls_ciphers)
2363   {
2364   /* not using expand_check_tlsvar because not yet in state */
2365   if (!expand_check(ob->dane_require_tls_ciphers, US"dane_require_tls_ciphers",
2366       &cipher_list, errstr))
2367     return NULL;
2368   cipher_list = cipher_list && *cipher_list
2369     ? ob->dane_require_tls_ciphers : ob->tls_require_ciphers;
2370   }
2371 #endif
2372
2373 if (!cipher_list)
2374   cipher_list = ob->tls_require_ciphers;
2375
2376 if (tls_init(host, ob->tls_certificate, ob->tls_privatekey,
2377     ob->tls_sni, ob->tls_verify_certificates, ob->tls_crl,
2378     cipher_list, &state, tlsp, errstr) != OK)
2379   return NULL;
2380
2381   {
2382   int dh_min_bits = ob->tls_dh_min_bits;
2383   if (dh_min_bits < EXIM_CLIENT_DH_MIN_MIN_BITS)
2384     {
2385     DEBUG(D_tls)
2386       debug_printf("WARNING: tls_dh_min_bits far too low,"
2387                     " clamping %d up to %d\n",
2388           dh_min_bits, EXIM_CLIENT_DH_MIN_MIN_BITS);
2389     dh_min_bits = EXIM_CLIENT_DH_MIN_MIN_BITS;
2390     }
2391
2392   DEBUG(D_tls) debug_printf("Setting D-H prime minimum"
2393                     " acceptable bits to %d\n",
2394       dh_min_bits);
2395   gnutls_dh_set_prime_bits(state->session, dh_min_bits);
2396   }
2397
2398 /* Stick to the old behaviour for compatibility if tls_verify_certificates is
2399 set but both tls_verify_hosts and tls_try_verify_hosts are unset. Check only
2400 the specified host patterns if one of them is defined */
2401
2402 #ifdef SUPPORT_DANE
2403 if (tlsa_dnsa && dane_tlsa_load(state, tlsa_dnsa))
2404   {
2405   DEBUG(D_tls)
2406     debug_printf("TLS: server certificate DANE required.\n");
2407   state->verify_requirement = VERIFY_DANE;
2408   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
2409   }
2410 else
2411 #endif
2412     if (  (  state->exp_tls_verify_certificates
2413           && !ob->tls_verify_hosts
2414           && (!ob->tls_try_verify_hosts || !*ob->tls_try_verify_hosts)
2415           )
2416         || verify_check_given_host(CUSS &ob->tls_verify_hosts, host) == OK
2417        )
2418   {
2419   tls_client_setup_hostname_checks(host, state, ob);
2420   DEBUG(D_tls)
2421     debug_printf("TLS: server certificate verification required.\n");
2422   state->verify_requirement = VERIFY_REQUIRED;
2423   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
2424   }
2425 else if (verify_check_given_host(CUSS &ob->tls_try_verify_hosts, host) == OK)
2426   {
2427   tls_client_setup_hostname_checks(host, state, ob);
2428   DEBUG(D_tls)
2429     debug_printf("TLS: server certificate verification optional.\n");
2430   state->verify_requirement = VERIFY_OPTIONAL;
2431   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
2432   }
2433 else
2434   {
2435   DEBUG(D_tls)
2436     debug_printf("TLS: server certificate verification not required.\n");
2437   state->verify_requirement = VERIFY_NONE;
2438   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
2439   }
2440
2441 #ifndef DISABLE_OCSP
2442                         /* supported since GnuTLS 3.1.3 */
2443 if (request_ocsp)
2444   {
2445   DEBUG(D_tls) debug_printf("TLS: will request OCSP stapling\n");
2446   if ((rc = gnutls_ocsp_status_request_enable_client(state->session,
2447                     NULL, 0, NULL)) != OK)
2448     {
2449     tls_error(US"cert-status-req", US gnutls_strerror(rc), state->host, errstr);
2450     return NULL;
2451     }
2452   tlsp->ocsp = OCSP_NOT_RESP;
2453   }
2454 #endif
2455
2456 #ifndef DISABLE_EVENT
2457 if (tb && tb->event_action)
2458   {
2459   state->event_action = tb->event_action;
2460   gnutls_session_set_ptr(state->session, state);
2461   gnutls_certificate_set_verify_function(state->x509_cred, verify_cb);
2462   }
2463 #endif
2464
2465 gnutls_transport_set_ptr(state->session, (gnutls_transport_ptr_t)(long) fd);
2466 state->fd_in = fd;
2467 state->fd_out = fd;
2468
2469 DEBUG(D_tls) debug_printf("about to gnutls_handshake\n");
2470 /* There doesn't seem to be a built-in timeout on connection. */
2471
2472 sigalrm_seen = FALSE;
2473 ALARM(ob->command_timeout);
2474 do
2475   rc = gnutls_handshake(state->session);
2476 while (rc == GNUTLS_E_AGAIN || rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen);
2477 ALARM_CLR(0);
2478
2479 if (rc != GNUTLS_E_SUCCESS)
2480   {
2481   if (sigalrm_seen)
2482     {
2483     gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_USER_CANCELED);
2484     tls_error(US"gnutls_handshake", US"timed out", state->host, errstr);
2485     }
2486   else
2487     tls_error(US"gnutls_handshake", US gnutls_strerror(rc), state->host, errstr);
2488   return NULL;
2489   }
2490
2491 DEBUG(D_tls) debug_printf("gnutls_handshake was successful\n");
2492
2493 /* Verify late */
2494
2495 if (!verify_certificate(state, errstr))
2496   {
2497   tls_error(US"certificate verification failed", *errstr, state->host, errstr);
2498   return NULL;
2499   }
2500
2501 #ifndef DISABLE_OCSP
2502 if (request_ocsp)
2503   {
2504   DEBUG(D_tls)
2505     {
2506     gnutls_datum_t stapling;
2507     gnutls_ocsp_resp_t resp;
2508     gnutls_datum_t printed;
2509     if (  (rc= gnutls_ocsp_status_request_get(state->session, &stapling)) == 0
2510        && (rc= gnutls_ocsp_resp_init(&resp)) == 0
2511        && (rc= gnutls_ocsp_resp_import(resp, &stapling)) == 0
2512        && (rc= gnutls_ocsp_resp_print(resp, GNUTLS_OCSP_PRINT_FULL, &printed)) == 0
2513        )
2514       {
2515       debug_printf("%.4096s", printed.data);
2516       gnutls_free(printed.data);
2517       }
2518     else
2519       (void) tls_error(US"ocsp decode", US gnutls_strerror(rc), state->host, errstr);
2520     }
2521
2522   if (gnutls_ocsp_status_request_is_checked(state->session, 0) == 0)
2523     {
2524     tlsp->ocsp = OCSP_FAILED;
2525     tls_error(US"certificate status check failed", NULL, state->host, errstr);
2526     if (require_ocsp)
2527       return FALSE;
2528     }
2529   else
2530     {
2531     DEBUG(D_tls) debug_printf("Passed OCSP checking\n");
2532     tlsp->ocsp = OCSP_VFIED;
2533     }
2534   }
2535 #endif
2536
2537 /* Figure out peer DN, and if authenticated, etc. */
2538
2539 if (peer_status(state, errstr) != OK)
2540   return NULL;
2541
2542 /* Sets various Exim expansion variables; may need to adjust for ACL callouts */
2543
2544 extract_exim_vars_from_tls_state(state);
2545
2546 return state;
2547 }
2548
2549
2550
2551
2552 /*************************************************
2553 *         Close down a TLS session               *
2554 *************************************************/
2555
2556 /* This is also called from within a delivery subprocess forked from the
2557 daemon, to shut down the TLS library, without actually doing a shutdown (which
2558 would tamper with the TLS session in the parent process).
2559
2560 Arguments:
2561   ct_ctx        client context pointer, or NULL for the one global server context
2562   shutdown      1 if TLS close-alert is to be sent,
2563                 2 if also response to be waited for
2564
2565 Returns:     nothing
2566 */
2567
2568 void
2569 tls_close(void * ct_ctx, int shutdown)
2570 {
2571 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
2572 tls_support * tlsp = state->tlsp;
2573
2574 if (!tlsp || tlsp->active.sock < 0) return;  /* TLS was not active */
2575
2576 if (shutdown)
2577   {
2578   DEBUG(D_tls) debug_printf("tls_close(): shutting down TLS%s\n",
2579     shutdown > 1 ? " (with response-wait)" : "");
2580
2581   ALARM(2);
2582   gnutls_bye(state->session, shutdown > 1 ? GNUTLS_SHUT_RDWR : GNUTLS_SHUT_WR);
2583   ALARM_CLR(0);
2584   }
2585
2586 if (!ct_ctx)    /* server */
2587   {
2588   receive_getc =        smtp_getc;
2589   receive_getbuf =      smtp_getbuf;
2590   receive_get_cache =   smtp_get_cache;
2591   receive_ungetc =      smtp_ungetc;
2592   receive_feof =        smtp_feof;
2593   receive_ferror =      smtp_ferror;
2594   receive_smtp_buffered = smtp_buffered;
2595   }
2596
2597 gnutls_deinit(state->session);
2598 gnutls_certificate_free_credentials(state->x509_cred);
2599
2600 tlsp->active.sock = -1;
2601 tlsp->active.tls_ctx = NULL;
2602 /* Leave bits, peercert, cipher, peerdn, certificate_verified set, for logging */
2603 tls_channelbinding_b64 = NULL;
2604
2605
2606 if (state->xfer_buffer) store_free(state->xfer_buffer);
2607 memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
2608 }
2609
2610
2611
2612
2613 static BOOL
2614 tls_refill(unsigned lim)
2615 {
2616 exim_gnutls_state_st * state = &state_server;
2617 ssize_t inbytes;
2618
2619 DEBUG(D_tls) debug_printf("Calling gnutls_record_recv(%p, %p, %u)\n",
2620   state->session, state->xfer_buffer, ssl_xfer_buffer_size);
2621
2622 sigalrm_seen = FALSE;
2623 if (smtp_receive_timeout > 0) ALARM(smtp_receive_timeout);
2624
2625 do
2626   inbytes = gnutls_record_recv(state->session, state->xfer_buffer,
2627     MIN(ssl_xfer_buffer_size, lim));
2628 while (inbytes == GNUTLS_E_AGAIN);
2629
2630 if (smtp_receive_timeout > 0) ALARM_CLR(0);
2631
2632 if (had_command_timeout)                /* set by signal handler */
2633   smtp_command_timeout_exit();          /* does not return */
2634 if (had_command_sigterm)
2635   smtp_command_sigterm_exit();
2636 if (had_data_timeout)
2637   smtp_data_timeout_exit();
2638 if (had_data_sigint)
2639   smtp_data_sigint_exit();
2640
2641 /* Timeouts do not get this far.  A zero-byte return appears to mean that the
2642 TLS session has been closed down, not that the socket itself has been closed
2643 down. Revert to non-TLS handling. */
2644
2645 if (sigalrm_seen)
2646   {
2647   DEBUG(D_tls) debug_printf("Got tls read timeout\n");
2648   state->xfer_error = TRUE;
2649   return FALSE;
2650   }
2651
2652 else if (inbytes == 0)
2653   {
2654   DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
2655   tls_close(NULL, TLS_NO_SHUTDOWN);
2656   return FALSE;
2657   }
2658
2659 /* Handle genuine errors */
2660
2661 else if (inbytes < 0)
2662   {
2663   DEBUG(D_tls) debug_printf("%s: err from gnutls_record_recv(\n", __FUNCTION__);
2664   record_io_error(state, (int) inbytes, US"recv", NULL);
2665   state->xfer_error = TRUE;
2666   return FALSE;
2667   }
2668 #ifndef DISABLE_DKIM
2669 dkim_exim_verify_feed(state->xfer_buffer, inbytes);
2670 #endif
2671 state->xfer_buffer_hwm = (int) inbytes;
2672 state->xfer_buffer_lwm = 0;
2673 return TRUE;
2674 }
2675
2676 /*************************************************
2677 *            TLS version of getc                 *
2678 *************************************************/
2679
2680 /* This gets the next byte from the TLS input buffer. If the buffer is empty,
2681 it refills the buffer via the GnuTLS reading function.
2682 Only used by the server-side TLS.
2683
2684 This feeds DKIM and should be used for all message-body reads.
2685
2686 Arguments:  lim         Maximum amount to read/buffer
2687 Returns:    the next character or EOF
2688 */
2689
2690 int
2691 tls_getc(unsigned lim)
2692 {
2693 exim_gnutls_state_st * state = &state_server;
2694
2695 if (state->xfer_buffer_lwm >= state->xfer_buffer_hwm)
2696   if (!tls_refill(lim))
2697     return state->xfer_error ? EOF : smtp_getc(lim);
2698
2699 /* Something in the buffer; return next uschar */
2700
2701 return state->xfer_buffer[state->xfer_buffer_lwm++];
2702 }
2703
2704 uschar *
2705 tls_getbuf(unsigned * len)
2706 {
2707 exim_gnutls_state_st * state = &state_server;
2708 unsigned size;
2709 uschar * buf;
2710
2711 if (state->xfer_buffer_lwm >= state->xfer_buffer_hwm)
2712   if (!tls_refill(*len))
2713     {
2714     if (!state->xfer_error) return smtp_getbuf(len);
2715     *len = 0;
2716     return NULL;
2717     }
2718
2719 if ((size = state->xfer_buffer_hwm - state->xfer_buffer_lwm) > *len)
2720   size = *len;
2721 buf = &state->xfer_buffer[state->xfer_buffer_lwm];
2722 state->xfer_buffer_lwm += size;
2723 *len = size;
2724 return buf;
2725 }
2726
2727
2728 void
2729 tls_get_cache()
2730 {
2731 #ifndef DISABLE_DKIM
2732 exim_gnutls_state_st * state = &state_server;
2733 int n = state->xfer_buffer_hwm - state->xfer_buffer_lwm;
2734 if (n > 0)
2735   dkim_exim_verify_feed(state->xfer_buffer+state->xfer_buffer_lwm, n);
2736 #endif
2737 }
2738
2739
2740 BOOL
2741 tls_could_read(void)
2742 {
2743 return state_server.xfer_buffer_lwm < state_server.xfer_buffer_hwm
2744  || gnutls_record_check_pending(state_server.session) > 0;
2745 }
2746
2747
2748
2749
2750 /*************************************************
2751 *          Read bytes from TLS channel           *
2752 *************************************************/
2753
2754 /* This does not feed DKIM, so if the caller uses this for reading message body,
2755 then the caller must feed DKIM.
2756
2757 Arguments:
2758   ct_ctx    client context pointer, or NULL for the one global server context
2759   buff      buffer of data
2760   len       size of buffer
2761
2762 Returns:    the number of bytes read
2763             -1 after a failed read, including EOF
2764 */
2765
2766 int
2767 tls_read(void * ct_ctx, uschar *buff, size_t len)
2768 {
2769 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
2770 ssize_t inbytes;
2771
2772 if (len > INT_MAX)
2773   len = INT_MAX;
2774
2775 if (state->xfer_buffer_lwm < state->xfer_buffer_hwm)
2776   DEBUG(D_tls)
2777     debug_printf("*** PROBABLY A BUG *** " \
2778         "tls_read() called with data in the tls_getc() buffer, %d ignored\n",
2779         state->xfer_buffer_hwm - state->xfer_buffer_lwm);
2780
2781 DEBUG(D_tls)
2782   debug_printf("Calling gnutls_record_recv(%p, %p, " SIZE_T_FMT ")\n",
2783       state->session, buff, len);
2784
2785 do
2786   inbytes = gnutls_record_recv(state->session, buff, len);
2787 while (inbytes == GNUTLS_E_AGAIN);
2788
2789 if (inbytes > 0) return inbytes;
2790 if (inbytes == 0)
2791   {
2792   DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
2793   }
2794 else
2795   {
2796   DEBUG(D_tls) debug_printf("%s: err from gnutls_record_recv(\n", __FUNCTION__);
2797   record_io_error(state, (int)inbytes, US"recv", NULL);
2798   }
2799
2800 return -1;
2801 }
2802
2803
2804
2805
2806 /*************************************************
2807 *         Write bytes down TLS channel           *
2808 *************************************************/
2809
2810 /*
2811 Arguments:
2812   ct_ctx    client context pointer, or NULL for the one global server context
2813   buff      buffer of data
2814   len       number of bytes
2815   more      more data expected soon
2816
2817 Returns:    the number of bytes after a successful write,
2818             -1 after a failed write
2819 */
2820
2821 int
2822 tls_write(void * ct_ctx, const uschar * buff, size_t len, BOOL more)
2823 {
2824 ssize_t outbytes;
2825 size_t left = len;
2826 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
2827 #ifdef SUPPORT_CORK
2828 static BOOL corked = FALSE;
2829
2830 if (more && !corked) gnutls_record_cork(state->session);
2831 #endif
2832
2833 DEBUG(D_tls) debug_printf("%s(%p, " SIZE_T_FMT "%s)\n", __FUNCTION__,
2834   buff, left, more ? ", more" : "");
2835
2836 while (left > 0)
2837   {
2838   DEBUG(D_tls) debug_printf("gnutls_record_send(SSL, %p, " SIZE_T_FMT ")\n",
2839       buff, left);
2840
2841   do
2842     outbytes = gnutls_record_send(state->session, buff, left);
2843   while (outbytes == GNUTLS_E_AGAIN);
2844
2845   DEBUG(D_tls) debug_printf("outbytes=" SSIZE_T_FMT "\n", outbytes);
2846   if (outbytes < 0)
2847     {
2848     DEBUG(D_tls) debug_printf("%s: gnutls_record_send err\n", __FUNCTION__);
2849     record_io_error(state, outbytes, US"send", NULL);
2850     return -1;
2851     }
2852   if (outbytes == 0)
2853     {
2854     record_io_error(state, 0, US"send", US"TLS channel closed on write");
2855     return -1;
2856     }
2857
2858   left -= outbytes;
2859   buff += outbytes;
2860   }
2861
2862 if (len > INT_MAX)
2863   {
2864   DEBUG(D_tls)
2865     debug_printf("Whoops!  Wrote more bytes (" SIZE_T_FMT ") than INT_MAX\n",
2866         len);
2867   len = INT_MAX;
2868   }
2869
2870 #ifdef SUPPORT_CORK
2871 if (more != corked)
2872   {
2873   if (!more) (void) gnutls_record_uncork(state->session, 0);
2874   corked = more;
2875   }
2876 #endif
2877
2878 return (int) len;
2879 }
2880
2881
2882
2883
2884 /*************************************************
2885 *            Random number generation            *
2886 *************************************************/
2887
2888 /* Pseudo-random number generation.  The result is not expected to be
2889 cryptographically strong but not so weak that someone will shoot themselves
2890 in the foot using it as a nonce in input in some email header scheme or
2891 whatever weirdness they'll twist this into.  The result should handle fork()
2892 and avoid repeating sequences.  OpenSSL handles that for us.
2893
2894 Arguments:
2895   max       range maximum
2896 Returns     a random number in range [0, max-1]
2897 */
2898
2899 #ifdef HAVE_GNUTLS_RND
2900 int
2901 vaguely_random_number(int max)
2902 {
2903 unsigned int r;
2904 int i, needed_len;
2905 uschar *p;
2906 uschar smallbuf[sizeof(r)];
2907
2908 if (max <= 1)
2909   return 0;
2910
2911 needed_len = sizeof(r);
2912 /* Don't take 8 times more entropy than needed if int is 8 octets and we were
2913  * asked for a number less than 10. */
2914 for (r = max, i = 0; r; ++i)
2915   r >>= 1;
2916 i = (i + 7) / 8;
2917 if (i < needed_len)
2918   needed_len = i;
2919
2920 i = gnutls_rnd(GNUTLS_RND_NONCE, smallbuf, needed_len);
2921 if (i < 0)
2922   {
2923   DEBUG(D_all) debug_printf("gnutls_rnd() failed, using fallback.\n");
2924   return vaguely_random_number_fallback(max);
2925   }
2926 r = 0;
2927 for (p = smallbuf; needed_len; --needed_len, ++p)
2928   {
2929   r *= 256;
2930   r += *p;
2931   }
2932
2933 /* We don't particularly care about weighted results; if someone wants
2934  * smooth distribution and cares enough then they should submit a patch then. */
2935 return r % max;
2936 }
2937 #else /* HAVE_GNUTLS_RND */
2938 int
2939 vaguely_random_number(int max)
2940 {
2941   return vaguely_random_number_fallback(max);
2942 }
2943 #endif /* HAVE_GNUTLS_RND */
2944
2945
2946
2947
2948 /*************************************************
2949 *  Let tls_require_ciphers be checked at startup *
2950 *************************************************/
2951
2952 /* The tls_require_ciphers option, if set, must be something which the
2953 library can parse.
2954
2955 Returns:     NULL on success, or error message
2956 */
2957
2958 uschar *
2959 tls_validate_require_cipher(void)
2960 {
2961 int rc;
2962 uschar *expciphers = NULL;
2963 gnutls_priority_t priority_cache;
2964 const char *errpos;
2965 uschar * dummy_errstr;
2966
2967 #define validate_check_rc(Label) do { \
2968   if (rc != GNUTLS_E_SUCCESS) { if (exim_gnutls_base_init_done) gnutls_global_deinit(); \
2969   return string_sprintf("%s failed: %s", (Label), gnutls_strerror(rc)); } } while (0)
2970 #define return_deinit(Label) do { gnutls_global_deinit(); return (Label); } while (0)
2971
2972 if (exim_gnutls_base_init_done)
2973   log_write(0, LOG_MAIN|LOG_PANIC,
2974       "already initialised GnuTLS, Exim developer bug");
2975
2976 #ifdef HAVE_GNUTLS_PKCS11
2977 if (!gnutls_allow_auto_pkcs11)
2978   {
2979   rc = gnutls_pkcs11_init(GNUTLS_PKCS11_FLAG_MANUAL, NULL);
2980   validate_check_rc(US"gnutls_pkcs11_init");
2981   }
2982 #endif
2983 rc = gnutls_global_init();
2984 validate_check_rc(US"gnutls_global_init()");
2985 exim_gnutls_base_init_done = TRUE;
2986
2987 if (!(tls_require_ciphers && *tls_require_ciphers))
2988   return_deinit(NULL);
2989
2990 if (!expand_check(tls_require_ciphers, US"tls_require_ciphers", &expciphers,
2991                   &dummy_errstr))
2992   return_deinit(US"failed to expand tls_require_ciphers");
2993
2994 if (!(expciphers && *expciphers))
2995   return_deinit(NULL);
2996
2997 DEBUG(D_tls)
2998   debug_printf("tls_require_ciphers expands to \"%s\"\n", expciphers);
2999
3000 rc = gnutls_priority_init(&priority_cache, CS expciphers, &errpos);
3001 validate_check_rc(string_sprintf(
3002       "gnutls_priority_init(%s) failed at offset %ld, \"%.8s..\"",
3003       expciphers, errpos - CS expciphers, errpos));
3004
3005 #undef return_deinit
3006 #undef validate_check_rc
3007 gnutls_global_deinit();
3008
3009 return NULL;
3010 }
3011
3012
3013
3014
3015 /*************************************************
3016 *         Report the library versions.           *
3017 *************************************************/
3018
3019 /* See a description in tls-openssl.c for an explanation of why this exists.
3020
3021 Arguments:   a FILE* to print the results to
3022 Returns:     nothing
3023 */
3024
3025 void
3026 tls_version_report(FILE *f)
3027 {
3028 fprintf(f, "Library version: GnuTLS: Compile: %s\n"
3029            "                         Runtime: %s\n",
3030            LIBGNUTLS_VERSION,
3031            gnutls_check_version(NULL));
3032 }
3033
3034 /* vi: aw ai sw=2
3035 */
3036 /* End of tls-gnu.c */