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