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