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