TLS: when tls_certificates unset, generate a selfsigned cert
[exim.git] / src / src / tls-gnu.c
CommitLineData
059ec3d9
PH
1/*************************************************
2* Exim - an Internet mail transport agent *
3*************************************************/
4
3386088d 5/* Copyright (c) University of Cambridge 1995 - 2015 */
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>
a5f239e4
PP
42/* needed to disable PKCS11 autoload unless requested */
43#if GNUTLS_VERSION_NUMBER >= 0x020c00
44# include <gnutls/pkcs11.h>
45#endif
7e07527a
JH
46#if GNUTLS_VERSION_NUMBER < 0x030103 && !defined(DISABLE_OCSP)
47# warning "GnuTLS library version too old; define DISABLE_OCSP in Makefile"
48# define DISABLE_OCSP
49#endif
0cbf2b82 50#if GNUTLS_VERSION_NUMBER < 0x020a00 && !defined(DISABLE_EVENT)
774ef2d7 51# warning "GnuTLS library version too old; tls:cert event unsupported"
0cbf2b82 52# define DISABLE_EVENT
a7538db1 53#endif
a7fec7a7
JH
54#if GNUTLS_VERSION_NUMBER >= 0x030306
55# define SUPPORT_CA_DIR
56#else
57# undef SUPPORT_CA_DIR
58#endif
11a04b5a 59#if GNUTLS_VERSION_NUMBER >= 0x030014
cb1d7830
JH
60# define SUPPORT_SYSDEFAULT_CABUNDLE
61#endif
7e07527a 62
f2de3a33 63#ifndef DISABLE_OCSP
2b4a568d
JH
64# include <gnutls/ocsp.h>
65#endif
059ec3d9 66
17c76198 67/* GnuTLS 2 vs 3
059ec3d9 68
17c76198
PP
69GnuTLS 3 only:
70 gnutls_global_set_audit_log_function()
059ec3d9 71
17c76198
PP
72Changes:
73 gnutls_certificate_verify_peers2(): is new, drop the 2 for old version
74*/
059ec3d9 75
17c76198 76/* Local static variables for GnuTLS */
059ec3d9 77
17c76198 78/* Values for verify_requirement */
059ec3d9 79
e51c7be2 80enum peer_verify_requirement
aa2a70ba 81 { VERIFY_NONE, VERIFY_OPTIONAL, VERIFY_REQUIRED };
059ec3d9 82
17c76198
PP
83/* This holds most state for server or client; with this, we can set up an
84outbound TLS-enabled connection in an ACL callout, while not stomping all
85over the TLS variables available for expansion.
059ec3d9 86
17c76198
PP
87Some of these correspond to variables in globals.c; those variables will
88be set to point to content in one of these instances, as appropriate for
89the stage of the process lifetime.
059ec3d9 90
389ca47a 91Not handled here: global tls_channelbinding_b64.
17c76198 92*/
059ec3d9 93
17c76198 94typedef struct exim_gnutls_state {
9d1c15ef 95 gnutls_session_t session;
17c76198 96 gnutls_certificate_credentials_t x509_cred;
9d1c15ef 97 gnutls_priority_t priority_cache;
17c76198 98 enum peer_verify_requirement verify_requirement;
9d1c15ef
JH
99 int fd_in;
100 int fd_out;
101 BOOL peer_cert_verified;
102 BOOL trigger_sni_changes;
103 BOOL have_set_peerdn;
17c76198 104 const struct host_item *host;
9d1c15ef
JH
105 gnutls_x509_crt_t peercert;
106 uschar *peerdn;
107 uschar *ciphersuite;
108 uschar *received_sni;
17c76198
PP
109
110 const uschar *tls_certificate;
111 const uschar *tls_privatekey;
112 const uschar *tls_sni; /* client send only, not received */
113 const uschar *tls_verify_certificates;
114 const uschar *tls_crl;
115 const uschar *tls_require_ciphers;
e51c7be2 116
17c76198
PP
117 uschar *exp_tls_certificate;
118 uschar *exp_tls_privatekey;
17c76198
PP
119 uschar *exp_tls_verify_certificates;
120 uschar *exp_tls_crl;
121 uschar *exp_tls_require_ciphers;
44662487 122 uschar *exp_tls_ocsp_file;
55414b25 123 const uschar *exp_tls_verify_cert_hostnames;
0cbf2b82 124#ifndef DISABLE_EVENT
a7538db1
JH
125 uschar *event_action;
126#endif
17c76198 127
389ca47a 128 tls_support *tlsp; /* set in tls_init() */
817d9f57 129
17c76198
PP
130 uschar *xfer_buffer;
131 int xfer_buffer_lwm;
132 int xfer_buffer_hwm;
133 int xfer_eof;
134 int xfer_error;
17c76198
PP
135} exim_gnutls_state_st;
136
137static const exim_gnutls_state_st exim_gnutls_state_init = {
4fe99a6c 138 NULL, NULL, NULL, VERIFY_NONE, -1, -1, FALSE, FALSE, FALSE,
75fe387d 139 NULL, NULL, NULL, NULL,
17c76198 140 NULL, NULL, NULL, NULL, NULL, NULL,
44662487 141 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
01a4a5c5 142 NULL,
0cbf2b82 143#ifndef DISABLE_EVENT
a7538db1 144 NULL,
e51c7be2 145#endif
817d9f57 146 NULL,
17c76198 147 NULL, 0, 0, 0, 0,
17c76198 148};
83da1223 149
17c76198
PP
150/* Not only do we have our own APIs which don't pass around state, assuming
151it's held in globals, GnuTLS doesn't appear to let us register callback data
152for callbacks, or as part of the session, so we have to keep a "this is the
153context we're currently dealing with" pointer and rely upon being
154single-threaded to keep from processing data on an inbound TLS connection while
155talking to another TLS connection for an outbound check. This does mean that
156there's no way for heart-beats to be responded to, for the duration of the
a7538db1
JH
157second connection.
158XXX But see gnutls_session_get_ptr()
159*/
059ec3d9 160
17c76198 161static exim_gnutls_state_st state_server, state_client;
059ec3d9 162
17c76198
PP
163/* dh_params are initialised once within the lifetime of a process using TLS;
164if we used TLS in a long-lived daemon, we'd have to reconsider this. But we
165don't want to repeat this. */
83da1223 166
17c76198 167static gnutls_dh_params_t dh_server_params = NULL;
059ec3d9 168
17c76198 169/* No idea how this value was chosen; preserving it. Default is 3600. */
059ec3d9 170
17c76198 171static const int ssl_session_timeout = 200;
059ec3d9 172
17c76198 173static const char * const exim_default_gnutls_priority = "NORMAL";
83da1223 174
17c76198 175/* Guard library core initialisation */
83da1223 176
17c76198 177static BOOL exim_gnutls_base_init_done = FALSE;
059ec3d9 178
4fb7df6d 179#ifndef DISABLE_OCSP
9196d5bf 180static BOOL gnutls_buggy_ocsp = FALSE;
4fb7df6d 181#endif
9196d5bf 182
059ec3d9 183
17c76198
PP
184/* ------------------------------------------------------------------------ */
185/* macros */
83da1223 186
17c76198 187#define MAX_HOST_LEN 255
83da1223 188
17c76198
PP
189/* Set this to control gnutls_global_set_log_level(); values 0 to 9 will setup
190the library logging; a value less than 0 disables the calls to set up logging
191callbacks. */
2c17bb02 192#ifndef EXIM_GNUTLS_LIBRARY_LOG_LEVEL
a7538db1 193# define EXIM_GNUTLS_LIBRARY_LOG_LEVEL -1
2c17bb02 194#endif
83da1223 195
2c17bb02 196#ifndef EXIM_CLIENT_DH_MIN_BITS
a7538db1 197# define EXIM_CLIENT_DH_MIN_BITS 1024
2c17bb02 198#endif
83da1223 199
af3498d6
PP
200/* With GnuTLS 2.12.x+ we have gnutls_sec_param_to_pk_bits() with which we
201can ask for a bit-strength. Without that, we stick to the constant we had
202before, for now. */
2c17bb02 203#ifndef EXIM_SERVER_DH_BITS_PRE2_12
a7538db1 204# define EXIM_SERVER_DH_BITS_PRE2_12 1024
2c17bb02 205#endif
af3498d6 206
17c76198
PP
207#define exim_gnutls_err_check(Label) do { \
208 if (rc != GNUTLS_E_SUCCESS) { return tls_error((Label), gnutls_strerror(rc), host); } } while (0)
059ec3d9 209
17c76198 210#define expand_check_tlsvar(Varname) expand_check(state->Varname, US #Varname, &state->exp_##Varname)
83da1223 211
17c76198 212#if GNUTLS_VERSION_NUMBER >= 0x020c00
e51c7be2
JH
213# define HAVE_GNUTLS_SESSION_CHANNEL_BINDING
214# define HAVE_GNUTLS_SEC_PARAM_CONSTANTS
215# define HAVE_GNUTLS_RND
2519e60d
TL
216/* The security fix we provide with the gnutls_allow_auto_pkcs11 option
217 * (4.82 PP/09) introduces a compatibility regression. The symbol simply
218 * isn't available sometimes, so this needs to become a conditional
219 * compilation; the sanest way to deal with this being a problem on
220 * older OSes is to block it in the Local/Makefile with this compiler
221 * definition */
e51c7be2
JH
222# ifndef AVOID_GNUTLS_PKCS11
223# define HAVE_GNUTLS_PKCS11
224# endif /* AVOID_GNUTLS_PKCS11 */
17c76198 225#endif
83da1223 226
af3498d6
PP
227
228
229
230/* ------------------------------------------------------------------------ */
231/* Callback declarations */
232
233#if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
234static void exim_gnutls_logger_cb(int level, const char *message);
235#endif
236
237static int exim_sni_handling_cb(gnutls_session_t session);
238
f2de3a33 239#ifndef DISABLE_OCSP
44662487
JH
240static int server_ocsp_stapling_cb(gnutls_session_t session, void * ptr,
241 gnutls_datum_t * ocsp_response);
242#endif
af3498d6
PP
243
244
245
17c76198
PP
246/* ------------------------------------------------------------------------ */
247/* Static functions */
059ec3d9
PH
248
249/*************************************************
250* Handle TLS error *
251*************************************************/
252
253/* Called from lots of places when errors occur before actually starting to do
254the TLS handshake, that is, while the session is still in clear. Always returns
255DEFER for a server and FAIL for a client so that most calls can use "return
256tls_error(...)" to do this processing and then give an appropriate return. A
257single function is used for both server and client, because it is called from
258some shared functions.
259
260Argument:
261 prefix text to include in the logged error
7199e1ee
TF
262 msg additional error string (may be NULL)
263 usually obtained from gnutls_strerror()
17c76198
PP
264 host NULL if setting up a server;
265 the connected host if setting up a client
059ec3d9
PH
266
267Returns: OK/DEFER/FAIL
268*/
269
270static int
17c76198 271tls_error(const uschar *prefix, const char *msg, const host_item *host)
059ec3d9 272{
17c76198
PP
273if (host)
274 {
c562fd30 275 log_write(0, LOG_MAIN, "H=%s [%s] TLS error on connection (%s)%s%s",
17c76198
PP
276 host->name, host->address, prefix, msg ? ": " : "", msg ? msg : "");
277 return FAIL;
278 }
279else
059ec3d9 280 {
7199e1ee 281 uschar *conn_info = smtp_get_connection_info();
17c76198 282 if (Ustrncmp(conn_info, US"SMTP ", 5) == 0)
7199e1ee 283 conn_info += 5;
c562fd30 284 /* I'd like to get separated H= here, but too hard for now */
7199e1ee 285 log_write(0, LOG_MAIN, "TLS error on %s (%s)%s%s",
17c76198 286 conn_info, prefix, msg ? ": " : "", msg ? msg : "");
059ec3d9
PH
287 return DEFER;
288 }
059ec3d9
PH
289}
290
291
292
17c76198 293
059ec3d9 294/*************************************************
17c76198 295* Deal with logging errors during I/O *
059ec3d9
PH
296*************************************************/
297
17c76198 298/* We have to get the identity of the peer from saved data.
059ec3d9 299
17c76198
PP
300Argument:
301 state the current GnuTLS exim state container
302 rc the GnuTLS error code, or 0 if it's a local error
303 when text identifying read or write
304 text local error text when ec is 0
059ec3d9 305
17c76198 306Returns: nothing
059ec3d9
PH
307*/
308
17c76198
PP
309static void
310record_io_error(exim_gnutls_state_st *state, int rc, uschar *when, uschar *text)
059ec3d9 311{
17c76198 312const char *msg;
059ec3d9 313
17c76198
PP
314if (rc == GNUTLS_E_FATAL_ALERT_RECEIVED)
315 msg = CS string_sprintf("%s: %s", US gnutls_strerror(rc),
316 US gnutls_alert_get_name(gnutls_alert_get(state->session)));
317else
318 msg = gnutls_strerror(rc);
059ec3d9 319
17c76198
PP
320tls_error(when, msg, state->host);
321}
059ec3d9 322
059ec3d9 323
059ec3d9 324
059ec3d9 325
17c76198
PP
326/*************************************************
327* Set various Exim expansion vars *
328*************************************************/
059ec3d9 329
e51c7be2
JH
330#define exim_gnutls_cert_err(Label) \
331 do \
332 { \
333 if (rc != GNUTLS_E_SUCCESS) \
334 { \
335 DEBUG(D_tls) debug_printf("TLS: cert problem: %s: %s\n", \
336 (Label), gnutls_strerror(rc)); \
337 return rc; \
338 } \
339 } while (0)
9d1c15ef
JH
340
341static int
27f19eb4 342import_cert(const gnutls_datum_t * cert, gnutls_x509_crt_t * crtp)
9d1c15ef
JH
343{
344int rc;
345
346rc = gnutls_x509_crt_init(crtp);
347exim_gnutls_cert_err(US"gnutls_x509_crt_init (crt)");
348
349rc = gnutls_x509_crt_import(*crtp, cert, GNUTLS_X509_FMT_DER);
350exim_gnutls_cert_err(US"failed to import certificate [gnutls_x509_crt_import(cert)]");
351
352return rc;
353}
354
355#undef exim_gnutls_cert_err
356
357
17c76198
PP
358/* We set various Exim global variables from the state, once a session has
359been established. With TLS callouts, may need to change this to stack
360variables, or just re-call it with the server state after client callout
361has finished.
059ec3d9 362
9d1c15ef 363Make sure anything set here is unset in tls_getc().
17c76198
PP
364
365Sets:
366 tls_active fd
367 tls_bits strength indicator
368 tls_certificate_verified bool indicator
369 tls_channelbinding_b64 for some SASL mechanisms
370 tls_cipher a string
9d1c15ef 371 tls_peercert pointer to library internal
17c76198
PP
372 tls_peerdn a string
373 tls_sni a (UTF-8) string
9d1c15ef 374 tls_ourcert pointer to library internal
17c76198
PP
375
376Argument:
377 state the relevant exim_gnutls_state_st *
378*/
379
380static void
9d1c15ef 381extract_exim_vars_from_tls_state(exim_gnutls_state_st * state)
17c76198 382{
17c76198 383gnutls_cipher_algorithm_t cipher;
17c76198
PP
384#ifdef HAVE_GNUTLS_SESSION_CHANNEL_BINDING
385int old_pool;
386int rc;
387gnutls_datum_t channel;
388#endif
9d1c15ef 389tls_support * tlsp = state->tlsp;
17c76198 390
9d1c15ef 391tlsp->active = state->fd_out;
17c76198
PP
392
393cipher = gnutls_cipher_get(state->session);
394/* returns size in "bytes" */
9d1c15ef 395tlsp->bits = gnutls_cipher_get_key_size(cipher) * 8;
17c76198 396
9d1c15ef 397tlsp->cipher = state->ciphersuite;
17c76198 398
817d9f57 399DEBUG(D_tls) debug_printf("cipher: %s\n", state->ciphersuite);
17c76198 400
9d1c15ef 401tlsp->certificate_verified = state->peer_cert_verified;
059ec3d9 402
17c76198
PP
403/* note that tls_channelbinding_b64 is not saved to the spool file, since it's
404only available for use for authenticators while this TLS session is running. */
405
406tls_channelbinding_b64 = NULL;
407#ifdef HAVE_GNUTLS_SESSION_CHANNEL_BINDING
408channel.data = NULL;
409channel.size = 0;
410rc = gnutls_session_channel_binding(state->session, GNUTLS_CB_TLS_UNIQUE, &channel);
411if (rc) {
412 DEBUG(D_tls) debug_printf("Channel binding error: %s\n", gnutls_strerror(rc));
413} else {
414 old_pool = store_pool;
415 store_pool = POOL_PERM;
f4d091fb 416 tls_channelbinding_b64 = b64encode(channel.data, (int)channel.size);
17c76198
PP
417 store_pool = old_pool;
418 DEBUG(D_tls) debug_printf("Have channel bindings cached for possible auth usage.\n");
419}
420#endif
421
9d1c15ef
JH
422/* peercert is set in peer_status() */
423tlsp->peerdn = state->peerdn;
424tlsp->sni = state->received_sni;
425
426/* record our certificate */
427 {
27f19eb4 428 const gnutls_datum_t * cert = gnutls_certificate_get_ours(state->session);
9d1c15ef
JH
429 gnutls_x509_crt_t crt;
430
431 tlsp->ourcert = cert && import_cert(cert, &crt)==0 ? crt : NULL;
432 }
059ec3d9
PH
433}
434
435
436
17c76198 437
059ec3d9 438/*************************************************
575643cd 439* Setup up DH parameters *
059ec3d9
PH
440*************************************************/
441
575643cd 442/* Generating the D-H parameters may take a long time. They only need to
059ec3d9
PH
443be re-generated every so often, depending on security policy. What we do is to
444keep these parameters in a file in the spool directory. If the file does not
445exist, we generate them. This means that it is easy to cause a regeneration.
446
447The new file is written as a temporary file and renamed, so that an incomplete
448file is never present. If two processes both compute some new parameters, you
449waste a bit of effort, but it doesn't seem worth messing around with locking to
450prevent this.
451
059ec3d9
PH
452Returns: OK/DEFER/FAIL
453*/
454
455static int
17c76198 456init_server_dh(void)
059ec3d9 457{
17c76198
PP
458int fd, rc;
459unsigned int dh_bits;
27f19eb4 460gnutls_datum_t m;
a799883d
PP
461uschar filename_buf[PATH_MAX];
462uschar *filename = NULL;
17c76198 463size_t sz;
a799883d
PP
464uschar *exp_tls_dhparam;
465BOOL use_file_in_spool = FALSE;
466BOOL use_fixed_file = FALSE;
17c76198 467host_item *host = NULL; /* dummy for macros */
059ec3d9 468
17c76198 469DEBUG(D_tls) debug_printf("Initialising GnuTLS server params.\n");
059ec3d9 470
17c76198
PP
471rc = gnutls_dh_params_init(&dh_server_params);
472exim_gnutls_err_check(US"gnutls_dh_params_init");
059ec3d9 473
a799883d
PP
474m.data = NULL;
475m.size = 0;
476
477if (!expand_check(tls_dhparam, US"tls_dhparam", &exp_tls_dhparam))
478 return DEFER;
479
480if (!exp_tls_dhparam)
481 {
482 DEBUG(D_tls) debug_printf("Loading default hard-coded DH params\n");
483 m.data = US std_dh_prime_default();
484 m.size = Ustrlen(m.data);
485 }
486else if (Ustrcmp(exp_tls_dhparam, "historic") == 0)
487 use_file_in_spool = TRUE;
488else if (Ustrcmp(exp_tls_dhparam, "none") == 0)
489 {
490 DEBUG(D_tls) debug_printf("Requested no DH parameters.\n");
491 return OK;
492 }
493else if (exp_tls_dhparam[0] != '/')
494 {
495 m.data = US std_dh_prime_named(exp_tls_dhparam);
496 if (m.data == NULL)
497 return tls_error(US"No standard prime named", CS exp_tls_dhparam, NULL);
498 m.size = Ustrlen(m.data);
499 }
500else
501 {
502 use_fixed_file = TRUE;
503 filename = exp_tls_dhparam;
504 }
505
506if (m.data)
507 {
508 rc = gnutls_dh_params_import_pkcs3(dh_server_params, &m, GNUTLS_X509_FMT_PEM);
509 exim_gnutls_err_check(US"gnutls_dh_params_import_pkcs3");
510 DEBUG(D_tls) debug_printf("Loaded fixed standard D-H parameters\n");
511 return OK;
512 }
513
af3498d6
PP
514#ifdef HAVE_GNUTLS_SEC_PARAM_CONSTANTS
515/* If you change this constant, also change dh_param_fn_ext so that we can use a
17c76198
PP
516different filename and ensure we have sufficient bits. */
517dh_bits = gnutls_sec_param_to_pk_bits(GNUTLS_PK_DH, GNUTLS_SEC_PARAM_NORMAL);
518if (!dh_bits)
519 return tls_error(US"gnutls_sec_param_to_pk_bits() failed", NULL, NULL);
af3498d6 520DEBUG(D_tls)
b34fc30c 521 debug_printf("GnuTLS tells us that for D-H PK, NORMAL is %d bits.\n",
af3498d6
PP
522 dh_bits);
523#else
524dh_bits = EXIM_SERVER_DH_BITS_PRE2_12;
525DEBUG(D_tls)
526 debug_printf("GnuTLS lacks gnutls_sec_param_to_pk_bits(), using %d bits.\n",
527 dh_bits);
528#endif
059ec3d9 529
3375e053
PP
530/* Some clients have hard-coded limits. */
531if (dh_bits > tls_dh_max_bits)
532 {
533 DEBUG(D_tls)
534 debug_printf("tls_dh_max_bits clamping override, using %d bits instead.\n",
535 tls_dh_max_bits);
536 dh_bits = tls_dh_max_bits;
537 }
538
a799883d
PP
539if (use_file_in_spool)
540 {
541 if (!string_format(filename_buf, sizeof(filename_buf),
542 "%s/gnutls-params-%d", spool_directory, dh_bits))
543 return tls_error(US"overlong filename", NULL, NULL);
544 filename = filename_buf;
545 }
059ec3d9 546
b5aea5e1 547/* Open the cache file for reading and if successful, read it and set up the
575643cd 548parameters. */
059ec3d9
PH
549
550fd = Uopen(filename, O_RDONLY, 0);
b5aea5e1 551if (fd >= 0)
059ec3d9 552 {
b5aea5e1 553 struct stat statbuf;
17c76198
PP
554 FILE *fp;
555 int saved_errno;
556
557 if (fstat(fd, &statbuf) < 0) /* EIO */
558 {
559 saved_errno = errno;
560 (void)close(fd);
561 return tls_error(US"TLS cache stat failed", strerror(saved_errno), NULL);
562 }
563 if (!S_ISREG(statbuf.st_mode))
b5aea5e1
PH
564 {
565 (void)close(fd);
17c76198
PP
566 return tls_error(US"TLS cache not a file", NULL, NULL);
567 }
568 fp = fdopen(fd, "rb");
569 if (!fp)
570 {
571 saved_errno = errno;
572 (void)close(fd);
573 return tls_error(US"fdopen(TLS cache stat fd) failed",
574 strerror(saved_errno), NULL);
b5aea5e1 575 }
059ec3d9 576
b5aea5e1
PH
577 m.size = statbuf.st_size;
578 m.data = malloc(m.size);
579 if (m.data == NULL)
17c76198
PP
580 {
581 fclose(fp);
582 return tls_error(US"malloc failed", strerror(errno), NULL);
583 }
584 sz = fread(m.data, m.size, 1, fp);
585 if (!sz)
586 {
587 saved_errno = errno;
588 fclose(fp);
589 free(m.data);
590 return tls_error(US"fread failed", strerror(saved_errno), NULL);
591 }
592 fclose(fp);
b5aea5e1 593
17c76198 594 rc = gnutls_dh_params_import_pkcs3(dh_server_params, &m, GNUTLS_X509_FMT_PEM);
b5aea5e1 595 free(m.data);
17c76198
PP
596 exim_gnutls_err_check(US"gnutls_dh_params_import_pkcs3");
597 DEBUG(D_tls) debug_printf("read D-H parameters from file \"%s\"\n", filename);
b5aea5e1
PH
598 }
599
600/* If the file does not exist, fall through to compute new data and cache it.
601If there was any other opening error, it is serious. */
602
182ad5cf
PH
603else if (errno == ENOENT)
604 {
17c76198 605 rc = -1;
182ad5cf 606 DEBUG(D_tls)
17c76198 607 debug_printf("D-H parameter cache file \"%s\" does not exist\n", filename);
182ad5cf
PH
608 }
609else
17c76198
PP
610 return tls_error(string_open_failed(errno, "\"%s\" for reading", filename),
611 NULL, NULL);
b5aea5e1
PH
612
613/* If ret < 0, either the cache file does not exist, or the data it contains
614is not useful. One particular case of this is when upgrading from an older
615release of Exim in which the data was stored in a different format. We don't
616try to be clever and support both formats; we just regenerate new data in this
617case. */
618
17c76198 619if (rc < 0)
b5aea5e1 620 {
17c76198 621 uschar *temp_fn;
201f5254 622 unsigned int dh_bits_gen = dh_bits;
059ec3d9 623
17c76198
PP
624 if ((PATH_MAX - Ustrlen(filename)) < 10)
625 return tls_error(US"Filename too long to generate replacement",
626 CS filename, NULL);
059ec3d9 627
17c76198
PP
628 temp_fn = string_copy(US "%s.XXXXXXX");
629 fd = mkstemp(CS temp_fn); /* modifies temp_fn */
059ec3d9 630 if (fd < 0)
17c76198 631 return tls_error(US"Unable to open temp file", strerror(errno), NULL);
059ec3d9
PH
632 (void)fchown(fd, exim_uid, exim_gid); /* Probably not necessary */
633
201f5254
PP
634 /* GnuTLS overshoots!
635 * If we ask for 2236, we might get 2237 or more.
636 * But there's no way to ask GnuTLS how many bits there really are.
637 * We can ask how many bits were used in a TLS session, but that's it!
638 * The prime itself is hidden behind too much abstraction.
639 * So we ask for less, and proceed on a wing and a prayer.
640 * First attempt, subtracted 3 for 2233 and got 2240.
641 */
cae6e576 642 if (dh_bits >= EXIM_CLIENT_DH_MIN_BITS + 10)
201f5254
PP
643 {
644 dh_bits_gen = dh_bits - 10;
645 DEBUG(D_tls)
646 debug_printf("being paranoid about DH generation, make it '%d' bits'\n",
647 dh_bits_gen);
648 }
649
650 DEBUG(D_tls)
651 debug_printf("requesting generation of %d bit Diffie-Hellman prime ...\n",
652 dh_bits_gen);
653 rc = gnutls_dh_params_generate2(dh_server_params, dh_bits_gen);
17c76198
PP
654 exim_gnutls_err_check(US"gnutls_dh_params_generate2");
655
656 /* gnutls_dh_params_export_pkcs3() will tell us the exact size, every time,
657 and I confirmed that a NULL call to get the size first is how the GnuTLS
658 sample apps handle this. */
659
660 sz = 0;
661 m.data = NULL;
662 rc = gnutls_dh_params_export_pkcs3(dh_server_params, GNUTLS_X509_FMT_PEM,
663 m.data, &sz);
664 if (rc != GNUTLS_E_SHORT_MEMORY_BUFFER)
665 exim_gnutls_err_check(US"gnutls_dh_params_export_pkcs3(NULL) sizing");
666 m.size = sz;
b5aea5e1
PH
667 m.data = malloc(m.size);
668 if (m.data == NULL)
17c76198 669 return tls_error(US"memory allocation failed", strerror(errno), NULL);
1f00591e 670 /* this will return a size 1 less than the allocation size above */
17c76198 671 rc = gnutls_dh_params_export_pkcs3(dh_server_params, GNUTLS_X509_FMT_PEM,
1f00591e 672 m.data, &sz);
17c76198
PP
673 if (rc != GNUTLS_E_SUCCESS)
674 {
675 free(m.data);
676 exim_gnutls_err_check(US"gnutls_dh_params_export_pkcs3() real");
677 }
1f00591e 678 m.size = sz; /* shrink by 1, probably */
059ec3d9 679
17c76198
PP
680 sz = write_to_fd_buf(fd, m.data, (size_t) m.size);
681 if (sz != m.size)
682 {
683 free(m.data);
684 return tls_error(US"TLS cache write D-H params failed",
685 strerror(errno), NULL);
686 }
b5aea5e1 687 free(m.data);
17c76198
PP
688 sz = write_to_fd_buf(fd, US"\n", 1);
689 if (sz != 1)
690 return tls_error(US"TLS cache write D-H params final newline failed",
691 strerror(errno), NULL);
692
693 rc = close(fd);
694 if (rc)
695 return tls_error(US"TLS cache write close() failed",
696 strerror(errno), NULL);
059ec3d9 697
17c76198
PP
698 if (Urename(temp_fn, filename) < 0)
699 return tls_error(string_sprintf("failed to rename \"%s\" as \"%s\"",
700 temp_fn, filename), strerror(errno), NULL);
059ec3d9 701
17c76198 702 DEBUG(D_tls) debug_printf("wrote D-H parameters to file \"%s\"\n", filename);
059ec3d9
PH
703 }
704
17c76198 705DEBUG(D_tls) debug_printf("initialized server D-H parameters\n");
059ec3d9
PH
706return OK;
707}
708
709
710
711
23bb6982
JH
712/* Create and install a selfsigned certificate, for use in server mode */
713
714static int
715tls_install_selfsign(exim_gnutls_state_st * state)
716{
717gnutls_x509_crt_t cert = NULL;
718time_t now;
719gnutls_x509_privkey_t pkey = NULL;
720const uschar * where;
721int rc;
722
723where = US"initialising pkey";
724if ((rc = gnutls_x509_privkey_init(&pkey))) goto err;
725
726where = US"initialising cert";
727if ((rc = gnutls_x509_crt_init(&cert))) goto err;
728
729where = US"generating pkey";
730if ((rc = gnutls_x509_privkey_generate(pkey, GNUTLS_PK_RSA,
731 gnutls_sec_param_to_pk_bits(GNUTLS_PK_RSA, GNUTLS_SEC_PARAM_LOW),
732 0))) /* _to_pk_bits() Since: 2.12.0 */
733 goto err;
734
735where = US"configuring cert";
736now = 0;
737if ( (rc = gnutls_x509_crt_set_version(cert, 3))
738 || (rc = gnutls_x509_crt_set_serial(cert, &now, sizeof(now)))
739 || (rc = gnutls_x509_crt_set_activation_time(cert, now = time(NULL)))
740 || (rc = gnutls_x509_crt_set_expiration_time(cert, now + 60 * 60)) /* 1 hr */
741 || (rc = gnutls_x509_crt_set_key(cert, pkey))
742
743 || (rc = gnutls_x509_crt_set_dn_by_oid(cert,
744 GNUTLS_OID_X520_COUNTRY_NAME, 0, "UK", 2))
745 || (rc = gnutls_x509_crt_set_dn_by_oid(cert,
746 GNUTLS_OID_X520_ORGANIZATION_NAME, 0, "Exim Developers", 15))
747 || (rc = gnutls_x509_crt_set_dn_by_oid(cert,
748 GNUTLS_OID_X520_COMMON_NAME, 0,
749 smtp_active_hostname, Ustrlen(smtp_active_hostname)))
750 )
751 goto err;
752
753where = US"signing cert";
754if ((rc = gnutls_x509_crt_sign(cert, cert, pkey))) goto err;
755
756where = US"installing selfsign cert";
757 /* Since: 2.4.0 */
758if ((rc = gnutls_certificate_set_x509_key(state->x509_cred, &cert, 1, pkey)))
759 goto err;
760
761rc = OK;
762
763out:
764 if (cert) gnutls_x509_crt_deinit(cert);
765 if (pkey) gnutls_x509_privkey_deinit(pkey);
766 return rc;
767
768err:
769 rc = tls_error(where, gnutls_strerror(rc), NULL);
770 goto out;
771}
772
773
774
775
059ec3d9 776/*************************************************
17c76198 777* Variables re-expanded post-SNI *
059ec3d9
PH
778*************************************************/
779
17c76198
PP
780/* Called from both server and client code, via tls_init(), and also from
781the SNI callback after receiving an SNI, if tls_certificate includes "tls_sni".
782
783We can tell the two apart by state->received_sni being non-NULL in callback.
784
785The callback should not call us unless state->trigger_sni_changes is true,
786which we are responsible for setting on the first pass through.
059ec3d9
PH
787
788Arguments:
17c76198 789 state exim_gnutls_state_st *
059ec3d9
PH
790
791Returns: OK/DEFER/FAIL
792*/
793
794static int
17c76198 795tls_expand_session_files(exim_gnutls_state_st *state)
059ec3d9 796{
1365611d 797struct stat statbuf;
059ec3d9 798int rc;
17c76198
PP
799const host_item *host = state->host; /* macro should be reconsidered? */
800uschar *saved_tls_certificate = NULL;
801uschar *saved_tls_privatekey = NULL;
802uschar *saved_tls_verify_certificates = NULL;
803uschar *saved_tls_crl = NULL;
804int cert_count;
805
806/* We check for tls_sni *before* expansion. */
2b4a568d 807if (!host) /* server */
17c76198
PP
808 if (!state->received_sni)
809 {
d9b2312b
JH
810 if (state->tls_certificate &&
811 (Ustrstr(state->tls_certificate, US"tls_sni") ||
812 Ustrstr(state->tls_certificate, US"tls_in_sni") ||
813 Ustrstr(state->tls_certificate, US"tls_out_sni")
814 ))
17c76198
PP
815 {
816 DEBUG(D_tls) debug_printf("We will re-expand TLS session files if we receive SNI.\n");
817 state->trigger_sni_changes = TRUE;
818 }
819 }
820 else
821 {
1365611d 822 /* useful for debugging */
17c76198
PP
823 saved_tls_certificate = state->exp_tls_certificate;
824 saved_tls_privatekey = state->exp_tls_privatekey;
825 saved_tls_verify_certificates = state->exp_tls_verify_certificates;
826 saved_tls_crl = state->exp_tls_crl;
827 }
059ec3d9 828
1365611d
PP
829rc = gnutls_certificate_allocate_credentials(&state->x509_cred);
830exim_gnutls_err_check(US"gnutls_certificate_allocate_credentials");
831
17c76198
PP
832/* remember: expand_check_tlsvar() is expand_check() but fiddling with
833state members, assuming consistent naming; and expand_check() returns
834false if expansion failed, unless expansion was forced to fail. */
059ec3d9 835
17c76198
PP
836/* check if we at least have a certificate, before doing expensive
837D-H generation. */
059ec3d9 838
17c76198
PP
839if (!expand_check_tlsvar(tls_certificate))
840 return DEFER;
059ec3d9 841
17c76198 842/* certificate is mandatory in server, optional in client */
059ec3d9 843
23bb6982
JH
844if ( !state->exp_tls_certificate
845 || !*state->exp_tls_certificate
846 )
2b4a568d 847 if (!host)
23bb6982 848 return tls_install_selfsign(state);
17c76198
PP
849 else
850 DEBUG(D_tls) debug_printf("TLS: no client certificate specified; okay\n");
059ec3d9 851
17c76198 852if (state->tls_privatekey && !expand_check_tlsvar(tls_privatekey))
059ec3d9
PH
853 return DEFER;
854
17c76198
PP
855/* tls_privatekey is optional, defaulting to same file as certificate */
856
857if (state->tls_privatekey == NULL || *state->tls_privatekey == '\0')
059ec3d9 858 {
17c76198
PP
859 state->tls_privatekey = state->tls_certificate;
860 state->exp_tls_privatekey = state->exp_tls_certificate;
059ec3d9 861 }
c91535f3 862
059ec3d9 863
17c76198 864if (state->exp_tls_certificate && *state->exp_tls_certificate)
059ec3d9
PH
865 {
866 DEBUG(D_tls) debug_printf("certificate file = %s\nkey file = %s\n",
17c76198
PP
867 state->exp_tls_certificate, state->exp_tls_privatekey);
868
869 if (state->received_sni)
23bb6982
JH
870 if ( Ustrcmp(state->exp_tls_certificate, saved_tls_certificate) == 0
871 && Ustrcmp(state->exp_tls_privatekey, saved_tls_privatekey) == 0
872 )
17c76198 873 {
b34fc30c 874 DEBUG(D_tls) debug_printf("TLS SNI: cert and key unchanged\n");
17c76198
PP
875 }
876 else
877 {
b34fc30c 878 DEBUG(D_tls) debug_printf("TLS SNI: have a changed cert/key pair.\n");
17c76198 879 }
059ec3d9 880
1365611d
PP
881 rc = gnutls_certificate_set_x509_key_file(state->x509_cred,
882 CS state->exp_tls_certificate, CS state->exp_tls_privatekey,
883 GNUTLS_X509_FMT_PEM);
884 exim_gnutls_err_check(
885 string_sprintf("cert/key setup: cert=%s key=%s",
886 state->exp_tls_certificate, state->exp_tls_privatekey));
887 DEBUG(D_tls) debug_printf("TLS: cert/key registered\n");
b34fc30c 888 } /* tls_certificate */
059ec3d9 889
2b4a568d
JH
890
891/* Set the OCSP stapling server info */
892
f2de3a33 893#ifndef DISABLE_OCSP
2b4a568d
JH
894if ( !host /* server */
895 && tls_ocsp_file
896 )
897 {
9196d5bf
JH
898 if (gnutls_buggy_ocsp)
899 {
900 DEBUG(D_tls) debug_printf("GnuTLS library is buggy for OCSP; avoiding\n");
901 }
902 else
903 {
904 if (!expand_check(tls_ocsp_file, US"tls_ocsp_file",
905 &state->exp_tls_ocsp_file))
906 return DEFER;
2b4a568d 907
9196d5bf
JH
908 /* Use the full callback method for stapling just to get observability.
909 More efficient would be to read the file once only, if it never changed
910 (due to SNI). Would need restart on file update, or watch datestamp. */
44662487 911
9196d5bf
JH
912 gnutls_certificate_set_ocsp_status_request_function(state->x509_cred,
913 server_ocsp_stapling_cb, state->exp_tls_ocsp_file);
2b4a568d 914
9196d5bf
JH
915 DEBUG(D_tls) debug_printf("OCSP response file = %s\n", state->exp_tls_ocsp_file);
916 }
2b4a568d
JH
917 }
918#endif
919
920
059ec3d9
PH
921/* Set the trusted CAs file if one is provided, and then add the CRL if one is
922provided. Experiment shows that, if the certificate file is empty, an unhelpful
923error message is provided. However, if we just refrain from setting anything up
924in that case, certificate verification fails, which seems to be the correct
925behaviour. */
926
610ff438 927if (state->tls_verify_certificates && *state->tls_verify_certificates)
059ec3d9 928 {
17c76198 929 if (!expand_check_tlsvar(tls_verify_certificates))
059ec3d9 930 return DEFER;
610ff438
JH
931#ifndef SUPPORT_SYSDEFAULT_CABUNDLE
932 if (Ustrcmp(state->exp_tls_verify_certificates, "system") == 0)
933 state->exp_tls_verify_certificates = NULL;
934#endif
17c76198
PP
935 if (state->tls_crl && *state->tls_crl)
936 if (!expand_check_tlsvar(tls_crl))
937 return DEFER;
059ec3d9 938
1365611d
PP
939 if (!(state->exp_tls_verify_certificates &&
940 *state->exp_tls_verify_certificates))
b34fc30c
PP
941 {
942 DEBUG(D_tls)
1365611d
PP
943 debug_printf("TLS: tls_verify_certificates expanded empty, ignoring\n");
944 /* With no tls_verify_certificates, we ignore tls_crl too */
17c76198 945 return OK;
b34fc30c 946 }
1365611d 947 }
83e2f8a2
PP
948else
949 {
950 DEBUG(D_tls)
951 debug_printf("TLS: tls_verify_certificates not set or empty, ignoring\n");
952 return OK;
953 }
17c76198 954
cb1d7830
JH
955#ifdef SUPPORT_SYSDEFAULT_CABUNDLE
956if (Ustrcmp(state->exp_tls_verify_certificates, "system") == 0)
957 cert_count = gnutls_certificate_set_x509_system_trust(state->x509_cred);
958else
959#endif
1365611d 960 {
cb1d7830
JH
961 if (Ustat(state->exp_tls_verify_certificates, &statbuf) < 0)
962 {
963 log_write(0, LOG_MAIN|LOG_PANIC, "could not stat %s "
964 "(tls_verify_certificates): %s", state->exp_tls_verify_certificates,
965 strerror(errno));
966 return DEFER;
967 }
17c76198 968
a7fec7a7 969#ifndef SUPPORT_CA_DIR
cb1d7830
JH
970 /* The test suite passes in /dev/null; we could check for that path explicitly,
971 but who knows if someone has some weird FIFO which always dumps some certs, or
972 other weirdness. The thing we really want to check is that it's not a
973 directory, since while OpenSSL supports that, GnuTLS does not.
60f914bc 974 So s/!S_ISREG/S_ISDIR/ and change some messaging ... */
cb1d7830
JH
975 if (S_ISDIR(statbuf.st_mode))
976 {
977 DEBUG(D_tls)
978 debug_printf("verify certificates path is a dir: \"%s\"\n",
979 state->exp_tls_verify_certificates);
980 log_write(0, LOG_MAIN|LOG_PANIC,
981 "tls_verify_certificates \"%s\" is a directory",
982 state->exp_tls_verify_certificates);
983 return DEFER;
984 }
a7fec7a7 985#endif
059ec3d9 986
cb1d7830
JH
987 DEBUG(D_tls) debug_printf("verify certificates = %s size=" OFF_T_FMT "\n",
988 state->exp_tls_verify_certificates, statbuf.st_size);
059ec3d9 989
cb1d7830
JH
990 if (statbuf.st_size == 0)
991 {
992 DEBUG(D_tls)
993 debug_printf("cert file empty, no certs, no verification, ignoring any CRL\n");
994 return OK;
995 }
059ec3d9 996
cb1d7830 997 cert_count =
a7fec7a7
JH
998
999#ifdef SUPPORT_CA_DIR
cb1d7830
JH
1000 (statbuf.st_mode & S_IFMT) == S_IFDIR
1001 ?
1002 gnutls_certificate_set_x509_trust_dir(state->x509_cred,
1003 CS state->exp_tls_verify_certificates, GNUTLS_X509_FMT_PEM)
1004 :
a7fec7a7 1005#endif
cb1d7830
JH
1006 gnutls_certificate_set_x509_trust_file(state->x509_cred,
1007 CS state->exp_tls_verify_certificates, GNUTLS_X509_FMT_PEM);
1008 }
a7fec7a7 1009
1365611d
PP
1010if (cert_count < 0)
1011 {
1012 rc = cert_count;
cb1d7830 1013 exim_gnutls_err_check(US"setting certificate trust");
1365611d
PP
1014 }
1015DEBUG(D_tls) debug_printf("Added %d certificate authorities.\n", cert_count);
059ec3d9 1016
5c8cda3a
PP
1017if (state->tls_crl && *state->tls_crl &&
1018 state->exp_tls_crl && *state->exp_tls_crl)
1365611d 1019 {
5c8cda3a
PP
1020 DEBUG(D_tls) debug_printf("loading CRL file = %s\n", state->exp_tls_crl);
1021 cert_count = gnutls_certificate_set_x509_crl_file(state->x509_cred,
1022 CS state->exp_tls_crl, GNUTLS_X509_FMT_PEM);
1023 if (cert_count < 0)
1365611d 1024 {
5c8cda3a 1025 rc = cert_count;
1365611d
PP
1026 exim_gnutls_err_check(US"gnutls_certificate_set_x509_crl_file");
1027 }
5c8cda3a 1028 DEBUG(D_tls) debug_printf("Processed %d CRLs.\n", cert_count);
1365611d 1029 }
059ec3d9 1030
059ec3d9
PH
1031return OK;
1032}
1033
1034
1035
1036
1365611d
PP
1037/*************************************************
1038* Set X.509 state variables *
1039*************************************************/
1040
1041/* In GnuTLS, the registered cert/key are not replaced by a later
1042set of a cert/key, so for SNI support we need a whole new x509_cred
1043structure. Which means various other non-re-expanded pieces of state
1044need to be re-set in the new struct, so the setting logic is pulled
1045out to this.
1046
1047Arguments:
1048 state exim_gnutls_state_st *
1049
1050Returns: OK/DEFER/FAIL
1051*/
1052
1053static int
1054tls_set_remaining_x509(exim_gnutls_state_st *state)
1055{
1056int rc;
1057const host_item *host = state->host; /* macro should be reconsidered? */
1058
1059/* Create D-H parameters, or read them from the cache file. This function does
1060its own SMTP error messaging. This only happens for the server, TLS D-H ignores
1061client-side params. */
1062
1063if (!state->host)
1064 {
1065 if (!dh_server_params)
1066 {
1067 rc = init_server_dh();
1068 if (rc != OK) return rc;
1069 }
1070 gnutls_certificate_set_dh_params(state->x509_cred, dh_server_params);
1071 }
1072
1073/* Link the credentials to the session. */
1074
1075rc = gnutls_credentials_set(state->session, GNUTLS_CRD_CERTIFICATE, state->x509_cred);
1076exim_gnutls_err_check(US"gnutls_credentials_set");
1077
1078return OK;
1079}
1080
059ec3d9 1081/*************************************************
17c76198 1082* Initialize for GnuTLS *
059ec3d9
PH
1083*************************************************/
1084
9196d5bf 1085
4fb7df6d
JH
1086#ifndef DISABLE_OCSP
1087
9196d5bf
JH
1088static BOOL
1089tls_is_buggy_ocsp(void)
1090{
1091const uschar * s;
1092uschar maj, mid, mic;
1093
1094s = CUS gnutls_check_version(NULL);
1095maj = atoi(CCS s);
1096if (maj == 3)
1097 {
1098 while (*s && *s != '.') s++;
1099 mid = atoi(CCS ++s);
1100 if (mid <= 2)
1101 return TRUE;
1102 else if (mid >= 5)
1103 return FALSE;
1104 else
1105 {
1106 while (*s && *s != '.') s++;
1107 mic = atoi(CCS ++s);
1108 return mic <= (mid == 3 ? 16 : 3);
1109 }
1110 }
1111return FALSE;
1112}
1113
4fb7df6d 1114#endif
9196d5bf
JH
1115
1116
17c76198
PP
1117/* Called from both server and client code. In the case of a server, errors
1118before actual TLS negotiation return DEFER.
059ec3d9
PH
1119
1120Arguments:
17c76198
PP
1121 host connected host, if client; NULL if server
1122 certificate certificate file
1123 privatekey private key file
1124 sni TLS SNI to send, sometimes when client; else NULL
1125 cas CA certs file
1126 crl CRL file
1127 require_ciphers tls_require_ciphers setting
817d9f57 1128 caller_state returned state-info structure
059ec3d9 1129
17c76198 1130Returns: OK/DEFER/FAIL
059ec3d9
PH
1131*/
1132
17c76198
PP
1133static int
1134tls_init(
1135 const host_item *host,
1136 const uschar *certificate,
1137 const uschar *privatekey,
1138 const uschar *sni,
1139 const uschar *cas,
1140 const uschar *crl,
1141 const uschar *require_ciphers,
1142 exim_gnutls_state_st **caller_state)
059ec3d9 1143{
17c76198
PP
1144exim_gnutls_state_st *state;
1145int rc;
1146size_t sz;
1147const char *errpos;
1148uschar *p;
1149BOOL want_default_priorities;
1150
1151if (!exim_gnutls_base_init_done)
059ec3d9 1152 {
17c76198
PP
1153 DEBUG(D_tls) debug_printf("GnuTLS global init required.\n");
1154
a5f239e4
PP
1155#ifdef HAVE_GNUTLS_PKCS11
1156 /* By default, gnutls_global_init will init PKCS11 support in auto mode,
1157 which loads modules from a config file, which sounds good and may be wanted
1158 by some sysadmin, but also means in common configurations that GNOME keyring
1159 environment variables are used and so breaks for users calling mailq.
1160 To prevent this, we init PKCS11 first, which is the documented approach. */
2519e60d 1161 if (!gnutls_allow_auto_pkcs11)
a5f239e4
PP
1162 {
1163 rc = gnutls_pkcs11_init(GNUTLS_PKCS11_FLAG_MANUAL, NULL);
1164 exim_gnutls_err_check(US"gnutls_pkcs11_init");
1165 }
1166#endif
1167
17c76198
PP
1168 rc = gnutls_global_init();
1169 exim_gnutls_err_check(US"gnutls_global_init");
1170
1171#if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
1172 DEBUG(D_tls)
059ec3d9 1173 {
17c76198
PP
1174 gnutls_global_set_log_function(exim_gnutls_logger_cb);
1175 /* arbitrarily chosen level; bump upto 9 for more */
1176 gnutls_global_set_log_level(EXIM_GNUTLS_LIBRARY_LOG_LEVEL);
059ec3d9 1177 }
17c76198
PP
1178#endif
1179
4fb7df6d
JH
1180#ifndef DISABLE_OCSP
1181 if (tls_ocsp_file && (gnutls_buggy_ocsp = tls_is_buggy_ocsp()))
9196d5bf 1182 log_write(0, LOG_MAIN, "OCSP unusable with this GnuTLS library version");
4fb7df6d 1183#endif
9196d5bf 1184
17c76198 1185 exim_gnutls_base_init_done = TRUE;
059ec3d9 1186 }
059ec3d9 1187
17c76198
PP
1188if (host)
1189 {
1190 state = &state_client;
1191 memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
817d9f57 1192 state->tlsp = &tls_out;
17c76198
PP
1193 DEBUG(D_tls) debug_printf("initialising GnuTLS client session\n");
1194 rc = gnutls_init(&state->session, GNUTLS_CLIENT);
1195 }
1196else
1197 {
1198 state = &state_server;
1199 memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
817d9f57 1200 state->tlsp = &tls_in;
17c76198
PP
1201 DEBUG(D_tls) debug_printf("initialising GnuTLS server session\n");
1202 rc = gnutls_init(&state->session, GNUTLS_SERVER);
1203 }
1204exim_gnutls_err_check(US"gnutls_init");
059ec3d9 1205
17c76198 1206state->host = host;
059ec3d9 1207
17c76198
PP
1208state->tls_certificate = certificate;
1209state->tls_privatekey = privatekey;
5779e6aa 1210state->tls_require_ciphers = require_ciphers;
17c76198
PP
1211state->tls_sni = sni;
1212state->tls_verify_certificates = cas;
1213state->tls_crl = crl;
059ec3d9 1214
17c76198
PP
1215/* This handles the variables that might get re-expanded after TLS SNI;
1216that's tls_certificate, tls_privatekey, tls_verify_certificates, tls_crl */
059ec3d9 1217
17c76198
PP
1218DEBUG(D_tls)
1219 debug_printf("Expanding various TLS configuration options for session credentials.\n");
1220rc = tls_expand_session_files(state);
1221if (rc != OK) return rc;
059ec3d9 1222
1365611d
PP
1223/* These are all other parts of the x509_cred handling, since SNI in GnuTLS
1224requires a new structure afterwards. */
83da1223 1225
1365611d
PP
1226rc = tls_set_remaining_x509(state);
1227if (rc != OK) return rc;
83da1223 1228
17c76198
PP
1229/* set SNI in client, only */
1230if (host)
1231 {
0df4ab80 1232 if (!expand_check(sni, US"tls_out_sni", &state->tlsp->sni))
17c76198 1233 return DEFER;
0df4ab80 1234 if (state->tlsp->sni && *state->tlsp->sni)
17c76198
PP
1235 {
1236 DEBUG(D_tls)
0df4ab80
JH
1237 debug_printf("Setting TLS client SNI to \"%s\"\n", state->tlsp->sni);
1238 sz = Ustrlen(state->tlsp->sni);
17c76198 1239 rc = gnutls_server_name_set(state->session,
0df4ab80 1240 GNUTLS_NAME_DNS, state->tlsp->sni, sz);
17c76198
PP
1241 exim_gnutls_err_check(US"gnutls_server_name_set");
1242 }
1243 }
1244else if (state->tls_sni)
1245 DEBUG(D_tls) debug_printf("*** PROBABLY A BUG *** " \
1246 "have an SNI set for a client [%s]\n", state->tls_sni);
83da1223 1247
17c76198 1248/* This is the priority string support,
42bfef1e 1249http://www.gnutls.org/manual/html_node/Priority-Strings.html
17c76198
PP
1250and replaces gnutls_require_kx, gnutls_require_mac & gnutls_require_protocols.
1251This was backwards incompatible, but means Exim no longer needs to track
1252all algorithms and provide string forms for them. */
83da1223 1253
17c76198 1254want_default_priorities = TRUE;
83da1223 1255
17c76198 1256if (state->tls_require_ciphers && *state->tls_require_ciphers)
83da1223 1257 {
17c76198
PP
1258 if (!expand_check_tlsvar(tls_require_ciphers))
1259 return DEFER;
1260 if (state->exp_tls_require_ciphers && *state->exp_tls_require_ciphers)
83da1223 1261 {
17c76198
PP
1262 DEBUG(D_tls) debug_printf("GnuTLS session cipher/priority \"%s\"\n",
1263 state->exp_tls_require_ciphers);
1264
1265 rc = gnutls_priority_init(&state->priority_cache,
1266 CS state->exp_tls_require_ciphers, &errpos);
1267 want_default_priorities = FALSE;
1268 p = state->exp_tls_require_ciphers;
83da1223
PH
1269 }
1270 }
17c76198
PP
1271if (want_default_priorities)
1272 {
83e2f8a2
PP
1273 DEBUG(D_tls)
1274 debug_printf("GnuTLS using default session cipher/priority \"%s\"\n",
1275 exim_default_gnutls_priority);
17c76198
PP
1276 rc = gnutls_priority_init(&state->priority_cache,
1277 exim_default_gnutls_priority, &errpos);
1278 p = US exim_default_gnutls_priority;
1279 }
83da1223 1280
17c76198
PP
1281exim_gnutls_err_check(string_sprintf(
1282 "gnutls_priority_init(%s) failed at offset %ld, \"%.6s..\"",
1283 p, errpos - CS p, errpos));
1284
1285rc = gnutls_priority_set(state->session, state->priority_cache);
1286exim_gnutls_err_check(US"gnutls_priority_set");
1287
1288gnutls_db_set_cache_expiration(state->session, ssl_session_timeout);
1289
1290/* Reduce security in favour of increased compatibility, if the admin
1291decides to make that trade-off. */
1292if (gnutls_compat_mode)
83da1223 1293 {
17c76198
PP
1294#if LIBGNUTLS_VERSION_NUMBER >= 0x020104
1295 DEBUG(D_tls) debug_printf("lowering GnuTLS security, compatibility mode\n");
1296 gnutls_session_enable_compatibility_mode(state->session);
1297#else
1298 DEBUG(D_tls) debug_printf("Unable to set gnutls_compat_mode - GnuTLS version too old\n");
1299#endif
83da1223
PH
1300 }
1301
17c76198 1302*caller_state = state;
17c76198 1303return OK;
83da1223
PH
1304}
1305
1306
1307
059ec3d9 1308/*************************************************
17c76198 1309* Extract peer information *
059ec3d9
PH
1310*************************************************/
1311
17c76198 1312/* Called from both server and client code.
4fe99a6c
PP
1313Only this is allowed to set state->peerdn and state->have_set_peerdn
1314and we use that to detect double-calls.
059ec3d9 1315
75fe387d
PP
1316NOTE: the state blocks last while the TLS connection is up, which is fine
1317for logging in the server side, but for the client side, we log after teardown
1318in src/deliver.c. While the session is up, we can twist about states and
1319repoint tls_* globals, but those variables used for logging or other variable
1320expansion that happens _after_ delivery need to have a longer life-time.
1321
1322So for those, we get the data from POOL_PERM; the re-invoke guard keeps us from
1323doing this more than once per generation of a state context. We set them in
1324the state context, and repoint tls_* to them. After the state goes away, the
1325tls_* copies of the pointers remain valid and client delivery logging is happy.
1326
1327tls_certificate_verified is a BOOL, so the tls_peerdn and tls_cipher issues
1328don't apply.
1329
059ec3d9 1330Arguments:
17c76198 1331 state exim_gnutls_state_st *
059ec3d9 1332
17c76198 1333Returns: OK/DEFER/FAIL
059ec3d9
PH
1334*/
1335
17c76198
PP
1336static int
1337peer_status(exim_gnutls_state_st *state)
059ec3d9 1338{
75fe387d 1339uschar cipherbuf[256];
27f19eb4 1340const gnutls_datum_t *cert_list;
75fe387d 1341int old_pool, rc;
17c76198 1342unsigned int cert_list_size = 0;
4fe99a6c
PP
1343gnutls_protocol_t protocol;
1344gnutls_cipher_algorithm_t cipher;
1345gnutls_kx_algorithm_t kx;
1346gnutls_mac_algorithm_t mac;
17c76198
PP
1347gnutls_certificate_type_t ct;
1348gnutls_x509_crt_t crt;
4fe99a6c 1349uschar *p, *dn_buf;
17c76198 1350size_t sz;
059ec3d9 1351
4fe99a6c 1352if (state->have_set_peerdn)
17c76198 1353 return OK;
4fe99a6c 1354state->have_set_peerdn = TRUE;
059ec3d9 1355
4fe99a6c 1356state->peerdn = NULL;
059ec3d9 1357
4fe99a6c
PP
1358/* tls_cipher */
1359cipher = gnutls_cipher_get(state->session);
1360protocol = gnutls_protocol_get_version(state->session);
1361mac = gnutls_mac_get(state->session);
1362kx = gnutls_kx_get(state->session);
1363
75fe387d 1364string_format(cipherbuf, sizeof(cipherbuf),
4fe99a6c
PP
1365 "%s:%s:%d",
1366 gnutls_protocol_get_name(protocol),
1367 gnutls_cipher_suite_get_name(kx, cipher, mac),
1368 (int) gnutls_cipher_get_key_size(cipher) * 8);
1369
1370/* I don't see a way that spaces could occur, in the current GnuTLS
1371code base, but it was a concern in the old code and perhaps older GnuTLS
1372releases did return "TLS 1.0"; play it safe, just in case. */
75fe387d 1373for (p = cipherbuf; *p != '\0'; ++p)
4fe99a6c
PP
1374 if (isspace(*p))
1375 *p = '-';
75fe387d
PP
1376old_pool = store_pool;
1377store_pool = POOL_PERM;
1378state->ciphersuite = string_copy(cipherbuf);
1379store_pool = old_pool;
817d9f57 1380state->tlsp->cipher = state->ciphersuite;
4fe99a6c
PP
1381
1382/* tls_peerdn */
17c76198 1383cert_list = gnutls_certificate_get_peers(state->session, &cert_list_size);
83da1223 1384
17c76198
PP
1385if (cert_list == NULL || cert_list_size == 0)
1386 {
17c76198
PP
1387 DEBUG(D_tls) debug_printf("TLS: no certificate from peer (%p & %d)\n",
1388 cert_list, cert_list_size);
e51c7be2 1389 if (state->verify_requirement >= VERIFY_REQUIRED)
17c76198
PP
1390 return tls_error(US"certificate verification failed",
1391 "no certificate received from peer", state->host);
1392 return OK;
1393 }
059ec3d9 1394
17c76198
PP
1395ct = gnutls_certificate_type_get(state->session);
1396if (ct != GNUTLS_CRT_X509)
059ec3d9 1397 {
17c76198 1398 const char *ctn = gnutls_certificate_type_get_name(ct);
17c76198
PP
1399 DEBUG(D_tls)
1400 debug_printf("TLS: peer cert not X.509 but instead \"%s\"\n", ctn);
e51c7be2 1401 if (state->verify_requirement >= VERIFY_REQUIRED)
17c76198
PP
1402 return tls_error(US"certificate verification not possible, unhandled type",
1403 ctn, state->host);
1404 return OK;
83da1223 1405 }
059ec3d9 1406
e51c7be2
JH
1407#define exim_gnutls_peer_err(Label) \
1408 do { \
1409 if (rc != GNUTLS_E_SUCCESS) \
1410 { \
1411 DEBUG(D_tls) debug_printf("TLS: peer cert problem: %s: %s\n", \
1412 (Label), gnutls_strerror(rc)); \
1413 if (state->verify_requirement >= VERIFY_REQUIRED) \
1414 return tls_error((Label), gnutls_strerror(rc), state->host); \
1415 return OK; \
1416 } \
1417 } while (0)
17c76198 1418
9d1c15ef
JH
1419rc = import_cert(&cert_list[0], &crt);
1420exim_gnutls_peer_err(US"cert 0");
1421
1422state->tlsp->peercert = state->peercert = crt;
17c76198 1423
17c76198
PP
1424sz = 0;
1425rc = gnutls_x509_crt_get_dn(crt, NULL, &sz);
1426if (rc != GNUTLS_E_SHORT_MEMORY_BUFFER)
83da1223 1427 {
17c76198
PP
1428 exim_gnutls_peer_err(US"getting size for cert DN failed");
1429 return FAIL; /* should not happen */
059ec3d9 1430 }
17c76198
PP
1431dn_buf = store_get_perm(sz);
1432rc = gnutls_x509_crt_get_dn(crt, CS dn_buf, &sz);
1433exim_gnutls_peer_err(US"failed to extract certificate DN [gnutls_x509_crt_get_dn(cert 0)]");
9d1c15ef 1434
17c76198
PP
1435state->peerdn = dn_buf;
1436
1437return OK;
1438#undef exim_gnutls_peer_err
1439}
059ec3d9 1440
059ec3d9 1441
059ec3d9 1442
059ec3d9 1443
17c76198
PP
1444/*************************************************
1445* Verify peer certificate *
1446*************************************************/
059ec3d9 1447
17c76198
PP
1448/* Called from both server and client code.
1449*Should* be using a callback registered with
1450gnutls_certificate_set_verify_function() to fail the handshake if we dislike
1451the peer information, but that's too new for some OSes.
059ec3d9 1452
17c76198
PP
1453Arguments:
1454 state exim_gnutls_state_st *
1455 error where to put an error message
059ec3d9 1456
17c76198
PP
1457Returns:
1458 FALSE if the session should be rejected
1459 TRUE if the cert is okay or we just don't care
1460*/
059ec3d9 1461
17c76198
PP
1462static BOOL
1463verify_certificate(exim_gnutls_state_st *state, const char **error)
1464{
1465int rc;
1466unsigned int verify;
1467
1468*error = NULL;
1469
0a92f87f 1470if ((rc = peer_status(state)) != OK)
e6060e2c 1471 {
17c76198 1472 verify = GNUTLS_CERT_INVALID;
0a92f87f 1473 *error = "certificate not supplied";
17c76198
PP
1474 }
1475else
17c76198 1476 rc = gnutls_certificate_verify_peers2(state->session, &verify);
e6060e2c 1477
17c76198
PP
1478/* Handle the result of verification. INVALID seems to be set as well
1479as REVOKED, but leave the test for both. */
059ec3d9 1480
e51c7be2
JH
1481if (rc < 0 ||
1482 verify & (GNUTLS_CERT_INVALID|GNUTLS_CERT_REVOKED)
1483 )
17c76198
PP
1484 {
1485 state->peer_cert_verified = FALSE;
0a92f87f
JH
1486 if (!*error)
1487 *error = verify & GNUTLS_CERT_REVOKED
1488 ? "certificate revoked" : "certificate invalid";
059ec3d9 1489
17c76198 1490 DEBUG(D_tls)
e51c7be2 1491 debug_printf("TLS certificate verification failed (%s): peerdn=\"%s\"\n",
4fe99a6c 1492 *error, state->peerdn ? state->peerdn : US"<unset>");
059ec3d9 1493
e51c7be2 1494 if (state->verify_requirement >= VERIFY_REQUIRED)
17c76198 1495 {
e51c7be2
JH
1496 gnutls_alert_send(state->session,
1497 GNUTLS_AL_FATAL, GNUTLS_A_BAD_CERTIFICATE);
17c76198
PP
1498 return FALSE;
1499 }
1500 DEBUG(D_tls)
4789da3a 1501 debug_printf("TLS verify failure overridden (host in tls_try_verify_hosts)\n");
17c76198 1502 }
e51c7be2 1503
17c76198
PP
1504else
1505 {
aa2a70ba 1506 if (state->exp_tls_verify_cert_hostnames)
e51c7be2
JH
1507 {
1508 int sep = 0;
55414b25 1509 const uschar * list = state->exp_tls_verify_cert_hostnames;
e51c7be2
JH
1510 uschar * name;
1511 while (name = string_nextinlist(&list, &sep, NULL, 0))
1512 if (gnutls_x509_crt_check_hostname(state->tlsp->peercert, CS name))
1513 break;
1514 if (!name)
1515 {
1516 DEBUG(D_tls)
1517 debug_printf("TLS certificate verification failed: cert name mismatch\n");
aa2a70ba
JH
1518 if (state->verify_requirement >= VERIFY_REQUIRED)
1519 {
1520 gnutls_alert_send(state->session,
1521 GNUTLS_AL_FATAL, GNUTLS_A_BAD_CERTIFICATE);
1522 return FALSE;
1523 }
1524 return TRUE;
e51c7be2
JH
1525 }
1526 }
17c76198 1527 state->peer_cert_verified = TRUE;
e51c7be2 1528 DEBUG(D_tls) debug_printf("TLS certificate verified: peerdn=\"%s\"\n",
4fe99a6c 1529 state->peerdn ? state->peerdn : US"<unset>");
17c76198 1530 }
059ec3d9 1531
817d9f57 1532state->tlsp->peerdn = state->peerdn;
059ec3d9 1533
17c76198
PP
1534return TRUE;
1535}
059ec3d9 1536
17c76198
PP
1537
1538
1539
1540/* ------------------------------------------------------------------------ */
1541/* Callbacks */
1542
1543/* Logging function which can be registered with
1544 * gnutls_global_set_log_function()
1545 * gnutls_global_set_log_level() 0..9
1546 */
af3498d6 1547#if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
059ec3d9 1548static void
17c76198 1549exim_gnutls_logger_cb(int level, const char *message)
059ec3d9 1550{
8c79eebf
PP
1551 size_t len = strlen(message);
1552 if (len < 1)
1553 {
1554 DEBUG(D_tls) debug_printf("GnuTLS<%d> empty debug message\n", level);
1555 return;
1556 }
1557 DEBUG(D_tls) debug_printf("GnuTLS<%d>: %s%s", level, message,
1558 message[len-1] == '\n' ? "" : "\n");
17c76198 1559}
af3498d6 1560#endif
059ec3d9 1561
059ec3d9 1562
17c76198
PP
1563/* Called after client hello, should handle SNI work.
1564This will always set tls_sni (state->received_sni) if available,
1565and may trigger presenting different certificates,
1566if state->trigger_sni_changes is TRUE.
059ec3d9 1567
17c76198
PP
1568Should be registered with
1569 gnutls_handshake_set_post_client_hello_function()
059ec3d9 1570
17c76198
PP
1571"This callback must return 0 on success or a gnutls error code to terminate the
1572handshake.".
059ec3d9 1573
17c76198
PP
1574For inability to get SNI information, we return 0.
1575We only return non-zero if re-setup failed.
817d9f57 1576Only used for server-side TLS.
17c76198 1577*/
44bbabb5 1578
17c76198
PP
1579static int
1580exim_sni_handling_cb(gnutls_session_t session)
1581{
1582char sni_name[MAX_HOST_LEN];
1583size_t data_len = MAX_HOST_LEN;
817d9f57 1584exim_gnutls_state_st *state = &state_server;
17c76198
PP
1585unsigned int sni_type;
1586int rc, old_pool;
1587
1588rc = gnutls_server_name_get(session, sni_name, &data_len, &sni_type, 0);
b34fc30c
PP
1589if (rc != GNUTLS_E_SUCCESS)
1590 {
1591 DEBUG(D_tls) {
1592 if (rc == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
1593 debug_printf("TLS: no SNI presented in handshake.\n");
1594 else
1595 debug_printf("TLS failure: gnutls_server_name_get(): %s [%d]\n",
1596 gnutls_strerror(rc), rc);
1597 };
1598 return 0;
1599 }
1600
17c76198
PP
1601if (sni_type != GNUTLS_NAME_DNS)
1602 {
1603 DEBUG(D_tls) debug_printf("TLS: ignoring SNI of unhandled type %u\n", sni_type);
1604 return 0;
1605 }
44bbabb5 1606
17c76198
PP
1607/* We now have a UTF-8 string in sni_name */
1608old_pool = store_pool;
1609store_pool = POOL_PERM;
1610state->received_sni = string_copyn(US sni_name, data_len);
1611store_pool = old_pool;
1612
1613/* We set this one now so that variable expansions below will work */
817d9f57 1614state->tlsp->sni = state->received_sni;
17c76198
PP
1615
1616DEBUG(D_tls) debug_printf("Received TLS SNI \"%s\"%s\n", sni_name,
1617 state->trigger_sni_changes ? "" : " (unused for certificate selection)");
1618
1619if (!state->trigger_sni_changes)
1620 return 0;
1621
1622rc = tls_expand_session_files(state);
1623if (rc != OK)
1624 {
1625 /* If the setup of certs/etc failed before handshake, TLS would not have
1626 been offered. The best we can do now is abort. */
1627 return GNUTLS_E_APPLICATION_ERROR_MIN;
1628 }
1629
1365611d
PP
1630rc = tls_set_remaining_x509(state);
1631if (rc != OK) return GNUTLS_E_APPLICATION_ERROR_MIN;
1632
1633return 0;
059ec3d9
PH
1634}
1635
1636
1637
f2de3a33 1638#ifndef DISABLE_OCSP
44662487
JH
1639
1640static int
1641server_ocsp_stapling_cb(gnutls_session_t session, void * ptr,
1642 gnutls_datum_t * ocsp_response)
1643{
1644int ret;
1645
44662487
JH
1646if ((ret = gnutls_load_file(ptr, ocsp_response)) < 0)
1647 {
1648 DEBUG(D_tls) debug_printf("Failed to load ocsp stapling file %s\n",
1649 (char *)ptr);
018058b2 1650 tls_in.ocsp = OCSP_NOT_RESP;
44662487
JH
1651 return GNUTLS_E_NO_CERTIFICATE_STATUS;
1652 }
1653
018058b2 1654tls_in.ocsp = OCSP_VFY_NOT_TRIED;
44662487
JH
1655return 0;
1656}
1657
1658#endif
1659
1660
0cbf2b82 1661#ifndef DISABLE_EVENT
a7538db1
JH
1662/*
1663We use this callback to get observability and detail-level control
723fe533
JH
1664for an exim TLS connection (either direction), raising a tls:cert event
1665for each cert in the chain presented by the peer. Any event
a7538db1
JH
1666can deny verification.
1667
1668Return 0 for the handshake to continue or non-zero to terminate.
1669*/
1670
1671static int
723fe533 1672verify_cb(gnutls_session_t session)
a7538db1 1673{
27f19eb4 1674const gnutls_datum_t * cert_list;
a7538db1
JH
1675unsigned int cert_list_size = 0;
1676gnutls_x509_crt_t crt;
1677int rc;
b30275b8 1678uschar * yield;
a7538db1
JH
1679exim_gnutls_state_st * state = gnutls_session_get_ptr(session);
1680
1681cert_list = gnutls_certificate_get_peers(session, &cert_list_size);
1682if (cert_list)
1683 while (cert_list_size--)
1684 {
1685 rc = import_cert(&cert_list[cert_list_size], &crt);
1686 if (rc != GNUTLS_E_SUCCESS)
1687 {
1688 DEBUG(D_tls) debug_printf("TLS: peer cert problem: depth %d: %s\n",
1689 cert_list_size, gnutls_strerror(rc));
1690 break;
1691 }
1692
1693 state->tlsp->peercert = crt;
b30275b8
JH
1694 if ((yield = event_raise(state->event_action,
1695 US"tls:cert", string_sprintf("%d", cert_list_size))))
a7538db1
JH
1696 {
1697 log_write(0, LOG_MAIN,
b30275b8
JH
1698 "SSL verify denied by event-action: depth=%d: %s",
1699 cert_list_size, yield);
a7538db1
JH
1700 return 1; /* reject */
1701 }
1702 state->tlsp->peercert = NULL;
1703 }
1704
1705return 0;
1706}
1707
1708#endif
44662487
JH
1709
1710
17c76198
PP
1711
1712/* ------------------------------------------------------------------------ */
1713/* Exported functions */
1714
1715
1716
1717
059ec3d9
PH
1718/*************************************************
1719* Start a TLS session in a server *
1720*************************************************/
1721
1722/* This is called when Exim is running as a server, after having received
1723the STARTTLS command. It must respond to that command, and then negotiate
1724a TLS session.
1725
1726Arguments:
83da1223 1727 require_ciphers list of allowed ciphers or NULL
059ec3d9
PH
1728
1729Returns: OK on success
1730 DEFER for errors before the start of the negotiation
1731 FAIL for errors during the negotation; the server can't
1732 continue running.
1733*/
1734
1735int
17c76198 1736tls_server_start(const uschar *require_ciphers)
059ec3d9
PH
1737{
1738int rc;
7199e1ee 1739const char *error;
17c76198 1740exim_gnutls_state_st *state = NULL;
059ec3d9
PH
1741
1742/* Check for previous activation */
817d9f57 1743if (tls_in.active >= 0)
059ec3d9 1744 {
17c76198 1745 tls_error(US"STARTTLS received after TLS started", "", NULL);
059ec3d9
PH
1746 smtp_printf("554 Already in TLS\r\n");
1747 return FAIL;
1748 }
1749
1750/* Initialize the library. If it fails, it will already have logged the error
1751and sent an SMTP response. */
1752
17c76198 1753DEBUG(D_tls) debug_printf("initialising GnuTLS as a server\n");
059ec3d9 1754
17c76198
PP
1755rc = tls_init(NULL, tls_certificate, tls_privatekey,
1756 NULL, tls_verify_certificates, tls_crl,
1757 require_ciphers, &state);
059ec3d9
PH
1758if (rc != OK) return rc;
1759
059ec3d9
PH
1760/* If this is a host for which certificate verification is mandatory or
1761optional, set up appropriately. */
1762
059ec3d9 1763if (verify_check_host(&tls_verify_hosts) == OK)
17c76198 1764 {
e51c7be2
JH
1765 DEBUG(D_tls)
1766 debug_printf("TLS: a client certificate will be required.\n");
17c76198
PP
1767 state->verify_requirement = VERIFY_REQUIRED;
1768 gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
1769 }
059ec3d9 1770else if (verify_check_host(&tls_try_verify_hosts) == OK)
17c76198 1771 {
e51c7be2
JH
1772 DEBUG(D_tls)
1773 debug_printf("TLS: a client certificate will be requested but not required.\n");
17c76198
PP
1774 state->verify_requirement = VERIFY_OPTIONAL;
1775 gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
1776 }
1777else
1778 {
e51c7be2
JH
1779 DEBUG(D_tls)
1780 debug_printf("TLS: a client certificate will not be requested.\n");
17c76198
PP
1781 state->verify_requirement = VERIFY_NONE;
1782 gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
1783 }
059ec3d9 1784
0cbf2b82 1785#ifndef DISABLE_EVENT
723fe533
JH
1786if (event_action)
1787 {
1788 state->event_action = event_action;
1789 gnutls_session_set_ptr(state->session, state);
1790 gnutls_certificate_set_verify_function(state->x509_cred, verify_cb);
1791 }
1792#endif
1793
17c76198
PP
1794/* Register SNI handling; always, even if not in tls_certificate, so that the
1795expansion variable $tls_sni is always available. */
059ec3d9 1796
17c76198
PP
1797gnutls_handshake_set_post_client_hello_function(state->session,
1798 exim_sni_handling_cb);
059ec3d9
PH
1799
1800/* Set context and tell client to go ahead, except in the case of TLS startup
1801on connection, where outputting anything now upsets the clients and tends to
1802make them disconnect. We need to have an explicit fflush() here, to force out
1803the response. Other smtp_printf() calls do not need it, because in non-TLS
1804mode, the fflush() happens when smtp_getc() is called. */
1805
817d9f57 1806if (!state->tlsp->on_connect)
059ec3d9
PH
1807 {
1808 smtp_printf("220 TLS go ahead\r\n");
9d1c15ef 1809 fflush(smtp_out);
059ec3d9
PH
1810 }
1811
1812/* Now negotiate the TLS session. We put our own timer on it, since it seems
1813that the GnuTLS library doesn't. */
1814
17c76198 1815gnutls_transport_set_ptr2(state->session,
27f19eb4
JH
1816 (gnutls_transport_ptr_t)(long) fileno(smtp_in),
1817 (gnutls_transport_ptr_t)(long) fileno(smtp_out));
17c76198
PP
1818state->fd_in = fileno(smtp_in);
1819state->fd_out = fileno(smtp_out);
059ec3d9
PH
1820
1821sigalrm_seen = FALSE;
1822if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
17c76198
PP
1823do
1824 {
1825 rc = gnutls_handshake(state->session);
619b2b25
PP
1826 } while ((rc == GNUTLS_E_AGAIN) ||
1827 (rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen));
059ec3d9
PH
1828alarm(0);
1829
17c76198 1830if (rc != GNUTLS_E_SUCCESS)
059ec3d9 1831 {
17c76198
PP
1832 tls_error(US"gnutls_handshake",
1833 sigalrm_seen ? "timed out" : gnutls_strerror(rc), NULL);
059ec3d9
PH
1834 /* It seems that, except in the case of a timeout, we have to close the
1835 connection right here; otherwise if the other end is running OpenSSL it hangs
1836 until the server times out. */
1837
1838 if (!sigalrm_seen)
1839 {
f1e894f3
PH
1840 (void)fclose(smtp_out);
1841 (void)fclose(smtp_in);
059ec3d9
PH
1842 }
1843
1844 return FAIL;
1845 }
1846
1847DEBUG(D_tls) debug_printf("gnutls_handshake was successful\n");
1848
17c76198
PP
1849/* Verify after the fact */
1850
9d1c15ef
JH
1851if ( state->verify_requirement != VERIFY_NONE
1852 && !verify_certificate(state, &error))
059ec3d9 1853 {
9d1c15ef 1854 if (state->verify_requirement != VERIFY_OPTIONAL)
17c76198 1855 {
9d1c15ef
JH
1856 tls_error(US"certificate verification failed", error, NULL);
1857 return FAIL;
17c76198 1858 }
9d1c15ef
JH
1859 DEBUG(D_tls)
1860 debug_printf("TLS: continuing on only because verification was optional, after: %s\n",
1861 error);
059ec3d9
PH
1862 }
1863
17c76198
PP
1864/* Figure out peer DN, and if authenticated, etc. */
1865
1866rc = peer_status(state);
1867if (rc != OK) return rc;
1868
1869/* Sets various Exim expansion variables; always safe within server */
1870
9d1c15ef 1871extract_exim_vars_from_tls_state(state);
059ec3d9
PH
1872
1873/* TLS has been set up. Adjust the input functions to read via TLS,
1874and initialize appropriately. */
1875
17c76198 1876state->xfer_buffer = store_malloc(ssl_xfer_buffer_size);
059ec3d9
PH
1877
1878receive_getc = tls_getc;
1879receive_ungetc = tls_ungetc;
1880receive_feof = tls_feof;
1881receive_ferror = tls_ferror;
58eb016e 1882receive_smtp_buffered = tls_smtp_buffered;
059ec3d9 1883
059ec3d9
PH
1884return OK;
1885}
1886
1887
1888
1889
aa2a70ba
JH
1890static void
1891tls_client_setup_hostname_checks(host_item * host, exim_gnutls_state_st * state,
1892 smtp_transport_options_block * ob)
1893{
5130845b 1894if (verify_check_given_host(&ob->tls_verify_cert_hostnames, host) == OK)
aa2a70ba 1895 {
4af0d74a 1896 state->exp_tls_verify_cert_hostnames =
8c5d388a 1897#ifdef SUPPORT_I18N
4af0d74a
JH
1898 string_domain_utf8_to_alabel(host->name, NULL);
1899#else
1900 host->name;
1901#endif
aa2a70ba
JH
1902 DEBUG(D_tls)
1903 debug_printf("TLS: server cert verification includes hostname: \"%s\".\n",
1904 state->exp_tls_verify_cert_hostnames);
1905 }
1906}
aa2a70ba
JH
1907
1908
059ec3d9
PH
1909/*************************************************
1910* Start a TLS session in a client *
1911*************************************************/
1912
1913/* Called from the smtp transport after STARTTLS has been accepted.
1914
1915Arguments:
1916 fd the fd of the connection
1917 host connected host (for messages)
83da1223 1918 addr the first address (not used)
a7538db1 1919 tb transport (always smtp)
059ec3d9
PH
1920
1921Returns: OK/DEFER/FAIL (because using common functions),
1922 but for a client, DEFER and FAIL have the same meaning
1923*/
1924
1925int
17c76198 1926tls_client_start(int fd, host_item *host,
f5d78688 1927 address_item *addr ARG_UNUSED,
0e66b3b6
JH
1928 transport_instance *tb
1929#ifdef EXPERIMENTAL_DANE
b2ba1b4c 1930 , dns_answer * unused_tlsa_dnsa
0e66b3b6
JH
1931#endif
1932 )
059ec3d9 1933{
a7538db1
JH
1934smtp_transport_options_block *ob =
1935 (smtp_transport_options_block *)tb->options_block;
059ec3d9 1936int rc;
17c76198
PP
1937const char *error;
1938exim_gnutls_state_st *state = NULL;
f2de3a33 1939#ifndef DISABLE_OCSP
5130845b
JH
1940BOOL require_ocsp =
1941 verify_check_given_host(&ob->hosts_require_ocsp, host) == OK;
44662487 1942BOOL request_ocsp = require_ocsp ? TRUE
5130845b 1943 : verify_check_given_host(&ob->hosts_request_ocsp, host) == OK;
2b4a568d 1944#endif
059ec3d9 1945
17c76198 1946DEBUG(D_tls) debug_printf("initialising GnuTLS as a client on fd %d\n", fd);
059ec3d9 1947
65867078
JH
1948if ((rc = tls_init(host, ob->tls_certificate, ob->tls_privatekey,
1949 ob->tls_sni, ob->tls_verify_certificates, ob->tls_crl,
1950 ob->tls_require_ciphers, &state)) != OK)
2b4a568d 1951 return rc;
059ec3d9 1952
54c90be1 1953 {
65867078
JH
1954 int dh_min_bits = ob->tls_dh_min_bits;
1955 if (dh_min_bits < EXIM_CLIENT_DH_MIN_MIN_BITS)
1956 {
1957 DEBUG(D_tls)
1958 debug_printf("WARNING: tls_dh_min_bits far too low,"
1959 " clamping %d up to %d\n",
1960 dh_min_bits, EXIM_CLIENT_DH_MIN_MIN_BITS);
1961 dh_min_bits = EXIM_CLIENT_DH_MIN_MIN_BITS;
1962 }
54c90be1 1963
65867078
JH
1964 DEBUG(D_tls) debug_printf("Setting D-H prime minimum"
1965 " acceptable bits to %d\n",
1966 dh_min_bits);
1967 gnutls_dh_set_prime_bits(state->session, dh_min_bits);
1968 }
83da1223 1969
94431adb 1970/* Stick to the old behaviour for compatibility if tls_verify_certificates is
2b4a568d
JH
1971set but both tls_verify_hosts and tls_try_verify_hosts are unset. Check only
1972the specified host patterns if one of them is defined */
1973
aa2a70ba
JH
1974if ( ( state->exp_tls_verify_certificates
1975 && !ob->tls_verify_hosts
610ff438 1976 && (!ob->tls_try_verify_hosts || !*ob->tls_try_verify_hosts)
aa2a70ba 1977 )
5130845b 1978 || verify_check_given_host(&ob->tls_verify_hosts, host) == OK
2b4a568d 1979 )
17c76198 1980 {
aa2a70ba 1981 tls_client_setup_hostname_checks(host, state, ob);
aa2a70ba
JH
1982 DEBUG(D_tls)
1983 debug_printf("TLS: server certificate verification required.\n");
1984 state->verify_requirement = VERIFY_REQUIRED;
52f93eed
WB
1985 gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
1986 }
5130845b 1987else if (verify_check_given_host(&ob->tls_try_verify_hosts, host) == OK)
52f93eed 1988 {
aa2a70ba 1989 tls_client_setup_hostname_checks(host, state, ob);
e51c7be2
JH
1990 DEBUG(D_tls)
1991 debug_printf("TLS: server certificate verification optional.\n");
52f93eed 1992 state->verify_requirement = VERIFY_OPTIONAL;
17c76198
PP
1993 gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
1994 }
1995else
1996 {
e51c7be2
JH
1997 DEBUG(D_tls)
1998 debug_printf("TLS: server certificate verification not required.\n");
52f93eed
WB
1999 state->verify_requirement = VERIFY_NONE;
2000 gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
17c76198 2001 }
059ec3d9 2002
f2de3a33
JH
2003#ifndef DISABLE_OCSP
2004 /* supported since GnuTLS 3.1.3 */
44662487 2005if (request_ocsp)
9d1c15ef
JH
2006 {
2007 DEBUG(D_tls) debug_printf("TLS: will request OCSP stapling\n");
65867078
JH
2008 if ((rc = gnutls_ocsp_status_request_enable_client(state->session,
2009 NULL, 0, NULL)) != OK)
9d1c15ef
JH
2010 return tls_error(US"cert-status-req",
2011 gnutls_strerror(rc), state->host);
44662487 2012 tls_out.ocsp = OCSP_NOT_RESP;
9d1c15ef 2013 }
2b4a568d
JH
2014#endif
2015
0cbf2b82 2016#ifndef DISABLE_EVENT
774ef2d7 2017if (tb->event_action)
a7538db1 2018 {
774ef2d7 2019 state->event_action = tb->event_action;
a7538db1 2020 gnutls_session_set_ptr(state->session, state);
723fe533 2021 gnutls_certificate_set_verify_function(state->x509_cred, verify_cb);
a7538db1
JH
2022 }
2023#endif
2024
27f19eb4 2025gnutls_transport_set_ptr(state->session, (gnutls_transport_ptr_t)(long) fd);
17c76198
PP
2026state->fd_in = fd;
2027state->fd_out = fd;
059ec3d9 2028
9d1c15ef 2029DEBUG(D_tls) debug_printf("about to gnutls_handshake\n");
059ec3d9
PH
2030/* There doesn't seem to be a built-in timeout on connection. */
2031
2032sigalrm_seen = FALSE;
65867078 2033alarm(ob->command_timeout);
17c76198
PP
2034do
2035 {
2036 rc = gnutls_handshake(state->session);
619b2b25
PP
2037 } while ((rc == GNUTLS_E_AGAIN) ||
2038 (rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen));
059ec3d9
PH
2039alarm(0);
2040
4fe99a6c
PP
2041if (rc != GNUTLS_E_SUCCESS)
2042 return tls_error(US"gnutls_handshake",
2043 sigalrm_seen ? "timed out" : gnutls_strerror(rc), state->host);
2044
17c76198 2045DEBUG(D_tls) debug_printf("gnutls_handshake was successful\n");
059ec3d9 2046
17c76198 2047/* Verify late */
059ec3d9 2048
17c76198
PP
2049if (state->verify_requirement != VERIFY_NONE &&
2050 !verify_certificate(state, &error))
2051 return tls_error(US"certificate verification failed", error, state->host);
059ec3d9 2052
f2de3a33 2053#ifndef DISABLE_OCSP
2b4a568d
JH
2054if (require_ocsp)
2055 {
2056 DEBUG(D_tls)
2057 {
2058 gnutls_datum_t stapling;
2059 gnutls_ocsp_resp_t resp;
2060 gnutls_datum_t printed;
2061 if ( (rc= gnutls_ocsp_status_request_get(state->session, &stapling)) == 0
2062 && (rc= gnutls_ocsp_resp_init(&resp)) == 0
2063 && (rc= gnutls_ocsp_resp_import(resp, &stapling)) == 0
2064 && (rc= gnutls_ocsp_resp_print(resp, GNUTLS_OCSP_PRINT_FULL, &printed)) == 0
2065 )
2066 {
65867078 2067 debug_printf("%.4096s", printed.data);
2b4a568d
JH
2068 gnutls_free(printed.data);
2069 }
2070 else
2071 (void) tls_error(US"ocsp decode", gnutls_strerror(rc), state->host);
2072 }
2073
2b4a568d 2074 if (gnutls_ocsp_status_request_is_checked(state->session, 0) == 0)
018058b2
JH
2075 {
2076 tls_out.ocsp = OCSP_FAILED;
2b4a568d 2077 return tls_error(US"certificate status check failed", NULL, state->host);
018058b2 2078 }
2b4a568d 2079 DEBUG(D_tls) debug_printf("Passed OCSP checking\n");
44662487 2080 tls_out.ocsp = OCSP_VFIED;
2b4a568d
JH
2081 }
2082#endif
2083
17c76198 2084/* Figure out peer DN, and if authenticated, etc. */
059ec3d9 2085
2b4a568d
JH
2086if ((rc = peer_status(state)) != OK)
2087 return rc;
059ec3d9 2088
4fe99a6c 2089/* Sets various Exim expansion variables; may need to adjust for ACL callouts */
059ec3d9 2090
9d1c15ef 2091extract_exim_vars_from_tls_state(state);
059ec3d9 2092
059ec3d9
PH
2093return OK;
2094}
2095
2096
2097
17c76198 2098
059ec3d9 2099/*************************************************
17c76198 2100* Close down a TLS session *
059ec3d9
PH
2101*************************************************/
2102
17c76198
PP
2103/* This is also called from within a delivery subprocess forked from the
2104daemon, to shut down the TLS library, without actually doing a shutdown (which
2105would tamper with the TLS session in the parent process).
059ec3d9 2106
17c76198
PP
2107Arguments: TRUE if gnutls_bye is to be called
2108Returns: nothing
059ec3d9
PH
2109*/
2110
17c76198 2111void
817d9f57 2112tls_close(BOOL is_server, BOOL shutdown)
059ec3d9 2113{
817d9f57 2114exim_gnutls_state_st *state = is_server ? &state_server : &state_client;
059ec3d9 2115
389ca47a 2116if (!state->tlsp || state->tlsp->active < 0) return; /* TLS was not active */
17c76198
PP
2117
2118if (shutdown)
2119 {
2120 DEBUG(D_tls) debug_printf("tls_close(): shutting down TLS\n");
2121 gnutls_bye(state->session, GNUTLS_SHUT_WR);
2122 }
2123
2124gnutls_deinit(state->session);
2125
389ca47a 2126state->tlsp->active = -1;
17c76198
PP
2127memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
2128
2129if ((state_server.session == NULL) && (state_client.session == NULL))
2130 {
2131 gnutls_global_deinit();
2132 exim_gnutls_base_init_done = FALSE;
2133 }
7199e1ee 2134
059ec3d9
PH
2135}
2136
2137
2138
17c76198 2139
059ec3d9
PH
2140/*************************************************
2141* TLS version of getc *
2142*************************************************/
2143
2144/* This gets the next byte from the TLS input buffer. If the buffer is empty,
2145it refills the buffer via the GnuTLS reading function.
817d9f57 2146Only used by the server-side TLS.
059ec3d9 2147
17c76198
PP
2148This feeds DKIM and should be used for all message-body reads.
2149
059ec3d9
PH
2150Arguments: none
2151Returns: the next character or EOF
2152*/
2153
2154int
2155tls_getc(void)
2156{
817d9f57 2157exim_gnutls_state_st *state = &state_server;
17c76198 2158if (state->xfer_buffer_lwm >= state->xfer_buffer_hwm)
059ec3d9 2159 {
17c76198 2160 ssize_t inbytes;
059ec3d9 2161
17c76198
PP
2162 DEBUG(D_tls) debug_printf("Calling gnutls_record_recv(%p, %p, %u)\n",
2163 state->session, state->xfer_buffer, ssl_xfer_buffer_size);
059ec3d9
PH
2164
2165 if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
17c76198 2166 inbytes = gnutls_record_recv(state->session, state->xfer_buffer,
059ec3d9
PH
2167 ssl_xfer_buffer_size);
2168 alarm(0);
2169
2170 /* A zero-byte return appears to mean that the TLS session has been
2171 closed down, not that the socket itself has been closed down. Revert to
2172 non-TLS handling. */
2173
2174 if (inbytes == 0)
2175 {
2176 DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
2177
2178 receive_getc = smtp_getc;
2179 receive_ungetc = smtp_ungetc;
2180 receive_feof = smtp_feof;
2181 receive_ferror = smtp_ferror;
58eb016e 2182 receive_smtp_buffered = smtp_buffered;
059ec3d9 2183
17c76198
PP
2184 gnutls_deinit(state->session);
2185 state->session = NULL;
817d9f57
JH
2186 state->tlsp->active = -1;
2187 state->tlsp->bits = 0;
2188 state->tlsp->certificate_verified = FALSE;
9d1c15ef 2189 tls_channelbinding_b64 = NULL;
817d9f57 2190 state->tlsp->cipher = NULL;
9d1c15ef 2191 state->tlsp->peercert = NULL;
817d9f57 2192 state->tlsp->peerdn = NULL;
059ec3d9
PH
2193
2194 return smtp_getc();
2195 }
2196
2197 /* Handle genuine errors */
2198
2199 else if (inbytes < 0)
2200 {
17c76198
PP
2201 record_io_error(state, (int) inbytes, US"recv", NULL);
2202 state->xfer_error = 1;
059ec3d9
PH
2203 return EOF;
2204 }
80a47a2c 2205#ifndef DISABLE_DKIM
17c76198 2206 dkim_exim_verify_feed(state->xfer_buffer, inbytes);
80a47a2c 2207#endif
17c76198
PP
2208 state->xfer_buffer_hwm = (int) inbytes;
2209 state->xfer_buffer_lwm = 0;
059ec3d9
PH
2210 }
2211
059ec3d9
PH
2212/* Something in the buffer; return next uschar */
2213
17c76198 2214return state->xfer_buffer[state->xfer_buffer_lwm++];
059ec3d9
PH
2215}
2216
2217
2218
17c76198 2219
059ec3d9
PH
2220/*************************************************
2221* Read bytes from TLS channel *
2222*************************************************/
2223
17c76198
PP
2224/* This does not feed DKIM, so if the caller uses this for reading message body,
2225then the caller must feed DKIM.
817d9f57 2226
059ec3d9
PH
2227Arguments:
2228 buff buffer of data
2229 len size of buffer
2230
2231Returns: the number of bytes read
2232 -1 after a failed read
2233*/
2234
2235int
817d9f57 2236tls_read(BOOL is_server, uschar *buff, size_t len)
059ec3d9 2237{
817d9f57 2238exim_gnutls_state_st *state = is_server ? &state_server : &state_client;
17c76198 2239ssize_t inbytes;
059ec3d9 2240
17c76198
PP
2241if (len > INT_MAX)
2242 len = INT_MAX;
059ec3d9 2243
17c76198
PP
2244if (state->xfer_buffer_lwm < state->xfer_buffer_hwm)
2245 DEBUG(D_tls)
2246 debug_printf("*** PROBABLY A BUG *** " \
2247 "tls_read() called with data in the tls_getc() buffer, %d ignored\n",
2248 state->xfer_buffer_hwm - state->xfer_buffer_lwm);
2249
2250DEBUG(D_tls)
2251 debug_printf("Calling gnutls_record_recv(%p, %p, " SIZE_T_FMT ")\n",
2252 state->session, buff, len);
2253
2254inbytes = gnutls_record_recv(state->session, buff, len);
059ec3d9
PH
2255if (inbytes > 0) return inbytes;
2256if (inbytes == 0)
2257 {
2258 DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
2259 }
17c76198 2260else record_io_error(state, (int)inbytes, US"recv", NULL);
059ec3d9
PH
2261
2262return -1;
2263}
2264
2265
2266
17c76198 2267
059ec3d9
PH
2268/*************************************************
2269* Write bytes down TLS channel *
2270*************************************************/
2271
2272/*
2273Arguments:
817d9f57 2274 is_server channel specifier
059ec3d9
PH
2275 buff buffer of data
2276 len number of bytes
2277
2278Returns: the number of bytes after a successful write,
2279 -1 after a failed write
2280*/
2281
2282int
817d9f57 2283tls_write(BOOL is_server, const uschar *buff, size_t len)
059ec3d9 2284{
17c76198
PP
2285ssize_t outbytes;
2286size_t left = len;
817d9f57 2287exim_gnutls_state_st *state = is_server ? &state_server : &state_client;
059ec3d9 2288
17c76198 2289DEBUG(D_tls) debug_printf("tls_do_write(%p, " SIZE_T_FMT ")\n", buff, left);
059ec3d9
PH
2290while (left > 0)
2291 {
17c76198
PP
2292 DEBUG(D_tls) debug_printf("gnutls_record_send(SSL, %p, " SIZE_T_FMT ")\n",
2293 buff, left);
2294 outbytes = gnutls_record_send(state->session, buff, left);
059ec3d9 2295
17c76198 2296 DEBUG(D_tls) debug_printf("outbytes=" SSIZE_T_FMT "\n", outbytes);
059ec3d9
PH
2297 if (outbytes < 0)
2298 {
17c76198 2299 record_io_error(state, outbytes, US"send", NULL);
059ec3d9
PH
2300 return -1;
2301 }
2302 if (outbytes == 0)
2303 {
17c76198 2304 record_io_error(state, 0, US"send", US"TLS channel closed on write");
059ec3d9
PH
2305 return -1;
2306 }
2307
2308 left -= outbytes;
2309 buff += outbytes;
2310 }
2311
17c76198
PP
2312if (len > INT_MAX)
2313 {
2314 DEBUG(D_tls)
2315 debug_printf("Whoops! Wrote more bytes (" SIZE_T_FMT ") than INT_MAX\n",
2316 len);
2317 len = INT_MAX;
2318 }
2319
2320return (int) len;
059ec3d9
PH
2321}
2322
2323
2324
17c76198 2325
059ec3d9 2326/*************************************************
17c76198 2327* Random number generation *
059ec3d9
PH
2328*************************************************/
2329
17c76198
PP
2330/* Pseudo-random number generation. The result is not expected to be
2331cryptographically strong but not so weak that someone will shoot themselves
2332in the foot using it as a nonce in input in some email header scheme or
2333whatever weirdness they'll twist this into. The result should handle fork()
2334and avoid repeating sequences. OpenSSL handles that for us.
059ec3d9 2335
17c76198
PP
2336Arguments:
2337 max range maximum
2338Returns a random number in range [0, max-1]
059ec3d9
PH
2339*/
2340
af3498d6 2341#ifdef HAVE_GNUTLS_RND
17c76198
PP
2342int
2343vaguely_random_number(int max)
059ec3d9 2344{
17c76198
PP
2345unsigned int r;
2346int i, needed_len;
2347uschar *p;
2348uschar smallbuf[sizeof(r)];
2349
2350if (max <= 1)
2351 return 0;
2352
2353needed_len = sizeof(r);
2354/* Don't take 8 times more entropy than needed if int is 8 octets and we were
2355 * asked for a number less than 10. */
2356for (r = max, i = 0; r; ++i)
2357 r >>= 1;
2358i = (i + 7) / 8;
2359if (i < needed_len)
2360 needed_len = i;
2361
2362i = gnutls_rnd(GNUTLS_RND_NONCE, smallbuf, needed_len);
2363if (i < 0)
059ec3d9 2364 {
17c76198
PP
2365 DEBUG(D_all) debug_printf("gnutls_rnd() failed, using fallback.\n");
2366 return vaguely_random_number_fallback(max);
2367 }
2368r = 0;
2369for (p = smallbuf; needed_len; --needed_len, ++p)
2370 {
2371 r *= 256;
2372 r += *p;
059ec3d9
PH
2373 }
2374
17c76198
PP
2375/* We don't particularly care about weighted results; if someone wants
2376 * smooth distribution and cares enough then they should submit a patch then. */
2377return r % max;
059ec3d9 2378}
af3498d6
PP
2379#else /* HAVE_GNUTLS_RND */
2380int
2381vaguely_random_number(int max)
2382{
2383 return vaguely_random_number_fallback(max);
2384}
2385#endif /* HAVE_GNUTLS_RND */
059ec3d9 2386
36f12725
NM
2387
2388
2389
3375e053
PP
2390/*************************************************
2391* Let tls_require_ciphers be checked at startup *
2392*************************************************/
2393
2394/* The tls_require_ciphers option, if set, must be something which the
2395library can parse.
2396
2397Returns: NULL on success, or error message
2398*/
2399
2400uschar *
2401tls_validate_require_cipher(void)
2402{
2403int rc;
2404uschar *expciphers = NULL;
2405gnutls_priority_t priority_cache;
2406const char *errpos;
2407
2408#define validate_check_rc(Label) do { \
2409 if (rc != GNUTLS_E_SUCCESS) { if (exim_gnutls_base_init_done) gnutls_global_deinit(); \
2410 return string_sprintf("%s failed: %s", (Label), gnutls_strerror(rc)); } } while (0)
2411#define return_deinit(Label) do { gnutls_global_deinit(); return (Label); } while (0)
2412
2413if (exim_gnutls_base_init_done)
2414 log_write(0, LOG_MAIN|LOG_PANIC,
2415 "already initialised GnuTLS, Exim developer bug");
2416
a5f239e4 2417#ifdef HAVE_GNUTLS_PKCS11
2519e60d 2418if (!gnutls_allow_auto_pkcs11)
a5f239e4
PP
2419 {
2420 rc = gnutls_pkcs11_init(GNUTLS_PKCS11_FLAG_MANUAL, NULL);
2421 validate_check_rc(US"gnutls_pkcs11_init");
2422 }
2423#endif
3375e053
PP
2424rc = gnutls_global_init();
2425validate_check_rc(US"gnutls_global_init()");
2426exim_gnutls_base_init_done = TRUE;
2427
2428if (!(tls_require_ciphers && *tls_require_ciphers))
2429 return_deinit(NULL);
2430
2431if (!expand_check(tls_require_ciphers, US"tls_require_ciphers", &expciphers))
2432 return_deinit(US"failed to expand tls_require_ciphers");
2433
2434if (!(expciphers && *expciphers))
2435 return_deinit(NULL);
2436
2437DEBUG(D_tls)
2438 debug_printf("tls_require_ciphers expands to \"%s\"\n", expciphers);
2439
2440rc = gnutls_priority_init(&priority_cache, CS expciphers, &errpos);
2441validate_check_rc(string_sprintf(
2442 "gnutls_priority_init(%s) failed at offset %ld, \"%.8s..\"",
2443 expciphers, errpos - CS expciphers, errpos));
2444
2445#undef return_deinit
2446#undef validate_check_rc
2447gnutls_global_deinit();
2448
2449return NULL;
2450}
2451
2452
2453
2454
36f12725
NM
2455/*************************************************
2456* Report the library versions. *
2457*************************************************/
2458
2459/* See a description in tls-openssl.c for an explanation of why this exists.
2460
2461Arguments: a FILE* to print the results to
2462Returns: nothing
2463*/
2464
2465void
2466tls_version_report(FILE *f)
2467{
754a0503
PP
2468fprintf(f, "Library version: GnuTLS: Compile: %s\n"
2469 " Runtime: %s\n",
2470 LIBGNUTLS_VERSION,
2471 gnutls_check_version(NULL));
36f12725
NM
2472}
2473
2b4a568d
JH
2474/* vi: aw ai sw=2
2475*/
059ec3d9 2476/* End of tls-gnu.c */