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