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