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