06cd4a5f85c9e4d05965c4575c91804ee5f72eb9
[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->drinst.options_block;
1634 const uschar * trname = t->drinst.name;
1635 exim_gnutls_state_st tpt_dummy_state;
1636 host_item * dummy_host = (host_item *)1;
1637 uschar * dummy_errstr;
1638
1639 if (  !exim_gnutls_base_init_done
1640    && tls_g_init(&dummy_errstr) != OK)
1641   return;
1642
1643 ob->tls_preload = null_tls_preload;
1644 if (gnutls_certificate_allocate_credentials(
1645   (struct gnutls_certificate_credentials_st **)&ob->tls_preload.x509_cred))
1646   {
1647   ob->tls_preload.x509_cred = NULL;
1648   return;
1649   }
1650 creds_basic_init(ob->tls_preload.x509_cred, FALSE);
1651
1652 tpt_dummy_state.session = NULL;
1653 tpt_dummy_state.lib_state = ob->tls_preload;
1654
1655 #if defined(EXIM_HAVE_INOTIFY) || defined(EXIM_HAVE_KEVENT)
1656 if (  opt_set_and_noexpand(ob->tls_certificate)
1657    && opt_unset_or_noexpand(ob->tls_privatekey))
1658   {
1659   if (  !watch
1660      || (  tls_set_watch(ob->tls_certificate, FALSE)
1661         && tls_set_watch(ob->tls_privatekey, FALSE)
1662      )  )
1663     {
1664     const uschar * pkey = ob->tls_privatekey;
1665
1666     DEBUG(D_tls)
1667       debug_printf("TLS: preloading client certs for transport '%s'\n", trname);
1668
1669     /* The state->lib_state.x509_cred is used for the certs load, and is the sole
1670     structure element used.  So we can set up a dummy.  The hoat arg only
1671     selects a retcode in case of fail, so any value */
1672
1673     if (creds_load_client_certs(&tpt_dummy_state, dummy_host,
1674           ob->tls_certificate, pkey ? pkey : ob->tls_certificate,
1675           &dummy_errstr) == OK)
1676       ob->tls_preload.conn_certs = TRUE;
1677     }
1678   }
1679 else
1680   DEBUG(D_tls)
1681     debug_printf("TLS: not preloading client certs, for transport '%s'\n", trname);
1682
1683 /* If tls_verify_certificates is non-empty and has no $, load CAs.
1684 If none was configured and we can't handle "system", treat as empty. */
1685
1686 if (  opt_set_and_noexpand(ob->tls_verify_certificates)
1687 #ifndef SUPPORT_SYSDEFAULT_CABUNDLE
1688    && Ustrcmp(ob->tls_verify_certificates, "system") != 0
1689 #endif
1690    )
1691   {
1692   if (!watch || tls_set_watch(ob->tls_verify_certificates, FALSE))
1693     {
1694     DEBUG(D_tls)
1695       debug_printf("TLS: preloading CA bundle for transport '%s'\n", trname);
1696     if (creds_load_cabundle(&tpt_dummy_state, ob->tls_verify_certificates,
1697                             dummy_host, &dummy_errstr) != OK)
1698       return;
1699     ob->tls_preload.cabundle = TRUE;
1700
1701     if (opt_set_and_noexpand(ob->tls_crl))
1702       {
1703       if (!watch || tls_set_watch(ob->tls_crl, FALSE))
1704         {
1705         DEBUG(D_tls) debug_printf("TLS: preloading CRL for transport '%s'\n", trname);
1706         if (creds_load_crl(&tpt_dummy_state, ob->tls_crl, &dummy_errstr) != OK)
1707           return;
1708         ob->tls_preload.crl = TRUE;
1709         }
1710       }
1711     else
1712       DEBUG(D_tls) debug_printf("TLS: not preloading CRL, for transport '%s'\n", trname);
1713     }
1714   }
1715 else
1716   DEBUG(D_tls)
1717       debug_printf("TLS: not preloading CA bundle, for transport '%s'\n", trname);
1718
1719 /* We do not preload tls_require_ciphers to to the transport as it implicitly
1720 depends on DANE or plain usage. */
1721
1722 #endif
1723 }
1724
1725
1726 #if defined(EXIM_HAVE_INOTIFY) || defined(EXIM_HAVE_KEVENT)
1727 /* Invalidate the creds cached, by dropping the current ones.
1728 Call when we notice one of the source files has changed. */
1729  
1730 static void
1731 tls_server_creds_invalidate(void)
1732 {
1733 if (state_server.lib_state.pri_cache)
1734   gnutls_priority_deinit(state_server.lib_state.pri_cache);
1735 state_server.lib_state.pri_cache = NULL;
1736
1737 if (state_server.lib_state.x509_cred)
1738   gnutls_certificate_free_credentials(state_server.lib_state.x509_cred);
1739 state_server.lib_state = null_tls_preload;
1740 }
1741
1742
1743 static void
1744 tls_client_creds_invalidate(transport_instance * t)
1745 {
1746 smtp_transport_options_block * ob = t->drinst.options_block;
1747 if (ob->tls_preload.x509_cred)
1748   gnutls_certificate_free_credentials(ob->tls_preload.x509_cred);
1749 ob->tls_preload = null_tls_preload;
1750 }
1751 #endif
1752
1753
1754 /*************************************************
1755 *       Variables re-expanded post-SNI           *
1756 *************************************************/
1757
1758 /* Called from both server and client code, via tls_init(), and also from
1759 the SNI callback after receiving an SNI, if tls_certificate includes "tls_sni".
1760
1761 We can tell the two apart by state->received_sni being non-NULL in callback.
1762
1763 The callback should not call us unless state->trigger_sni_changes is true,
1764 which we are responsible for setting on the first pass through.
1765
1766 Arguments:
1767   state           exim_gnutls_state_st *
1768   errstr          error string pointer
1769
1770 Returns:          OK/DEFER/FAIL
1771 */
1772
1773 static int
1774 tls_expand_session_files(exim_gnutls_state_st * state, uschar ** errstr)
1775 {
1776 int rc;
1777 const host_item *host = state->host;  /* macro should be reconsidered? */
1778 const uschar *saved_tls_certificate = NULL;
1779 const uschar *saved_tls_privatekey = NULL;
1780 const uschar *saved_tls_verify_certificates = NULL;
1781 const uschar *saved_tls_crl = NULL;
1782 int cert_count;
1783
1784 /* We check for tls_sni *before* expansion. */
1785 if (!host)      /* server */
1786   if (!state->received_sni)
1787     {
1788     if (  state->tls_certificate
1789        && (  Ustrstr(state->tls_certificate, US"tls_sni")
1790           || Ustrstr(state->tls_certificate, US"tls_in_sni")
1791           || Ustrstr(state->tls_certificate, US"tls_out_sni")
1792        )  )
1793       {
1794       DEBUG(D_tls) debug_printf("We will re-expand TLS session files if we receive SNI\n");
1795       state->trigger_sni_changes = TRUE;
1796       }
1797     }
1798   else  /* SNI callback case */
1799     {
1800     /* useful for debugging */
1801     saved_tls_certificate = state->exp_tls_certificate;
1802     saved_tls_privatekey = state->exp_tls_privatekey;
1803     saved_tls_verify_certificates = state->exp_tls_verify_certificates;
1804     saved_tls_crl = state->exp_tls_crl;
1805     }
1806
1807 if (!state->lib_state.x509_cred)
1808   {
1809   if ((rc = gnutls_certificate_allocate_credentials(
1810         (gnutls_certificate_credentials_t *) &state->lib_state.x509_cred)))
1811     return tls_error_gnu(state, US"gnutls_certificate_allocate_credentials",
1812             rc, errstr);
1813   creds_basic_init(state->lib_state.x509_cred, !host);
1814   }
1815
1816
1817 /* remember: Expand_check_tlsvar() is expand_check() but fiddling with
1818 state members, assuming consistent naming; and expand_check() returns
1819 false if expansion failed, unless expansion was forced to fail. */
1820
1821 /* check if we at least have a certificate, before doing expensive
1822 D-H generation. */
1823
1824 if (!state->lib_state.conn_certs)
1825   {
1826   if (  !Expand_check_tlsvar(tls_certificate, errstr)
1827      || f.expand_string_forcedfail)
1828     {
1829     if (f.expand_string_forcedfail)
1830       *errstr = US"expansion of tls_certificate failed";
1831     return DEFER;
1832     }
1833
1834   /* certificate is mandatory in server, optional in client */
1835
1836   if (  !state->exp_tls_certificate
1837      || !*state->exp_tls_certificate
1838      )
1839     if (!host)
1840       return tls_install_selfsign(state, errstr);
1841     else
1842       DEBUG(D_tls) debug_printf("TLS: no client certificate specified; okay\n");
1843
1844   if (  state->tls_privatekey && !Expand_check_tlsvar(tls_privatekey, errstr)
1845      || f.expand_string_forcedfail
1846      )
1847     {
1848     if (f.expand_string_forcedfail)
1849       *errstr = US"expansion of tls_privatekey failed";
1850     return DEFER;
1851     }
1852
1853   /* tls_privatekey is optional, defaulting to same file as certificate */
1854
1855   if (!state->tls_privatekey || !*state->tls_privatekey)
1856     {
1857     state->tls_privatekey = state->tls_certificate;
1858     state->exp_tls_privatekey = state->exp_tls_certificate;
1859     }
1860
1861   if (state->exp_tls_certificate && *state->exp_tls_certificate)
1862     {
1863     BOOL load = TRUE;
1864     DEBUG(D_tls) debug_printf("certificate file = %s\nkey file = %s\n",
1865         state->exp_tls_certificate, state->exp_tls_privatekey);
1866
1867     if (state->received_sni)
1868       if (  Ustrcmp(state->exp_tls_certificate, saved_tls_certificate) == 0
1869          && Ustrcmp(state->exp_tls_privatekey,  saved_tls_privatekey)  == 0
1870          )
1871         {
1872         DEBUG(D_tls) debug_printf("TLS SNI: cert and key unchanged\n");
1873         load = FALSE;   /* avoid re-loading the same certs */
1874         }
1875       else              /* unload the pre-SNI certs before loading new ones */
1876         {
1877         DEBUG(D_tls) debug_printf("TLS SNI: have a changed cert/key pair\n");
1878         gnutls_certificate_free_keys(state->lib_state.x509_cred);
1879         }
1880
1881     if (  load
1882        && (rc = host
1883           ? creds_load_client_certs(state, host, state->exp_tls_certificate,
1884                               state->exp_tls_privatekey, errstr)
1885           : creds_load_server_certs(state, state->exp_tls_certificate,
1886                               state->exp_tls_privatekey,
1887 #ifdef DISABLE_OCSP
1888                               NULL,
1889 #else
1890                               tls_ocsp_file,
1891 #endif
1892                               errstr)
1893        )  )
1894       {
1895       DEBUG(D_tls) debug_printf("load-cert: '%s'\n", *errstr);
1896       return rc;
1897       }
1898     }
1899   }
1900 else
1901   {
1902   DEBUG(D_tls)
1903     debug_printf("%s certs were preloaded\n", host ? "client" : "server");
1904
1905   if (!state->tls_privatekey) state->tls_privatekey = state->tls_certificate;
1906   state->exp_tls_certificate = US state->tls_certificate;
1907   state->exp_tls_privatekey = US state->tls_privatekey;
1908
1909 #ifdef SUPPORT_GNUTLS_EXT_RAW_PARSE
1910   if (state->lib_state.ocsp_hook)
1911      gnutls_handshake_set_hook_function(state->session,
1912        GNUTLS_HANDSHAKE_ANY, GNUTLS_HOOK_POST, tls_server_hook_cb);
1913 #endif
1914   }
1915
1916
1917 /* Set the trusted CAs file if one is provided, and then add the CRL if one is
1918 provided. Experiment shows that, if the certificate file is empty, an unhelpful
1919 error message is provided. However, if we just refrain from setting anything up
1920 in that case, certificate verification fails, which seems to be the correct
1921 behaviour.
1922 If none was configured and we can't handle "system", treat as empty. */
1923
1924 if (!state->lib_state.cabundle)
1925   {
1926   if (state->tls_verify_certificates && *state->tls_verify_certificates)
1927     {
1928     if (!Expand_check_tlsvar(tls_verify_certificates, errstr))
1929       return DEFER;
1930 #ifndef SUPPORT_SYSDEFAULT_CABUNDLE
1931     if (Ustrcmp(state->exp_tls_verify_certificates, "system") == 0)
1932       state->exp_tls_verify_certificates = NULL;
1933 #endif
1934     if (state->tls_crl && *state->tls_crl)
1935       if (!Expand_check_tlsvar(tls_crl, errstr))
1936         return DEFER;
1937
1938     if (!(state->exp_tls_verify_certificates &&
1939           *state->exp_tls_verify_certificates))
1940       {
1941       DEBUG(D_tls)
1942         debug_printf("TLS: tls_verify_certificates expanded empty, ignoring\n");
1943       /* With no tls_verify_certificates, we ignore tls_crl too */
1944       return OK;
1945       }
1946     }
1947   else
1948     {
1949     DEBUG(D_tls)
1950       debug_printf("TLS: tls_verify_certificates not set or empty, ignoring\n");
1951     return OK;
1952     }
1953   rc = creds_load_cabundle(state, state->exp_tls_verify_certificates, host, errstr);
1954   if (rc != OK) return rc;
1955   }
1956 else
1957   {
1958   DEBUG(D_tls)
1959     debug_printf("%s CA bundle was preloaded\n", host ? "client" : "server");
1960   state->exp_tls_verify_certificates = US state->tls_verify_certificates;
1961
1962 #ifdef SUPPORT_CA_DIR
1963 /* Mimic the behaviour with OpenSSL of not advertising a usable-cert list
1964 when using the directory-of-certs config model. */
1965     if (state->lib_state.ca_rdn_emulate)
1966       gnutls_certificate_send_x509_rdn_sequence(state->session, 1);
1967 #endif
1968   }
1969
1970
1971 if (!state->lib_state.crl)
1972   {
1973   if (  state->tls_crl && *state->tls_crl
1974      && state->exp_tls_crl && *state->exp_tls_crl)
1975     return creds_load_crl(state, state->exp_tls_crl, errstr);
1976   }
1977 else
1978   {
1979   DEBUG(D_tls)
1980       debug_printf("%s CRL was preloaded\n", host ? "client" : "server");
1981   state->exp_tls_crl = US state->tls_crl;
1982   }
1983
1984 return OK;
1985 }
1986
1987
1988
1989
1990 /*************************************************
1991 *          Set X.509 state variables             *
1992 *************************************************/
1993
1994 /* In GnuTLS, the registered cert/key are not replaced by a later
1995 set of a cert/key, so for SNI support we need a whole new x509_cred
1996 structure.  Which means various other non-re-expanded pieces of state
1997 need to be re-set in the new struct, so the setting logic is pulled
1998 out to this.
1999
2000 Arguments:
2001   state           exim_gnutls_state_st *
2002   errstr          error string pointer
2003
2004 Returns:          OK/DEFER/FAIL
2005 */
2006
2007 static int
2008 tls_set_remaining_x509(exim_gnutls_state_st * state, uschar ** errstr)
2009 {
2010 int rc = OK;
2011 const host_item * host = state->host;  /* macro should be reconsidered? */
2012
2013 /* Create D-H parameters, or read them from the cache file. This function does
2014 its own SMTP error messaging. This only happens for the server, TLS D-H ignores
2015 client-side params. */
2016
2017 if (!state->host)
2018   {
2019   if (!dh_server_params)
2020     if ((rc = init_server_dh(errstr)) == DEFER) return rc;
2021
2022   /* Unnecessary & discouraged with 3.6.0 or later, according to docs.  But without it,
2023   no DHE- ciphers are advertised. */
2024
2025   if (rc == OK)
2026     gnutls_certificate_set_dh_params(state->lib_state.x509_cred, dh_server_params);
2027   }
2028
2029 /* Link the credentials to the session. */
2030
2031 if ((rc = gnutls_credentials_set(state->session,
2032             GNUTLS_CRD_CERTIFICATE, state->lib_state.x509_cred)))
2033   return tls_error_gnu(state, US"gnutls_credentials_set", rc, errstr);
2034
2035 return OK;
2036 }
2037
2038 /*************************************************
2039 *            Initialize for GnuTLS               *
2040 *************************************************/
2041
2042
2043 /* Called from both server and client code. In the case of a server, errors
2044 before actual TLS negotiation return DEFER.
2045
2046 Arguments:
2047   host            connected host, if client; NULL if server
2048   ob              tranport options block, if client; NULL if server
2049   require_ciphers tls_require_ciphers setting
2050   caller_state    returned state-info structure
2051   errstr          error string pointer
2052
2053 Returns:          OK/DEFER/FAIL
2054 */
2055
2056 static int
2057 tls_init(
2058     const host_item *host,
2059     smtp_transport_options_block * ob,
2060     const uschar * require_ciphers,
2061     exim_gnutls_state_st **caller_state,
2062     tls_support * tlsp,
2063     uschar ** errstr)
2064 {
2065 exim_gnutls_state_st * state;
2066 int rc;
2067 size_t sz;
2068
2069 if (  !exim_gnutls_base_init_done
2070    && (rc = tls_g_init(errstr)) != OK)
2071   return rc;
2072
2073 if (host)
2074   {
2075   /* For client-side sessions we allocate a context. This lets us run
2076   several in parallel. */
2077
2078   int old_pool = store_pool;
2079   store_pool = POOL_PERM;
2080   state = store_get(sizeof(exim_gnutls_state_st), GET_UNTAINTED);
2081   store_pool = old_pool;
2082
2083   memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
2084   state->lib_state = ob->tls_preload;
2085   state->tlsp = tlsp;
2086   DEBUG(D_tls) debug_printf("initialising GnuTLS client session\n");
2087   rc = gnutls_init(&state->session, GNUTLS_CLIENT);
2088
2089   state->tls_certificate =      ob->tls_certificate;
2090   state->tls_privatekey =       ob->tls_privatekey;
2091   state->tls_sni =              ob->tls_sni;
2092   state->tls_verify_certificates = ob->tls_verify_certificates;
2093   state->tls_crl =              ob->tls_crl;
2094   }
2095 else
2096   {
2097   /* Server operations always use the one state_server context.  It is not
2098   shared because we have forked a fresh process for every receive.  However it
2099   can get re-used for successive TLS sessions on a single TCP connection. */
2100
2101   state = &state_server;
2102   state->tlsp = tlsp;
2103   DEBUG(D_tls) debug_printf("initialising GnuTLS server session\n");
2104   rc = gnutls_init(&state->session, GNUTLS_SERVER);
2105
2106   state->tls_certificate =      tls_certificate;
2107   state->tls_privatekey =       tls_privatekey;
2108   state->tls_sni =              NULL;
2109   state->tls_verify_certificates = tls_verify_certificates;
2110   state->tls_crl =              tls_crl;
2111   }
2112 if (rc)
2113   return tls_error_gnu(state, US"gnutls_init", rc, errstr);
2114
2115 state->tls_require_ciphers =    require_ciphers;
2116 state->host = host;
2117
2118 /* This handles the variables that might get re-expanded after TLS SNI;
2119 tls_certificate, tls_privatekey, tls_verify_certificates, tls_crl */
2120
2121 DEBUG(D_tls)
2122   debug_printf("Expanding various TLS configuration options for session credentials\n");
2123 if ((rc = tls_expand_session_files(state, errstr)) != OK) return rc;
2124
2125 /* These are all other parts of the x509_cred handling, since SNI in GnuTLS
2126 requires a new structure afterwards. */
2127
2128 if ((rc = tls_set_remaining_x509(state, errstr)) != OK) return rc;
2129
2130 /* set SNI in client, only */
2131 if (host)
2132   {
2133   if (!expand_check(state->tls_sni, US"tls_out_sni", &state->tlsp->sni, errstr))
2134     return DEFER;
2135   if (state->tlsp->sni && *state->tlsp->sni)
2136     {
2137     DEBUG(D_tls)
2138       debug_printf("Setting TLS client SNI to \"%s\"\n", state->tlsp->sni);
2139     sz = Ustrlen(state->tlsp->sni);
2140     if ((rc = gnutls_server_name_set(state->session,
2141           GNUTLS_NAME_DNS, state->tlsp->sni, sz)))
2142       return tls_error_gnu(state, US"gnutls_server_name_set", rc, errstr);
2143     }
2144   }
2145 else if (state->tls_sni)
2146   DEBUG(D_tls) debug_printf("*** PROBABLY A BUG *** " \
2147       "have an SNI set for a server [%s]\n", state->tls_sni);
2148
2149 if (!state->lib_state.pri_string)
2150   {
2151   const uschar * p = NULL;
2152   const char * errpos;
2153
2154   /* This is the priority string support,
2155   http://www.gnutls.org/manual/html_node/Priority-Strings.html
2156   and replaces gnutls_require_kx, gnutls_require_mac & gnutls_require_protocols.
2157   This was backwards incompatible, but means Exim no longer needs to track
2158   all algorithms and provide string forms for them. */
2159
2160   if (state->tls_require_ciphers && *state->tls_require_ciphers)
2161     {
2162     if (!Expand_check_tlsvar(tls_require_ciphers, errstr))
2163       return DEFER;
2164     if (state->exp_tls_require_ciphers && *state->exp_tls_require_ciphers)
2165       {
2166       p = state->exp_tls_require_ciphers;
2167       DEBUG(D_tls) debug_printf("GnuTLS session cipher/priority \"%s\"\n", p);
2168       }
2169     }
2170
2171   if ((rc = creds_load_pristring(state, p, &errpos)))
2172     return tls_error_gnu(state, string_sprintf(
2173                         "gnutls_priority_init(%s) failed at offset %ld, \"%.6s..\"",
2174                         p, (long)(errpos - CS p), errpos),
2175                     rc, errstr);
2176   }
2177 else
2178   {
2179   DEBUG(D_tls) debug_printf("cipher list preloaded\n");
2180   state->exp_tls_require_ciphers = US state->tls_require_ciphers;
2181   }
2182
2183
2184 if ((rc = gnutls_priority_set(state->session, state->lib_state.pri_cache)))
2185   return tls_error_gnu(state, US"gnutls_priority_set", rc, errstr);
2186
2187 /* This also sets the server ticket expiration time to the same, and
2188 the STEK rotation time to 3x. */
2189
2190 gnutls_db_set_cache_expiration(state->session, ssl_session_timeout);
2191
2192 /* Reduce security in favour of increased compatibility, if the admin
2193 decides to make that trade-off. */
2194 if (gnutls_compat_mode)
2195   {
2196 #if LIBGNUTLS_VERSION_NUMBER >= 0x020104
2197   DEBUG(D_tls) debug_printf("lowering GnuTLS security, compatibility mode\n");
2198   gnutls_session_enable_compatibility_mode(state->session);
2199 #else
2200   DEBUG(D_tls) debug_printf("Unable to set gnutls_compat_mode - GnuTLS version too old\n");
2201 #endif
2202   }
2203
2204 *caller_state = state;
2205 return OK;
2206 }
2207
2208
2209
2210 /*************************************************
2211 *            Extract peer information            *
2212 *************************************************/
2213
2214 static const uschar *
2215 cipher_stdname_kcm(gnutls_kx_algorithm_t kx, gnutls_cipher_algorithm_t cipher,
2216   gnutls_mac_algorithm_t mac)
2217 {
2218 uschar cs_id[2];
2219 gnutls_kx_algorithm_t kx_i;
2220 gnutls_cipher_algorithm_t cipher_i;
2221 gnutls_mac_algorithm_t mac_i;
2222
2223 for (size_t i = 0;
2224      gnutls_cipher_suite_info(i, cs_id, &kx_i, &cipher_i, &mac_i, NULL);
2225      i++)
2226   if (kx_i == kx && cipher_i == cipher && mac_i == mac)
2227     return cipher_stdname(cs_id[0], cs_id[1]);
2228 return NULL;
2229 }
2230
2231
2232
2233 /* Called from both server and client code.
2234 Only this is allowed to set state->peerdn and state->have_set_peerdn
2235 and we use that to detect double-calls.
2236
2237 NOTE: the state blocks last while the TLS connection is up, which is fine
2238 for logging in the server side, but for the client side, we log after teardown
2239 in src/deliver.c.  While the session is up, we can twist about states and
2240 repoint tls_* globals, but those variables used for logging or other variable
2241 expansion that happens _after_ delivery need to have a longer life-time.
2242
2243 So for those, we get the data from POOL_PERM; the re-invoke guard keeps us from
2244 doing this more than once per generation of a state context.  We set them in
2245 the state context, and repoint tls_* to them.  After the state goes away, the
2246 tls_* copies of the pointers remain valid and client delivery logging is happy.
2247
2248 tls_certificate_verified is a BOOL, so the tls_peerdn and tls_cipher issues
2249 don't apply.
2250
2251 Arguments:
2252   state           exim_gnutls_state_st *
2253   errstr          pointer to error string
2254
2255 Returns:          OK/DEFER/FAIL
2256 */
2257
2258 static int
2259 peer_status(exim_gnutls_state_st * state, uschar ** errstr)
2260 {
2261 gnutls_session_t session = state->session;
2262 const gnutls_datum_t * cert_list;
2263 int old_pool, rc;
2264 unsigned int cert_list_size = 0;
2265 gnutls_protocol_t protocol;
2266 gnutls_cipher_algorithm_t cipher;
2267 gnutls_kx_algorithm_t kx;
2268 gnutls_mac_algorithm_t mac;
2269 gnutls_certificate_type_t ct;
2270 gnutls_x509_crt_t crt;
2271 uschar * dn_buf;
2272 size_t sz;
2273
2274 if (state->have_set_peerdn)
2275   return OK;
2276 state->have_set_peerdn = TRUE;
2277
2278 state->peerdn = NULL;
2279
2280 /* tls_cipher */
2281 cipher = gnutls_cipher_get(session);
2282 protocol = gnutls_protocol_get_version(session);
2283 mac = gnutls_mac_get(session);
2284 kx =
2285 #ifdef GNUTLS_TLS1_3
2286     protocol >= GNUTLS_TLS1_3 ? 0 :
2287 #endif
2288   gnutls_kx_get(session);
2289
2290 old_pool = store_pool;
2291   {
2292   tls_support * tlsp = state->tlsp;
2293   store_pool = POOL_PERM;
2294
2295 #ifdef SUPPORT_GNUTLS_SESS_DESC
2296     {
2297     gstring * g = NULL;
2298     uschar * s = US gnutls_session_get_desc(session), c;
2299
2300     /* Nikos M suggests we use this by preference.  It returns like:
2301     (TLS1.3)-(ECDHE-SECP256R1)-(RSA-PSS-RSAE-SHA256)-(AES-256-GCM)
2302
2303     For partial back-compat, put a colon after the TLS version, replace the
2304     )-( grouping with __, replace in-group - with _ and append the :keysize. */
2305
2306     /* debug_printf("peer_status: gnutls_session_get_desc %s\n", s); */
2307
2308     for (s++; (c = *s) && c != ')'; s++) g = string_catn(g, s, 1);
2309
2310     tlsp->ver = string_copy_from_gstring(g);
2311     for (uschar * p = US tlsp->ver; *p; p++)
2312       if (*p == '-') { *p = '\0'; break; }      /* TLS1.0-PKIX -> TLS1.0 */
2313
2314     g = string_catn(g, US":", 1);
2315     if (*s) s++;                /* now on _ between groups */
2316     while ((c = *s))
2317       {
2318       if (*++s)
2319         for (++s; (c = *s) && c != ')'; s++)
2320           g = string_catn(g, c == '-' ? US"_" : s, 1);
2321       /* now on ) closing group */
2322       if ((c = *s) && *++s == '-') g = string_catn(g, US"__", 2);
2323       /* now on _ between groups */
2324       }
2325     g = string_catn(g, US":", 1);
2326     g = string_cat(g, string_sprintf("%d", (int) gnutls_cipher_get_key_size(cipher) * 8));
2327     state->ciphersuite = string_from_gstring(g);
2328     }
2329 #else
2330   state->ciphersuite = string_sprintf("%s:%s:%d",
2331       gnutls_protocol_get_name(protocol),
2332       gnutls_cipher_suite_get_name(kx, cipher, mac),
2333       (int) gnutls_cipher_get_key_size(cipher) * 8);
2334
2335   /* I don't see a way that spaces could occur, in the current GnuTLS
2336   code base, but it was a concern in the old code and perhaps older GnuTLS
2337   releases did return "TLS 1.0"; play it safe, just in case. */
2338
2339   for (uschar * p = state->ciphersuite; *p; p++) if (isspace(*p)) *p = '-';
2340   tlsp->ver = string_copyn(state->ciphersuite,
2341                         Ustrchr(state->ciphersuite, ':') - state->ciphersuite);
2342 #endif
2343
2344 /* debug_printf("peer_status: ciphersuite %s\n", state->ciphersuite); */
2345
2346   tlsp->cipher = state->ciphersuite;
2347   tlsp->bits = gnutls_cipher_get_key_size(cipher) * 8;
2348
2349   tlsp->cipher_stdname = cipher_stdname_kcm(kx, cipher, mac);
2350   }
2351 store_pool = old_pool;
2352
2353 /* tls_peerdn */
2354 cert_list = gnutls_certificate_get_peers(session, &cert_list_size);
2355
2356 if (!cert_list || cert_list_size == 0)
2357   {
2358   DEBUG(D_tls) debug_printf("TLS: no certificate from peer (%p & %d)\n",
2359       cert_list, cert_list_size);
2360   if (state->verify_requirement >= VERIFY_REQUIRED)
2361     return tls_error(US"certificate verification failed",
2362         US"no certificate received from peer", state->host, errstr);
2363   return OK;
2364   }
2365
2366 if ((ct = gnutls_certificate_type_get(session)) != GNUTLS_CRT_X509)
2367   {
2368   const uschar * ctn = US gnutls_certificate_type_get_name(ct);
2369   DEBUG(D_tls)
2370     debug_printf("TLS: peer cert not X.509 but instead \"%s\"\n", ctn);
2371   if (state->verify_requirement >= VERIFY_REQUIRED)
2372     return tls_error(US"certificate verification not possible, unhandled type",
2373         ctn, state->host, errstr);
2374   return OK;
2375   }
2376
2377 #define exim_gnutls_peer_err(Label) \
2378   do { \
2379     if (rc != GNUTLS_E_SUCCESS) \
2380       { \
2381       DEBUG(D_tls) debug_printf("TLS: peer cert problem: %s: %s\n", \
2382         (Label), gnutls_strerror(rc)); \
2383       if (state->verify_requirement >= VERIFY_REQUIRED) \
2384         return tls_error_gnu(state, (Label), rc, errstr); \
2385       return OK; \
2386       } \
2387     } while (0)
2388
2389 rc = import_cert(&cert_list[0], &crt);
2390 exim_gnutls_peer_err(US"cert 0");
2391
2392 state->tlsp->peercert = state->peercert = crt;
2393
2394 sz = 0;
2395 rc = gnutls_x509_crt_get_dn(crt, NULL, &sz);
2396 if (rc != GNUTLS_E_SHORT_MEMORY_BUFFER)
2397   {
2398   exim_gnutls_peer_err(US"getting size for cert DN failed");
2399   return FAIL; /* should not happen */
2400   }
2401 dn_buf = store_get_perm(sz, GET_TAINTED);
2402 rc = gnutls_x509_crt_get_dn(crt, CS dn_buf, &sz);
2403 exim_gnutls_peer_err(US"failed to extract certificate DN [gnutls_x509_crt_get_dn(cert 0)]");
2404
2405 state->peerdn = dn_buf;
2406
2407 return OK;
2408 #undef exim_gnutls_peer_err
2409 }
2410
2411
2412
2413
2414 /*************************************************
2415 *            Verify peer certificate             *
2416 *************************************************/
2417
2418 /* Called from both server and client code.
2419 *Should* be using a callback registered with
2420 gnutls_certificate_set_verify_function() to fail the handshake if we dislike
2421 the peer information, but that's too new for some OSes.
2422
2423 Arguments:
2424   state         exim_gnutls_state_st *
2425   errstr        where to put an error message
2426
2427 Returns:
2428   FALSE     if the session should be rejected
2429   TRUE      if the cert is okay or we just don't care
2430 */
2431
2432 static BOOL
2433 verify_certificate(exim_gnutls_state_st * state, uschar ** errstr)
2434 {
2435 int rc;
2436 uint verify;
2437
2438 DEBUG(D_tls) debug_printf("TLS: checking peer certificate\n");
2439 *errstr = NULL;
2440 rc = peer_status(state, errstr);
2441
2442 if (state->verify_requirement == VERIFY_NONE)
2443   return TRUE;
2444
2445 if (rc != OK || !state->peerdn)
2446   {
2447   verify = GNUTLS_CERT_INVALID;
2448   *errstr = US"certificate not supplied";
2449   }
2450 else
2451
2452   {
2453 #ifdef SUPPORT_DANE
2454   if (state->verify_requirement == VERIFY_DANE && state->host)
2455     {
2456     /* Using dane_verify_session_crt() would be easy, as it does it all for us
2457     including talking to a DNS resolver.  But we want to do that bit ourselves
2458     as the testsuite intercepts and fakes its own DNS environment. */
2459
2460     dane_state_t s;
2461     dane_query_t r;
2462     uint lsize;
2463     const gnutls_datum_t * certlist =
2464       gnutls_certificate_get_peers(state->session, &lsize);
2465     int usage = tls_out.tlsa_usage;
2466
2467 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
2468     /* Split the TLSA records into two sets, TA and EE selectors.  Run the
2469     dane-verification separately so that we know which selector verified;
2470     then we know whether to do name-verification (needed for TA but not EE). */
2471
2472     if (usage == ((1<<DANESSL_USAGE_DANE_TA) | (1<<DANESSL_USAGE_DANE_EE)))
2473       {                                         /* a mixed-usage bundle */
2474       int i, j, nrec;
2475       const char ** dd;
2476       int * ddl;
2477
2478       for (nrec = 0; state->dane_data_len[nrec]; ) nrec++;
2479       nrec++;
2480
2481       dd = store_get(nrec * sizeof(uschar *), GET_UNTAINTED);
2482       ddl = store_get(nrec * sizeof(int), GET_UNTAINTED);
2483       nrec--;
2484
2485       if ((rc = dane_state_init(&s, 0)))
2486         goto tlsa_prob;
2487
2488       for (usage = DANESSL_USAGE_DANE_EE;
2489            usage >= DANESSL_USAGE_DANE_TA; usage--)
2490         {                               /* take records with this usage */
2491         for (j = i = 0; i < nrec; i++)
2492           if (state->dane_data[i][0] == usage)
2493             {
2494             dd[j] = state->dane_data[i];
2495             ddl[j++] = state->dane_data_len[i];
2496             }
2497         if (j)
2498           {
2499           dd[j] = NULL;
2500           ddl[j] = 0;
2501
2502           if ((rc = dane_raw_tlsa(s, &r, (char * const *)dd, ddl, 1, 0)))
2503             goto tlsa_prob;
2504
2505           if ((rc = dane_verify_crt_raw(s, certlist, lsize,
2506                             gnutls_certificate_type_get(state->session),
2507                             r, 0,
2508                             usage == DANESSL_USAGE_DANE_EE
2509                             ? DANE_VFLAG_ONLY_CHECK_EE_USAGE : 0,
2510                             &verify)))
2511             {
2512             DEBUG(D_tls)
2513               debug_printf("TLSA record problem: %s\n", dane_strerror(rc));
2514             }
2515           else if (verify == 0) /* verification passed */
2516             {
2517             usage = 1 << usage;
2518             break;
2519             }
2520           }
2521         }
2522
2523         if (rc) goto tlsa_prob;
2524       }
2525     else
2526 # endif
2527       {
2528       if (  (rc = dane_state_init(&s, 0))
2529          || (rc = dane_raw_tlsa(s, &r, state->dane_data, state->dane_data_len,
2530                         1, 0))
2531          || (rc = dane_verify_crt_raw(s, certlist, lsize,
2532                         gnutls_certificate_type_get(state->session),
2533                         r, 0,
2534 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
2535                         usage == (1 << DANESSL_USAGE_DANE_EE)
2536                         ? DANE_VFLAG_ONLY_CHECK_EE_USAGE : 0,
2537 # else
2538                         0,
2539 # endif
2540                         &verify))
2541          )
2542         goto tlsa_prob;
2543       }
2544
2545     if (verify != 0)            /* verification failed */
2546       {
2547       gnutls_datum_t str;
2548       (void) dane_verification_status_print(verify, &str, 0);
2549       *errstr = US str.data;    /* don't bother to free */
2550       goto badcert;
2551       }
2552
2553 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
2554     /* If a TA-mode TLSA record was used for verification we must additionally
2555     verify the cert name (but not the CA chain).  For EE-mode, skip it. */
2556
2557     if (usage & (1 << DANESSL_USAGE_DANE_EE))
2558 # endif
2559       {
2560       state->peer_dane_verified = state->peer_cert_verified = TRUE;
2561       goto goodcert;
2562       }
2563 # ifdef GNUTLS_BROKEN_DANE_VALIDATION
2564     /* Assume that the name on the A-record is the one that should be matching
2565     the cert.  An alternate view is that the domain part of the email address
2566     is also permissible. */
2567
2568     if (gnutls_x509_crt_check_hostname(state->tlsp->peercert,
2569           CS state->host->name))
2570       {
2571       state->peer_dane_verified = state->peer_cert_verified = TRUE;
2572       goto goodcert;
2573       }
2574 # endif
2575     }
2576 #endif  /*SUPPORT_DANE*/
2577
2578   rc = gnutls_certificate_verify_peers2(state->session, &verify);
2579   }
2580
2581 /* Handle the result of verification. INVALID is set if any others are. */
2582
2583 if (rc < 0 || verify & (GNUTLS_CERT_INVALID|GNUTLS_CERT_REVOKED))
2584   {
2585   state->peer_cert_verified = FALSE;
2586   if (!*errstr)
2587     {
2588 #ifdef GNUTLS_CERT_VFY_STATUS_PRINT
2589     DEBUG(D_tls)
2590       {
2591       gnutls_datum_t txt;
2592
2593       if (gnutls_certificate_verification_status_print(verify,
2594             gnutls_certificate_type_get(state->session), &txt, 0)
2595           == GNUTLS_E_SUCCESS)
2596         {
2597         debug_printf("%s\n", txt.data);
2598         gnutls_free(txt.data);
2599         }
2600       }
2601 #endif
2602     *errstr = verify & GNUTLS_CERT_REVOKED
2603       ? US"certificate revoked" : US"certificate invalid";
2604     }
2605
2606   DEBUG(D_tls)
2607     debug_printf("TLS certificate verification failed (%s): peerdn=\"%s\"\n",
2608         *errstr, state->peerdn ? state->peerdn : US"<unset>");
2609
2610   if (state->verify_requirement >= VERIFY_REQUIRED)
2611     goto badcert;
2612   DEBUG(D_tls)
2613     debug_printf("TLS verify failure overridden (host in tls_try_verify_hosts)\n");
2614   }
2615
2616 else
2617   {
2618   /* Client side, check the server's certificate name versus the name on the
2619   A-record for the connection we made.  What to do for server side - what name
2620   to use for client?  We document that there is no such checking for server
2621   side. */
2622
2623   if (  state->exp_tls_verify_cert_hostnames
2624      && !gnutls_x509_crt_check_hostname(state->tlsp->peercert,
2625                 CS state->exp_tls_verify_cert_hostnames)
2626      )
2627     {
2628     DEBUG(D_tls)
2629       debug_printf("TLS certificate verification failed: cert name mismatch (per GnuTLS)\n");
2630     if (state->verify_requirement >= VERIFY_REQUIRED)
2631       goto badcert;
2632     return TRUE;
2633     }
2634
2635   state->peer_cert_verified = TRUE;
2636   DEBUG(D_tls) debug_printf("TLS certificate verified: peerdn=\"%s\"\n",
2637       state->peerdn ? state->peerdn : US"<unset>");
2638   }
2639
2640 goodcert:
2641   state->tlsp->peerdn = state->peerdn;
2642   return TRUE;
2643
2644 #ifdef SUPPORT_DANE
2645 tlsa_prob:
2646   *errstr = string_sprintf("TLSA record problem: %s",
2647     rc == DANE_E_REQUESTED_DATA_NOT_AVAILABLE ? "none usable" : dane_strerror(rc));
2648 #endif
2649
2650 badcert:
2651   gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_BAD_CERTIFICATE);
2652   return FALSE;
2653 }
2654
2655
2656
2657
2658 /* ------------------------------------------------------------------------ */
2659 /* Callbacks */
2660
2661 /* Logging function which can be registered with
2662  *   gnutls_global_set_log_function()
2663  *   gnutls_global_set_log_level() 0..9
2664  */
2665 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
2666 static void
2667 exim_gnutls_logger_cb(int level, const char *message)
2668 {
2669   size_t len = strlen(message);
2670   if (len < 1)
2671     {
2672     DEBUG(D_tls) debug_printf("GnuTLS<%d> empty debug message\n", level);
2673     return;
2674     }
2675   DEBUG(D_tls) debug_printf("GnuTLS<%d>: %s%s", level, message,
2676       message[len-1] == '\n' ? "" : "\n");
2677 }
2678 #endif
2679
2680
2681 /* Called after client hello, should handle SNI work.
2682 This will always set tls_sni (state->received_sni) if available,
2683 and may trigger presenting different certificates,
2684 if state->trigger_sni_changes is TRUE.
2685
2686 Should be registered with
2687   gnutls_handshake_set_post_client_hello_function()
2688
2689 "This callback must return 0 on success or a gnutls error code to terminate the
2690 handshake.".
2691
2692 For inability to get SNI information, we return 0.
2693 We only return non-zero if re-setup failed.
2694 Only used for server-side TLS.
2695 */
2696
2697 static int
2698 exim_sni_handling_cb(gnutls_session_t session)
2699 {
2700 char sni_name[MAX_HOST_LEN];
2701 size_t data_len = MAX_HOST_LEN;
2702 exim_gnutls_state_st *state = &state_server;
2703 unsigned int sni_type;
2704 int rc, old_pool;
2705 uschar * dummy_errstr;
2706
2707 rc = gnutls_server_name_get(session, sni_name, &data_len, &sni_type, 0);
2708 if (rc != GNUTLS_E_SUCCESS)
2709   {
2710   DEBUG(D_tls)
2711     if (rc == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
2712       debug_printf("TLS: no SNI presented in handshake\n");
2713     else
2714       debug_printf("TLS failure: gnutls_server_name_get(): %s [%d]\n",
2715         gnutls_strerror(rc), rc);
2716   return 0;
2717   }
2718
2719 if (sni_type != GNUTLS_NAME_DNS)
2720   {
2721   DEBUG(D_tls) debug_printf("TLS: ignoring SNI of unhandled type %u\n", sni_type);
2722   return 0;
2723   }
2724
2725 /* We now have a UTF-8 string in sni_name */
2726 old_pool = store_pool;
2727 store_pool = POOL_PERM;
2728 state->received_sni = string_copy_taint(US sni_name, GET_TAINTED);
2729 store_pool = old_pool;
2730
2731 /* We set this one now so that variable expansions below will work */
2732 state->tlsp->sni = state->received_sni;
2733
2734 DEBUG(D_tls) debug_printf("Received TLS SNI \"%s\"%s\n", sni_name,
2735     state->trigger_sni_changes ? "" : " (unused for certificate selection)");
2736
2737 if (!state->trigger_sni_changes)
2738   return 0;
2739
2740 if ((rc = tls_expand_session_files(state, &dummy_errstr)) != OK)
2741   {
2742   /* If the setup of certs/etc failed before handshake, TLS would not have
2743   been offered.  The best we can do now is abort. */
2744   DEBUG(D_tls) debug_printf("expansion for SNI-dependent session files failed\n");
2745   return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE;
2746   }
2747
2748 rc = tls_set_remaining_x509(state, &dummy_errstr);
2749 if (rc != OK) return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE;
2750
2751 return 0;
2752 }
2753
2754
2755
2756 #ifndef DISABLE_EVENT
2757 /*
2758 We use this callback to get observability and detail-level control
2759 for an exim TLS connection (either direction), raising a tls:cert event
2760 for each cert in the chain presented by the peer.  Any event
2761 can deny verification.
2762
2763 Return 0 for the handshake to continue or non-zero to terminate.
2764 */
2765
2766 static int
2767 verify_cb(gnutls_session_t session)
2768 {
2769 const gnutls_datum_t * cert_list;
2770 unsigned int cert_list_size = 0;
2771 gnutls_x509_crt_t crt;
2772 int rc;
2773 uschar * yield;
2774 exim_gnutls_state_st * state = gnutls_session_get_ptr(session);
2775
2776 if ((cert_list = gnutls_certificate_get_peers(session, &cert_list_size)))
2777   while (cert_list_size--)
2778     {
2779     if ((rc = import_cert(&cert_list[cert_list_size], &crt)) != GNUTLS_E_SUCCESS)
2780       {
2781       DEBUG(D_tls) debug_printf("TLS: peer cert problem: depth %d: %s\n",
2782         cert_list_size, gnutls_strerror(rc));
2783       break;
2784       }
2785
2786     state->tlsp->peercert = crt;
2787     if ((yield = event_raise(state->event_action,
2788                 US"tls:cert", string_sprintf("%d", cert_list_size), &errno)))
2789       {
2790       log_write(0, LOG_MAIN,
2791                 "SSL verify denied by event-action: depth=%d: %s",
2792                 cert_list_size, yield);
2793       return 1;                     /* reject */
2794       }
2795     state->tlsp->peercert = NULL;
2796     }
2797
2798 return 0;
2799 }
2800
2801 #endif
2802
2803
2804 static gstring *
2805 ddump(gnutls_datum_t * d)
2806 {
2807 gstring * g = string_get((d->size+1) * 2);
2808 uschar * s = d->data;
2809 for (unsigned i = d->size; i > 0; i--, s++)
2810   {
2811   g = string_catn(g, US "0123456789abcdef" + (*s >> 4), 1);
2812   g = string_catn(g, US "0123456789abcdef" + (*s & 0xf), 1);
2813   }
2814 return g;
2815 }
2816
2817 static void
2818 post_handshake_debug(exim_gnutls_state_st * state)
2819 {
2820 #ifdef SUPPORT_GNUTLS_SESS_DESC
2821 debug_printf("%s\n", gnutls_session_get_desc(state->session));
2822 #endif
2823
2824 #ifdef SUPPORT_GNUTLS_KEYLOG
2825 # ifdef EXIM_HAVE_TLS1_3
2826 if (gnutls_protocol_get_version(state->session) < GNUTLS_TLS1_3)
2827 # else
2828 if (TRUE)
2829 # endif
2830   {
2831   gnutls_datum_t c, s;
2832   gstring * gc, * gs;
2833   /* For TLS1.2 we only want the client random and the master secret */
2834   gnutls_session_get_random(state->session, &c, &s);
2835   gnutls_session_get_master_secret(state->session, &s);
2836   gc = ddump(&c);
2837   gs = ddump(&s);
2838   debug_printf("CLIENT_RANDOM %.*s %.*s\n", (int)gc->ptr, gc->s, (int)gs->ptr, gs->s);
2839   }
2840 else
2841   debug_printf("To get keying info for TLS1.3 is hard:\n"
2842     " Set environment variable SSLKEYLOGFILE to a filename relative to the spool directory,\n"
2843     " and make sure it is writable by the Exim runtime user.\n"
2844     " Add SSLKEYLOGFILE to keep_environment in the exim config.\n"
2845     " Start Exim as root.\n"
2846     " If using sudo, add SSLKEYLOGFILE to env_keep in /etc/sudoers\n"
2847     " (works for TLS1.2 also, and saves cut-paste into file).\n"
2848     " Trying to use add_environment for this will not work\n");
2849 #endif
2850 }
2851
2852
2853 #ifdef EXIM_HAVE_TLS_RESUME
2854 static int
2855 tls_server_ticket_cb(gnutls_session_t sess, u_int htype, unsigned when,
2856   unsigned incoming, const gnutls_datum_t * msg)
2857 {
2858 DEBUG(D_tls) debug_printf("newticket cb (on server)\n");
2859 tls_in.resumption |= RESUME_CLIENT_REQUESTED;
2860 return 0;
2861 }
2862
2863 static void
2864 tls_server_resume_prehandshake(exim_gnutls_state_st * state)
2865 {
2866 /* Should the server offer session resumption? */
2867 tls_in.resumption = RESUME_SUPPORTED;
2868 if (verify_check_host(&tls_resumption_hosts) == OK)
2869   {
2870   int rc;
2871   /* GnuTLS appears to not do ticket overlap, but does emit a fresh ticket when
2872   an offered resumption is unacceptable.  We lose one resumption per ticket
2873   lifetime, and sessions cannot be indefinitely re-used.  There seems to be no
2874   way (3.6.7) of changing the default number of 2 TLS1.3 tickets issued, but at
2875   least they go out in a single packet. */
2876
2877   if (!(rc = gnutls_session_ticket_enable_server(state->session,
2878               &server_sessticket_key)))
2879     tls_in.resumption |= RESUME_SERVER_TICKET;
2880   else
2881     DEBUG(D_tls)
2882       debug_printf("enabling session tickets: %s\n", US gnutls_strerror(rc));
2883
2884   /* Try to tell if we see a ticket request */
2885   gnutls_handshake_set_hook_function(state->session,
2886     GNUTLS_HANDSHAKE_ANY, GNUTLS_HOOK_POST, tls_server_hook_cb);
2887   }
2888 }
2889
2890 static void
2891 tls_server_resume_posthandshake(exim_gnutls_state_st * state)
2892 {
2893 if (gnutls_session_resumption_requested(state->session))
2894   {
2895   /* This tells us the client sent a full (?) ticket.  We use a
2896   callback on session-ticket request, elsewhere, to tell
2897   if a client asked for a ticket.
2898   XXX As of GnuTLS 3.0.1 it seems to be returning true even for
2899   a pure ticket-req (a zero-length Session Ticket extension
2900   in the Client Hello, for 1.2) which mucks up our logic. */
2901
2902   tls_in.resumption |= RESUME_CLIENT_SUGGESTED;
2903   DEBUG(D_tls) debug_printf("client requested resumption\n");
2904   }
2905 if (gnutls_session_is_resumed(state->session))
2906   {
2907   tls_in.resumption |= RESUME_USED;
2908   DEBUG(D_tls) debug_printf("Session resumed\n");
2909   }
2910 }
2911 #endif  /* EXIM_HAVE_TLS_RESUME */
2912
2913
2914 #ifdef EXIM_HAVE_ALPN
2915 /* Expand and convert an Exim list to a gnutls_datum list.  False return for fail.
2916 NULL plist return for silent no-ALPN.
2917 */
2918
2919 static BOOL
2920 tls_alpn_plist(uschar ** tls_alpn, const gnutls_datum_t ** plist, unsigned * plen,
2921   uschar ** errstr)
2922 {
2923 uschar * exp_alpn;
2924
2925 if (!expand_check(*tls_alpn, US"tls_alpn", &exp_alpn, errstr))
2926   return FALSE;
2927
2928 if (!exp_alpn)
2929   {
2930   DEBUG(D_tls) debug_printf("Setting TLS ALPN forced to fail, not sending\n");
2931   *plist = NULL;
2932   }
2933 else
2934   {
2935   const uschar * list = exp_alpn;
2936   int sep = 0;
2937   unsigned cnt = 0;
2938   gnutls_datum_t * p;
2939   uschar * s;
2940
2941   while (string_nextinlist(&list, &sep, NULL, 0)) cnt++;
2942
2943   p = store_get(sizeof(gnutls_datum_t) * cnt, exp_alpn);
2944   list = exp_alpn;
2945   for (int i = 0; s = string_nextinlist(&list, &sep, NULL, 0); i++)
2946     { p[i].data = s; p[i].size = Ustrlen(s); }
2947   *plist = (*plen = cnt) ? p : NULL;
2948   }
2949 return TRUE;
2950 }
2951
2952 static void
2953 tls_server_set_acceptable_alpns(exim_gnutls_state_st * state, uschar ** errstr)
2954 {
2955 uschar * local_alpn = string_copy(tls_alpn);
2956 int rc;
2957 const gnutls_datum_t * plist;
2958 unsigned plen;
2959
2960 if (tls_alpn_plist(&local_alpn, &plist, &plen, errstr) && plist)
2961   {
2962   /* This seems to be only mandatory if the client sends an ALPN extension;
2963   not trying ALPN is ok. Need to decide how to support server-side must-alpn. */
2964
2965   server_seen_alpn = 0;
2966   if (!(rc = gnutls_alpn_set_protocols(state->session, plist, plen,
2967                                         GNUTLS_ALPN_MANDATORY)))
2968     gnutls_handshake_set_hook_function(state->session,
2969       GNUTLS_HANDSHAKE_ANY, GNUTLS_HOOK_POST, tls_server_hook_cb);
2970   else
2971     DEBUG(D_tls)
2972       debug_printf("setting alpn protocols: %s\n", US gnutls_strerror(rc));
2973   }
2974 }
2975 #endif  /* EXIM_HAVE_ALPN */
2976
2977 /* ------------------------------------------------------------------------ */
2978 /* Exported functions */
2979
2980
2981
2982
2983 /*************************************************
2984 *       Start a TLS session in a server          *
2985 *************************************************/
2986
2987 /* This is called when Exim is running as a server, after having received
2988 the STARTTLS command. It must respond to that command, and then negotiate
2989 a TLS session.
2990
2991 Arguments:
2992   errstr           pointer to error string
2993
2994 Returns:           OK on success
2995                    DEFER for errors before the start of the negotiation
2996                    FAIL for errors during the negotiation; the server can't
2997                      continue running.
2998 */
2999
3000 int
3001 tls_server_start(uschar ** errstr)
3002 {
3003 int rc;
3004 exim_gnutls_state_st * state = NULL;
3005
3006 /* Check for previous activation */
3007 if (tls_in.active.sock >= 0)
3008   {
3009   tls_error(US"STARTTLS received after TLS started", US "", NULL, errstr);
3010   smtp_printf("554 Already in TLS\r\n", SP_NO_MORE);
3011   return FAIL;
3012   }
3013
3014 /* Initialize the library. If it fails, it will already have logged the error
3015 and sent an SMTP response. */
3016
3017 DEBUG(D_tls) debug_printf("initialising GnuTLS as a server\n");
3018
3019   {
3020 #ifdef MEASURE_TIMING
3021   struct timeval t0;
3022   gettimeofday(&t0, NULL);
3023 #endif
3024
3025   if ((rc = tls_init(NULL, NULL,
3026       tls_require_ciphers, &state, &tls_in, errstr)) != OK) return rc;
3027
3028 #ifdef MEASURE_TIMING
3029   report_time_since(&t0, US"server tls_init (delta)");
3030 #endif
3031   }
3032
3033 #ifdef EXIM_HAVE_ALPN
3034 tls_server_set_acceptable_alpns(state, errstr);
3035 #endif
3036
3037 #ifdef EXIM_HAVE_TLS_RESUME
3038 tls_server_resume_prehandshake(state);
3039 #endif
3040
3041 /* If this is a host for which certificate verification is mandatory or
3042 optional, set up appropriately. */
3043
3044 if (verify_check_host(&tls_verify_hosts) == OK)
3045   {
3046   DEBUG(D_tls)
3047     debug_printf("TLS: a client certificate will be required\n");
3048   state->verify_requirement = VERIFY_REQUIRED;
3049   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
3050   }
3051 else if (verify_check_host(&tls_try_verify_hosts) == OK)
3052   {
3053   DEBUG(D_tls)
3054     debug_printf("TLS: a client certificate will be requested but not required\n");
3055   state->verify_requirement = VERIFY_OPTIONAL;
3056   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
3057   }
3058 else
3059   {
3060   DEBUG(D_tls)
3061     debug_printf("TLS: a client certificate will not be requested\n");
3062   state->verify_requirement = VERIFY_NONE;
3063   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
3064   }
3065
3066 #ifndef DISABLE_EVENT
3067 if (event_action)
3068   {
3069   state->event_action = event_action;
3070   gnutls_session_set_ptr(state->session, state);
3071   gnutls_certificate_set_verify_function(state->lib_state.x509_cred, verify_cb);
3072   }
3073 #endif
3074
3075 /* Register SNI handling; always, even if not in tls_certificate, so that the
3076 expansion variable $tls_sni is always available. */
3077
3078 gnutls_handshake_set_post_client_hello_function(state->session,
3079     exim_sni_handling_cb);
3080
3081 /* Set context and tell client to go ahead, except in the case of TLS startup
3082 on connection, where outputting anything now upsets the clients and tends to
3083 make them disconnect. We need to have an explicit fflush() here, to force out
3084 the response. Other smtp_printf() calls do not need it, because in non-TLS
3085 mode, the fflush() happens when smtp_getc() is called. */
3086
3087 if (!state->tlsp->on_connect)
3088   {
3089   smtp_printf("220 TLS go ahead\r\n", SP_NO_MORE);
3090   fflush(smtp_out);
3091   }
3092
3093 /* Now negotiate the TLS session. We put our own timer on it, since it seems
3094 that the GnuTLS library doesn't.
3095 From 3.1.0 there is gnutls_handshake_set_timeout() - but it requires you
3096 to set (and clear down afterwards) up a pull-timeout callback function that does
3097 a select, so we're no better off unless avoiding signals becomes an issue. */
3098
3099 gnutls_transport_set_ptr2(state->session,
3100     (gnutls_transport_ptr_t)(long) fileno(smtp_in),
3101     (gnutls_transport_ptr_t)(long) fileno(smtp_out));
3102 state->fd_in = fileno(smtp_in);
3103 state->fd_out = fileno(smtp_out);
3104
3105 sigalrm_seen = FALSE;
3106 if (smtp_receive_timeout > 0) ALARM(smtp_receive_timeout);
3107 do
3108   rc = gnutls_handshake(state->session);
3109 while (rc == GNUTLS_E_AGAIN ||  rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen);
3110 ALARM_CLR(0);
3111
3112 if (rc != GNUTLS_E_SUCCESS)
3113   {
3114   DEBUG(D_tls) debug_printf(" error %d from gnutls_handshake: %s\n",
3115     rc, gnutls_strerror(rc));
3116
3117   /* It seems that, except in the case of a timeout, we have to close the
3118   connection right here; otherwise if the other end is running OpenSSL it hangs
3119   until the server times out. */
3120
3121   if (sigalrm_seen)
3122     {
3123     tls_error(US"gnutls_handshake", US"timed out", NULL, errstr);
3124 #ifndef DISABLE_EVENT
3125     (void) event_raise(event_action, US"tls:fail:connect", *errstr, NULL);
3126 #endif
3127     gnutls_db_remove_session(state->session);
3128     }
3129   else
3130     {
3131     tls_error_gnu(state, US"gnutls_handshake", rc, errstr);
3132 #ifndef DISABLE_EVENT
3133     (void) event_raise(event_action, US"tls:fail:connect", *errstr, NULL);
3134 #endif
3135     (void) gnutls_alert_send_appropriate(state->session, rc);
3136     gnutls_deinit(state->session);
3137     millisleep(500);
3138     shutdown(state->fd_out, SHUT_WR);
3139     for (int i = 1024; fgetc(smtp_in) != EOF && i > 0; ) i--;   /* drain skt */
3140     (void)fclose(smtp_out);
3141     (void)fclose(smtp_in);
3142     smtp_out = smtp_in = NULL;
3143     }
3144
3145   return FAIL;
3146   }
3147
3148 #ifdef GNUTLS_SFLAGS_EXT_MASTER_SECRET
3149 if (gnutls_session_get_flags(state->session) & GNUTLS_SFLAGS_EXT_MASTER_SECRET)
3150   tls_in.ext_master_secret = TRUE;
3151 #endif
3152
3153 #ifdef EXIM_HAVE_TLS_RESUME
3154 tls_server_resume_posthandshake(state);
3155 #endif
3156
3157 DEBUG(D_tls) post_handshake_debug(state);
3158
3159 #ifdef EXIM_HAVE_ALPN
3160 if (server_seen_alpn > 0)
3161   {
3162   DEBUG(D_tls)
3163     {           /* The client offered ALPN.  See what was negotiated. */
3164     gnutls_datum_t p = {.size = 0};
3165     int rc = gnutls_alpn_get_selected_protocol(state->session, &p);
3166     if (!rc)
3167         debug_printf("ALPN negotiated: %.*s\n", (int)p.size, p.data);
3168     else
3169         debug_printf("getting alpn protocol: %s\n", US gnutls_strerror(rc));
3170
3171     }
3172   }
3173 else if (server_seen_alpn == 0)
3174   if (verify_check_host(&hosts_require_alpn) == OK)
3175     {
3176     gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_NO_APPLICATION_PROTOCOL);
3177     tls_error(US"handshake", US"ALPN required but not negotiated", NULL, errstr);
3178     return FAIL;
3179     }
3180   else
3181     DEBUG(D_tls) debug_printf("TLS: no ALPN presented in handshake\n");
3182 else
3183   DEBUG(D_tls) debug_printf("TLS: was not watching for ALPN\n");
3184 #endif
3185
3186 /* Verify after the fact */
3187
3188 if (!verify_certificate(state, errstr))
3189   {
3190   if (state->verify_requirement != VERIFY_OPTIONAL)
3191     {
3192     (void) tls_error(US"certificate verification failed", *errstr, NULL, errstr);
3193     return FAIL;
3194     }
3195   DEBUG(D_tls)
3196     debug_printf("TLS: continuing on only because verification was optional, after: %s\n",
3197         *errstr);
3198   }
3199
3200 /* Sets various Exim expansion variables; always safe within server */
3201
3202 extract_exim_vars_from_tls_state(state);
3203
3204 /* TLS has been set up. Adjust the input functions to read via TLS,
3205 and initialize appropriately. */
3206
3207 state->xfer_buffer = store_malloc(ssl_xfer_buffer_size);
3208
3209 receive_getc = tls_getc;
3210 receive_getbuf = tls_getbuf;
3211 receive_get_cache = tls_get_cache;
3212 receive_hasc = tls_hasc;
3213 receive_ungetc = tls_ungetc;
3214 receive_feof = tls_feof;
3215 receive_ferror = tls_ferror;
3216
3217 return OK;
3218 }
3219
3220
3221
3222
3223 static void
3224 tls_client_setup_hostname_checks(host_item * host, exim_gnutls_state_st * state,
3225   smtp_transport_options_block * ob)
3226 {
3227 if (verify_check_given_host(CUSS &ob->tls_verify_cert_hostnames, host) == OK)
3228   {
3229   state->exp_tls_verify_cert_hostnames =
3230 #ifdef SUPPORT_I18N
3231     string_domain_utf8_to_alabel(host->certname, NULL);
3232 #else
3233     host->certname;
3234 #endif
3235   DEBUG(D_tls)
3236     debug_printf("TLS: server cert verification includes hostname: \"%s\"\n",
3237                     state->exp_tls_verify_cert_hostnames);
3238   }
3239 }
3240
3241
3242
3243
3244 #ifdef SUPPORT_DANE
3245 /* Given our list of RRs from the TLSA lookup, build a lookup block in
3246 GnuTLS-DANE's preferred format.  Hang it on the state str for later
3247 use in DANE verification.
3248
3249 We point at the dnsa data not copy it, so it must remain valid until
3250 after verification is done.*/
3251
3252 static BOOL
3253 dane_tlsa_load(exim_gnutls_state_st * state, dns_answer * dnsa)
3254 {
3255 dns_scan dnss;
3256 int i;
3257 const char **   dane_data;
3258 int *           dane_data_len;
3259
3260 i = 1;
3261 for (dns_record * rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS); rr;
3262      rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)
3263     ) if (rr->type == T_TLSA) i++;
3264
3265 dane_data = store_get(i * sizeof(uschar *), GET_UNTAINTED);
3266 dane_data_len = store_get(i * sizeof(int), GET_UNTAINTED);
3267
3268 i = 0;
3269 for (dns_record * rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS); rr;
3270      rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)
3271     ) if (rr->type == T_TLSA && rr->size > 3)
3272   {
3273   const uschar * p = rr->data;
3274 /*XXX need somehow to mark rr and its data as tainted.  Doues this mean copying it? */
3275   uint8_t usage = p[0], sel = p[1], type = p[2];
3276
3277   DEBUG(D_tls)
3278     debug_printf("TLSA: %d %d %d size %d\n", usage, sel, type, rr->size);
3279
3280   if (  (usage != DANESSL_USAGE_DANE_TA && usage != DANESSL_USAGE_DANE_EE)
3281      || (sel != 0 && sel != 1)
3282      )
3283     continue;
3284   switch(type)
3285     {
3286     case 0:     /* Full: cannot check at present */
3287                 break;
3288     case 1:     if (rr->size != 3 + 256/8) continue;    /* sha2-256 */
3289                 break;
3290     case 2:     if (rr->size != 3 + 512/8) continue;    /* sha2-512 */
3291                 break;
3292     default:    continue;
3293     }
3294
3295   tls_out.tlsa_usage |= 1<<usage;
3296   dane_data[i] = CS p;
3297   dane_data_len[i++] = rr->size;
3298   }
3299
3300 if (!i) return FALSE;
3301
3302 dane_data[i] = NULL;
3303 dane_data_len[i] = 0;
3304
3305 state->dane_data = (char * const *)dane_data;
3306 state->dane_data_len = dane_data_len;
3307 return TRUE;
3308 }
3309 #endif
3310
3311
3312
3313 #ifdef EXIM_HAVE_TLS_RESUME
3314 /* On the client, get any stashed session for the given IP from hints db
3315 and apply it to the ssl-connection for attempted resumption.  Although
3316 there is a gnutls_session_ticket_enable_client() interface it is
3317 documented as unnecessary (as of 3.6.7) as "session tickets are emabled
3318 by deafult".  There seems to be no way to disable them, so even hosts not
3319 enabled by the transport option will be sent a ticket request.  We will
3320 however avoid storing and retrieving session information. */
3321
3322 static void
3323 tls_retrieve_session(tls_support * tlsp, gnutls_session_t session,
3324   smtp_connect_args * conn_args, smtp_transport_options_block * ob)
3325 {
3326 tlsp->resumption = RESUME_SUPPORTED;
3327
3328 if (!conn_args->have_lbserver)
3329   { DEBUG(D_tls) debug_printf(
3330       "resumption not supported: no LB detection done (continued-conn?)\n"); }
3331 else if (verify_check_given_host(CUSS &ob->tls_resumption_hosts, conn_args->host) == OK)
3332   {
3333   dbdata_tls_session * dt;
3334   int len, rc;
3335   open_db dbblock, * dbm_file;
3336
3337   tlsp->host_resumable = TRUE;
3338   tls_client_resmption_key(tlsp, conn_args, ob);
3339
3340   tlsp->resumption |= RESUME_CLIENT_REQUESTED;
3341   if ((dbm_file = dbfn_open(US"tls", O_RDONLY, &dbblock, FALSE, FALSE)))
3342     {
3343     /* We'd like to filter the retrieved session for ticket advisory expiry,
3344     but 3.6.1 seems to give no access to that */
3345
3346     if ((dt = dbfn_read_with_length(dbm_file, tlsp->resume_index, &len)))
3347       if (!(rc = gnutls_session_set_data(session,
3348                     CUS dt->session, (size_t)len - sizeof(dbdata_tls_session))))
3349         {
3350         DEBUG(D_tls) debug_printf("good session\n");
3351         tlsp->resumption |= RESUME_CLIENT_SUGGESTED;
3352         }
3353       else DEBUG(D_tls) debug_printf("setting session resumption data: %s\n",
3354             US gnutls_strerror(rc));
3355     dbfn_close(dbm_file);
3356     }
3357   }
3358 else DEBUG(D_tls) debug_printf("no resumption for this host\n");
3359 }
3360
3361
3362 static void
3363 tls_save_session(tls_support * tlsp, gnutls_session_t session, const host_item * host)
3364 {
3365 /* TLS 1.2 - we get both the callback and the direct posthandshake call,
3366 but this flag is not set until the second.  TLS 1.3 it's the other way about.
3367 Keep both calls as the session data cannot be extracted before handshake
3368 completes. */
3369
3370 if (gnutls_session_get_flags(session) & GNUTLS_SFLAGS_SESSION_TICKET)
3371   {
3372   gnutls_datum_t tkt;
3373   int rc;
3374
3375   DEBUG(D_tls) debug_printf("server offered session ticket\n");
3376   tlsp->ticket_received = TRUE;
3377   tlsp->resumption |= RESUME_SERVER_TICKET;
3378
3379   if (tlsp->host_resumable)
3380     if (!(rc = gnutls_session_get_data2(session, &tkt)))
3381       {
3382       open_db dbblock, * dbm_file;
3383       int dlen = sizeof(dbdata_tls_session) + tkt.size;
3384       dbdata_tls_session * dt = store_get(dlen, GET_TAINTED);
3385
3386       DEBUG(D_tls) debug_printf(" session data size %u\n", (unsigned)tkt.size);
3387       memcpy(dt->session, tkt.data, tkt.size);
3388       gnutls_free(tkt.data);
3389
3390       if ((dbm_file = dbfn_open(US"tls", O_RDWR|O_CREAT, &dbblock, FALSE, FALSE)))
3391         {
3392         /* key for the db is the IP */
3393         dbfn_write(dbm_file, tlsp->resume_index, dt, dlen);
3394         dbfn_close(dbm_file);
3395
3396         DEBUG(D_tls)
3397           debug_printf(" wrote session db (len %u)\n", (unsigned)dlen);
3398         }
3399       }
3400     else
3401       { DEBUG(D_tls)
3402       debug_printf(" extract session data: %s\n", US gnutls_strerror(rc));
3403       }
3404   else DEBUG(D_tls)
3405       debug_printf(" host not resmable; not saving ticket\n");
3406   }
3407 }
3408
3409
3410 /* With a TLS1.3 session, the ticket(s) are not seen until
3411 the first data read is attempted.  And there's often two of them.
3412 Pick them up with this callback.  We are also called for 1.2
3413 but we do nothing.
3414 */
3415 static int
3416 tls_client_ticket_cb(gnutls_session_t sess, u_int htype, unsigned when,
3417   unsigned incoming, const gnutls_datum_t * msg)
3418 {
3419 exim_gnutls_state_st * state = gnutls_session_get_ptr(sess);
3420 tls_support * tlsp = state->tlsp;
3421
3422 DEBUG(D_tls) debug_printf("newticket cb (on client)\n");
3423
3424 if (!tlsp->ticket_received)
3425   tls_save_session(tlsp, sess, state->host);
3426 return 0;
3427 }
3428
3429
3430 static void
3431 tls_client_resume_prehandshake(exim_gnutls_state_st * state,
3432   tls_support * tlsp, smtp_connect_args * conn_args,
3433   smtp_transport_options_block * ob)
3434 {
3435 gnutls_session_set_ptr(state->session, state);
3436 gnutls_handshake_set_hook_function(state->session,
3437   GNUTLS_HANDSHAKE_NEW_SESSION_TICKET, GNUTLS_HOOK_POST, tls_client_ticket_cb);
3438
3439 tls_retrieve_session(tlsp, state->session, conn_args, ob);
3440 }
3441
3442 static void
3443 tls_client_resume_posthandshake(exim_gnutls_state_st * state,
3444   tls_support * tlsp, host_item * host)
3445 {
3446 if (gnutls_session_is_resumed(state->session))
3447   {
3448   DEBUG(D_tls) debug_printf("Session resumed\n");
3449   tlsp->resumption |= RESUME_USED;
3450   }
3451
3452 tls_save_session(tlsp, state->session, host);
3453 }
3454 #endif  /* !DISABLE_TLS_RESUME */
3455
3456
3457 /*************************************************
3458 *    Start a TLS session in a client             *
3459 *************************************************/
3460
3461 /* Called from the smtp transport after STARTTLS has been accepted.
3462
3463 Arguments:
3464   cctx          connection context
3465   conn_args     connection details
3466   cookie        datum for randomness (not used)
3467   tlsp          record details of channel configuration here; must be non-NULL
3468   errstr        error string pointer
3469
3470 Returns:        TRUE for success with TLS session context set in smtp context,
3471                 FALSE on error
3472 */
3473
3474 BOOL
3475 tls_client_start(client_conn_ctx * cctx, smtp_connect_args * conn_args,
3476   void * cookie ARG_UNUSED,
3477   tls_support * tlsp, uschar ** errstr)
3478 {
3479 host_item * host = conn_args->host;          /* for msgs and option-tests */
3480 transport_instance * tb = conn_args->tblock; /* always smtp or NULL */
3481 smtp_transport_options_block * ob = tb
3482   ? tb->drinst.options_block
3483   : &smtp_transport_option_defaults;
3484 int rc;
3485 exim_gnutls_state_st * state = NULL;
3486 uschar * cipher_list = NULL;
3487
3488 #ifndef DISABLE_OCSP
3489 BOOL require_ocsp =
3490   verify_check_given_host(CUSS &ob->hosts_require_ocsp, host) == OK;
3491 BOOL request_ocsp = require_ocsp ? TRUE
3492   : verify_check_given_host(CUSS &ob->hosts_request_ocsp, host) == OK;
3493 #endif
3494
3495 DEBUG(D_tls) debug_printf("initialising GnuTLS as a client on fd %d\n", cctx->sock);
3496
3497 #ifdef SUPPORT_DANE
3498 /* If dane is flagged, have either request or require dane for this host, and
3499 a TLSA record found.  Therefore, dane verify required.  Which implies cert must
3500 be requested and supplied, dane verify must pass, and cert verify irrelevant
3501 (incl.  hostnames), and (caller handled) require_tls and sni=$domain */
3502
3503 if (conn_args->dane && ob->dane_require_tls_ciphers)
3504   {
3505   /* not using Expand_check_tlsvar because not yet in state */
3506   if (!expand_check(ob->dane_require_tls_ciphers, US"dane_require_tls_ciphers",
3507       &cipher_list, errstr))
3508     return FALSE;
3509   cipher_list = cipher_list && *cipher_list
3510     ? ob->dane_require_tls_ciphers : ob->tls_require_ciphers;
3511   }
3512 #endif
3513
3514 if (!cipher_list)
3515   cipher_list = ob->tls_require_ciphers;
3516
3517   {
3518 #ifdef MEASURE_TIMING
3519   struct timeval t0;
3520   gettimeofday(&t0, NULL);
3521 #endif
3522
3523   if (tls_init(host, ob, cipher_list, &state, tlsp, errstr) != OK)
3524     return FALSE;
3525
3526 #ifdef MEASURE_TIMING
3527   report_time_since(&t0, US"client tls_init (delta)");
3528 #endif
3529   }
3530
3531 if (ob->tls_alpn)
3532 #ifdef EXIM_HAVE_ALPN
3533   {
3534   const gnutls_datum_t * plist;
3535   unsigned plen;
3536
3537   if (!tls_alpn_plist(&ob->tls_alpn, &plist, &plen, errstr))
3538     return FALSE;
3539   if (plist)
3540     if (gnutls_alpn_set_protocols(state->session, plist, plen, 0) != 0)
3541       {
3542       tls_error(US"alpn init", NULL, state->host, errstr);
3543       return FALSE;
3544       }
3545     else
3546       DEBUG(D_tls) debug_printf("Setting TLS ALPN '%s'\n", ob->tls_alpn);
3547   }
3548 #else
3549   log_write(0, LOG_MAIN, "ALPN unusable with this GnuTLS library version; ignoring \"%s\"\n",
3550           ob->tls_alpn);
3551 #endif
3552
3553   {
3554   int dh_min_bits = ob->tls_dh_min_bits;
3555   if (dh_min_bits < EXIM_CLIENT_DH_MIN_MIN_BITS)
3556     {
3557     DEBUG(D_tls)
3558       debug_printf("WARNING: tls_dh_min_bits far too low,"
3559                     " clamping %d up to %d\n",
3560           dh_min_bits, EXIM_CLIENT_DH_MIN_MIN_BITS);
3561     dh_min_bits = EXIM_CLIENT_DH_MIN_MIN_BITS;
3562     }
3563
3564   DEBUG(D_tls) debug_printf("Setting D-H prime minimum"
3565                     " acceptable bits to %d\n",
3566       dh_min_bits);
3567   gnutls_dh_set_prime_bits(state->session, dh_min_bits);
3568   }
3569
3570 /* Stick to the old behaviour for compatibility if tls_verify_certificates is
3571 set but both tls_verify_hosts and tls_try_verify_hosts are unset. Check only
3572 the specified host patterns if one of them is defined */
3573
3574 #ifdef SUPPORT_DANE
3575 if (conn_args->dane && dane_tlsa_load(state, &conn_args->tlsa_dnsa))
3576   {
3577   DEBUG(D_tls)
3578     debug_printf("TLS: server certificate DANE required\n");
3579   state->verify_requirement = VERIFY_DANE;
3580   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
3581   }
3582 else
3583 #endif
3584     if (  (  state->exp_tls_verify_certificates
3585           && !ob->tls_verify_hosts
3586           && (!ob->tls_try_verify_hosts || !*ob->tls_try_verify_hosts)
3587           )
3588         || verify_check_given_host(CUSS &ob->tls_verify_hosts, host) == OK
3589        )
3590   {
3591   tls_client_setup_hostname_checks(host, state, ob);
3592   DEBUG(D_tls)
3593     debug_printf("TLS: server certificate verification required\n");
3594   state->verify_requirement = VERIFY_REQUIRED;
3595   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
3596   }
3597 else if (verify_check_given_host(CUSS &ob->tls_try_verify_hosts, host) == OK)
3598   {
3599   tls_client_setup_hostname_checks(host, state, ob);
3600   DEBUG(D_tls)
3601     debug_printf("TLS: server certificate verification optional\n");
3602   state->verify_requirement = VERIFY_OPTIONAL;
3603   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
3604   }
3605 else
3606   {
3607   DEBUG(D_tls)
3608     debug_printf("TLS: server certificate verification not required\n");
3609   state->verify_requirement = VERIFY_NONE;
3610   gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
3611   }
3612
3613 #ifndef DISABLE_OCSP
3614                         /* supported since GnuTLS 3.1.3 */
3615 if (request_ocsp)
3616   {
3617   DEBUG(D_tls) debug_printf("TLS: will request OCSP stapling\n");
3618   if ((rc = gnutls_ocsp_status_request_enable_client(state->session,
3619                     NULL, 0, NULL)) != OK)
3620     {
3621     tls_error_gnu(state, US"cert-status-req", rc, errstr);
3622     return FALSE;
3623     }
3624   tlsp->ocsp = OCSP_NOT_RESP;
3625   }
3626 #endif
3627
3628 #ifdef EXIM_HAVE_TLS_RESUME
3629 tls_client_resume_prehandshake(state, tlsp, conn_args, ob);
3630 #endif
3631
3632 #ifndef DISABLE_EVENT
3633 if (tb && tb->event_action)
3634   {
3635   state->event_action = tb->event_action;
3636   gnutls_session_set_ptr(state->session, state);
3637   gnutls_certificate_set_verify_function(state->lib_state.x509_cred, verify_cb);
3638   }
3639 #endif
3640
3641 gnutls_transport_set_ptr(state->session, (gnutls_transport_ptr_t)(long) cctx->sock);
3642 state->fd_in = cctx->sock;
3643 state->fd_out = cctx->sock;
3644
3645 DEBUG(D_tls) debug_printf("about to gnutls_handshake\n");
3646 /* There doesn't seem to be a built-in timeout on connection. */
3647
3648 sigalrm_seen = FALSE;
3649 ALARM(ob->command_timeout);
3650 do
3651   rc = gnutls_handshake(state->session);
3652 while (rc == GNUTLS_E_AGAIN || rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen);
3653 ALARM_CLR(0);
3654
3655 if (rc != GNUTLS_E_SUCCESS)
3656   {
3657   if (sigalrm_seen)
3658     {
3659     gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_USER_CANCELED);
3660     tls_error(US"gnutls_handshake", US"timed out", state->host, errstr);
3661     }
3662   else
3663     tls_error_gnu(state, US"gnutls_handshake", rc, errstr);
3664   return FALSE;
3665   }
3666
3667 DEBUG(D_tls) post_handshake_debug(state);
3668
3669 /* Verify late */
3670
3671 if (!verify_certificate(state, errstr))
3672   {
3673   tls_error(US"certificate verification failed", *errstr, state->host, errstr);
3674   return FALSE;
3675   }
3676
3677 #ifdef GNUTLS_SFLAGS_EXT_MASTER_SECRET
3678 if (gnutls_session_get_flags(state->session) & GNUTLS_SFLAGS_EXT_MASTER_SECRET)
3679   tlsp->ext_master_secret = TRUE;
3680 #endif
3681
3682 #ifndef DISABLE_OCSP
3683 if (request_ocsp)
3684   {
3685   DEBUG(D_tls)
3686     {
3687     gnutls_datum_t stapling;
3688     gnutls_ocsp_resp_t resp;
3689     gnutls_datum_t printed;
3690     unsigned idx = 0;
3691
3692     for (;
3693 # ifdef GNUTLS_OCSP_STATUS_REQUEST_GET2
3694          (rc = gnutls_ocsp_status_request_get2(state->session, idx, &stapling)) == 0;
3695 #else
3696          (rc = gnutls_ocsp_status_request_get(state->session, &stapling)) == 0;
3697 #endif
3698          idx++)
3699       if (  (rc= gnutls_ocsp_resp_init(&resp)) == 0
3700          && (rc= gnutls_ocsp_resp_import(resp, &stapling)) == 0
3701          && (rc= gnutls_ocsp_resp_print(resp, GNUTLS_OCSP_PRINT_COMPACT, &printed)) == 0
3702          )
3703         {
3704         debug_printf("%.4096s", printed.data);
3705         gnutls_free(printed.data);
3706         }
3707       else
3708         (void) tls_error_gnu(state, US"ocsp decode", rc, errstr);
3709     if (idx == 0 && rc)
3710       (void) tls_error_gnu(state, US"ocsp decode", rc, errstr);
3711     }
3712
3713   if (gnutls_ocsp_status_request_is_checked(state->session, 0) == 0)
3714     {
3715     tlsp->ocsp = OCSP_FAILED;
3716     tls_error(US"certificate status check failed", NULL, state->host, errstr);
3717     if (require_ocsp)
3718       return FALSE;
3719     }
3720   else
3721     {
3722     DEBUG(D_tls) debug_printf("Passed OCSP checking\n");
3723     tlsp->ocsp = OCSP_VFIED;
3724     }
3725   }
3726 #endif
3727
3728 #ifdef EXIM_HAVE_TLS_RESUME
3729 tls_client_resume_posthandshake(state, tlsp, host);
3730 #endif
3731
3732 #ifdef EXIM_HAVE_ALPN
3733 if (ob->tls_alpn)       /* We requested. See what was negotiated. */
3734   {
3735   gnutls_datum_t p = {.size = 0};
3736
3737   if (gnutls_alpn_get_selected_protocol(state->session, &p) == 0)
3738     { DEBUG(D_tls) debug_printf("ALPN negotiated: '%.*s'\n", (int)p.size, p.data); }
3739   else if (verify_check_given_host(CUSS &ob->hosts_require_alpn, host) == OK)
3740     {
3741     gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_NO_APPLICATION_PROTOCOL);
3742     tls_error(US"handshake", US"ALPN required but not negotiated", state->host, errstr);
3743     return FALSE;
3744     }
3745   else
3746     DEBUG(D_tls) debug_printf("No ALPN negotiated");
3747   }
3748 #endif
3749
3750 /* Sets various Exim expansion variables; may need to adjust for ACL callouts */
3751
3752 extract_exim_vars_from_tls_state(state);
3753
3754 cctx->tls_ctx = state;
3755 return TRUE;
3756 }
3757
3758
3759
3760
3761 /*
3762 Arguments:
3763   ct_ctx        client TLS context pointer, or NULL for the one global server context
3764 */
3765
3766 void
3767 tls_shutdown_wr(void * ct_ctx)
3768 {
3769 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
3770 tls_support * tlsp = state->tlsp;
3771
3772 if (!tlsp || tlsp->active.sock < 0) return;  /* TLS was not active */
3773
3774 tls_write(ct_ctx, NULL, 0, FALSE);      /* flush write buffer */
3775
3776 HDEBUG(D_transport|D_tls|D_acl|D_v) debug_printf_indent("  SMTP(TLS shutdown)>>\n");
3777 gnutls_bye(state->session, GNUTLS_SHUT_WR);
3778 }
3779
3780 /*************************************************
3781 *         Close down a TLS session               *
3782 *************************************************/
3783
3784 /* This is also called from within a delivery subprocess forked from the
3785 daemon, to shut down the TLS library, without actually doing a shutdown (which
3786 would tamper with the TLS session in the parent process).
3787
3788 Arguments:
3789   ct_ctx        client context pointer, or NULL for the one global server context
3790   do_shutdown   0 no data-flush or TLS close-alert
3791                 1 if TLS close-alert is to be sent,
3792                 2 if also response to be waited for (2s timeout)
3793
3794 Returns:     nothing
3795 */
3796
3797 void
3798 tls_close(void * ct_ctx, int do_shutdown)
3799 {
3800 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
3801 tls_support * tlsp = state->tlsp;
3802
3803 if (!tlsp || tlsp->active.sock < 0) return;  /* TLS was not active */
3804
3805 if (do_shutdown)
3806   {
3807   DEBUG(D_tls) debug_printf("tls_close(): shutting down TLS%s\n",
3808     do_shutdown > TLS_SHUTDOWN_NOWAIT ? " (with response-wait)" : "");
3809
3810   tls_write(ct_ctx, NULL, 0, FALSE);    /* flush write buffer */
3811
3812 #ifdef EXIM_TCP_CORK
3813   if (do_shutdown == TLS_SHUTDOWN_WAIT)
3814     (void) setsockopt(tlsp->active.sock, IPPROTO_TCP, EXIM_TCP_CORK, US &off, sizeof(off));
3815 #endif
3816
3817   /* The library seems to have no way to only wait for a peer's
3818   shutdown, so handle the same as TLS_SHUTDOWN_WAIT */
3819
3820   ALARM(2);
3821   gnutls_bye(state->session,
3822       do_shutdown > TLS_SHUTDOWN_NOWAIT ? GNUTLS_SHUT_RDWR : GNUTLS_SHUT_WR);
3823   ALARM_CLR(0);
3824   }
3825
3826 if (!ct_ctx)    /* server */
3827   {
3828   receive_getc =        smtp_getc;
3829   receive_getbuf =      smtp_getbuf;
3830   receive_get_cache =   smtp_get_cache;
3831   receive_hasc =        smtp_hasc;
3832   receive_ungetc =      smtp_ungetc;
3833   receive_feof =        smtp_feof;
3834   receive_ferror =      smtp_ferror;
3835   }
3836
3837 gnutls_deinit(state->session);
3838 tlsp->active.sock = -1;
3839 tlsp->active.tls_ctx = NULL;
3840 /* Leave bits, peercert, cipher, peerdn, certificate_verified set, for logging */
3841 tlsp->channelbinding = NULL;
3842
3843
3844 if (state->xfer_buffer) store_free(state->xfer_buffer);
3845 }
3846
3847
3848
3849
3850 static BOOL
3851 tls_refill(unsigned lim)
3852 {
3853 exim_gnutls_state_st * state = &state_server;
3854 ssize_t inbytes;
3855
3856 DEBUG(D_tls) debug_printf("Calling gnutls_record_recv(session=%p, buffer=%p, buffersize=%u)\n",
3857   state->session, state->xfer_buffer, ssl_xfer_buffer_size);
3858
3859 sigalrm_seen = FALSE;
3860 if (smtp_receive_timeout > 0) ALARM(smtp_receive_timeout);
3861
3862 errno = 0;
3863 do
3864   inbytes = gnutls_record_recv(state->session, state->xfer_buffer,
3865     MIN(ssl_xfer_buffer_size, lim));
3866 while (inbytes == GNUTLS_E_AGAIN);
3867
3868 if (smtp_receive_timeout > 0) ALARM_CLR(0);
3869
3870 if (had_command_timeout)                /* set by signal handler */
3871   smtp_command_timeout_exit();          /* does not return */
3872 if (had_command_sigterm)
3873   smtp_command_sigterm_exit();
3874 if (had_data_timeout)
3875   smtp_data_timeout_exit();
3876 if (had_data_sigint)
3877   smtp_data_sigint_exit();
3878
3879 /* Timeouts do not get this far.  A zero-byte return appears to mean that the
3880 TLS session has been closed down, not that the socket itself has been closed
3881 down. Revert to non-TLS handling. */
3882
3883 if (sigalrm_seen)
3884   {
3885   DEBUG(D_tls) debug_printf("Got tls read timeout\n");
3886   state->xfer_error = TRUE;
3887   return FALSE;
3888   }
3889
3890 else if (inbytes == 0)
3891   {
3892   DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
3893   tls_close(NULL, TLS_NO_SHUTDOWN);
3894   return FALSE;
3895   }
3896
3897 /* Handle genuine errors */
3898
3899 else if (inbytes < 0)
3900   {
3901   DEBUG(D_tls) debug_printf("%s: err from gnutls_record_recv\n", __FUNCTION__);
3902   record_io_error(state, (int) inbytes, US"recv", NULL);
3903   state->xfer_error = TRUE;
3904   return FALSE;
3905   }
3906 #ifndef DISABLE_DKIM
3907 dkim_exim_verify_feed(state->xfer_buffer, inbytes);
3908 #endif
3909 state->xfer_buffer_hwm = (int) inbytes;
3910 state->xfer_buffer_lwm = 0;
3911 return TRUE;
3912 }
3913
3914 /*************************************************
3915 *            TLS version of getc                 *
3916 *************************************************/
3917
3918 /* This gets the next byte from the TLS input buffer. If the buffer is empty,
3919 it refills the buffer via the GnuTLS reading function.
3920 Only used by the server-side TLS.
3921
3922 This feeds DKIM and should be used for all message-body reads.
3923
3924 Arguments:  lim         Maximum amount to read/buffer
3925 Returns:    the next character or EOF
3926 */
3927
3928 int
3929 tls_getc(unsigned lim)
3930 {
3931 exim_gnutls_state_st * state = &state_server;
3932
3933 if (state->xfer_buffer_lwm >= state->xfer_buffer_hwm)
3934   if (!tls_refill(lim))
3935     return state->xfer_error ? EOF : smtp_getc(lim);
3936
3937 /* Something in the buffer; return next uschar */
3938
3939 return state->xfer_buffer[state->xfer_buffer_lwm++];
3940 }
3941
3942 BOOL
3943 tls_hasc(void)
3944 {
3945 exim_gnutls_state_st * state = &state_server;
3946 return state->xfer_buffer_lwm < state->xfer_buffer_hwm;
3947 }
3948
3949 uschar *
3950 tls_getbuf(unsigned * len)
3951 {
3952 exim_gnutls_state_st * state = &state_server;
3953 unsigned size;
3954 uschar * buf;
3955
3956 if (state->xfer_buffer_lwm >= state->xfer_buffer_hwm)
3957   if (!tls_refill(*len))
3958     {
3959     if (!state->xfer_error) return smtp_getbuf(len);
3960     *len = 0;
3961     return NULL;
3962     }
3963
3964 if ((size = state->xfer_buffer_hwm - state->xfer_buffer_lwm) > *len)
3965   size = *len;
3966 buf = &state->xfer_buffer[state->xfer_buffer_lwm];
3967 state->xfer_buffer_lwm += size;
3968 *len = size;
3969 return buf;
3970 }
3971
3972
3973 /* Get up to the given number of bytes from any cached data, and feed to dkim. */
3974 void
3975 tls_get_cache(unsigned lim)
3976 {
3977 #ifndef DISABLE_DKIM
3978 exim_gnutls_state_st * state = &state_server;
3979 int n = state->xfer_buffer_hwm - state->xfer_buffer_lwm;
3980 if (n > lim)
3981   n = lim;
3982 if (n > 0)
3983   dkim_exim_verify_feed(state->xfer_buffer+state->xfer_buffer_lwm, n);
3984 #endif
3985 }
3986
3987
3988 BOOL
3989 tls_could_getc(void)
3990 {
3991 return state_server.xfer_buffer_lwm < state_server.xfer_buffer_hwm
3992  || gnutls_record_check_pending(state_server.session) > 0;
3993 }
3994
3995
3996 /*************************************************
3997 *          Read bytes from TLS channel           *
3998 *************************************************/
3999
4000 /* This does not feed DKIM, so if the caller uses this for reading message body,
4001 then the caller must feed DKIM.
4002
4003 Arguments:
4004   ct_ctx    client context pointer, or NULL for the one global server context
4005   buff      buffer of data
4006   len       size of buffer
4007
4008 Returns:    the number of bytes read
4009             -1 after a failed read, including EOF
4010 */
4011
4012 int
4013 tls_read(void * ct_ctx, uschar *buff, size_t len)
4014 {
4015 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
4016 ssize_t inbytes;
4017
4018 if (len > INT_MAX)
4019   len = INT_MAX;
4020
4021 if (state->xfer_buffer_lwm < state->xfer_buffer_hwm)
4022   DEBUG(D_tls)
4023     debug_printf("*** PROBABLY A BUG *** " \
4024         "tls_read() called with data in the tls_getc() buffer, %d ignored\n",
4025         state->xfer_buffer_hwm - state->xfer_buffer_lwm);
4026
4027 DEBUG(D_tls)
4028   debug_printf("Calling gnutls_record_recv(session=%p, buffer=%p, len=" SIZE_T_FMT ")\n",
4029       state->session, buff, len);
4030
4031 errno = 0;
4032 do
4033   inbytes = gnutls_record_recv(state->session, buff, len);
4034 while (inbytes == GNUTLS_E_AGAIN);
4035
4036 if (inbytes > 0) return inbytes;
4037 if (inbytes == 0)
4038   {
4039   DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
4040   }
4041 else
4042   {
4043   DEBUG(D_tls) debug_printf("%s: err from gnutls_record_recv\n", __FUNCTION__);
4044   record_io_error(state, (int)inbytes, US"recv", NULL);
4045   }
4046
4047 return -1;
4048 }
4049
4050
4051
4052
4053 /*************************************************
4054 *         Write bytes down TLS channel           *
4055 *************************************************/
4056
4057 /*
4058 Arguments:
4059   ct_ctx    client context pointer, or NULL for the one global server context
4060   buff      buffer of data
4061   len       number of bytes
4062   more      more data expected soon
4063
4064 Calling with len zero and more unset will flush buffered writes.  The buff
4065 argument can be null for that case.
4066
4067 Returns:    the number of bytes after a successful write,
4068             -1 after a failed write
4069 */
4070
4071 int
4072 tls_write(void * ct_ctx, const uschar * buff, size_t len, BOOL more)
4073 {
4074 ssize_t outbytes;
4075 size_t left = len;
4076 exim_gnutls_state_st * state = ct_ctx ? ct_ctx : &state_server;
4077
4078 #ifdef SUPPORT_CORK
4079 if (more && !state->corked)
4080   {
4081   DEBUG(D_tls) debug_printf("gnutls_record_cork(session=%p)\n", state->session);
4082   gnutls_record_cork(state->session);
4083   state->corked = TRUE;
4084   }
4085 #endif
4086
4087 DEBUG(D_tls) debug_printf("%s(%p, " SIZE_T_FMT "%s)\n", __FUNCTION__,
4088   buff, left, more ? ", more" : "");
4089
4090 while (left > 0)
4091   {
4092   DEBUG(D_tls) debug_printf("gnutls_record_send(session=%p, buffer=%p, left=" SIZE_T_FMT ")\n",
4093       state->session, buff, left);
4094
4095   errno = 0;
4096   do
4097     outbytes = gnutls_record_send(state->session, buff, left);
4098   while (outbytes == GNUTLS_E_AGAIN);
4099
4100   DEBUG(D_tls) debug_printf("outbytes=" SSIZE_T_FMT "\n", outbytes);
4101
4102   if (outbytes < 0)
4103     {
4104 #ifdef GNUTLS_E_PREMATURE_TERMINATION
4105     if (  outbytes == GNUTLS_E_PREMATURE_TERMINATION && errno == ECONNRESET
4106        && !ct_ctx && f.smtp_in_quit
4107        )
4108       {                                 /* Outlook, dammit */
4109       if (LOGGING(protocol_detail))
4110         log_write(0, LOG_MAIN, "[%s] after QUIT, client reset TCP before"
4111           " SMTP response and TLS close\n", sender_host_address);
4112       else
4113         DEBUG(D_tls) debug_printf("[%s] SSL_write: after QUIT,"
4114           " client reset TCP before TLS close\n", sender_host_address);
4115       }
4116     else
4117 #endif
4118       {
4119       DEBUG(D_tls) debug_printf("%s: gnutls_record_send err\n", __FUNCTION__);
4120       record_io_error(state, outbytes, US"send", NULL);
4121       }
4122     return -1;
4123     }
4124   if (outbytes == 0)
4125     {
4126     record_io_error(state, 0, US"send", US"TLS channel closed on write");
4127     return -1;
4128     }
4129
4130   left -= outbytes;
4131   buff += outbytes;
4132   }
4133
4134 if (len > INT_MAX)
4135   {
4136   DEBUG(D_tls)
4137     debug_printf("Whoops!  Wrote more bytes (" SIZE_T_FMT ") than INT_MAX\n",
4138         len);
4139   len = INT_MAX;
4140   }
4141
4142 #ifdef SUPPORT_CORK
4143 if (!more && state->corked)
4144   {
4145   DEBUG(D_tls) debug_printf("gnutls_record_uncork(session=%p)\n", state->session);
4146   do
4147     /* We can't use GNUTLS_RECORD_WAIT here, as it retries on
4148     GNUTLS_E_AGAIN || GNUTLS_E_INTR, which would break our timeout set by alarm().
4149     The GNUTLS_E_AGAIN should not happen ever, as our sockets are blocking anyway.
4150     But who knows. (That all relies on the fact that GNUTLS_E_INTR and GNUTLS_E_AGAIN
4151     match the EINTR and EAGAIN errno values.) */
4152     outbytes = gnutls_record_uncork(state->session, 0);
4153   while (outbytes == GNUTLS_E_AGAIN);
4154
4155   if (outbytes < 0)
4156     {
4157     record_io_error(state, len, US"uncork", NULL);
4158     return -1;
4159     }
4160
4161   state->corked = FALSE;
4162   }
4163 #endif
4164
4165 return (int) len;
4166 }
4167
4168
4169
4170
4171 /*************************************************
4172 *            Random number generation            *
4173 *************************************************/
4174
4175 /* Pseudo-random number generation.  The result is not expected to be
4176 cryptographically strong but not so weak that someone will shoot themselves
4177 in the foot using it as a nonce in input in some email header scheme or
4178 whatever weirdness they'll twist this into.  The result should handle fork()
4179 and avoid repeating sequences.  OpenSSL handles that for us.
4180
4181 Arguments:
4182   max       range maximum
4183 Returns     a random number in range [0, max-1]
4184 */
4185
4186 #ifdef HAVE_GNUTLS_RND
4187 int
4188 vaguely_random_number(int max)
4189 {
4190 unsigned int r;
4191 int i, needed_len;
4192 uschar smallbuf[sizeof(r)];
4193
4194 if (max <= 1)
4195   return 0;
4196
4197 needed_len = sizeof(r);
4198 /* Don't take 8 times more entropy than needed if int is 8 octets and we were
4199 asked for a number less than 10. */
4200
4201 for (r = max, i = 0; r; ++i)
4202   r >>= 1;
4203 i = (i + 7) / 8;
4204 if (i < needed_len)
4205   needed_len = i;
4206
4207 i = gnutls_rnd(GNUTLS_RND_NONCE, smallbuf, needed_len);
4208 if (i < 0)
4209   {
4210   DEBUG(D_all) debug_printf("gnutls_rnd() failed, using fallback\n");
4211   return vaguely_random_number_fallback(max);
4212   }
4213 r = 0;
4214 for (uschar * p = smallbuf; needed_len; --needed_len, ++p)
4215   r = r * 256 + *p;
4216
4217 /* We don't particularly care about weighted results; if someone wants
4218  * smooth distribution and cares enough then they should submit a patch then. */
4219 return r % max;
4220 }
4221 #else /* HAVE_GNUTLS_RND */
4222 int
4223 vaguely_random_number(int max)
4224 {
4225   return vaguely_random_number_fallback(max);
4226 }
4227 #endif /* HAVE_GNUTLS_RND */
4228
4229
4230
4231
4232 /*************************************************
4233 *  Let tls_require_ciphers be checked at startup *
4234 *************************************************/
4235
4236 /* The tls_require_ciphers option, if set, must be something which the
4237 library can parse.
4238
4239 Returns:     NULL on success, or error message
4240 */
4241
4242 uschar *
4243 tls_validate_require_cipher(void)
4244 {
4245 int rc;
4246 uschar *expciphers = NULL;
4247 gnutls_priority_t priority_cache;
4248 const char *errpos;
4249 uschar * dummy_errstr;
4250
4251 #ifdef GNUTLS_AUTO_GLOBAL_INIT
4252 # define validate_check_rc(Label) do { \
4253   if (rc != GNUTLS_E_SUCCESS) { if (exim_gnutls_base_init_done) \
4254     return string_sprintf("%s failed: %s", (Label), gnutls_strerror(rc)); } } while (0)
4255 # define return_deinit(Label) do { return (Label); } while (0)
4256 #else
4257 # define validate_check_rc(Label) do { \
4258   if (rc != GNUTLS_E_SUCCESS) { if (exim_gnutls_base_init_done) gnutls_global_deinit(); \
4259     return string_sprintf("%s failed: %s", (Label), gnutls_strerror(rc)); } } while (0)
4260 # define return_deinit(Label) do { gnutls_global_deinit(); return (Label); } while (0)
4261 #endif
4262
4263 if (exim_gnutls_base_init_done)
4264   log_write(0, LOG_MAIN|LOG_PANIC,
4265       "already initialised GnuTLS, Exim developer bug");
4266
4267 #if defined(HAVE_GNUTLS_PKCS11) && !defined(GNUTLS_AUTO_PKCS11_MANUAL)
4268 if (!gnutls_allow_auto_pkcs11)
4269   {
4270   rc = gnutls_pkcs11_init(GNUTLS_PKCS11_FLAG_MANUAL, NULL);
4271   validate_check_rc(US"gnutls_pkcs11_init");
4272   }
4273 #endif
4274 #ifndef GNUTLS_AUTO_GLOBAL_INIT
4275 rc = gnutls_global_init();
4276 validate_check_rc(US"gnutls_global_init()");
4277 #endif
4278 exim_gnutls_base_init_done = TRUE;
4279
4280 if (!(tls_require_ciphers && *tls_require_ciphers))
4281   return_deinit(NULL);
4282
4283 if (!expand_check(tls_require_ciphers, US"tls_require_ciphers", &expciphers,
4284                   &dummy_errstr))
4285   return_deinit(US"failed to expand tls_require_ciphers");
4286
4287 if (!(expciphers && *expciphers))
4288   return_deinit(NULL);
4289
4290 DEBUG(D_tls)
4291   debug_printf("tls_require_ciphers expands to \"%s\"\n", expciphers);
4292
4293 rc = gnutls_priority_init(&priority_cache, CS expciphers, &errpos);
4294 validate_check_rc(string_sprintf(
4295       "gnutls_priority_init(%s) failed at offset %ld, \"%.8s..\"",
4296       expciphers, (long)(errpos - CS expciphers), errpos));
4297
4298 #undef return_deinit
4299 #undef validate_check_rc
4300 #ifndef GNUTLS_AUTO_GLOBAL_INIT
4301 gnutls_global_deinit();
4302 #endif
4303
4304 return NULL;
4305 }
4306
4307
4308
4309
4310 /*************************************************
4311 *         Report the library versions.           *
4312 *************************************************/
4313
4314 /* See a description in tls-openssl.c for an explanation of why this exists.
4315
4316 Arguments:   string to append to
4317 Returns:     string
4318 */
4319
4320 gstring *
4321 tls_version_report(gstring * g)
4322 {
4323 return string_fmt_append(g,
4324     "Library version: GnuTLS: Compile: %s\n"
4325     "                         Runtime: %s\n",
4326              LIBGNUTLS_VERSION,
4327              gnutls_check_version(NULL));
4328 }
4329
4330 #endif  /*!MACRO_PREDEF*/
4331 /* vi: aw ai sw=2
4332 */
4333 /* End of tls-gnu.c */