Refactor tls_client_init interface
[exim.git] / src / src / tls-gnu.c
1 /*************************************************
2 * Exim - an Internet mail transport agent *
3 *************************************************/
4
5 /* Copyright (c) University of Cambridge 1995 - 2014 */
6 /* See the file NOTICE for conditions of use and distribution. */
7
8 /* Copyright (c) Phil Pennock 2012 */
9
10 /* This file provides TLS/SSL support for Exim using the GnuTLS library,
11 one of the available supported implementations. This file is #included into
12 tls.c when USE_GNUTLS has been set.
13
14 The code herein is a revamp of GnuTLS integration using the current APIs; the
15 original tls-gnu.c was based on a patch which was contributed by Nikos
16 Mavroyanopoulos. The revamp is partially a rewrite, partially cut&paste as
17 appropriate.
18
19 APIs current as of GnuTLS 2.12.18; note that the GnuTLS manual is for GnuTLS 3,
20 which is not widely deployed by OS vendors. Will note issues below, which may
21 assist in updating the code in the future. Another sources of hints is
22 mod_gnutls for Apache (SNI callback registration and handling).
23
24 Keeping client and server variables more split than before and is currently
25 the norm, in anticipation of TLS in ACL callouts.
26
27 I wanted to switch to gnutls_certificate_set_verify_function() so that
28 certificate rejection could happen during handshake where it belongs, rather
29 than being dropped afterwards, but that was introduced in 2.10.0 and Debian
30 (6.0.5) is still on 2.8.6. So for now we have to stick with sub-par behaviour.
31
32 (I wasn't looking for libraries quite that old, when updating to get rid of
33 compiler warnings of deprecated APIs. If it turns out that a lot of the rest
34 require current GnuTLS, then we'll drop support for the ancient libraries).
35 */
36
37 #include <gnutls/gnutls.h>
38 /* needed for cert checks in verification and DN extraction: */
39 #include <gnutls/x509.h>
40 /* man-page is incorrect, gnutls_rnd() is not in gnutls.h: */
41 #include <gnutls/crypto.h>
42 /* needed to disable PKCS11 autoload unless requested */
43 #if GNUTLS_VERSION_NUMBER >= 0x020c00
44 # include <gnutls/pkcs11.h>
45 #endif
46 #ifdef EXPERIMENTAL_OCSP
47 # include <gnutls/ocsp.h>
48 #endif
49
50 /* GnuTLS 2 vs 3
51
52 GnuTLS 3 only:
53 gnutls_global_set_audit_log_function()
54
55 Changes:
56 gnutls_certificate_verify_peers2(): is new, drop the 2 for old version
57 */
58
59 /* Local static variables for GnuTLS */
60
61 /* Values for verify_requirement */
62
63 enum peer_verify_requirement { VERIFY_NONE, VERIFY_OPTIONAL, VERIFY_REQUIRED };
64
65 /* This holds most state for server or client; with this, we can set up an
66 outbound TLS-enabled connection in an ACL callout, while not stomping all
67 over the TLS variables available for expansion.
68
69 Some of these correspond to variables in globals.c; those variables will
70 be set to point to content in one of these instances, as appropriate for
71 the stage of the process lifetime.
72
73 Not handled here: global tls_channelbinding_b64.
74 */
75
76 typedef struct exim_gnutls_state {
77 gnutls_session_t session;
78 gnutls_certificate_credentials_t x509_cred;
79 gnutls_priority_t priority_cache;
80 enum peer_verify_requirement verify_requirement;
81 int fd_in;
82 int fd_out;
83 BOOL peer_cert_verified;
84 BOOL trigger_sni_changes;
85 BOOL have_set_peerdn;
86 const struct host_item *host;
87 gnutls_x509_crt_t peercert;
88 uschar *peerdn;
89 uschar *ciphersuite;
90 uschar *received_sni;
91
92 const uschar *tls_certificate;
93 const uschar *tls_privatekey;
94 const uschar *tls_sni; /* client send only, not received */
95 const uschar *tls_verify_certificates;
96 const uschar *tls_crl;
97 const uschar *tls_require_ciphers;
98 uschar *exp_tls_certificate;
99 uschar *exp_tls_privatekey;
100 uschar *exp_tls_sni;
101 uschar *exp_tls_verify_certificates;
102 uschar *exp_tls_crl;
103 uschar *exp_tls_require_ciphers;
104
105 tls_support *tlsp; /* set in tls_init() */
106
107 uschar *xfer_buffer;
108 int xfer_buffer_lwm;
109 int xfer_buffer_hwm;
110 int xfer_eof;
111 int xfer_error;
112 } exim_gnutls_state_st;
113
114 static const exim_gnutls_state_st exim_gnutls_state_init = {
115 NULL, NULL, NULL, VERIFY_NONE, -1, -1, FALSE, FALSE, FALSE,
116 NULL, NULL, NULL, NULL,
117 NULL, NULL, NULL, NULL, NULL, NULL,
118 NULL, NULL, NULL, NULL, NULL, NULL,
119 NULL,
120 NULL, 0, 0, 0, 0,
121 };
122
123 /* Not only do we have our own APIs which don't pass around state, assuming
124 it's held in globals, GnuTLS doesn't appear to let us register callback data
125 for callbacks, or as part of the session, so we have to keep a "this is the
126 context we're currently dealing with" pointer and rely upon being
127 single-threaded to keep from processing data on an inbound TLS connection while
128 talking to another TLS connection for an outbound check. This does mean that
129 there's no way for heart-beats to be responded to, for the duration of the
130 second connection. */
131
132 static exim_gnutls_state_st state_server, state_client;
133
134 /* dh_params are initialised once within the lifetime of a process using TLS;
135 if we used TLS in a long-lived daemon, we'd have to reconsider this. But we
136 don't want to repeat this. */
137
138 static gnutls_dh_params_t dh_server_params = NULL;
139
140 /* No idea how this value was chosen; preserving it. Default is 3600. */
141
142 static const int ssl_session_timeout = 200;
143
144 static const char * const exim_default_gnutls_priority = "NORMAL";
145
146 /* Guard library core initialisation */
147
148 static BOOL exim_gnutls_base_init_done = FALSE;
149
150
151 /* ------------------------------------------------------------------------ */
152 /* macros */
153
154 #define MAX_HOST_LEN 255
155
156 /* Set this to control gnutls_global_set_log_level(); values 0 to 9 will setup
157 the library logging; a value less than 0 disables the calls to set up logging
158 callbacks. */
159 #ifndef EXIM_GNUTLS_LIBRARY_LOG_LEVEL
160 #define EXIM_GNUTLS_LIBRARY_LOG_LEVEL -1
161 #endif
162
163 #ifndef EXIM_CLIENT_DH_MIN_BITS
164 #define EXIM_CLIENT_DH_MIN_BITS 1024
165 #endif
166
167 /* With GnuTLS 2.12.x+ we have gnutls_sec_param_to_pk_bits() with which we
168 can ask for a bit-strength. Without that, we stick to the constant we had
169 before, for now. */
170 #ifndef EXIM_SERVER_DH_BITS_PRE2_12
171 #define EXIM_SERVER_DH_BITS_PRE2_12 1024
172 #endif
173
174 #define exim_gnutls_err_check(Label) do { \
175 if (rc != GNUTLS_E_SUCCESS) { return tls_error((Label), gnutls_strerror(rc), host); } } while (0)
176
177 #define expand_check_tlsvar(Varname) expand_check(state->Varname, US #Varname, &state->exp_##Varname)
178
179 #if GNUTLS_VERSION_NUMBER >= 0x020c00
180 #define HAVE_GNUTLS_SESSION_CHANNEL_BINDING
181 #define HAVE_GNUTLS_SEC_PARAM_CONSTANTS
182 #define HAVE_GNUTLS_RND
183 /* The security fix we provide with the gnutls_allow_auto_pkcs11 option
184 * (4.82 PP/09) introduces a compatibility regression. The symbol simply
185 * isn't available sometimes, so this needs to become a conditional
186 * compilation; the sanest way to deal with this being a problem on
187 * older OSes is to block it in the Local/Makefile with this compiler
188 * definition */
189 #ifndef AVOID_GNUTLS_PKCS11
190 #define HAVE_GNUTLS_PKCS11
191 #endif /* AVOID_GNUTLS_PKCS11 */
192 #endif
193
194
195
196
197 /* ------------------------------------------------------------------------ */
198 /* Callback declarations */
199
200 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
201 static void exim_gnutls_logger_cb(int level, const char *message);
202 #endif
203
204 static int exim_sni_handling_cb(gnutls_session_t session);
205
206
207
208
209 /* ------------------------------------------------------------------------ */
210 /* Static functions */
211
212 /*************************************************
213 * Handle TLS error *
214 *************************************************/
215
216 /* Called from lots of places when errors occur before actually starting to do
217 the TLS handshake, that is, while the session is still in clear. Always returns
218 DEFER for a server and FAIL for a client so that most calls can use "return
219 tls_error(...)" to do this processing and then give an appropriate return. A
220 single function is used for both server and client, because it is called from
221 some shared functions.
222
223 Argument:
224 prefix text to include in the logged error
225 msg additional error string (may be NULL)
226 usually obtained from gnutls_strerror()
227 host NULL if setting up a server;
228 the connected host if setting up a client
229
230 Returns: OK/DEFER/FAIL
231 */
232
233 static int
234 tls_error(const uschar *prefix, const char *msg, const host_item *host)
235 {
236 if (host)
237 {
238 log_write(0, LOG_MAIN, "TLS error on connection to %s [%s] (%s)%s%s",
239 host->name, host->address, prefix, msg ? ": " : "", msg ? msg : "");
240 return FAIL;
241 }
242 else
243 {
244 uschar *conn_info = smtp_get_connection_info();
245 if (Ustrncmp(conn_info, US"SMTP ", 5) == 0)
246 conn_info += 5;
247 log_write(0, LOG_MAIN, "TLS error on %s (%s)%s%s",
248 conn_info, prefix, msg ? ": " : "", msg ? msg : "");
249 return DEFER;
250 }
251 }
252
253
254
255
256 /*************************************************
257 * Deal with logging errors during I/O *
258 *************************************************/
259
260 /* We have to get the identity of the peer from saved data.
261
262 Argument:
263 state the current GnuTLS exim state container
264 rc the GnuTLS error code, or 0 if it's a local error
265 when text identifying read or write
266 text local error text when ec is 0
267
268 Returns: nothing
269 */
270
271 static void
272 record_io_error(exim_gnutls_state_st *state, int rc, uschar *when, uschar *text)
273 {
274 const char *msg;
275
276 if (rc == GNUTLS_E_FATAL_ALERT_RECEIVED)
277 msg = CS string_sprintf("%s: %s", US gnutls_strerror(rc),
278 US gnutls_alert_get_name(gnutls_alert_get(state->session)));
279 else
280 msg = gnutls_strerror(rc);
281
282 tls_error(when, msg, state->host);
283 }
284
285
286
287
288 /*************************************************
289 * Set various Exim expansion vars *
290 *************************************************/
291
292 #define exim_gnutls_cert_err(Label) do { \
293 if (rc != GNUTLS_E_SUCCESS) { \
294 DEBUG(D_tls) debug_printf("TLS: cert problem: %s: %s\n", (Label), gnutls_strerror(rc)); \
295 return rc; } } while (0)
296
297 static int
298 import_cert(const gnutls_datum * cert, gnutls_x509_crt_t * crtp)
299 {
300 int rc;
301
302 rc = gnutls_x509_crt_init(crtp);
303 exim_gnutls_cert_err(US"gnutls_x509_crt_init (crt)");
304
305 rc = gnutls_x509_crt_import(*crtp, cert, GNUTLS_X509_FMT_DER);
306 exim_gnutls_cert_err(US"failed to import certificate [gnutls_x509_crt_import(cert)]");
307
308 return rc;
309 }
310
311 #undef exim_gnutls_cert_err
312
313
314 /* We set various Exim global variables from the state, once a session has
315 been established. With TLS callouts, may need to change this to stack
316 variables, or just re-call it with the server state after client callout
317 has finished.
318
319 Make sure anything set here is unset in tls_getc().
320
321 Sets:
322 tls_active fd
323 tls_bits strength indicator
324 tls_certificate_verified bool indicator
325 tls_channelbinding_b64 for some SASL mechanisms
326 tls_cipher a string
327 tls_peercert pointer to library internal
328 tls_peerdn a string
329 tls_sni a (UTF-8) string
330 tls_ourcert pointer to library internal
331
332 Argument:
333 state the relevant exim_gnutls_state_st *
334 */
335
336 static void
337 extract_exim_vars_from_tls_state(exim_gnutls_state_st * state)
338 {
339 gnutls_cipher_algorithm_t cipher;
340 #ifdef HAVE_GNUTLS_SESSION_CHANNEL_BINDING
341 int old_pool;
342 int rc;
343 gnutls_datum_t channel;
344 #endif
345 tls_support * tlsp = state->tlsp;
346
347 tlsp->active = state->fd_out;
348
349 cipher = gnutls_cipher_get(state->session);
350 /* returns size in "bytes" */
351 tlsp->bits = gnutls_cipher_get_key_size(cipher) * 8;
352
353 tlsp->cipher = state->ciphersuite;
354
355 DEBUG(D_tls) debug_printf("cipher: %s\n", state->ciphersuite);
356
357 tlsp->certificate_verified = state->peer_cert_verified;
358
359 /* note that tls_channelbinding_b64 is not saved to the spool file, since it's
360 only available for use for authenticators while this TLS session is running. */
361
362 tls_channelbinding_b64 = NULL;
363 #ifdef HAVE_GNUTLS_SESSION_CHANNEL_BINDING
364 channel.data = NULL;
365 channel.size = 0;
366 rc = gnutls_session_channel_binding(state->session, GNUTLS_CB_TLS_UNIQUE, &channel);
367 if (rc) {
368 DEBUG(D_tls) debug_printf("Channel binding error: %s\n", gnutls_strerror(rc));
369 } else {
370 old_pool = store_pool;
371 store_pool = POOL_PERM;
372 tls_channelbinding_b64 = auth_b64encode(channel.data, (int)channel.size);
373 store_pool = old_pool;
374 DEBUG(D_tls) debug_printf("Have channel bindings cached for possible auth usage.\n");
375 }
376 #endif
377
378 /* peercert is set in peer_status() */
379 tlsp->peerdn = state->peerdn;
380 tlsp->sni = state->received_sni;
381
382 /* record our certificate */
383 {
384 const gnutls_datum * cert = gnutls_certificate_get_ours(state->session);
385 gnutls_x509_crt_t crt;
386
387 tlsp->ourcert = cert && import_cert(cert, &crt)==0 ? crt : NULL;
388 }
389 }
390
391
392
393
394 /*************************************************
395 * Setup up DH parameters *
396 *************************************************/
397
398 /* Generating the D-H parameters may take a long time. They only need to
399 be re-generated every so often, depending on security policy. What we do is to
400 keep these parameters in a file in the spool directory. If the file does not
401 exist, we generate them. This means that it is easy to cause a regeneration.
402
403 The new file is written as a temporary file and renamed, so that an incomplete
404 file is never present. If two processes both compute some new parameters, you
405 waste a bit of effort, but it doesn't seem worth messing around with locking to
406 prevent this.
407
408 Returns: OK/DEFER/FAIL
409 */
410
411 static int
412 init_server_dh(void)
413 {
414 int fd, rc;
415 unsigned int dh_bits;
416 gnutls_datum m;
417 uschar filename_buf[PATH_MAX];
418 uschar *filename = NULL;
419 size_t sz;
420 uschar *exp_tls_dhparam;
421 BOOL use_file_in_spool = FALSE;
422 BOOL use_fixed_file = FALSE;
423 host_item *host = NULL; /* dummy for macros */
424
425 DEBUG(D_tls) debug_printf("Initialising GnuTLS server params.\n");
426
427 rc = gnutls_dh_params_init(&dh_server_params);
428 exim_gnutls_err_check(US"gnutls_dh_params_init");
429
430 m.data = NULL;
431 m.size = 0;
432
433 if (!expand_check(tls_dhparam, US"tls_dhparam", &exp_tls_dhparam))
434 return DEFER;
435
436 if (!exp_tls_dhparam)
437 {
438 DEBUG(D_tls) debug_printf("Loading default hard-coded DH params\n");
439 m.data = US std_dh_prime_default();
440 m.size = Ustrlen(m.data);
441 }
442 else if (Ustrcmp(exp_tls_dhparam, "historic") == 0)
443 use_file_in_spool = TRUE;
444 else if (Ustrcmp(exp_tls_dhparam, "none") == 0)
445 {
446 DEBUG(D_tls) debug_printf("Requested no DH parameters.\n");
447 return OK;
448 }
449 else if (exp_tls_dhparam[0] != '/')
450 {
451 m.data = US std_dh_prime_named(exp_tls_dhparam);
452 if (m.data == NULL)
453 return tls_error(US"No standard prime named", CS exp_tls_dhparam, NULL);
454 m.size = Ustrlen(m.data);
455 }
456 else
457 {
458 use_fixed_file = TRUE;
459 filename = exp_tls_dhparam;
460 }
461
462 if (m.data)
463 {
464 rc = gnutls_dh_params_import_pkcs3(dh_server_params, &m, GNUTLS_X509_FMT_PEM);
465 exim_gnutls_err_check(US"gnutls_dh_params_import_pkcs3");
466 DEBUG(D_tls) debug_printf("Loaded fixed standard D-H parameters\n");
467 return OK;
468 }
469
470 #ifdef HAVE_GNUTLS_SEC_PARAM_CONSTANTS
471 /* If you change this constant, also change dh_param_fn_ext so that we can use a
472 different filename and ensure we have sufficient bits. */
473 dh_bits = gnutls_sec_param_to_pk_bits(GNUTLS_PK_DH, GNUTLS_SEC_PARAM_NORMAL);
474 if (!dh_bits)
475 return tls_error(US"gnutls_sec_param_to_pk_bits() failed", NULL, NULL);
476 DEBUG(D_tls)
477 debug_printf("GnuTLS tells us that for D-H PK, NORMAL is %d bits.\n",
478 dh_bits);
479 #else
480 dh_bits = EXIM_SERVER_DH_BITS_PRE2_12;
481 DEBUG(D_tls)
482 debug_printf("GnuTLS lacks gnutls_sec_param_to_pk_bits(), using %d bits.\n",
483 dh_bits);
484 #endif
485
486 /* Some clients have hard-coded limits. */
487 if (dh_bits > tls_dh_max_bits)
488 {
489 DEBUG(D_tls)
490 debug_printf("tls_dh_max_bits clamping override, using %d bits instead.\n",
491 tls_dh_max_bits);
492 dh_bits = tls_dh_max_bits;
493 }
494
495 if (use_file_in_spool)
496 {
497 if (!string_format(filename_buf, sizeof(filename_buf),
498 "%s/gnutls-params-%d", spool_directory, dh_bits))
499 return tls_error(US"overlong filename", NULL, NULL);
500 filename = filename_buf;
501 }
502
503 /* Open the cache file for reading and if successful, read it and set up the
504 parameters. */
505
506 fd = Uopen(filename, O_RDONLY, 0);
507 if (fd >= 0)
508 {
509 struct stat statbuf;
510 FILE *fp;
511 int saved_errno;
512
513 if (fstat(fd, &statbuf) < 0) /* EIO */
514 {
515 saved_errno = errno;
516 (void)close(fd);
517 return tls_error(US"TLS cache stat failed", strerror(saved_errno), NULL);
518 }
519 if (!S_ISREG(statbuf.st_mode))
520 {
521 (void)close(fd);
522 return tls_error(US"TLS cache not a file", NULL, NULL);
523 }
524 fp = fdopen(fd, "rb");
525 if (!fp)
526 {
527 saved_errno = errno;
528 (void)close(fd);
529 return tls_error(US"fdopen(TLS cache stat fd) failed",
530 strerror(saved_errno), NULL);
531 }
532
533 m.size = statbuf.st_size;
534 m.data = malloc(m.size);
535 if (m.data == NULL)
536 {
537 fclose(fp);
538 return tls_error(US"malloc failed", strerror(errno), NULL);
539 }
540 sz = fread(m.data, m.size, 1, fp);
541 if (!sz)
542 {
543 saved_errno = errno;
544 fclose(fp);
545 free(m.data);
546 return tls_error(US"fread failed", strerror(saved_errno), NULL);
547 }
548 fclose(fp);
549
550 rc = gnutls_dh_params_import_pkcs3(dh_server_params, &m, GNUTLS_X509_FMT_PEM);
551 free(m.data);
552 exim_gnutls_err_check(US"gnutls_dh_params_import_pkcs3");
553 DEBUG(D_tls) debug_printf("read D-H parameters from file \"%s\"\n", filename);
554 }
555
556 /* If the file does not exist, fall through to compute new data and cache it.
557 If there was any other opening error, it is serious. */
558
559 else if (errno == ENOENT)
560 {
561 rc = -1;
562 DEBUG(D_tls)
563 debug_printf("D-H parameter cache file \"%s\" does not exist\n", filename);
564 }
565 else
566 return tls_error(string_open_failed(errno, "\"%s\" for reading", filename),
567 NULL, NULL);
568
569 /* If ret < 0, either the cache file does not exist, or the data it contains
570 is not useful. One particular case of this is when upgrading from an older
571 release of Exim in which the data was stored in a different format. We don't
572 try to be clever and support both formats; we just regenerate new data in this
573 case. */
574
575 if (rc < 0)
576 {
577 uschar *temp_fn;
578 unsigned int dh_bits_gen = dh_bits;
579
580 if ((PATH_MAX - Ustrlen(filename)) < 10)
581 return tls_error(US"Filename too long to generate replacement",
582 CS filename, NULL);
583
584 temp_fn = string_copy(US "%s.XXXXXXX");
585 fd = mkstemp(CS temp_fn); /* modifies temp_fn */
586 if (fd < 0)
587 return tls_error(US"Unable to open temp file", strerror(errno), NULL);
588 (void)fchown(fd, exim_uid, exim_gid); /* Probably not necessary */
589
590 /* GnuTLS overshoots!
591 * If we ask for 2236, we might get 2237 or more.
592 * But there's no way to ask GnuTLS how many bits there really are.
593 * We can ask how many bits were used in a TLS session, but that's it!
594 * The prime itself is hidden behind too much abstraction.
595 * So we ask for less, and proceed on a wing and a prayer.
596 * First attempt, subtracted 3 for 2233 and got 2240.
597 */
598 if (dh_bits >= EXIM_CLIENT_DH_MIN_BITS + 10)
599 {
600 dh_bits_gen = dh_bits - 10;
601 DEBUG(D_tls)
602 debug_printf("being paranoid about DH generation, make it '%d' bits'\n",
603 dh_bits_gen);
604 }
605
606 DEBUG(D_tls)
607 debug_printf("requesting generation of %d bit Diffie-Hellman prime ...\n",
608 dh_bits_gen);
609 rc = gnutls_dh_params_generate2(dh_server_params, dh_bits_gen);
610 exim_gnutls_err_check(US"gnutls_dh_params_generate2");
611
612 /* gnutls_dh_params_export_pkcs3() will tell us the exact size, every time,
613 and I confirmed that a NULL call to get the size first is how the GnuTLS
614 sample apps handle this. */
615
616 sz = 0;
617 m.data = NULL;
618 rc = gnutls_dh_params_export_pkcs3(dh_server_params, GNUTLS_X509_FMT_PEM,
619 m.data, &sz);
620 if (rc != GNUTLS_E_SHORT_MEMORY_BUFFER)
621 exim_gnutls_err_check(US"gnutls_dh_params_export_pkcs3(NULL) sizing");
622 m.size = sz;
623 m.data = malloc(m.size);
624 if (m.data == NULL)
625 return tls_error(US"memory allocation failed", strerror(errno), NULL);
626 /* this will return a size 1 less than the allocation size above */
627 rc = gnutls_dh_params_export_pkcs3(dh_server_params, GNUTLS_X509_FMT_PEM,
628 m.data, &sz);
629 if (rc != GNUTLS_E_SUCCESS)
630 {
631 free(m.data);
632 exim_gnutls_err_check(US"gnutls_dh_params_export_pkcs3() real");
633 }
634 m.size = sz; /* shrink by 1, probably */
635
636 sz = write_to_fd_buf(fd, m.data, (size_t) m.size);
637 if (sz != m.size)
638 {
639 free(m.data);
640 return tls_error(US"TLS cache write D-H params failed",
641 strerror(errno), NULL);
642 }
643 free(m.data);
644 sz = write_to_fd_buf(fd, US"\n", 1);
645 if (sz != 1)
646 return tls_error(US"TLS cache write D-H params final newline failed",
647 strerror(errno), NULL);
648
649 rc = close(fd);
650 if (rc)
651 return tls_error(US"TLS cache write close() failed",
652 strerror(errno), NULL);
653
654 if (Urename(temp_fn, filename) < 0)
655 return tls_error(string_sprintf("failed to rename \"%s\" as \"%s\"",
656 temp_fn, filename), strerror(errno), NULL);
657
658 DEBUG(D_tls) debug_printf("wrote D-H parameters to file \"%s\"\n", filename);
659 }
660
661 DEBUG(D_tls) debug_printf("initialized server D-H parameters\n");
662 return OK;
663 }
664
665
666
667
668 /*************************************************
669 * Variables re-expanded post-SNI *
670 *************************************************/
671
672 /* Called from both server and client code, via tls_init(), and also from
673 the SNI callback after receiving an SNI, if tls_certificate includes "tls_sni".
674
675 We can tell the two apart by state->received_sni being non-NULL in callback.
676
677 The callback should not call us unless state->trigger_sni_changes is true,
678 which we are responsible for setting on the first pass through.
679
680 Arguments:
681 state exim_gnutls_state_st *
682
683 Returns: OK/DEFER/FAIL
684 */
685
686 static int
687 tls_expand_session_files(exim_gnutls_state_st *state)
688 {
689 struct stat statbuf;
690 int rc;
691 const host_item *host = state->host; /* macro should be reconsidered? */
692 uschar *saved_tls_certificate = NULL;
693 uschar *saved_tls_privatekey = NULL;
694 uschar *saved_tls_verify_certificates = NULL;
695 uschar *saved_tls_crl = NULL;
696 int cert_count;
697
698 /* We check for tls_sni *before* expansion. */
699 if (!host) /* server */
700 {
701 if (!state->received_sni)
702 {
703 if (state->tls_certificate &&
704 (Ustrstr(state->tls_certificate, US"tls_sni") ||
705 Ustrstr(state->tls_certificate, US"tls_in_sni") ||
706 Ustrstr(state->tls_certificate, US"tls_out_sni")
707 ))
708 {
709 DEBUG(D_tls) debug_printf("We will re-expand TLS session files if we receive SNI.\n");
710 state->trigger_sni_changes = TRUE;
711 }
712 }
713 else
714 {
715 /* useful for debugging */
716 saved_tls_certificate = state->exp_tls_certificate;
717 saved_tls_privatekey = state->exp_tls_privatekey;
718 saved_tls_verify_certificates = state->exp_tls_verify_certificates;
719 saved_tls_crl = state->exp_tls_crl;
720 }
721 }
722
723 rc = gnutls_certificate_allocate_credentials(&state->x509_cred);
724 exim_gnutls_err_check(US"gnutls_certificate_allocate_credentials");
725
726 /* remember: expand_check_tlsvar() is expand_check() but fiddling with
727 state members, assuming consistent naming; and expand_check() returns
728 false if expansion failed, unless expansion was forced to fail. */
729
730 /* check if we at least have a certificate, before doing expensive
731 D-H generation. */
732
733 if (!expand_check_tlsvar(tls_certificate))
734 return DEFER;
735
736 /* certificate is mandatory in server, optional in client */
737
738 if ((state->exp_tls_certificate == NULL) ||
739 (*state->exp_tls_certificate == '\0'))
740 {
741 if (!host)
742 return tls_error(US"no TLS server certificate is specified", NULL, NULL);
743 else
744 DEBUG(D_tls) debug_printf("TLS: no client certificate specified; okay\n");
745 }
746
747 if (state->tls_privatekey && !expand_check_tlsvar(tls_privatekey))
748 return DEFER;
749
750 /* tls_privatekey is optional, defaulting to same file as certificate */
751
752 if (state->tls_privatekey == NULL || *state->tls_privatekey == '\0')
753 {
754 state->tls_privatekey = state->tls_certificate;
755 state->exp_tls_privatekey = state->exp_tls_certificate;
756 }
757
758
759 if (state->exp_tls_certificate && *state->exp_tls_certificate)
760 {
761 DEBUG(D_tls) debug_printf("certificate file = %s\nkey file = %s\n",
762 state->exp_tls_certificate, state->exp_tls_privatekey);
763
764 if (state->received_sni)
765 {
766 if ((Ustrcmp(state->exp_tls_certificate, saved_tls_certificate) == 0) &&
767 (Ustrcmp(state->exp_tls_privatekey, saved_tls_privatekey) == 0))
768 {
769 DEBUG(D_tls) debug_printf("TLS SNI: cert and key unchanged\n");
770 }
771 else
772 {
773 DEBUG(D_tls) debug_printf("TLS SNI: have a changed cert/key pair.\n");
774 }
775 }
776
777 rc = gnutls_certificate_set_x509_key_file(state->x509_cred,
778 CS state->exp_tls_certificate, CS state->exp_tls_privatekey,
779 GNUTLS_X509_FMT_PEM);
780 exim_gnutls_err_check(
781 string_sprintf("cert/key setup: cert=%s key=%s",
782 state->exp_tls_certificate, state->exp_tls_privatekey));
783 DEBUG(D_tls) debug_printf("TLS: cert/key registered\n");
784 } /* tls_certificate */
785
786
787 /* Set the OCSP stapling server info */
788
789 #ifdef EXPERIMENTAL_OCSP
790 if ( !host /* server */
791 && tls_ocsp_file
792 )
793 {
794 uschar * expanded;
795 int rc;
796
797 if (!expand_check(tls_ocsp_file, US"tls_ocsp_file", &expanded))
798 return DEFER;
799
800 /* Lazy way; would like callback to emit debug on actual response */
801
802 rc = gnutls_certificate_set_ocsp_status_request_file(state->x509_cred,
803 expanded, 0);
804 exim_gnutls_err_check(US"gnutls_certificate_set_ocsp_status_request_file");
805 DEBUG(D_tls) debug_printf("Set OCSP response file %s\n", expanded);
806 }
807 #endif
808
809
810 /* Set the trusted CAs file if one is provided, and then add the CRL if one is
811 provided. Experiment shows that, if the certificate file is empty, an unhelpful
812 error message is provided. However, if we just refrain from setting anything up
813 in that case, certificate verification fails, which seems to be the correct
814 behaviour. */
815
816 if (state->tls_verify_certificates && *state->tls_verify_certificates)
817 {
818 if (!expand_check_tlsvar(tls_verify_certificates))
819 return DEFER;
820 if (state->tls_crl && *state->tls_crl)
821 if (!expand_check_tlsvar(tls_crl))
822 return DEFER;
823
824 if (!(state->exp_tls_verify_certificates &&
825 *state->exp_tls_verify_certificates))
826 {
827 DEBUG(D_tls)
828 debug_printf("TLS: tls_verify_certificates expanded empty, ignoring\n");
829 /* With no tls_verify_certificates, we ignore tls_crl too */
830 return OK;
831 }
832 }
833 else
834 {
835 DEBUG(D_tls)
836 debug_printf("TLS: tls_verify_certificates not set or empty, ignoring\n");
837 return OK;
838 }
839
840 if (Ustat(state->exp_tls_verify_certificates, &statbuf) < 0)
841 {
842 log_write(0, LOG_MAIN|LOG_PANIC, "could not stat %s "
843 "(tls_verify_certificates): %s", state->exp_tls_verify_certificates,
844 strerror(errno));
845 return DEFER;
846 }
847
848 /* The test suite passes in /dev/null; we could check for that path explicitly,
849 but who knows if someone has some weird FIFO which always dumps some certs, or
850 other weirdness. The thing we really want to check is that it's not a
851 directory, since while OpenSSL supports that, GnuTLS does not.
852 So s/!S_ISREG/S_ISDIR/ and change some messsaging ... */
853 if (S_ISDIR(statbuf.st_mode))
854 {
855 DEBUG(D_tls)
856 debug_printf("verify certificates path is a dir: \"%s\"\n",
857 state->exp_tls_verify_certificates);
858 log_write(0, LOG_MAIN|LOG_PANIC,
859 "tls_verify_certificates \"%s\" is a directory",
860 state->exp_tls_verify_certificates);
861 return DEFER;
862 }
863
864 DEBUG(D_tls) debug_printf("verify certificates = %s size=" OFF_T_FMT "\n",
865 state->exp_tls_verify_certificates, statbuf.st_size);
866
867 if (statbuf.st_size == 0)
868 {
869 DEBUG(D_tls)
870 debug_printf("cert file empty, no certs, no verification, ignoring any CRL\n");
871 return OK;
872 }
873
874 cert_count = gnutls_certificate_set_x509_trust_file(state->x509_cred,
875 CS state->exp_tls_verify_certificates, GNUTLS_X509_FMT_PEM);
876 if (cert_count < 0)
877 {
878 rc = cert_count;
879 exim_gnutls_err_check(US"gnutls_certificate_set_x509_trust_file");
880 }
881 DEBUG(D_tls) debug_printf("Added %d certificate authorities.\n", cert_count);
882
883 if (state->tls_crl && *state->tls_crl &&
884 state->exp_tls_crl && *state->exp_tls_crl)
885 {
886 DEBUG(D_tls) debug_printf("loading CRL file = %s\n", state->exp_tls_crl);
887 cert_count = gnutls_certificate_set_x509_crl_file(state->x509_cred,
888 CS state->exp_tls_crl, GNUTLS_X509_FMT_PEM);
889 if (cert_count < 0)
890 {
891 rc = cert_count;
892 exim_gnutls_err_check(US"gnutls_certificate_set_x509_crl_file");
893 }
894 DEBUG(D_tls) debug_printf("Processed %d CRLs.\n", cert_count);
895 }
896
897 return OK;
898 }
899
900
901
902
903 /*************************************************
904 * Set X.509 state variables *
905 *************************************************/
906
907 /* In GnuTLS, the registered cert/key are not replaced by a later
908 set of a cert/key, so for SNI support we need a whole new x509_cred
909 structure. Which means various other non-re-expanded pieces of state
910 need to be re-set in the new struct, so the setting logic is pulled
911 out to this.
912
913 Arguments:
914 state exim_gnutls_state_st *
915
916 Returns: OK/DEFER/FAIL
917 */
918
919 static int
920 tls_set_remaining_x509(exim_gnutls_state_st *state)
921 {
922 int rc;
923 const host_item *host = state->host; /* macro should be reconsidered? */
924
925 /* Create D-H parameters, or read them from the cache file. This function does
926 its own SMTP error messaging. This only happens for the server, TLS D-H ignores
927 client-side params. */
928
929 if (!state->host)
930 {
931 if (!dh_server_params)
932 {
933 rc = init_server_dh();
934 if (rc != OK) return rc;
935 }
936 gnutls_certificate_set_dh_params(state->x509_cred, dh_server_params);
937 }
938
939 /* Link the credentials to the session. */
940
941 rc = gnutls_credentials_set(state->session, GNUTLS_CRD_CERTIFICATE, state->x509_cred);
942 exim_gnutls_err_check(US"gnutls_credentials_set");
943
944 return OK;
945 }
946
947 /*************************************************
948 * Initialize for GnuTLS *
949 *************************************************/
950
951 /* Called from both server and client code. In the case of a server, errors
952 before actual TLS negotiation return DEFER.
953
954 Arguments:
955 host connected host, if client; NULL if server
956 certificate certificate file
957 privatekey private key file
958 sni TLS SNI to send, sometimes when client; else NULL
959 cas CA certs file
960 crl CRL file
961 require_ciphers tls_require_ciphers setting
962 caller_state returned state-info structure
963
964 Returns: OK/DEFER/FAIL
965 */
966
967 static int
968 tls_init(
969 const host_item *host,
970 const uschar *certificate,
971 const uschar *privatekey,
972 const uschar *sni,
973 const uschar *cas,
974 const uschar *crl,
975 const uschar *require_ciphers,
976 exim_gnutls_state_st **caller_state)
977 {
978 exim_gnutls_state_st *state;
979 int rc;
980 size_t sz;
981 const char *errpos;
982 uschar *p;
983 BOOL want_default_priorities;
984
985 if (!exim_gnutls_base_init_done)
986 {
987 DEBUG(D_tls) debug_printf("GnuTLS global init required.\n");
988
989 #ifdef HAVE_GNUTLS_PKCS11
990 /* By default, gnutls_global_init will init PKCS11 support in auto mode,
991 which loads modules from a config file, which sounds good and may be wanted
992 by some sysadmin, but also means in common configurations that GNOME keyring
993 environment variables are used and so breaks for users calling mailq.
994 To prevent this, we init PKCS11 first, which is the documented approach. */
995 if (!gnutls_allow_auto_pkcs11)
996 {
997 rc = gnutls_pkcs11_init(GNUTLS_PKCS11_FLAG_MANUAL, NULL);
998 exim_gnutls_err_check(US"gnutls_pkcs11_init");
999 }
1000 #endif
1001
1002 rc = gnutls_global_init();
1003 exim_gnutls_err_check(US"gnutls_global_init");
1004
1005 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
1006 DEBUG(D_tls)
1007 {
1008 gnutls_global_set_log_function(exim_gnutls_logger_cb);
1009 /* arbitrarily chosen level; bump upto 9 for more */
1010 gnutls_global_set_log_level(EXIM_GNUTLS_LIBRARY_LOG_LEVEL);
1011 }
1012 #endif
1013
1014 exim_gnutls_base_init_done = TRUE;
1015 }
1016
1017 if (host)
1018 {
1019 state = &state_client;
1020 memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
1021 state->tlsp = &tls_out;
1022 DEBUG(D_tls) debug_printf("initialising GnuTLS client session\n");
1023 rc = gnutls_init(&state->session, GNUTLS_CLIENT);
1024 }
1025 else
1026 {
1027 state = &state_server;
1028 memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
1029 state->tlsp = &tls_in;
1030 DEBUG(D_tls) debug_printf("initialising GnuTLS server session\n");
1031 rc = gnutls_init(&state->session, GNUTLS_SERVER);
1032 }
1033 exim_gnutls_err_check(US"gnutls_init");
1034
1035 state->host = host;
1036
1037 state->tls_certificate = certificate;
1038 state->tls_privatekey = privatekey;
1039 state->tls_require_ciphers = require_ciphers;
1040 state->tls_sni = sni;
1041 state->tls_verify_certificates = cas;
1042 state->tls_crl = crl;
1043
1044 /* This handles the variables that might get re-expanded after TLS SNI;
1045 that's tls_certificate, tls_privatekey, tls_verify_certificates, tls_crl */
1046
1047 DEBUG(D_tls)
1048 debug_printf("Expanding various TLS configuration options for session credentials.\n");
1049 rc = tls_expand_session_files(state);
1050 if (rc != OK) return rc;
1051
1052 /* These are all other parts of the x509_cred handling, since SNI in GnuTLS
1053 requires a new structure afterwards. */
1054
1055 rc = tls_set_remaining_x509(state);
1056 if (rc != OK) return rc;
1057
1058 /* set SNI in client, only */
1059 if (host)
1060 {
1061 if (!expand_check(state->tlsp->sni, US"tls_out_sni", &state->exp_tls_sni))
1062 return DEFER;
1063 if (state->exp_tls_sni && *state->exp_tls_sni)
1064 {
1065 DEBUG(D_tls)
1066 debug_printf("Setting TLS client SNI to \"%s\"\n", state->exp_tls_sni);
1067 sz = Ustrlen(state->exp_tls_sni);
1068 rc = gnutls_server_name_set(state->session,
1069 GNUTLS_NAME_DNS, state->exp_tls_sni, sz);
1070 exim_gnutls_err_check(US"gnutls_server_name_set");
1071 }
1072 }
1073 else if (state->tls_sni)
1074 DEBUG(D_tls) debug_printf("*** PROBABLY A BUG *** " \
1075 "have an SNI set for a client [%s]\n", state->tls_sni);
1076
1077 /* This is the priority string support,
1078 http://www.gnutls.org/manual/html_node/Priority-Strings.html
1079 and replaces gnutls_require_kx, gnutls_require_mac & gnutls_require_protocols.
1080 This was backwards incompatible, but means Exim no longer needs to track
1081 all algorithms and provide string forms for them. */
1082
1083 want_default_priorities = TRUE;
1084
1085 if (state->tls_require_ciphers && *state->tls_require_ciphers)
1086 {
1087 if (!expand_check_tlsvar(tls_require_ciphers))
1088 return DEFER;
1089 if (state->exp_tls_require_ciphers && *state->exp_tls_require_ciphers)
1090 {
1091 DEBUG(D_tls) debug_printf("GnuTLS session cipher/priority \"%s\"\n",
1092 state->exp_tls_require_ciphers);
1093
1094 rc = gnutls_priority_init(&state->priority_cache,
1095 CS state->exp_tls_require_ciphers, &errpos);
1096 want_default_priorities = FALSE;
1097 p = state->exp_tls_require_ciphers;
1098 }
1099 }
1100 if (want_default_priorities)
1101 {
1102 DEBUG(D_tls)
1103 debug_printf("GnuTLS using default session cipher/priority \"%s\"\n",
1104 exim_default_gnutls_priority);
1105 rc = gnutls_priority_init(&state->priority_cache,
1106 exim_default_gnutls_priority, &errpos);
1107 p = US exim_default_gnutls_priority;
1108 }
1109
1110 exim_gnutls_err_check(string_sprintf(
1111 "gnutls_priority_init(%s) failed at offset %ld, \"%.6s..\"",
1112 p, errpos - CS p, errpos));
1113
1114 rc = gnutls_priority_set(state->session, state->priority_cache);
1115 exim_gnutls_err_check(US"gnutls_priority_set");
1116
1117 gnutls_db_set_cache_expiration(state->session, ssl_session_timeout);
1118
1119 /* Reduce security in favour of increased compatibility, if the admin
1120 decides to make that trade-off. */
1121 if (gnutls_compat_mode)
1122 {
1123 #if LIBGNUTLS_VERSION_NUMBER >= 0x020104
1124 DEBUG(D_tls) debug_printf("lowering GnuTLS security, compatibility mode\n");
1125 gnutls_session_enable_compatibility_mode(state->session);
1126 #else
1127 DEBUG(D_tls) debug_printf("Unable to set gnutls_compat_mode - GnuTLS version too old\n");
1128 #endif
1129 }
1130
1131 *caller_state = state;
1132 return OK;
1133 }
1134
1135
1136
1137 /*************************************************
1138 * Extract peer information *
1139 *************************************************/
1140
1141 /* Called from both server and client code.
1142 Only this is allowed to set state->peerdn and state->have_set_peerdn
1143 and we use that to detect double-calls.
1144
1145 NOTE: the state blocks last while the TLS connection is up, which is fine
1146 for logging in the server side, but for the client side, we log after teardown
1147 in src/deliver.c. While the session is up, we can twist about states and
1148 repoint tls_* globals, but those variables used for logging or other variable
1149 expansion that happens _after_ delivery need to have a longer life-time.
1150
1151 So for those, we get the data from POOL_PERM; the re-invoke guard keeps us from
1152 doing this more than once per generation of a state context. We set them in
1153 the state context, and repoint tls_* to them. After the state goes away, the
1154 tls_* copies of the pointers remain valid and client delivery logging is happy.
1155
1156 tls_certificate_verified is a BOOL, so the tls_peerdn and tls_cipher issues
1157 don't apply.
1158
1159 Arguments:
1160 state exim_gnutls_state_st *
1161
1162 Returns: OK/DEFER/FAIL
1163 */
1164
1165 static int
1166 peer_status(exim_gnutls_state_st *state)
1167 {
1168 uschar cipherbuf[256];
1169 const gnutls_datum *cert_list;
1170 int old_pool, rc;
1171 unsigned int cert_list_size = 0;
1172 gnutls_protocol_t protocol;
1173 gnutls_cipher_algorithm_t cipher;
1174 gnutls_kx_algorithm_t kx;
1175 gnutls_mac_algorithm_t mac;
1176 gnutls_certificate_type_t ct;
1177 gnutls_x509_crt_t crt;
1178 uschar *p, *dn_buf;
1179 size_t sz;
1180
1181 if (state->have_set_peerdn)
1182 return OK;
1183 state->have_set_peerdn = TRUE;
1184
1185 state->peerdn = NULL;
1186
1187 /* tls_cipher */
1188 cipher = gnutls_cipher_get(state->session);
1189 protocol = gnutls_protocol_get_version(state->session);
1190 mac = gnutls_mac_get(state->session);
1191 kx = gnutls_kx_get(state->session);
1192
1193 string_format(cipherbuf, sizeof(cipherbuf),
1194 "%s:%s:%d",
1195 gnutls_protocol_get_name(protocol),
1196 gnutls_cipher_suite_get_name(kx, cipher, mac),
1197 (int) gnutls_cipher_get_key_size(cipher) * 8);
1198
1199 /* I don't see a way that spaces could occur, in the current GnuTLS
1200 code base, but it was a concern in the old code and perhaps older GnuTLS
1201 releases did return "TLS 1.0"; play it safe, just in case. */
1202 for (p = cipherbuf; *p != '\0'; ++p)
1203 if (isspace(*p))
1204 *p = '-';
1205 old_pool = store_pool;
1206 store_pool = POOL_PERM;
1207 state->ciphersuite = string_copy(cipherbuf);
1208 store_pool = old_pool;
1209 state->tlsp->cipher = state->ciphersuite;
1210
1211 /* tls_peerdn */
1212 cert_list = gnutls_certificate_get_peers(state->session, &cert_list_size);
1213
1214 if (cert_list == NULL || cert_list_size == 0)
1215 {
1216 DEBUG(D_tls) debug_printf("TLS: no certificate from peer (%p & %d)\n",
1217 cert_list, cert_list_size);
1218 if (state->verify_requirement == VERIFY_REQUIRED)
1219 return tls_error(US"certificate verification failed",
1220 "no certificate received from peer", state->host);
1221 return OK;
1222 }
1223
1224 ct = gnutls_certificate_type_get(state->session);
1225 if (ct != GNUTLS_CRT_X509)
1226 {
1227 const char *ctn = gnutls_certificate_type_get_name(ct);
1228 DEBUG(D_tls)
1229 debug_printf("TLS: peer cert not X.509 but instead \"%s\"\n", ctn);
1230 if (state->verify_requirement == VERIFY_REQUIRED)
1231 return tls_error(US"certificate verification not possible, unhandled type",
1232 ctn, state->host);
1233 return OK;
1234 }
1235
1236 #define exim_gnutls_peer_err(Label) do { \
1237 if (rc != GNUTLS_E_SUCCESS) { \
1238 DEBUG(D_tls) debug_printf("TLS: peer cert problem: %s: %s\n", (Label), gnutls_strerror(rc)); \
1239 if (state->verify_requirement == VERIFY_REQUIRED) { return tls_error((Label), gnutls_strerror(rc), state->host); } \
1240 return OK; } } while (0)
1241
1242 rc = import_cert(&cert_list[0], &crt);
1243 exim_gnutls_peer_err(US"cert 0");
1244
1245 state->tlsp->peercert = state->peercert = crt;
1246
1247 sz = 0;
1248 rc = gnutls_x509_crt_get_dn(crt, NULL, &sz);
1249 if (rc != GNUTLS_E_SHORT_MEMORY_BUFFER)
1250 {
1251 exim_gnutls_peer_err(US"getting size for cert DN failed");
1252 return FAIL; /* should not happen */
1253 }
1254 dn_buf = store_get_perm(sz);
1255 rc = gnutls_x509_crt_get_dn(crt, CS dn_buf, &sz);
1256 exim_gnutls_peer_err(US"failed to extract certificate DN [gnutls_x509_crt_get_dn(cert 0)]");
1257
1258 state->peerdn = dn_buf;
1259
1260 return OK;
1261 #undef exim_gnutls_peer_err
1262 }
1263
1264
1265
1266
1267 /*************************************************
1268 * Verify peer certificate *
1269 *************************************************/
1270
1271 /* Called from both server and client code.
1272 *Should* be using a callback registered with
1273 gnutls_certificate_set_verify_function() to fail the handshake if we dislike
1274 the peer information, but that's too new for some OSes.
1275
1276 Arguments:
1277 state exim_gnutls_state_st *
1278 error where to put an error message
1279
1280 Returns:
1281 FALSE if the session should be rejected
1282 TRUE if the cert is okay or we just don't care
1283 */
1284
1285 static BOOL
1286 verify_certificate(exim_gnutls_state_st *state, const char **error)
1287 {
1288 int rc;
1289 unsigned int verify;
1290
1291 *error = NULL;
1292
1293 if ((rc = peer_status(state)) != OK)
1294 {
1295 verify = GNUTLS_CERT_INVALID;
1296 *error = "certificate not supplied";
1297 }
1298 else
1299 rc = gnutls_certificate_verify_peers2(state->session, &verify);
1300
1301 /* Handle the result of verification. INVALID seems to be set as well
1302 as REVOKED, but leave the test for both. */
1303
1304 if (rc < 0 || verify & (GNUTLS_CERT_INVALID|GNUTLS_CERT_REVOKED))
1305 {
1306 state->peer_cert_verified = FALSE;
1307 if (!*error)
1308 *error = verify & GNUTLS_CERT_REVOKED
1309 ? "certificate revoked" : "certificate invalid";
1310
1311 DEBUG(D_tls)
1312 debug_printf("TLS certificate verification failed (%s): peerdn=%s\n",
1313 *error, state->peerdn ? state->peerdn : US"<unset>");
1314
1315 if (state->verify_requirement == VERIFY_REQUIRED)
1316 {
1317 gnutls_alert_send(state->session, GNUTLS_AL_FATAL, GNUTLS_A_BAD_CERTIFICATE);
1318 return FALSE;
1319 }
1320 DEBUG(D_tls)
1321 debug_printf("TLS verify failure overridden (host in tls_try_verify_hosts)\n");
1322 }
1323 else
1324 {
1325 state->peer_cert_verified = TRUE;
1326 DEBUG(D_tls) debug_printf("TLS certificate verified: peerdn=%s\n",
1327 state->peerdn ? state->peerdn : US"<unset>");
1328 }
1329
1330 state->tlsp->peerdn = state->peerdn;
1331
1332 return TRUE;
1333 }
1334
1335
1336
1337
1338 /* ------------------------------------------------------------------------ */
1339 /* Callbacks */
1340
1341 /* Logging function which can be registered with
1342 * gnutls_global_set_log_function()
1343 * gnutls_global_set_log_level() 0..9
1344 */
1345 #if EXIM_GNUTLS_LIBRARY_LOG_LEVEL >= 0
1346 static void
1347 exim_gnutls_logger_cb(int level, const char *message)
1348 {
1349 size_t len = strlen(message);
1350 if (len < 1)
1351 {
1352 DEBUG(D_tls) debug_printf("GnuTLS<%d> empty debug message\n", level);
1353 return;
1354 }
1355 DEBUG(D_tls) debug_printf("GnuTLS<%d>: %s%s", level, message,
1356 message[len-1] == '\n' ? "" : "\n");
1357 }
1358 #endif
1359
1360
1361 /* Called after client hello, should handle SNI work.
1362 This will always set tls_sni (state->received_sni) if available,
1363 and may trigger presenting different certificates,
1364 if state->trigger_sni_changes is TRUE.
1365
1366 Should be registered with
1367 gnutls_handshake_set_post_client_hello_function()
1368
1369 "This callback must return 0 on success or a gnutls error code to terminate the
1370 handshake.".
1371
1372 For inability to get SNI information, we return 0.
1373 We only return non-zero if re-setup failed.
1374 Only used for server-side TLS.
1375 */
1376
1377 static int
1378 exim_sni_handling_cb(gnutls_session_t session)
1379 {
1380 char sni_name[MAX_HOST_LEN];
1381 size_t data_len = MAX_HOST_LEN;
1382 exim_gnutls_state_st *state = &state_server;
1383 unsigned int sni_type;
1384 int rc, old_pool;
1385
1386 rc = gnutls_server_name_get(session, sni_name, &data_len, &sni_type, 0);
1387 if (rc != GNUTLS_E_SUCCESS)
1388 {
1389 DEBUG(D_tls) {
1390 if (rc == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
1391 debug_printf("TLS: no SNI presented in handshake.\n");
1392 else
1393 debug_printf("TLS failure: gnutls_server_name_get(): %s [%d]\n",
1394 gnutls_strerror(rc), rc);
1395 };
1396 return 0;
1397 }
1398
1399 if (sni_type != GNUTLS_NAME_DNS)
1400 {
1401 DEBUG(D_tls) debug_printf("TLS: ignoring SNI of unhandled type %u\n", sni_type);
1402 return 0;
1403 }
1404
1405 /* We now have a UTF-8 string in sni_name */
1406 old_pool = store_pool;
1407 store_pool = POOL_PERM;
1408 state->received_sni = string_copyn(US sni_name, data_len);
1409 store_pool = old_pool;
1410
1411 /* We set this one now so that variable expansions below will work */
1412 state->tlsp->sni = state->received_sni;
1413
1414 DEBUG(D_tls) debug_printf("Received TLS SNI \"%s\"%s\n", sni_name,
1415 state->trigger_sni_changes ? "" : " (unused for certificate selection)");
1416
1417 if (!state->trigger_sni_changes)
1418 return 0;
1419
1420 rc = tls_expand_session_files(state);
1421 if (rc != OK)
1422 {
1423 /* If the setup of certs/etc failed before handshake, TLS would not have
1424 been offered. The best we can do now is abort. */
1425 return GNUTLS_E_APPLICATION_ERROR_MIN;
1426 }
1427
1428 rc = tls_set_remaining_x509(state);
1429 if (rc != OK) return GNUTLS_E_APPLICATION_ERROR_MIN;
1430
1431 return 0;
1432 }
1433
1434
1435
1436
1437 /* ------------------------------------------------------------------------ */
1438 /* Exported functions */
1439
1440
1441
1442
1443 /*************************************************
1444 * Start a TLS session in a server *
1445 *************************************************/
1446
1447 /* This is called when Exim is running as a server, after having received
1448 the STARTTLS command. It must respond to that command, and then negotiate
1449 a TLS session.
1450
1451 Arguments:
1452 require_ciphers list of allowed ciphers or NULL
1453
1454 Returns: OK on success
1455 DEFER for errors before the start of the negotiation
1456 FAIL for errors during the negotation; the server can't
1457 continue running.
1458 */
1459
1460 int
1461 tls_server_start(const uschar *require_ciphers)
1462 {
1463 int rc;
1464 const char *error;
1465 exim_gnutls_state_st *state = NULL;
1466
1467 /* Check for previous activation */
1468 if (tls_in.active >= 0)
1469 {
1470 tls_error(US"STARTTLS received after TLS started", "", NULL);
1471 smtp_printf("554 Already in TLS\r\n");
1472 return FAIL;
1473 }
1474
1475 /* Initialize the library. If it fails, it will already have logged the error
1476 and sent an SMTP response. */
1477
1478 DEBUG(D_tls) debug_printf("initialising GnuTLS as a server\n");
1479
1480 rc = tls_init(NULL, tls_certificate, tls_privatekey,
1481 NULL, tls_verify_certificates, tls_crl,
1482 require_ciphers, &state);
1483 if (rc != OK) return rc;
1484
1485 /* If this is a host for which certificate verification is mandatory or
1486 optional, set up appropriately. */
1487
1488 if (verify_check_host(&tls_verify_hosts) == OK)
1489 {
1490 DEBUG(D_tls) debug_printf("TLS: a client certificate will be required.\n");
1491 state->verify_requirement = VERIFY_REQUIRED;
1492 gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
1493 }
1494 else if (verify_check_host(&tls_try_verify_hosts) == OK)
1495 {
1496 DEBUG(D_tls) debug_printf("TLS: a client certificate will be requested but not required.\n");
1497 state->verify_requirement = VERIFY_OPTIONAL;
1498 gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
1499 }
1500 else
1501 {
1502 DEBUG(D_tls) debug_printf("TLS: a client certificate will not be requested.\n");
1503 state->verify_requirement = VERIFY_NONE;
1504 gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
1505 }
1506
1507 /* Register SNI handling; always, even if not in tls_certificate, so that the
1508 expansion variable $tls_sni is always available. */
1509
1510 gnutls_handshake_set_post_client_hello_function(state->session,
1511 exim_sni_handling_cb);
1512
1513 /* Set context and tell client to go ahead, except in the case of TLS startup
1514 on connection, where outputting anything now upsets the clients and tends to
1515 make them disconnect. We need to have an explicit fflush() here, to force out
1516 the response. Other smtp_printf() calls do not need it, because in non-TLS
1517 mode, the fflush() happens when smtp_getc() is called. */
1518
1519 if (!state->tlsp->on_connect)
1520 {
1521 smtp_printf("220 TLS go ahead\r\n");
1522 fflush(smtp_out);
1523 }
1524
1525 /* Now negotiate the TLS session. We put our own timer on it, since it seems
1526 that the GnuTLS library doesn't. */
1527
1528 gnutls_transport_set_ptr2(state->session,
1529 (gnutls_transport_ptr)fileno(smtp_in),
1530 (gnutls_transport_ptr)fileno(smtp_out));
1531 state->fd_in = fileno(smtp_in);
1532 state->fd_out = fileno(smtp_out);
1533
1534 sigalrm_seen = FALSE;
1535 if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
1536 do
1537 {
1538 rc = gnutls_handshake(state->session);
1539 } while ((rc == GNUTLS_E_AGAIN) ||
1540 (rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen));
1541 alarm(0);
1542
1543 if (rc != GNUTLS_E_SUCCESS)
1544 {
1545 tls_error(US"gnutls_handshake",
1546 sigalrm_seen ? "timed out" : gnutls_strerror(rc), NULL);
1547 /* It seems that, except in the case of a timeout, we have to close the
1548 connection right here; otherwise if the other end is running OpenSSL it hangs
1549 until the server times out. */
1550
1551 if (!sigalrm_seen)
1552 {
1553 (void)fclose(smtp_out);
1554 (void)fclose(smtp_in);
1555 }
1556
1557 return FAIL;
1558 }
1559
1560 DEBUG(D_tls) debug_printf("gnutls_handshake was successful\n");
1561
1562 /* Verify after the fact */
1563
1564 if ( state->verify_requirement != VERIFY_NONE
1565 && !verify_certificate(state, &error))
1566 {
1567 if (state->verify_requirement != VERIFY_OPTIONAL)
1568 {
1569 tls_error(US"certificate verification failed", error, NULL);
1570 return FAIL;
1571 }
1572 DEBUG(D_tls)
1573 debug_printf("TLS: continuing on only because verification was optional, after: %s\n",
1574 error);
1575 }
1576
1577 /* Figure out peer DN, and if authenticated, etc. */
1578
1579 rc = peer_status(state);
1580 if (rc != OK) return rc;
1581
1582 /* Sets various Exim expansion variables; always safe within server */
1583
1584 extract_exim_vars_from_tls_state(state);
1585
1586 /* TLS has been set up. Adjust the input functions to read via TLS,
1587 and initialize appropriately. */
1588
1589 state->xfer_buffer = store_malloc(ssl_xfer_buffer_size);
1590
1591 receive_getc = tls_getc;
1592 receive_ungetc = tls_ungetc;
1593 receive_feof = tls_feof;
1594 receive_ferror = tls_ferror;
1595 receive_smtp_buffered = tls_smtp_buffered;
1596
1597 return OK;
1598 }
1599
1600
1601
1602
1603 /*************************************************
1604 * Start a TLS session in a client *
1605 *************************************************/
1606
1607 /* Called from the smtp transport after STARTTLS has been accepted.
1608
1609 Arguments:
1610 fd the fd of the connection
1611 host connected host (for messages)
1612 addr the first address (not used)
1613 ob smtp transport options
1614
1615 Returns: OK/DEFER/FAIL (because using common functions),
1616 but for a client, DEFER and FAIL have the same meaning
1617 */
1618
1619 int
1620 tls_client_start(int fd, host_item *host,
1621 address_item *addr ARG_UNUSED,
1622 void *v_ob)
1623 {
1624 smtp_transport_options_block *ob = v_ob;
1625 int rc;
1626 const char *error;
1627 exim_gnutls_state_st *state = NULL;
1628 #ifdef EXPERIMENTAL_OCSP
1629 BOOL require_ocsp = verify_check_this_host(&ob->hosts_require_ocsp,
1630 NULL, host->name, host->address, NULL) == OK;
1631 #endif
1632
1633 DEBUG(D_tls) debug_printf("initialising GnuTLS as a client on fd %d\n", fd);
1634
1635 if ((rc = tls_init(host, ob->tls_certificate, ob->tls_privatekey,
1636 ob->tls_sni, ob->tls_verify_certificates, ob->tls_crl,
1637 ob->tls_require_ciphers, &state)) != OK)
1638 return rc;
1639
1640 {
1641 int dh_min_bits = ob->tls_dh_min_bits;
1642 if (dh_min_bits < EXIM_CLIENT_DH_MIN_MIN_BITS)
1643 {
1644 DEBUG(D_tls)
1645 debug_printf("WARNING: tls_dh_min_bits far too low,"
1646 " clamping %d up to %d\n",
1647 dh_min_bits, EXIM_CLIENT_DH_MIN_MIN_BITS);
1648 dh_min_bits = EXIM_CLIENT_DH_MIN_MIN_BITS;
1649 }
1650
1651 DEBUG(D_tls) debug_printf("Setting D-H prime minimum"
1652 " acceptable bits to %d\n",
1653 dh_min_bits);
1654 gnutls_dh_set_prime_bits(state->session, dh_min_bits);
1655 }
1656
1657 /* Stick to the old behaviour for compatibility if tls_verify_certificates is
1658 set but both tls_verify_hosts and tls_try_verify_hosts are unset. Check only
1659 the specified host patterns if one of them is defined */
1660
1661 if (( state->exp_tls_verify_certificates
1662 && !ob->tls_verify_hosts
1663 && !ob->tls_try_verify_hosts
1664 )
1665 ||
1666 verify_check_host(&ob->tls_verify_hosts) == OK
1667 )
1668 {
1669 DEBUG(D_tls) debug_printf("TLS: server certificate verification required.\n");
1670 state->verify_requirement = VERIFY_REQUIRED;
1671 gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUIRE);
1672 }
1673 else if (verify_check_host(&ob->tls_try_verify_hosts) == OK)
1674 {
1675 DEBUG(D_tls) debug_printf("TLS: server certificate verification optional.\n");
1676 state->verify_requirement = VERIFY_OPTIONAL;
1677 gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_REQUEST);
1678 }
1679 else
1680 {
1681 DEBUG(D_tls) debug_printf("TLS: server certificate verification not required.\n");
1682 state->verify_requirement = VERIFY_NONE;
1683 gnutls_certificate_server_set_request(state->session, GNUTLS_CERT_IGNORE);
1684 }
1685
1686 #ifdef EXPERIMENTAL_OCSP /* since GnuTLS 3.1.3 */
1687 if (require_ocsp)
1688 {
1689 DEBUG(D_tls) debug_printf("TLS: will request OCSP stapling\n");
1690 if ((rc = gnutls_ocsp_status_request_enable_client(state->session,
1691 NULL, 0, NULL)) != OK)
1692 return tls_error(US"cert-status-req",
1693 gnutls_strerror(rc), state->host);
1694 }
1695 #endif
1696
1697 gnutls_transport_set_ptr(state->session, (gnutls_transport_ptr)fd);
1698 state->fd_in = fd;
1699 state->fd_out = fd;
1700
1701 DEBUG(D_tls) debug_printf("about to gnutls_handshake\n");
1702 /* There doesn't seem to be a built-in timeout on connection. */
1703
1704 sigalrm_seen = FALSE;
1705 alarm(ob->command_timeout);
1706 do
1707 {
1708 rc = gnutls_handshake(state->session);
1709 } while ((rc == GNUTLS_E_AGAIN) ||
1710 (rc == GNUTLS_E_INTERRUPTED && !sigalrm_seen));
1711 alarm(0);
1712
1713 if (rc != GNUTLS_E_SUCCESS)
1714 return tls_error(US"gnutls_handshake",
1715 sigalrm_seen ? "timed out" : gnutls_strerror(rc), state->host);
1716
1717 DEBUG(D_tls) debug_printf("gnutls_handshake was successful\n");
1718
1719 /* Verify late */
1720
1721 if (state->verify_requirement != VERIFY_NONE &&
1722 !verify_certificate(state, &error))
1723 return tls_error(US"certificate verification failed", error, state->host);
1724
1725 #ifdef EXPERIMENTAL_OCSP
1726 if (require_ocsp)
1727 {
1728 DEBUG(D_tls)
1729 {
1730 gnutls_datum_t stapling;
1731 gnutls_ocsp_resp_t resp;
1732 gnutls_datum_t printed;
1733 if ( (rc= gnutls_ocsp_status_request_get(state->session, &stapling)) == 0
1734 && (rc= gnutls_ocsp_resp_init(&resp)) == 0
1735 && (rc= gnutls_ocsp_resp_import(resp, &stapling)) == 0
1736 && (rc= gnutls_ocsp_resp_print(resp, GNUTLS_OCSP_PRINT_FULL, &printed)) == 0
1737 )
1738 {
1739 debug_printf("%.4096s", printed.data);
1740 gnutls_free(printed.data);
1741 }
1742 else
1743 (void) tls_error(US"ocsp decode", gnutls_strerror(rc), state->host);
1744 }
1745
1746 if (gnutls_ocsp_status_request_is_checked(state->session, 0) == 0)
1747 return tls_error(US"certificate status check failed", NULL, state->host);
1748 DEBUG(D_tls) debug_printf("Passed OCSP checking\n");
1749 }
1750 #endif
1751
1752 /* Figure out peer DN, and if authenticated, etc. */
1753
1754 if ((rc = peer_status(state)) != OK)
1755 return rc;
1756
1757 /* Sets various Exim expansion variables; may need to adjust for ACL callouts */
1758
1759 extract_exim_vars_from_tls_state(state);
1760
1761 return OK;
1762 }
1763
1764
1765
1766
1767 /*************************************************
1768 * Close down a TLS session *
1769 *************************************************/
1770
1771 /* This is also called from within a delivery subprocess forked from the
1772 daemon, to shut down the TLS library, without actually doing a shutdown (which
1773 would tamper with the TLS session in the parent process).
1774
1775 Arguments: TRUE if gnutls_bye is to be called
1776 Returns: nothing
1777 */
1778
1779 void
1780 tls_close(BOOL is_server, BOOL shutdown)
1781 {
1782 exim_gnutls_state_st *state = is_server ? &state_server : &state_client;
1783
1784 if (!state->tlsp || state->tlsp->active < 0) return; /* TLS was not active */
1785
1786 if (shutdown)
1787 {
1788 DEBUG(D_tls) debug_printf("tls_close(): shutting down TLS\n");
1789 gnutls_bye(state->session, GNUTLS_SHUT_WR);
1790 }
1791
1792 gnutls_deinit(state->session);
1793
1794 state->tlsp->active = -1;
1795 memcpy(state, &exim_gnutls_state_init, sizeof(exim_gnutls_state_init));
1796
1797 if ((state_server.session == NULL) && (state_client.session == NULL))
1798 {
1799 gnutls_global_deinit();
1800 exim_gnutls_base_init_done = FALSE;
1801 }
1802
1803 }
1804
1805
1806
1807
1808 /*************************************************
1809 * TLS version of getc *
1810 *************************************************/
1811
1812 /* This gets the next byte from the TLS input buffer. If the buffer is empty,
1813 it refills the buffer via the GnuTLS reading function.
1814 Only used by the server-side TLS.
1815
1816 This feeds DKIM and should be used for all message-body reads.
1817
1818 Arguments: none
1819 Returns: the next character or EOF
1820 */
1821
1822 int
1823 tls_getc(void)
1824 {
1825 exim_gnutls_state_st *state = &state_server;
1826 if (state->xfer_buffer_lwm >= state->xfer_buffer_hwm)
1827 {
1828 ssize_t inbytes;
1829
1830 DEBUG(D_tls) debug_printf("Calling gnutls_record_recv(%p, %p, %u)\n",
1831 state->session, state->xfer_buffer, ssl_xfer_buffer_size);
1832
1833 if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
1834 inbytes = gnutls_record_recv(state->session, state->xfer_buffer,
1835 ssl_xfer_buffer_size);
1836 alarm(0);
1837
1838 /* A zero-byte return appears to mean that the TLS session has been
1839 closed down, not that the socket itself has been closed down. Revert to
1840 non-TLS handling. */
1841
1842 if (inbytes == 0)
1843 {
1844 DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
1845
1846 receive_getc = smtp_getc;
1847 receive_ungetc = smtp_ungetc;
1848 receive_feof = smtp_feof;
1849 receive_ferror = smtp_ferror;
1850 receive_smtp_buffered = smtp_buffered;
1851
1852 gnutls_deinit(state->session);
1853 state->session = NULL;
1854 state->tlsp->active = -1;
1855 state->tlsp->bits = 0;
1856 state->tlsp->certificate_verified = FALSE;
1857 tls_channelbinding_b64 = NULL;
1858 state->tlsp->cipher = NULL;
1859 state->tlsp->peercert = NULL;
1860 state->tlsp->peerdn = NULL;
1861
1862 return smtp_getc();
1863 }
1864
1865 /* Handle genuine errors */
1866
1867 else if (inbytes < 0)
1868 {
1869 record_io_error(state, (int) inbytes, US"recv", NULL);
1870 state->xfer_error = 1;
1871 return EOF;
1872 }
1873 #ifndef DISABLE_DKIM
1874 dkim_exim_verify_feed(state->xfer_buffer, inbytes);
1875 #endif
1876 state->xfer_buffer_hwm = (int) inbytes;
1877 state->xfer_buffer_lwm = 0;
1878 }
1879
1880 /* Something in the buffer; return next uschar */
1881
1882 return state->xfer_buffer[state->xfer_buffer_lwm++];
1883 }
1884
1885
1886
1887
1888 /*************************************************
1889 * Read bytes from TLS channel *
1890 *************************************************/
1891
1892 /* This does not feed DKIM, so if the caller uses this for reading message body,
1893 then the caller must feed DKIM.
1894
1895 Arguments:
1896 buff buffer of data
1897 len size of buffer
1898
1899 Returns: the number of bytes read
1900 -1 after a failed read
1901 */
1902
1903 int
1904 tls_read(BOOL is_server, uschar *buff, size_t len)
1905 {
1906 exim_gnutls_state_st *state = is_server ? &state_server : &state_client;
1907 ssize_t inbytes;
1908
1909 if (len > INT_MAX)
1910 len = INT_MAX;
1911
1912 if (state->xfer_buffer_lwm < state->xfer_buffer_hwm)
1913 DEBUG(D_tls)
1914 debug_printf("*** PROBABLY A BUG *** " \
1915 "tls_read() called with data in the tls_getc() buffer, %d ignored\n",
1916 state->xfer_buffer_hwm - state->xfer_buffer_lwm);
1917
1918 DEBUG(D_tls)
1919 debug_printf("Calling gnutls_record_recv(%p, %p, " SIZE_T_FMT ")\n",
1920 state->session, buff, len);
1921
1922 inbytes = gnutls_record_recv(state->session, buff, len);
1923 if (inbytes > 0) return inbytes;
1924 if (inbytes == 0)
1925 {
1926 DEBUG(D_tls) debug_printf("Got TLS_EOF\n");
1927 }
1928 else record_io_error(state, (int)inbytes, US"recv", NULL);
1929
1930 return -1;
1931 }
1932
1933
1934
1935
1936 /*************************************************
1937 * Write bytes down TLS channel *
1938 *************************************************/
1939
1940 /*
1941 Arguments:
1942 is_server channel specifier
1943 buff buffer of data
1944 len number of bytes
1945
1946 Returns: the number of bytes after a successful write,
1947 -1 after a failed write
1948 */
1949
1950 int
1951 tls_write(BOOL is_server, const uschar *buff, size_t len)
1952 {
1953 ssize_t outbytes;
1954 size_t left = len;
1955 exim_gnutls_state_st *state = is_server ? &state_server : &state_client;
1956
1957 DEBUG(D_tls) debug_printf("tls_do_write(%p, " SIZE_T_FMT ")\n", buff, left);
1958 while (left > 0)
1959 {
1960 DEBUG(D_tls) debug_printf("gnutls_record_send(SSL, %p, " SIZE_T_FMT ")\n",
1961 buff, left);
1962 outbytes = gnutls_record_send(state->session, buff, left);
1963
1964 DEBUG(D_tls) debug_printf("outbytes=" SSIZE_T_FMT "\n", outbytes);
1965 if (outbytes < 0)
1966 {
1967 record_io_error(state, outbytes, US"send", NULL);
1968 return -1;
1969 }
1970 if (outbytes == 0)
1971 {
1972 record_io_error(state, 0, US"send", US"TLS channel closed on write");
1973 return -1;
1974 }
1975
1976 left -= outbytes;
1977 buff += outbytes;
1978 }
1979
1980 if (len > INT_MAX)
1981 {
1982 DEBUG(D_tls)
1983 debug_printf("Whoops! Wrote more bytes (" SIZE_T_FMT ") than INT_MAX\n",
1984 len);
1985 len = INT_MAX;
1986 }
1987
1988 return (int) len;
1989 }
1990
1991
1992
1993
1994 /*************************************************
1995 * Random number generation *
1996 *************************************************/
1997
1998 /* Pseudo-random number generation. The result is not expected to be
1999 cryptographically strong but not so weak that someone will shoot themselves
2000 in the foot using it as a nonce in input in some email header scheme or
2001 whatever weirdness they'll twist this into. The result should handle fork()
2002 and avoid repeating sequences. OpenSSL handles that for us.
2003
2004 Arguments:
2005 max range maximum
2006 Returns a random number in range [0, max-1]
2007 */
2008
2009 #ifdef HAVE_GNUTLS_RND
2010 int
2011 vaguely_random_number(int max)
2012 {
2013 unsigned int r;
2014 int i, needed_len;
2015 uschar *p;
2016 uschar smallbuf[sizeof(r)];
2017
2018 if (max <= 1)
2019 return 0;
2020
2021 needed_len = sizeof(r);
2022 /* Don't take 8 times more entropy than needed if int is 8 octets and we were
2023 * asked for a number less than 10. */
2024 for (r = max, i = 0; r; ++i)
2025 r >>= 1;
2026 i = (i + 7) / 8;
2027 if (i < needed_len)
2028 needed_len = i;
2029
2030 i = gnutls_rnd(GNUTLS_RND_NONCE, smallbuf, needed_len);
2031 if (i < 0)
2032 {
2033 DEBUG(D_all) debug_printf("gnutls_rnd() failed, using fallback.\n");
2034 return vaguely_random_number_fallback(max);
2035 }
2036 r = 0;
2037 for (p = smallbuf; needed_len; --needed_len, ++p)
2038 {
2039 r *= 256;
2040 r += *p;
2041 }
2042
2043 /* We don't particularly care about weighted results; if someone wants
2044 * smooth distribution and cares enough then they should submit a patch then. */
2045 return r % max;
2046 }
2047 #else /* HAVE_GNUTLS_RND */
2048 int
2049 vaguely_random_number(int max)
2050 {
2051 return vaguely_random_number_fallback(max);
2052 }
2053 #endif /* HAVE_GNUTLS_RND */
2054
2055
2056
2057
2058 /*************************************************
2059 * Let tls_require_ciphers be checked at startup *
2060 *************************************************/
2061
2062 /* The tls_require_ciphers option, if set, must be something which the
2063 library can parse.
2064
2065 Returns: NULL on success, or error message
2066 */
2067
2068 uschar *
2069 tls_validate_require_cipher(void)
2070 {
2071 int rc;
2072 uschar *expciphers = NULL;
2073 gnutls_priority_t priority_cache;
2074 const char *errpos;
2075
2076 #define validate_check_rc(Label) do { \
2077 if (rc != GNUTLS_E_SUCCESS) { if (exim_gnutls_base_init_done) gnutls_global_deinit(); \
2078 return string_sprintf("%s failed: %s", (Label), gnutls_strerror(rc)); } } while (0)
2079 #define return_deinit(Label) do { gnutls_global_deinit(); return (Label); } while (0)
2080
2081 if (exim_gnutls_base_init_done)
2082 log_write(0, LOG_MAIN|LOG_PANIC,
2083 "already initialised GnuTLS, Exim developer bug");
2084
2085 #ifdef HAVE_GNUTLS_PKCS11
2086 if (!gnutls_allow_auto_pkcs11)
2087 {
2088 rc = gnutls_pkcs11_init(GNUTLS_PKCS11_FLAG_MANUAL, NULL);
2089 validate_check_rc(US"gnutls_pkcs11_init");
2090 }
2091 #endif
2092 rc = gnutls_global_init();
2093 validate_check_rc(US"gnutls_global_init()");
2094 exim_gnutls_base_init_done = TRUE;
2095
2096 if (!(tls_require_ciphers && *tls_require_ciphers))
2097 return_deinit(NULL);
2098
2099 if (!expand_check(tls_require_ciphers, US"tls_require_ciphers", &expciphers))
2100 return_deinit(US"failed to expand tls_require_ciphers");
2101
2102 if (!(expciphers && *expciphers))
2103 return_deinit(NULL);
2104
2105 DEBUG(D_tls)
2106 debug_printf("tls_require_ciphers expands to \"%s\"\n", expciphers);
2107
2108 rc = gnutls_priority_init(&priority_cache, CS expciphers, &errpos);
2109 validate_check_rc(string_sprintf(
2110 "gnutls_priority_init(%s) failed at offset %ld, \"%.8s..\"",
2111 expciphers, errpos - CS expciphers, errpos));
2112
2113 #undef return_deinit
2114 #undef validate_check_rc
2115 gnutls_global_deinit();
2116
2117 return NULL;
2118 }
2119
2120
2121
2122
2123 /*************************************************
2124 * Report the library versions. *
2125 *************************************************/
2126
2127 /* See a description in tls-openssl.c for an explanation of why this exists.
2128
2129 Arguments: a FILE* to print the results to
2130 Returns: nothing
2131 */
2132
2133 void
2134 tls_version_report(FILE *f)
2135 {
2136 fprintf(f, "Library version: GnuTLS: Compile: %s\n"
2137 " Runtime: %s\n",
2138 LIBGNUTLS_VERSION,
2139 gnutls_check_version(NULL));
2140 }
2141
2142 /* vi: aw ai sw=2
2143 */
2144 /* End of tls-gnu.c */