1953be1e460313c7a9dfce356ecfb3162581cc31
[exim.git] / src / src / tls-gnu.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) University of Cambridge 1995 - 2012 */
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 Mavroyanopoulos.  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 /* GnuTLS 2 vs 3
44
45 GnuTLS 3 only:
46   gnutls_global_set_audit_log_function()
47
48 Changes:
49   gnutls_certificate_verify_peers2(): is new, drop the 2 for old version
50 */
51
52 /* Local static variables for GnuTLS */
53
54 /* Values for verify_requirement */
55
56 enum peer_verify_requirement { VERIFY_NONE, VERIFY_OPTIONAL, VERIFY_REQUIRED };
57
58 /* This holds most state for server or client; with this, we can set up an
59 outbound TLS-enabled connection in an ACL callout, while not stomping all
60 over the TLS variables available for expansion.
61
62 Some of these correspond to variables in globals.c; those variables will
63 be set to point to content in one of these instances, as appropriate for
64 the stage of the process lifetime.
65
66 Not handled here: globals tls_active, tls_bits, tls_cipher, tls_peerdn,
67 tls_certificate_verified, tls_channelbinding_b64, tls_sni.
68 */
69
70 typedef struct exim_gnutls_state {
71   gnutls_session_t session;
72   gnutls_certificate_credentials_t x509_cred;
73   gnutls_priority_t priority_cache;
74   enum peer_verify_requirement verify_requirement;
75   int fd_in;
76   int fd_out;
77   BOOL peer_cert_verified;
78   BOOL trigger_sni_changes;
79   BOOL have_set_peerdn;
80   const struct host_item *host;
81   uschar *peerdn;
82   uschar *ciphersuite;
83   uschar *received_sni;
84
85   const uschar *tls_certificate;
86   const uschar *tls_privatekey;
87   const uschar *tls_sni; /* client send only, not received */
88   const uschar *tls_verify_certificates;
89   const uschar *tls_crl;
90   const uschar *tls_require_ciphers;
91   uschar *exp_tls_certificate;
92   uschar *exp_tls_privatekey;
93   uschar *exp_tls_sni;
94   uschar *exp_tls_verify_certificates;
95   uschar *exp_tls_crl;
96   uschar *exp_tls_require_ciphers;
97
98   uschar *xfer_buffer;
99   int xfer_buffer_lwm;
100   int xfer_buffer_hwm;
101   int xfer_eof;
102   int xfer_error;
103 } exim_gnutls_state_st;
104
105 static const exim_gnutls_state_st exim_gnutls_state_init = {
106   NULL, NULL, NULL, VERIFY_NONE, -1, -1, FALSE, FALSE, FALSE,
107   NULL, NULL, NULL, NULL,
108   NULL, NULL, NULL, NULL, NULL, NULL,
109   NULL, NULL, NULL, NULL, NULL, NULL,
110   NULL, 0, 0, 0, 0,
111 };
112
113 /* Not only do we have our own APIs which don't pass around state, assuming
114 it's held in globals, GnuTLS doesn't appear to let us register callback data
115 for callbacks, or as part of the session, so we have to keep a "this is the
116 context we're currently dealing with" pointer and rely upon being
117 single-threaded to keep from processing data on an inbound TLS connection while
118 talking to another TLS connection for an outbound check.  This does mean that
119 there's no way for heart-beats to be responded to, for the duration of the
120 second connection. */
121
122 static exim_gnutls_state_st state_server, state_client;
123 static exim_gnutls_state_st *current_global_tls_state;
124
125 /* dh_params are initialised once within the lifetime of a process using TLS;
126 if we used TLS in a long-lived daemon, we'd have to reconsider this.  But we
127 don't want to repeat this. */
128
129 static gnutls_dh_params_t dh_server_params = NULL;
130
131 /* No idea how this value was chosen; preserving it.  Default is 3600. */
132
133 static const int ssl_session_timeout = 200;
134
135 static const char * const exim_default_gnutls_priority = "NORMAL";
136
137 /* Guard library core initialisation */
138
139 static BOOL exim_gnutls_base_init_done = FALSE;
140
141
142 /* ------------------------------------------------------------------------ */
143 /* macros */
144
145 #define MAX_HOST_LEN 255
146
147 /* Set this to control gnutls_global_set_log_level(); values 0 to 9 will setup
148 the library logging; a value less than 0 disables the calls to set up logging
149 callbacks. */
150 #ifndef EXIM_GNUTLS_LIBRARY_LOG_LEVEL
151 #define EXIM_GNUTLS_LIBRARY_LOG_LEVEL -1
152 #endif
153
154 #ifndef EXIM_CLIENT_DH_MIN_BITS
155 #define EXIM_CLIENT_DH_MIN_BITS 1024
156 #endif
157
158 /* With GnuTLS 2.12.x+ we have gnutls_sec_param_to_pk_bits() with which we
159 can ask for a bit-strength.  Without that, we stick to the constant we had
160 before, for now. */
161 #ifndef EXIM_SERVER_DH_BITS_PRE2_12
162 #define EXIM_SERVER_DH_BITS_PRE2_12 1024
163 #endif
164
165 #define exim_gnutls_err_check(Label) do { \
166   if (rc != GNUTLS_E_SUCCESS) { return tls_error((Label), gnutls_strerror(rc), host); } } while (0)
167
168 #define expand_check_tlsvar(Varname) expand_check(state->Varname, US #Varname, &state->exp_##Varname)
169
170 #if GNUTLS_VERSION_NUMBER >= 0x020c00
171 #define HAVE_GNUTLS_SESSION_CHANNEL_BINDING
172 #define HAVE_GNUTLS_SEC_PARAM_CONSTANTS
173 #define HAVE_GNUTLS_RND
174 #endif
175
176
177
178
179 /* ------------------------------------------------------------------------ */
180 /* Callback declarations */
181
182 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
183 static void exim_gnutls_logger_cb(int level, const char *message);
184 #endif
185
186 static int exim_sni_handling_cb(gnutls_session_t session);
187
188
189
190
191 /* ------------------------------------------------------------------------ */
192 /* Static functions */
193
194 /*************************************************
195 *               Handle TLS error                 *
196 *************************************************/
197
198 /* Called from lots of places when errors occur before actually starting to do
199 the TLS handshake, that is, while the session is still in clear. Always returns
200 DEFER for a server and FAIL for a client so that most calls can use "return
201 tls_error(...)" to do this processing and then give an appropriate return. A
202 single function is used for both server and client, because it is called from
203 some shared functions.
204
205 Argument:
206   prefix    text to include in the logged error
207   msg       additional error string (may be NULL)
208             usually obtained from gnutls_strerror()
209   host      NULL if setting up a server;
210             the connected host if setting up a client
211
212 Returns:    OK/DEFER/FAIL
213 */
214
215 static int
216 tls_error(const uschar *prefix, const char *msg, const host_item *host)
217 {
218 if (host)
219   {
220   log_write(0, LOG_MAIN, "TLS error on connection to %s [%s] (%s)%s%s",
221       host->name, host->address, prefix, msg ? ": " : "", msg ? msg : "");
222   return FAIL;
223   }
224 else
225   {
226   uschar *conn_info = smtp_get_connection_info();
227   if (Ustrncmp(conn_info, US"SMTP ", 5) == 0)
228     conn_info += 5;
229   log_write(0, LOG_MAIN, "TLS error on %s (%s)%s%s",
230       conn_info, prefix, msg ? ": " : "", msg ? msg : "");
231   return DEFER;
232   }
233 }
234
235
236
237
238 /*************************************************
239 *    Deal with logging errors during I/O         *
240 *************************************************/
241
242 /* We have to get the identity of the peer from saved data.
243
244 Argument:
245   state    the current GnuTLS exim state container
246   rc       the GnuTLS error code, or 0 if it's a local error
247   when     text identifying read or write
248   text     local error text when ec is 0
249
250 Returns:   nothing
251 */
252
253 static void
254 record_io_error(exim_gnutls_state_st *state, int rc, uschar *when, uschar *text)
255 {
256 const char *msg;
257
258 if (rc == GNUTLS_E_FATAL_ALERT_RECEIVED)
259   msg = CS string_sprintf("%s: %s", US gnutls_strerror(rc),
260     US gnutls_alert_get_name(gnutls_alert_get(state->session)));
261 else
262   msg = gnutls_strerror(rc);
263
264 tls_error(when, msg, state->host);
265 }
266
267
268
269
270 /*************************************************
271 *        Set various Exim expansion vars         *
272 *************************************************/
273
274 /* We set various Exim global variables from the state, once a session has
275 been established.  With TLS callouts, may need to change this to stack
276 variables, or just re-call it with the server state after client callout
277 has finished.
278
279 Make sure anything set here is inset in tls_getc().
280
281 Sets:
282   tls_active                fd
283   tls_bits                  strength indicator
284   tls_certificate_verified  bool indicator
285   tls_channelbinding_b64    for some SASL mechanisms
286   tls_cipher                a string
287   tls_peerdn                a string
288   tls_sni                   a (UTF-8) string
289 Also:
290   current_global_tls_state  for API limitations
291
292 Argument:
293   state      the relevant exim_gnutls_state_st *
294 */
295
296 static void
297 extract_exim_vars_from_tls_state(exim_gnutls_state_st *state)
298 {
299 gnutls_cipher_algorithm_t cipher;
300 #ifdef HAVE_GNUTLS_SESSION_CHANNEL_BINDING
301 int old_pool;
302 int rc;
303 gnutls_datum_t channel;
304 #endif
305
306 current_global_tls_state = state;
307
308 tls_active = state->fd_out;
309
310 cipher = gnutls_cipher_get(state->session);
311 /* returns size in "bytes" */
312 tls_bits = gnutls_cipher_get_key_size(cipher) * 8;
313
314 tls_cipher = state->ciphersuite;
315
316 DEBUG(D_tls) debug_printf("cipher: %s\n", tls_cipher);
317
318 tls_certificate_verified = state->peer_cert_verified;
319
320 /* note that tls_channelbinding_b64 is not saved to the spool file, since it's
321 only available for use for authenticators while this TLS session is running. */
322
323 tls_channelbinding_b64 = NULL;
324 #ifdef HAVE_GNUTLS_SESSION_CHANNEL_BINDING
325 channel.data = NULL;
326 channel.size = 0;
327 rc = gnutls_session_channel_binding(state->session, GNUTLS_CB_TLS_UNIQUE, &channel);
328 if (rc) {
329   DEBUG(D_tls) debug_printf("Channel binding error: %s\n", gnutls_strerror(rc));
330 } else {
331   old_pool = store_pool;
332   store_pool = POOL_PERM;
333   tls_channelbinding_b64 = auth_b64encode(channel.data, (int)channel.size);
334   store_pool = old_pool;
335   DEBUG(D_tls) debug_printf("Have channel bindings cached for possible auth usage.\n");
336 }
337 #endif
338
339 tls_peerdn = state->peerdn;
340
341 tls_sni = state->received_sni;
342 }
343
344
345
346
347 /*************************************************
348 *            Setup up DH parameters              *
349 *************************************************/
350
351 /* Generating the D-H parameters may take a long time. They only need to
352 be re-generated every so often, depending on security policy. What we do is to
353 keep these parameters in a file in the spool directory. If the file does not
354 exist, we generate them. This means that it is easy to cause a regeneration.
355
356 The new file is written as a temporary file and renamed, so that an incomplete
357 file is never present. If two processes both compute some new parameters, you
358 waste a bit of effort, but it doesn't seem worth messing around with locking to
359 prevent this.
360
361 Argument:
362   host       NULL for server, server for client (for error handling)
363
364 Returns:     OK/DEFER/FAIL
365 */
366
367 static int
368 init_server_dh(void)
369 {
370 int fd, rc;
371 unsigned int dh_bits;
372 gnutls_datum m;
373 uschar filename[PATH_MAX];
374 size_t sz;
375 host_item *host = NULL; /* dummy for macros */
376
377 DEBUG(D_tls) debug_printf("Initialising GnuTLS server params.\n");
378
379 rc = gnutls_dh_params_init(&dh_server_params);
380 exim_gnutls_err_check(US"gnutls_dh_params_init");
381
382 #ifdef HAVE_GNUTLS_SEC_PARAM_CONSTANTS
383 /* If you change this constant, also change dh_param_fn_ext so that we can use a
384 different filename and ensure we have sufficient bits. */
385 dh_bits = gnutls_sec_param_to_pk_bits(GNUTLS_PK_DH, GNUTLS_SEC_PARAM_NORMAL);
386 if (!dh_bits)
387   return tls_error(US"gnutls_sec_param_to_pk_bits() failed", NULL, NULL);
388 DEBUG(D_tls)
389   debug_printf("GnuTLS tells us that for D-H PK, NORMAL is %d bits.\n",
390       dh_bits);
391 #else
392 dh_bits = EXIM_SERVER_DH_BITS_PRE2_12;
393 DEBUG(D_tls)
394   debug_printf("GnuTLS lacks gnutls_sec_param_to_pk_bits(), using %d bits.\n",
395       dh_bits);
396 #endif
397
398 if (!string_format(filename, sizeof(filename),
399       "%s/gnutls-params-%d", spool_directory, dh_bits))
400   return tls_error(US"overlong filename", NULL, NULL);
401
402 /* Open the cache file for reading and if successful, read it and set up the
403 parameters. */
404
405 fd = Uopen(filename, O_RDONLY, 0);
406 if (fd >= 0)
407   {
408   struct stat statbuf;
409   FILE *fp;
410   int saved_errno;
411
412   if (fstat(fd, &statbuf) < 0)  /* EIO */
413     {
414     saved_errno = errno;
415     (void)close(fd);
416     return tls_error(US"TLS cache stat failed", strerror(saved_errno), NULL);
417     }
418   if (!S_ISREG(statbuf.st_mode))
419     {
420     (void)close(fd);
421     return tls_error(US"TLS cache not a file", NULL, NULL);
422     }
423   fp = fdopen(fd, "rb");
424   if (!fp)
425     {
426     saved_errno = errno;
427     (void)close(fd);
428     return tls_error(US"fdopen(TLS cache stat fd) failed",
429         strerror(saved_errno), NULL);
430     }
431
432   m.size = statbuf.st_size;
433   m.data = malloc(m.size);
434   if (m.data == NULL)
435     {
436     fclose(fp);
437     return tls_error(US"malloc failed", strerror(errno), NULL);
438     }
439   sz = fread(m.data, m.size, 1, fp);
440   if (!sz)
441     {
442     saved_errno = errno;
443     fclose(fp);
444     free(m.data);
445     return tls_error(US"fread failed", strerror(saved_errno), NULL);
446     }
447   fclose(fp);
448
449   rc = gnutls_dh_params_import_pkcs3(dh_server_params, &m, GNUTLS_X509_FMT_PEM);
450   free(m.data);
451   exim_gnutls_err_check(US"gnutls_dh_params_import_pkcs3");
452   DEBUG(D_tls) debug_printf("read D-H parameters from file \"%s\"\n", filename);
453   }
454
455 /* If the file does not exist, fall through to compute new data and cache it.
456 If there was any other opening error, it is serious. */
457
458 else if (errno == ENOENT)
459   {
460   rc = -1;
461   DEBUG(D_tls)
462     debug_printf("D-H parameter cache file \"%s\" does not exist\n", filename);
463   }
464 else
465   return tls_error(string_open_failed(errno, "\"%s\" for reading", filename),
466       NULL, NULL);
467
468 /* If ret < 0, either the cache file does not exist, or the data it contains
469 is not useful. One particular case of this is when upgrading from an older
470 release of Exim in which the data was stored in a different format. We don't
471 try to be clever and support both formats; we just regenerate new data in this
472 case. */
473
474 if (rc < 0)
475   {
476   uschar *temp_fn;
477
478   if ((PATH_MAX - Ustrlen(filename)) < 10)
479     return tls_error(US"Filename too long to generate replacement",
480         CS filename, NULL);
481
482   temp_fn = string_copy(US "%s.XXXXXXX");
483   fd = mkstemp(CS temp_fn); /* modifies temp_fn */
484   if (fd < 0)
485     return tls_error(US"Unable to open temp file", strerror(errno), NULL);
486   (void)fchown(fd, exim_uid, exim_gid);   /* Probably not necessary */
487
488   DEBUG(D_tls) debug_printf("generating %d bits Diffie-Hellman key ...\n", dh_bits);
489   rc = gnutls_dh_params_generate2(dh_server_params, dh_bits);
490   exim_gnutls_err_check(US"gnutls_dh_params_generate2");
491
492   /* gnutls_dh_params_export_pkcs3() will tell us the exact size, every time,
493   and I confirmed that a NULL call to get the size first is how the GnuTLS
494   sample apps handle this. */
495
496   sz = 0;
497   m.data = NULL;
498   rc = gnutls_dh_params_export_pkcs3(dh_server_params, GNUTLS_X509_FMT_PEM,
499       m.data, &sz);
500   if (rc != GNUTLS_E_SHORT_MEMORY_BUFFER)
501     exim_gnutls_err_check(US"gnutls_dh_params_export_pkcs3(NULL) sizing");
502   m.size = sz;
503   m.data = malloc(m.size);
504   if (m.data == NULL)
505     return tls_error(US"memory allocation failed", strerror(errno), NULL);
506   rc = gnutls_dh_params_export_pkcs3(dh_server_params, GNUTLS_X509_FMT_PEM,
507       m.data, &sz);
508   if (rc != GNUTLS_E_SUCCESS)
509     {
510     free(m.data);
511     exim_gnutls_err_check(US"gnutls_dh_params_export_pkcs3() real");
512     }
513
514   sz = write_to_fd_buf(fd, m.data, (size_t) m.size);
515   if (sz != m.size)
516     {
517     free(m.data);
518     return tls_error(US"TLS cache write D-H params failed",
519         strerror(errno), NULL);
520     }
521   free(m.data);
522   sz = write_to_fd_buf(fd, US"\n", 1);
523   if (sz != 1)
524     return tls_error(US"TLS cache write D-H params final newline failed",
525         strerror(errno), NULL);
526
527   rc = close(fd);
528   if (rc)
529     return tls_error(US"TLS cache write close() failed",
530         strerror(errno), NULL);
531
532   if (Urename(temp_fn, filename) < 0)
533     return tls_error(string_sprintf("failed to rename \"%s\" as \"%s\"",
534           temp_fn, filename), strerror(errno), NULL);
535
536   DEBUG(D_tls) debug_printf("wrote D-H parameters to file \"%s\"\n", filename);
537   }
538
539 DEBUG(D_tls) debug_printf("initialized server D-H parameters\n");
540 return OK;
541 }
542
543
544
545
546 /*************************************************
547 *       Variables re-expanded post-SNI           *
548 *************************************************/
549
550 /* Called from both server and client code, via tls_init(), and also from
551 the SNI callback after receiving an SNI, if tls_certificate includes "tls_sni".
552
553 We can tell the two apart by state->received_sni being non-NULL in callback.
554
555 The callback should not call us unless state->trigger_sni_changes is true,
556 which we are responsible for setting on the first pass through.
557
558 Arguments:
559   state           exim_gnutls_state_st *
560
561 Returns:          OK/DEFER/FAIL
562 */
563
564 static int
565 tls_expand_session_files(exim_gnutls_state_st *state)
566 {
567 struct stat statbuf;
568 int rc;
569 const host_item *host = state->host;  /* macro should be reconsidered? */
570 uschar *saved_tls_certificate = NULL;
571 uschar *saved_tls_privatekey = NULL;
572 uschar *saved_tls_verify_certificates = NULL;
573 uschar *saved_tls_crl = NULL;
574 int cert_count;
575
576 /* We check for tls_sni *before* expansion. */
577 if (!state->host)
578   {
579   if (!state->received_sni)
580     {
581     if (Ustrstr(state->tls_certificate, US"tls_sni"))
582       {
583       DEBUG(D_tls) debug_printf("We will re-expand TLS session files if we receive SNI.\n");
584       state->trigger_sni_changes = TRUE;
585       }
586     }
587   else
588     {
589     /* useful for debugging */
590     saved_tls_certificate = state->exp_tls_certificate;
591     saved_tls_privatekey = state->exp_tls_privatekey;
592     saved_tls_verify_certificates = state->exp_tls_verify_certificates;
593     saved_tls_crl = state->exp_tls_crl;
594     }
595   }
596
597 rc = gnutls_certificate_allocate_credentials(&state->x509_cred);
598 exim_gnutls_err_check(US"gnutls_certificate_allocate_credentials");
599
600 /* remember: expand_check_tlsvar() is expand_check() but fiddling with
601 state members, assuming consistent naming; and expand_check() returns
602 false if expansion failed, unless expansion was forced to fail. */
603
604 /* check if we at least have a certificate, before doing expensive
605 D-H generation. */
606
607 if (!expand_check_tlsvar(tls_certificate))
608   return DEFER;
609
610 /* certificate is mandatory in server, optional in client */
611
612 if ((state->exp_tls_certificate == NULL) ||
613     (*state->exp_tls_certificate == '\0'))
614   {
615   if (state->host == NULL)
616     return tls_error(US"no TLS server certificate is specified", NULL, NULL);
617   else
618     DEBUG(D_tls) debug_printf("TLS: no client certificate specified; okay\n");
619   }
620
621 if (state->tls_privatekey && !expand_check_tlsvar(tls_privatekey))
622   return DEFER;
623
624 /* tls_privatekey is optional, defaulting to same file as certificate */
625
626 if (state->tls_privatekey == NULL || *state->tls_privatekey == '\0')
627   {
628   state->tls_privatekey = state->tls_certificate;
629   state->exp_tls_privatekey = state->exp_tls_certificate;
630   }
631
632
633 if (state->exp_tls_certificate && *state->exp_tls_certificate)
634   {
635   DEBUG(D_tls) debug_printf("certificate file = %s\nkey file = %s\n",
636       state->exp_tls_certificate, state->exp_tls_privatekey);
637
638   if (state->received_sni)
639     {
640     if ((Ustrcmp(state->exp_tls_certificate, saved_tls_certificate) == 0) &&
641         (Ustrcmp(state->exp_tls_privatekey, saved_tls_privatekey) == 0))
642       {
643       DEBUG(D_tls) debug_printf("TLS SNI: cert and key unchanged\n");
644       }
645     else
646       {
647       DEBUG(D_tls) debug_printf("TLS SNI: have a changed cert/key pair.\n");
648       }
649     }
650
651   rc = gnutls_certificate_set_x509_key_file(state->x509_cred,
652       CS state->exp_tls_certificate, CS state->exp_tls_privatekey,
653       GNUTLS_X509_FMT_PEM);
654   exim_gnutls_err_check(
655       string_sprintf("cert/key setup: cert=%s key=%s",
656         state->exp_tls_certificate, state->exp_tls_privatekey));
657   DEBUG(D_tls) debug_printf("TLS: cert/key registered\n");
658   } /* tls_certificate */
659
660 /* Set the trusted CAs file if one is provided, and then add the CRL if one is
661 provided. Experiment shows that, if the certificate file is empty, an unhelpful
662 error message is provided. However, if we just refrain from setting anything up
663 in that case, certificate verification fails, which seems to be the correct
664 behaviour. */
665
666 if (state->tls_verify_certificates && *state->tls_verify_certificates)
667   {
668   if (!expand_check_tlsvar(tls_verify_certificates))
669     return DEFER;
670   if (state->tls_crl && *state->tls_crl)
671     if (!expand_check_tlsvar(tls_crl))
672       return DEFER;
673
674   if (!(state->exp_tls_verify_certificates &&
675         *state->exp_tls_verify_certificates))
676     {
677     DEBUG(D_tls)
678       debug_printf("TLS: tls_verify_certificates expanded empty, ignoring\n");
679     /* With no tls_verify_certificates, we ignore tls_crl too */
680     return OK;
681     }
682   }
683 else
684   {
685   DEBUG(D_tls)
686     debug_printf("TLS: tls_verify_certificates not set or empty, ignoring\n");
687   return OK;
688   }
689
690 if (Ustat(state->exp_tls_verify_certificates, &statbuf) < 0)
691   {
692   log_write(0, LOG_MAIN|LOG_PANIC, "could not stat %s "
693       "(tls_verify_certificates): %s", state->exp_tls_verify_certificates,
694       strerror(errno));
695   return DEFER;
696   }
697
698 if (!S_ISREG(statbuf.st_mode))
699   {
700   DEBUG(D_tls)
701     debug_printf("verify certificates path is not a file: \"%s\"\n%s\n",
702         state->exp_tls_verify_certificates,
703         S_ISDIR(statbuf.st_mode)
704           ? " it's a directory, that's OpenSSL, this is GnuTLS"
705           : " (not a directory either)");
706   log_write(0, LOG_MAIN|LOG_PANIC,
707       "tls_verify_certificates \"%s\" is not a file",
708       state->exp_tls_verify_certificates);
709   return DEFER;
710   }
711
712 DEBUG(D_tls) debug_printf("verify certificates = %s size=" OFF_T_FMT "\n",
713         state->exp_tls_verify_certificates, statbuf.st_size);
714
715 if (statbuf.st_size == 0)
716   {
717   DEBUG(D_tls)
718     debug_printf("cert file empty, no certs, no verification, ignoring any CRL\n");
719   return OK;
720   }
721
722 cert_count = gnutls_certificate_set_x509_trust_file(state->x509_cred,
723     CS state->exp_tls_verify_certificates, GNUTLS_X509_FMT_PEM);
724 if (cert_count < 0)
725   {
726   rc = cert_count;
727   exim_gnutls_err_check(US"gnutls_certificate_set_x509_trust_file");
728   }
729 DEBUG(D_tls) debug_printf("Added %d certificate authorities.\n", cert_count);
730
731 if (state->tls_crl && *state->tls_crl)
732   {
733   if (state->exp_tls_crl && *state->exp_tls_crl)
734     {
735     DEBUG(D_tls) debug_printf("loading CRL file = %s\n", state->exp_tls_crl);
736     rc = gnutls_certificate_set_x509_crl_file(state->x509_cred,
737         CS state->exp_tls_crl, GNUTLS_X509_FMT_PEM);
738     exim_gnutls_err_check(US"gnutls_certificate_set_x509_crl_file");
739     }
740   }
741
742 return OK;
743 }
744
745
746
747
748 /*************************************************
749 *          Set X.509 state variables             *
750 *************************************************/
751
752 /* In GnuTLS, the registered cert/key are not replaced by a later
753 set of a cert/key, so for SNI support we need a whole new x509_cred
754 structure.  Which means various other non-re-expanded pieces of state
755 need to be re-set in the new struct, so the setting logic is pulled
756 out to this.
757
758 Arguments:
759   state           exim_gnutls_state_st *
760
761 Returns:          OK/DEFER/FAIL
762 */
763
764 static int
765 tls_set_remaining_x509(exim_gnutls_state_st *state)
766 {
767 int rc;
768 const host_item *host = state->host;  /* macro should be reconsidered? */
769
770 /* Create D-H parameters, or read them from the cache file. This function does
771 its own SMTP error messaging. This only happens for the server, TLS D-H ignores
772 client-side params. */
773
774 if (!state->host)
775   {
776   if (!dh_server_params)
777     {
778     rc = init_server_dh();
779     if (rc != OK) return rc;
780     }
781   gnutls_certificate_set_dh_params(state->x509_cred, dh_server_params);
782   }
783
784 /* Link the credentials to the session. */
785
786 rc = gnutls_credentials_set(state->session, GNUTLS_CRD_CERTIFICATE, state->x509_cred);
787 exim_gnutls_err_check(US"gnutls_credentials_set");
788
789 return OK;
790 }
791
792 /*************************************************
793 *            Initialize for GnuTLS               *
794 *************************************************/
795
796 /* Called from both server and client code. In the case of a server, errors
797 before actual TLS negotiation return DEFER.
798
799 Arguments:
800   host            connected host, if client; NULL if server
801   certificate     certificate file
802   privatekey      private key file
803   sni             TLS SNI to send, sometimes when client; else NULL
804   cas             CA certs file
805   crl             CRL file
806   require_ciphers tls_require_ciphers setting
807
808 Returns:          OK/DEFER/FAIL
809 */
810
811 static int
812 tls_init(
813     const host_item *host,
814     const uschar *certificate,
815     const uschar *privatekey,
816     const uschar *sni,
817     const uschar *cas,
818     const uschar *crl,
819     const uschar *require_ciphers,
820     exim_gnutls_state_st **caller_state)
821 {
822 exim_gnutls_state_st *state;
823 int rc;
824 size_t sz;
825 const char *errpos;
826 uschar *p;
827 BOOL want_default_priorities;
828
829 if (!exim_gnutls_base_init_done)
830   {
831   DEBUG(D_tls) debug_printf("GnuTLS global init required.\n");
832
833   rc = gnutls_global_init();
834   exim_gnutls_err_check(US"gnutls_global_init");
835
836 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
837   DEBUG(D_tls)
838     {
839     gnutls_global_set_log_function(exim_gnutls_logger_cb);
840     /* arbitrarily chosen level; bump upto 9 for more */
841     gnutls_global_set_log_level(EXIM_GNUTLS_LIBRARY_LOG_LEVEL);
842     }
843 #endif
844
845   exim_gnutls_base_init_done = TRUE;
846   }
847
848 if (host)
849   {
850   state = &state_client;
851   memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
852   DEBUG(D_tls) debug_printf("initialising GnuTLS client session\n");
853   rc = gnutls_init(&state->session, GNUTLS_CLIENT);
854   }
855 else
856   {
857   state = &state_server;
858   memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
859   DEBUG(D_tls) debug_printf("initialising GnuTLS server session\n");
860   rc = gnutls_init(&state->session, GNUTLS_SERVER);
861   }
862 exim_gnutls_err_check(US"gnutls_init");
863
864 state->host = host;
865
866 state->tls_certificate = certificate;
867 state->tls_privatekey = privatekey;
868 state->tls_sni = sni;
869 state->tls_verify_certificates = cas;
870 state->tls_crl = crl;
871
872 /* This handles the variables that might get re-expanded after TLS SNI;
873 that's tls_certificate, tls_privatekey, tls_verify_certificates, tls_crl */
874
875 DEBUG(D_tls)
876   debug_printf("Expanding various TLS configuration options for session credentials.\n");
877 rc = tls_expand_session_files(state);
878 if (rc != OK) return rc;
879
880 /* These are all other parts of the x509_cred handling, since SNI in GnuTLS
881 requires a new structure afterwards. */
882
883 rc = tls_set_remaining_x509(state);
884 if (rc != OK) return rc;
885
886 /* set SNI in client, only */
887 if (host)
888   {
889   if (!expand_check_tlsvar(tls_sni))
890     return DEFER;
891   if (state->exp_tls_sni && *state->exp_tls_sni)
892     {
893     DEBUG(D_tls)
894       debug_printf("Setting TLS client SNI to \"%s\"\n", state->exp_tls_sni);
895     sz = Ustrlen(state->exp_tls_sni);
896     rc = gnutls_server_name_set(state->session,
897         GNUTLS_NAME_DNS, state->exp_tls_sni, sz);
898     exim_gnutls_err_check(US"gnutls_server_name_set");
899     }
900   }
901 else if (state->tls_sni)
902   DEBUG(D_tls) debug_printf("*** PROBABLY A BUG *** " \
903       "have an SNI set for a client [%s]\n", state->tls_sni);
904
905 /* This is the priority string support,
906 http://www.gnu.org/software/gnutls/manual/html_node/Priority-Strings.html
907 and replaces gnutls_require_kx, gnutls_require_mac & gnutls_require_protocols.
908 This was backwards incompatible, but means Exim no longer needs to track
909 all algorithms and provide string forms for them. */
910
911 want_default_priorities = TRUE;
912
913 if (state->tls_require_ciphers && *state->tls_require_ciphers)
914   {
915   if (!expand_check_tlsvar(tls_require_ciphers))
916     return DEFER;
917   if (state->exp_tls_require_ciphers && *state->exp_tls_require_ciphers)
918     {
919     DEBUG(D_tls) debug_printf("GnuTLS session cipher/priority \"%s\"\n",
920         state->exp_tls_require_ciphers);
921
922     rc = gnutls_priority_init(&state->priority_cache,
923         CS state->exp_tls_require_ciphers, &errpos);
924     want_default_priorities = FALSE;
925     p = state->exp_tls_require_ciphers;
926     }
927   }
928 if (want_default_priorities)
929   {
930   DEBUG(D_tls)
931     debug_printf("GnuTLS using default session cipher/priority \"%s\"\n",
932         exim_default_gnutls_priority);
933   rc = gnutls_priority_init(&state->priority_cache,
934       exim_default_gnutls_priority, &errpos);
935   p = US exim_default_gnutls_priority;
936   }
937
938 exim_gnutls_err_check(string_sprintf(
939       "gnutls_priority_init(%s) failed at offset %ld, \"%.6s..\"",
940       p, errpos - CS p, errpos));
941
942 rc = gnutls_priority_set(state->session, state->priority_cache);
943 exim_gnutls_err_check(US"gnutls_priority_set");
944
945 gnutls_db_set_cache_expiration(state->session, ssl_session_timeout);
946
947 /* Reduce security in favour of increased compatibility, if the admin
948 decides to make that trade-off. */
949 if (gnutls_compat_mode)
950   {
951 #if LIBGNUTLS_VERSION_NUMBER >= 0x020104
952   DEBUG(D_tls) debug_printf("lowering GnuTLS security, compatibility mode\n");
953   gnutls_session_enable_compatibility_mode(state->session);
954 #else
955   DEBUG(D_tls) debug_printf("Unable to set gnutls_compat_mode - GnuTLS version too old\n");
956 #endif
957   }
958
959 *caller_state = state;
960 /* needs to happen before callbacks during handshake */
961 current_global_tls_state = state;
962 return OK;
963 }
964
965
966
967
968 /*************************************************
969 *            Extract peer information            *
970 *************************************************/
971
972 /* Called from both server and client code.
973 Only this is allowed to set state->peerdn and state->have_set_peerdn
974 and we use that to detect double-calls.
975
976 NOTE: the state blocks last while the TLS connection is up, which is fine
977 for logging in the server side, but for the client side, we log after teardown
978 in src/deliver.c.  While the session is up, we can twist about states and
979 repoint tls_* globals, but those variables used for logging or other variable
980 expansion that happens _after_ delivery need to have a longer life-time.
981
982 So for those, we get the data from POOL_PERM; the re-invoke guard keeps us from
983 doing this more than once per generation of a state context.  We set them in
984 the state context, and repoint tls_* to them.  After the state goes away, the
985 tls_* copies of the pointers remain valid and client delivery logging is happy.
986
987 tls_certificate_verified is a BOOL, so the tls_peerdn and tls_cipher issues
988 don't apply.
989
990 Arguments:
991   state           exim_gnutls_state_st *
992
993 Returns:          OK/DEFER/FAIL
994 */
995
996 static int
997 peer_status(exim_gnutls_state_st *state)
998 {
999 uschar cipherbuf[256];
1000 const gnutls_datum *cert_list;
1001 int old_pool, rc;
1002 unsigned int cert_list_size = 0;
1003 gnutls_protocol_t protocol;
1004 gnutls_cipher_algorithm_t cipher;
1005 gnutls_kx_algorithm_t kx;
1006 gnutls_mac_algorithm_t mac;
1007 gnutls_certificate_type_t ct;
1008 gnutls_x509_crt_t crt;
1009 uschar *p, *dn_buf;
1010 size_t sz;
1011
1012 if (state->have_set_peerdn)
1013   return OK;
1014 state->have_set_peerdn = TRUE;
1015
1016 state->peerdn = NULL;
1017
1018 /* tls_cipher */
1019 cipher = gnutls_cipher_get(state->session);
1020 protocol = gnutls_protocol_get_version(state->session);
1021 mac = gnutls_mac_get(state->session);
1022 kx = gnutls_kx_get(state->session);
1023
1024 string_format(cipherbuf, sizeof(cipherbuf),
1025     "%s:%s:%d",
1026     gnutls_protocol_get_name(protocol),
1027     gnutls_cipher_suite_get_name(kx, cipher, mac),
1028     (int) gnutls_cipher_get_key_size(cipher) * 8);
1029
1030 /* I don't see a way that spaces could occur, in the current GnuTLS
1031 code base, but it was a concern in the old code and perhaps older GnuTLS
1032 releases did return "TLS 1.0"; play it safe, just in case. */
1033 for (p = cipherbuf; *p != '\0'; ++p)
1034   if (isspace(*p))
1035     *p = '-';
1036 old_pool = store_pool;
1037 store_pool = POOL_PERM;
1038 state->ciphersuite = string_copy(cipherbuf);
1039 store_pool = old_pool;
1040 tls_cipher = state->ciphersuite;
1041
1042 /* tls_peerdn */
1043 cert_list = gnutls_certificate_get_peers(state->session, &cert_list_size);
1044
1045 if (cert_list == NULL || cert_list_size == 0)
1046   {
1047   DEBUG(D_tls) debug_printf("TLS: no certificate from peer (%p & %d)\n",
1048       cert_list, cert_list_size);
1049   if (state->verify_requirement == VERIFY_REQUIRED)
1050     return tls_error(US"certificate verification failed",
1051         "no certificate received from peer", state->host);
1052   return OK;
1053   }
1054
1055 ct = gnutls_certificate_type_get(state->session);
1056 if (ct != GNUTLS_CRT_X509)
1057   {
1058   const char *ctn = gnutls_certificate_type_get_name(ct);
1059   DEBUG(D_tls)
1060     debug_printf("TLS: peer cert not X.509 but instead \"%s\"\n", ctn);
1061   if (state->verify_requirement == VERIFY_REQUIRED)
1062     return tls_error(US"certificate verification not possible, unhandled type",
1063         ctn, state->host);
1064   return OK;
1065   }
1066
1067 #define exim_gnutls_peer_err(Label) do { \
1068   if (rc != GNUTLS_E_SUCCESS) { \
1069     DEBUG(D_tls) debug_printf("TLS: peer cert problem: %s: %s\n", (Label), gnutls_strerror(rc)); \
1070     if (state->verify_requirement == VERIFY_REQUIRED) { return tls_error((Label), gnutls_strerror(rc), state->host); } \
1071     return OK; } } while (0)
1072
1073 rc = gnutls_x509_crt_init(&crt);
1074 exim_gnutls_peer_err(US"gnutls_x509_crt_init (crt)");
1075
1076 rc = gnutls_x509_crt_import(crt, &cert_list[0], GNUTLS_X509_FMT_DER);
1077 exim_gnutls_peer_err(US"failed to import certificate [gnutls_x509_crt_import(cert 0)]");
1078 sz = 0;
1079 rc = gnutls_x509_crt_get_dn(crt, NULL, &sz);
1080 if (rc != GNUTLS_E_SHORT_MEMORY_BUFFER)
1081   {
1082   exim_gnutls_peer_err(US"getting size for cert DN failed");
1083   return FAIL; /* should not happen */
1084   }
1085 dn_buf = store_get_perm(sz);
1086 rc = gnutls_x509_crt_get_dn(crt, CS dn_buf, &sz);
1087 exim_gnutls_peer_err(US"failed to extract certificate DN [gnutls_x509_crt_get_dn(cert 0)]");
1088 state->peerdn = dn_buf;
1089
1090 return OK;
1091 #undef exim_gnutls_peer_err
1092 }
1093
1094
1095
1096
1097 /*************************************************
1098 *            Verify peer certificate             *
1099 *************************************************/
1100
1101 /* Called from both server and client code.
1102 *Should* be using a callback registered with
1103 gnutls_certificate_set_verify_function() to fail the handshake if we dislike
1104 the peer information, but that's too new for some OSes.
1105
1106 Arguments:
1107   state           exim_gnutls_state_st *
1108   error           where to put an error message
1109
1110 Returns:
1111   FALSE     if the session should be rejected
1112   TRUE      if the cert is okay or we just don't care
1113 */
1114
1115 static BOOL
1116 verify_certificate(exim_gnutls_state_st *state, const char **error)
1117 {
1118 int rc;
1119 unsigned int verify;
1120
1121 *error = NULL;
1122
1123 rc = peer_status(state);
1124 if (rc != OK)
1125   {
1126   verify = GNUTLS_CERT_INVALID;
1127   *error = "not supplied";
1128   }
1129 else
1130   {
1131   rc = gnutls_certificate_verify_peers2(state->session, &verify);
1132   }
1133
1134 /* Handle the result of verification. INVALID seems to be set as well
1135 as REVOKED, but leave the test for both. */
1136
1137 if ((rc < 0) || (verify & (GNUTLS_CERT_INVALID|GNUTLS_CERT_REVOKED)) != 0)
1138   {
1139   state->peer_cert_verified = FALSE;
1140   if (*error == NULL)
1141     *error = ((verify & GNUTLS_CERT_REVOKED) != 0) ? "revoked" : "invalid";
1142
1143   DEBUG(D_tls)
1144     debug_printf("TLS certificate verification failed (%s): peerdn=%s\n",
1145         *error, state->peerdn ? state->peerdn : US"<unset>");
1146
1147   if (state->verify_requirement == VERIFY_REQUIRED)
1148     {
1149     gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_BAD_CERTIFICATE);
1150     return FALSE;
1151     }
1152   DEBUG(D_tls)
1153     debug_printf("TLS verify failure overriden (host in tls_try_verify_hosts)\n");
1154   }
1155 else
1156   {
1157   state->peer_cert_verified = TRUE;
1158   DEBUG(D_tls) debug_printf("TLS certificate verified: peerdn=%s\n",
1159       state->peerdn ? state->peerdn : US"<unset>");
1160   }
1161
1162 tls_peerdn = state->peerdn;
1163
1164 return TRUE;
1165 }
1166
1167
1168
1169
1170 /* ------------------------------------------------------------------------ */
1171 /* Callbacks */
1172
1173 /* Logging function which can be registered with
1174  *   gnutls_global_set_log_function()
1175  *   gnutls_global_set_log_level() 0..9
1176  */
1177 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
1178 static void
1179 exim_gnutls_logger_cb(int level, const char *message)
1180 {
1181   DEBUG(D_tls) debug_printf("GnuTLS<%d>: %s\n", level, message);
1182 }
1183 #endif
1184
1185
1186 /* Called after client hello, should handle SNI work.
1187 This will always set tls_sni (state->received_sni) if available,
1188 and may trigger presenting different certificates,
1189 if state->trigger_sni_changes is TRUE.
1190
1191 Should be registered with
1192   gnutls_handshake_set_post_client_hello_function()
1193
1194 "This callback must return 0 on success or a gnutls error code to terminate the
1195 handshake.".
1196
1197 For inability to get SNI information, we return 0.
1198 We only return non-zero if re-setup failed.
1199 */
1200
1201 static int
1202 exim_sni_handling_cb(gnutls_session_t session)
1203 {
1204 char sni_name[MAX_HOST_LEN];
1205 size_t data_len = MAX_HOST_LEN;
1206 exim_gnutls_state_st *state = current_global_tls_state;
1207 unsigned int sni_type;
1208 int rc, old_pool;
1209
1210 rc = gnutls_server_name_get(session, sni_name, &data_len, &sni_type, 0);
1211 if (rc != GNUTLS_E_SUCCESS)
1212   {
1213   DEBUG(D_tls) {
1214     if (rc == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
1215       debug_printf("TLS: no SNI presented in handshake.\n");
1216     else
1217       debug_printf("TLS failure: gnutls_server_name_get(): %s [%d]\n",
1218         gnutls_strerror(rc), rc);
1219   };
1220   return 0;
1221   }
1222
1223 if (sni_type != GNUTLS_NAME_DNS)
1224   {
1225   DEBUG(D_tls) debug_printf("TLS: ignoring SNI of unhandled type %u\n", sni_type);
1226   return 0;
1227   }
1228
1229 /* We now have a UTF-8 string in sni_name */
1230 old_pool = store_pool;
1231 store_pool = POOL_PERM;
1232 state->received_sni = string_copyn(US sni_name, data_len);
1233 store_pool = old_pool;
1234
1235 /* We set this one now so that variable expansions below will work */
1236 tls_sni = state->received_sni;
1237
1238 DEBUG(D_tls) debug_printf("Received TLS SNI \"%s\"%s\n", sni_name,
1239     state->trigger_sni_changes ? "" : " (unused for certificate selection)");
1240
1241 if (!state->trigger_sni_changes)
1242   return 0;
1243
1244 rc = tls_expand_session_files(state);
1245 if (rc != OK)
1246   {
1247   /* If the setup of certs/etc failed before handshake, TLS would not have
1248   been offered.  The best we can do now is abort. */
1249   return GNUTLS_E_APPLICATION_ERROR_MIN;
1250   }
1251
1252 rc = tls_set_remaining_x509(state);
1253 if (rc != OK) return GNUTLS_E_APPLICATION_ERROR_MIN;
1254
1255 return 0;
1256 }
1257
1258
1259
1260
1261 /* ------------------------------------------------------------------------ */
1262 /* Exported functions */
1263
1264
1265
1266
1267 /*************************************************
1268 *       Start a TLS session in a server          *
1269 *************************************************/
1270
1271 /* This is called when Exim is running as a server, after having received
1272 the STARTTLS command. It must respond to that command, and then negotiate
1273 a TLS session.
1274
1275 Arguments:
1276   require_ciphers  list of allowed ciphers or NULL
1277
1278 Returns:           OK on success
1279                    DEFER for errors before the start of the negotiation
1280                    FAIL for errors during the negotation; the server can't
1281                      continue running.
1282 */
1283
1284 int
1285 tls_server_start(const uschar *require_ciphers)
1286 {
1287 int rc;
1288 const char *error;
1289 exim_gnutls_state_st *state = NULL;
1290
1291 /* Check for previous activation */
1292 /* nb: this will not be TLS callout safe, needs reworking as part of that. */
1293
1294 if (tls_active >= 0)
1295   {
1296   tls_error(US"STARTTLS received after TLS started", "", NULL);
1297   smtp_printf("554 Already in TLS\r\n");
1298   return FAIL;
1299   }
1300
1301 /* Initialize the library. If it fails, it will already have logged the error
1302 and sent an SMTP response. */
1303
1304 DEBUG(D_tls) debug_printf("initialising GnuTLS as a server\n");
1305
1306 rc = tls_init(NULL, tls_certificate, tls_privatekey,
1307     NULL, tls_verify_certificates, tls_crl,
1308     require_ciphers, &state);
1309 if (rc != OK) return rc;
1310
1311 /* If this is a host for which certificate verification is mandatory or
1312 optional, set up appropriately. */
1313
1314 if (verify_check_host(&tls_verify_hosts) == OK)
1315   {
1316   DEBUG(D_tls) debug_printf("TLS: a client certificate will be required.\n");
1317   state->verify_requirement = VERIFY_REQUIRED;
1318   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
1319   }
1320 else if (verify_check_host(&tls_try_verify_hosts) == OK)
1321   {
1322   DEBUG(D_tls) debug_printf("TLS: a client certificate will be requested but not required.\n");
1323   state->verify_requirement = VERIFY_OPTIONAL;
1324   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
1325   }
1326 else
1327   {
1328   DEBUG(D_tls) debug_printf("TLS: a client certificate will not be requested.\n");
1329   state->verify_requirement = VERIFY_NONE;
1330   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
1331   }
1332
1333 /* Register SNI handling; always, even if not in tls_certificate, so that the
1334 expansion variable $tls_sni is always available. */
1335
1336 gnutls_handshake_set_post_client_hello_function(state->session,
1337     exim_sni_handling_cb);
1338
1339 /* Set context and tell client to go ahead, except in the case of TLS startup
1340 on connection, where outputting anything now upsets the clients and tends to
1341 make them disconnect. We need to have an explicit fflush() here, to force out
1342 the response. Other smtp_printf() calls do not need it, because in non-TLS
1343 mode, the fflush() happens when smtp_getc() is called. */
1344
1345 if (!tls_on_connect)
1346   {
1347   smtp_printf("220 TLS go ahead\r\n");
1348   fflush(smtp_out);
1349   }
1350
1351 /* Now negotiate the TLS session. We put our own timer on it, since it seems
1352 that the GnuTLS library doesn't. */
1353
1354 gnutls_transport_set_ptr2(state->session,
1355     (gnutls_transport_ptr)fileno(smtp_in),
1356     (gnutls_transport_ptr)fileno(smtp_out));
1357 state->fd_in = fileno(smtp_in);
1358 state->fd_out = fileno(smtp_out);
1359
1360 sigalrm_seen = FALSE;
1361 if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
1362 do
1363   {
1364   rc = gnutls_handshake(state->session);
1365   } while ((rc == GNUTLS_E_AGAIN) || (rc == GNUTLS_E_INTERRUPTED));
1366 alarm(0);
1367
1368 if (rc != GNUTLS_E_SUCCESS)
1369   {
1370   tls_error(US"gnutls_handshake",
1371       sigalrm_seen ? "timed out" : gnutls_strerror(rc), NULL);
1372   /* It seems that, except in the case of a timeout, we have to close the
1373   connection right here; otherwise if the other end is running OpenSSL it hangs
1374   until the server times out. */
1375
1376   if (!sigalrm_seen)
1377     {
1378     (void)fclose(smtp_out);
1379     (void)fclose(smtp_in);
1380     }
1381
1382   return FAIL;
1383   }
1384
1385 DEBUG(D_tls) debug_printf("gnutls_handshake was successful\n");
1386
1387 /* Verify after the fact */
1388
1389 if (state->verify_requirement != VERIFY_NONE)
1390   {
1391   if (!verify_certificate(state, &error))
1392     {
1393     if (state->verify_requirement == VERIFY_OPTIONAL)
1394       {
1395       DEBUG(D_tls)
1396         debug_printf("TLS: continuing on only because verification was optional, after: %s\n",
1397             error);
1398       }
1399     else
1400       {
1401       tls_error(US"certificate verification failed", error, NULL);
1402       return FAIL;
1403       }
1404     }
1405   }
1406
1407 /* Figure out peer DN, and if authenticated, etc. */
1408
1409 rc = peer_status(state);
1410 if (rc != OK) return rc;
1411
1412 /* Sets various Exim expansion variables; always safe within server */
1413
1414 extract_exim_vars_from_tls_state(state);
1415
1416 /* TLS has been set up. Adjust the input functions to read via TLS,
1417 and initialize appropriately. */
1418
1419 state->xfer_buffer = store_malloc(ssl_xfer_buffer_size);
1420
1421 receive_getc = tls_getc;
1422 receive_ungetc = tls_ungetc;
1423 receive_feof = tls_feof;
1424 receive_ferror = tls_ferror;
1425 receive_smtp_buffered = tls_smtp_buffered;
1426
1427 return OK;
1428 }
1429
1430
1431
1432
1433 /*************************************************
1434 *    Start a TLS session in a client             *
1435 *************************************************/
1436
1437 /* Called from the smtp transport after STARTTLS has been accepted.
1438
1439 Arguments:
1440   fd                the fd of the connection
1441   host              connected host (for messages)
1442   addr              the first address (not used)
1443   dhparam           DH parameter file (ignored, we're a client)
1444   certificate       certificate file
1445   privatekey        private key file
1446   sni               TLS SNI to send to remote host
1447   verify_certs      file for certificate verify
1448   verify_crl        CRL for verify
1449   require_ciphers   list of allowed ciphers or NULL
1450   timeout           startup timeout
1451
1452 Returns:            OK/DEFER/FAIL (because using common functions),
1453                     but for a client, DEFER and FAIL have the same meaning
1454 */
1455
1456 int
1457 tls_client_start(int fd, host_item *host,
1458     address_item *addr ARG_UNUSED, uschar *dhparam ARG_UNUSED,
1459     uschar *certificate, uschar *privatekey, uschar *sni,
1460     uschar *verify_certs, uschar *verify_crl,
1461     uschar *require_ciphers, int timeout)
1462 {
1463 int rc;
1464 const char *error;
1465 exim_gnutls_state_st *state = NULL;
1466
1467 DEBUG(D_tls) debug_printf("initialising GnuTLS as a client on fd %d\n", fd);
1468
1469 rc = tls_init(host, certificate, privatekey,
1470     sni, verify_certs, verify_crl, require_ciphers, &state);
1471 if (rc != OK) return rc;
1472
1473 gnutls_dh_set_prime_bits(state->session, EXIM_CLIENT_DH_MIN_BITS);
1474
1475 if (verify_certs == NULL)
1476   {
1477   DEBUG(D_tls) debug_printf("TLS: server certificate verification not required\n");
1478   state->verify_requirement = VERIFY_NONE;
1479   /* we still ask for it, to log it, etc */
1480   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
1481   }
1482 else
1483   {
1484   DEBUG(D_tls) debug_printf("TLS: server certificate verification required\n");
1485   state->verify_requirement = VERIFY_REQUIRED;
1486   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
1487   }
1488
1489 gnutls_transport_set_ptr(state->session, (gnutls_transport_ptr)fd);
1490 state->fd_in = fd;
1491 state->fd_out = fd;
1492
1493 /* There doesn't seem to be a built-in timeout on connection. */
1494
1495 sigalrm_seen = FALSE;
1496 alarm(timeout);
1497 do
1498   {
1499   rc = gnutls_handshake(state->session);
1500   } while ((rc == GNUTLS_E_AGAIN) || (rc == GNUTLS_E_INTERRUPTED));
1501 alarm(0);
1502
1503 if (rc != GNUTLS_E_SUCCESS)
1504   return tls_error(US"gnutls_handshake",
1505       sigalrm_seen ? "timed out" : gnutls_strerror(rc), state->host);
1506
1507 DEBUG(D_tls) debug_printf("gnutls_handshake was successful\n");
1508
1509 /* Verify late */
1510
1511 if (state->verify_requirement != VERIFY_NONE &&
1512     !verify_certificate(state, &error))
1513   return tls_error(US"certificate verification failed", error, state->host);
1514
1515 /* Figure out peer DN, and if authenticated, etc. */
1516
1517 rc = peer_status(state);
1518 if (rc != OK) return rc;
1519
1520 /* Sets various Exim expansion variables; may need to adjust for ACL callouts */
1521
1522 extract_exim_vars_from_tls_state(state);
1523
1524 return OK;
1525 }
1526
1527
1528
1529
1530 /*************************************************
1531 *         Close down a TLS session               *
1532 *************************************************/
1533
1534 /* This is also called from within a delivery subprocess forked from the
1535 daemon, to shut down the TLS library, without actually doing a shutdown (which
1536 would tamper with the TLS session in the parent process).
1537
1538 Arguments:   TRUE if gnutls_bye is to be called
1539 Returns:     nothing
1540 */
1541
1542 void
1543 tls_close(BOOL shutdown)
1544 {
1545 exim_gnutls_state_st *state = current_global_tls_state;
1546
1547 if (tls_active < 0) return;  /* TLS was not active */
1548
1549 if (shutdown)
1550   {
1551   DEBUG(D_tls) debug_printf("tls_close(): shutting down TLS\n");
1552   gnutls_bye(state->session, GNUTLS_SHUT_WR);
1553   }
1554
1555 gnutls_deinit(state->session);
1556
1557 memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
1558
1559 if ((state_server.session == NULL) && (state_client.session == NULL))
1560   {
1561   gnutls_global_deinit();
1562   exim_gnutls_base_init_done = FALSE;
1563   }
1564
1565 tls_active = -1;
1566 }
1567
1568
1569
1570
1571 /*************************************************
1572 *            TLS version of getc                 *
1573 *************************************************/
1574
1575 /* This gets the next byte from the TLS input buffer. If the buffer is empty,
1576 it refills the buffer via the GnuTLS reading function.
1577
1578 This feeds DKIM and should be used for all message-body reads.
1579
1580 Arguments:  none
1581 Returns:    the next character or EOF
1582 */
1583
1584 int
1585 tls_getc(void)
1586 {
1587 exim_gnutls_state_st *state = current_global_tls_state;
1588 if (state->xfer_buffer_lwm >= state->xfer_buffer_hwm)
1589   {
1590   ssize_t inbytes;
1591
1592   DEBUG(D_tls) debug_printf("Calling gnutls_record_recv(%p, %p, %u)\n",
1593     state->session, state->xfer_buffer, ssl_xfer_buffer_size);
1594
1595   if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
1596   inbytes = gnutls_record_recv(state->session, state->xfer_buffer,
1597     ssl_xfer_buffer_size);
1598   alarm(0);
1599
1600   /* A zero-byte return appears to mean that the TLS session has been
1601      closed down, not that the socket itself has been closed down. Revert to
1602      non-TLS handling. */
1603
1604   if (inbytes == 0)
1605     {
1606     DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
1607
1608     receive_getc = smtp_getc;
1609     receive_ungetc = smtp_ungetc;
1610     receive_feof = smtp_feof;
1611     receive_ferror = smtp_ferror;
1612     receive_smtp_buffered = smtp_buffered;
1613
1614     gnutls_deinit(state->session);
1615     state->session = NULL;
1616     tls_active = -1;
1617     tls_bits = 0;
1618     tls_certificate_verified = FALSE;
1619     tls_channelbinding_b64 = NULL;
1620     tls_cipher = NULL;
1621     tls_peerdn = NULL;
1622
1623     return smtp_getc();
1624     }
1625
1626   /* Handle genuine errors */
1627
1628   else if (inbytes < 0)
1629     {
1630     record_io_error(state, (int) inbytes, US"recv", NULL);
1631     state->xfer_error = 1;
1632     return EOF;
1633     }
1634 #ifndef DISABLE_DKIM
1635   dkim_exim_verify_feed(state->xfer_buffer, inbytes);
1636 #endif
1637   state->xfer_buffer_hwm = (int) inbytes;
1638   state->xfer_buffer_lwm = 0;
1639   }
1640
1641 /* Something in the buffer; return next uschar */
1642
1643 return state->xfer_buffer[state->xfer_buffer_lwm++];
1644 }
1645
1646
1647
1648
1649 /*************************************************
1650 *          Read bytes from TLS channel           *
1651 *************************************************/
1652
1653 /* This does not feed DKIM, so if the caller uses this for reading message body,
1654 then the caller must feed DKIM.
1655 Arguments:
1656   buff      buffer of data
1657   len       size of buffer
1658
1659 Returns:    the number of bytes read
1660             -1 after a failed read
1661 */
1662
1663 int
1664 tls_read(uschar *buff, size_t len)
1665 {
1666 exim_gnutls_state_st *state = current_global_tls_state;
1667 ssize_t inbytes;
1668
1669 if (len > INT_MAX)
1670   len = INT_MAX;
1671
1672 if (state->xfer_buffer_lwm < state->xfer_buffer_hwm)
1673   DEBUG(D_tls)
1674     debug_printf("*** PROBABLY A BUG *** " \
1675         "tls_read() called with data in the tls_getc() buffer, %d ignored\n",
1676         state->xfer_buffer_hwm - state->xfer_buffer_lwm);
1677
1678 DEBUG(D_tls)
1679   debug_printf("Calling gnutls_record_recv(%p, %p, " SIZE_T_FMT ")\n",
1680       state->session, buff, len);
1681
1682 inbytes = gnutls_record_recv(state->session, buff, len);
1683 if (inbytes > 0) return inbytes;
1684 if (inbytes == 0)
1685   {
1686   DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
1687   }
1688 else record_io_error(state, (int)inbytes, US"recv", NULL);
1689
1690 return -1;
1691 }
1692
1693
1694
1695
1696 /*************************************************
1697 *         Write bytes down TLS channel           *
1698 *************************************************/
1699
1700 /*
1701 Arguments:
1702   buff      buffer of data
1703   len       number of bytes
1704
1705 Returns:    the number of bytes after a successful write,
1706             -1 after a failed write
1707 */
1708
1709 int
1710 tls_write(const uschar *buff, size_t len)
1711 {
1712 ssize_t outbytes;
1713 size_t left = len;
1714 exim_gnutls_state_st *state = current_global_tls_state;
1715
1716 DEBUG(D_tls) debug_printf("tls_do_write(%p, " SIZE_T_FMT ")\n", buff, left);
1717 while (left > 0)
1718   {
1719   DEBUG(D_tls) debug_printf("gnutls_record_send(SSL, %p, " SIZE_T_FMT ")\n",
1720       buff, left);
1721   outbytes = gnutls_record_send(state->session, buff, left);
1722
1723   DEBUG(D_tls) debug_printf("outbytes=" SSIZE_T_FMT "\n", outbytes);
1724   if (outbytes < 0)
1725     {
1726     record_io_error(state, outbytes, US"send", NULL);
1727     return -1;
1728     }
1729   if (outbytes == 0)
1730     {
1731     record_io_error(state, 0, US"send", US"TLS channel closed on write");
1732     return -1;
1733     }
1734
1735   left -= outbytes;
1736   buff += outbytes;
1737   }
1738
1739 if (len > INT_MAX)
1740   {
1741   DEBUG(D_tls)
1742     debug_printf("Whoops!  Wrote more bytes (" SIZE_T_FMT ") than INT_MAX\n",
1743         len);
1744   len = INT_MAX;
1745   }
1746
1747 return (int) len;
1748 }
1749
1750
1751
1752
1753 /*************************************************
1754 *            Random number generation            *
1755 *************************************************/
1756
1757 /* Pseudo-random number generation.  The result is not expected to be
1758 cryptographically strong but not so weak that someone will shoot themselves
1759 in the foot using it as a nonce in input in some email header scheme or
1760 whatever weirdness they'll twist this into.  The result should handle fork()
1761 and avoid repeating sequences.  OpenSSL handles that for us.
1762
1763 Arguments:
1764   max       range maximum
1765 Returns     a random number in range [0, max-1]
1766 */
1767
1768 #ifdef HAVE_GNUTLS_RND
1769 int
1770 vaguely_random_number(int max)
1771 {
1772 unsigned int r;
1773 int i, needed_len;
1774 uschar *p;
1775 uschar smallbuf[sizeof(r)];
1776
1777 if (max <= 1)
1778   return 0;
1779
1780 needed_len = sizeof(r);
1781 /* Don't take 8 times more entropy than needed if int is 8 octets and we were
1782  * asked for a number less than 10. */
1783 for (r = max, i = 0; r; ++i)
1784   r >>= 1;
1785 i = (i + 7) / 8;
1786 if (i < needed_len)
1787   needed_len = i;
1788
1789 i = gnutls_rnd(GNUTLS_RND_NONCE, smallbuf, needed_len);
1790 if (i < 0)
1791   {
1792   DEBUG(D_all) debug_printf("gnutls_rnd() failed, using fallback.\n");
1793   return vaguely_random_number_fallback(max);
1794   }
1795 r = 0;
1796 for (p = smallbuf; needed_len; --needed_len, ++p)
1797   {
1798   r *= 256;
1799   r += *p;
1800   }
1801
1802 /* We don't particularly care about weighted results; if someone wants
1803  * smooth distribution and cares enough then they should submit a patch then. */
1804 return r % max;
1805 }
1806 #else /* HAVE_GNUTLS_RND */
1807 int
1808 vaguely_random_number(int max)
1809 {
1810   return vaguely_random_number_fallback(max);
1811 }
1812 #endif /* HAVE_GNUTLS_RND */
1813
1814
1815
1816
1817 /*************************************************
1818 *         Report the library versions.           *
1819 *************************************************/
1820
1821 /* See a description in tls-openssl.c for an explanation of why this exists.
1822
1823 Arguments:   a FILE* to print the results to
1824 Returns:     nothing
1825 */
1826
1827 void
1828 tls_version_report(FILE *f)
1829 {
1830 fprintf(f, "Library version: GnuTLS: Compile: %s\n"
1831            "                         Runtime: %s\n",
1832            LIBGNUTLS_VERSION,
1833            gnutls_check_version(NULL));
1834 }
1835
1836 /* End of tls-gnu.c */