DKIM: permit dkim_private_key to override dkim_strict on signing. Bug 2220
[exim.git] / src / src / tls-openssl.c
CommitLineData
059ec3d9
PH
1/*************************************************
2* Exim - an Internet mail transport agent *
3*************************************************/
4
d4e5e70b 5/* Copyright (c) University of Cambridge 1995 - 2017 */
059ec3d9
PH
6/* See the file NOTICE for conditions of use and distribution. */
7
f5d78688
JH
8/* Portions Copyright (c) The OpenSSL Project 1999 */
9
059ec3d9
PH
10/* This module provides the TLS (aka SSL) support for Exim using the OpenSSL
11library. It is #included into the tls.c file when that library is used. The
12code herein is based on a patch that was originally contributed by Steve
13Haslam. It was adapted from stunnel, a GPL program by Michal Trojnara.
14
15No cryptographic code is included in Exim. All this module does is to call
16functions from the OpenSSL library. */
17
18
19/* Heading stuff */
20
21#include <openssl/lhash.h>
22#include <openssl/ssl.h>
23#include <openssl/err.h>
24#include <openssl/rand.h>
10ca4f1c
JH
25#ifndef OPENSSL_NO_ECDH
26# include <openssl/ec.h>
27#endif
f2de3a33 28#ifndef DISABLE_OCSP
e51c7be2 29# include <openssl/ocsp.h>
3f7eeb86 30#endif
85098ee7 31#ifdef EXPERIMENTAL_DANE
05e796ad 32# include "danessl.h"
85098ee7
JH
33#endif
34
3f7eeb86 35
f2de3a33
JH
36#ifndef DISABLE_OCSP
37# define EXIM_OCSP_SKEW_SECONDS (300L)
38# define EXIM_OCSP_MAX_AGE (-1L)
3f7eeb86 39#endif
059ec3d9 40
3bcbbbe2 41#if OPENSSL_VERSION_NUMBER >= 0x0090806fL && !defined(OPENSSL_NO_TLSEXT)
e51c7be2 42# define EXIM_HAVE_OPENSSL_TLSEXT
3bcbbbe2 43#endif
c8dfb21d
JH
44#if OPENSSL_VERSION_NUMBER >= 0x00908000L
45# define EXIM_HAVE_RSA_GENKEY_EX
46#endif
47#if OPENSSL_VERSION_NUMBER >= 0x10100000L
48# define EXIM_HAVE_OCSP_RESP_COUNT
49#else
50# define EXIM_HAVE_EPHEM_RSA_KEX
51# define EXIM_HAVE_RAND_PSEUDO
52#endif
53#if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && !defined(OPENSSL_NO_SHA256)
54# define EXIM_HAVE_SHA256
55#endif
34e3241d
PP
56
57/*
58 * X509_check_host provides sane certificate hostname checking, but was added
59 * to OpenSSL late, after other projects forked off the code-base. So in
60 * addition to guarding against the base version number, beware that LibreSSL
61 * does not (at this time) support this function.
62 *
63 * If LibreSSL gains a different API, perhaps via libtls, then we'll probably
64 * opt to disentangle and ask a LibreSSL user to provide glue for a third
65 * crypto provider for libtls instead of continuing to tie the OpenSSL glue
66 * into even twistier knots. If LibreSSL gains the same API, we can just
67 * change this guard and punt the issue for a while longer.
68 */
69#ifndef LIBRESSL_VERSION_NUMBER
70# if OPENSSL_VERSION_NUMBER >= 0x010100000L
71# define EXIM_HAVE_OPENSSL_CHECKHOST
8420742d 72# define EXIM_HAVE_OPENSSL_DH_BITS
34e3241d
PP
73# endif
74# if OPENSSL_VERSION_NUMBER >= 0x010000000L \
2dfb468b 75 && (OPENSSL_VERSION_NUMBER & 0x0000ff000L) >= 0x000002000L
34e3241d
PP
76# define EXIM_HAVE_OPENSSL_CHECKHOST
77# endif
11aa88b0 78#endif
10ca4f1c 79
11aa88b0
RA
80#if !defined(LIBRESSL_VERSION_NUMBER) \
81 || LIBRESSL_VERSION_NUMBER >= 0x20010000L
10ca4f1c
JH
82# if !defined(OPENSSL_NO_ECDH)
83# if OPENSSL_VERSION_NUMBER >= 0x0090800fL
84# define EXIM_HAVE_ECDH
85# endif
86# if OPENSSL_VERSION_NUMBER >= 0x10002000L
10ca4f1c
JH
87# define EXIM_HAVE_OPENSSL_EC_NIST2NID
88# endif
89# endif
2dfb468b 90#endif
3bcbbbe2 91
67791ce4
JH
92#if !defined(EXIM_HAVE_OPENSSL_TLSEXT) && !defined(DISABLE_OCSP)
93# warning "OpenSSL library version too old; define DISABLE_OCSP in Makefile"
94# define DISABLE_OCSP
95#endif
96
a6510420
JH
97#ifdef EXIM_HAVE_OPENSSL_CHECKHOST
98# include <openssl/x509v3.h>
99#endif
100
059ec3d9
PH
101/* Structure for collecting random data for seeding. */
102
103typedef struct randstuff {
9e3331ea
TK
104 struct timeval tv;
105 pid_t p;
059ec3d9
PH
106} randstuff;
107
108/* Local static variables */
109
a2ff477a
JH
110static BOOL client_verify_callback_called = FALSE;
111static BOOL server_verify_callback_called = FALSE;
059ec3d9
PH
112static const uschar *sid_ctx = US"exim";
113
d4f09789
PP
114/* We have three different contexts to care about.
115
116Simple case: client, `client_ctx`
117 As a client, we can be doing a callout or cut-through delivery while receiving
118 a message. So we have a client context, which should have options initialised
119 from the SMTP Transport.
120
121Server:
122 There are two cases: with and without ServerNameIndication from the client.
123 Given TLS SNI, we can be using different keys, certs and various other
124 configuration settings, because they're re-expanded with $tls_sni set. This
125 allows vhosting with TLS. This SNI is sent in the handshake.
126 A client might not send SNI, so we need a fallback, and an initial setup too.
127 So as a server, we start out using `server_ctx`.
128 If SNI is sent by the client, then we as server, mid-negotiation, try to clone
129 `server_sni` from `server_ctx` and then initialise settings by re-expanding
130 configuration.
131*/
132
817d9f57
JH
133static SSL_CTX *client_ctx = NULL;
134static SSL_CTX *server_ctx = NULL;
135static SSL *client_ssl = NULL;
136static SSL *server_ssl = NULL;
389ca47a 137
35731706 138#ifdef EXIM_HAVE_OPENSSL_TLSEXT
817d9f57 139static SSL_CTX *server_sni = NULL;
35731706 140#endif
059ec3d9
PH
141
142static char ssl_errstring[256];
143
144static int ssl_session_timeout = 200;
a2ff477a
JH
145static BOOL client_verify_optional = FALSE;
146static BOOL server_verify_optional = FALSE;
059ec3d9 147
f5d78688 148static BOOL reexpand_tls_files_for_sni = FALSE;
059ec3d9
PH
149
150
7be682ca
PP
151typedef struct tls_ext_ctx_cb {
152 uschar *certificate;
153 uschar *privatekey;
f5d78688 154 BOOL is_server;
a6510420 155#ifndef DISABLE_OCSP
c3033f13 156 STACK_OF(X509) *verify_stack; /* chain for verifying the proof */
f5d78688
JH
157 union {
158 struct {
159 uschar *file;
160 uschar *file_expanded;
161 OCSP_RESPONSE *response;
162 } server;
163 struct {
44662487
JH
164 X509_STORE *verify_store; /* non-null if status requested */
165 BOOL verify_required;
f5d78688
JH
166 } client;
167 } u_ocsp;
3f7eeb86 168#endif
7be682ca
PP
169 uschar *dhparam;
170 /* these are cached from first expand */
171 uschar *server_cipher_list;
172 /* only passed down to tls_error: */
173 host_item *host;
55414b25 174 const uschar * verify_cert_hostnames;
0cbf2b82 175#ifndef DISABLE_EVENT
a7538db1
JH
176 uschar * event_action;
177#endif
7be682ca
PP
178} tls_ext_ctx_cb;
179
180/* should figure out a cleanup of API to handle state preserved per
181implementation, for various reasons, which can be void * in the APIs.
182For now, we hack around it. */
817d9f57
JH
183tls_ext_ctx_cb *client_static_cbinfo = NULL;
184tls_ext_ctx_cb *server_static_cbinfo = NULL;
7be682ca
PP
185
186static int
983207c1 187setup_certs(SSL_CTX *sctx, uschar *certs, uschar *crl, host_item *host, BOOL optional,
cf0c6164 188 int (*cert_vfy_cb)(int, X509_STORE_CTX *), uschar ** errstr );
059ec3d9 189
3f7eeb86 190/* Callbacks */
3bcbbbe2 191#ifdef EXIM_HAVE_OPENSSL_TLSEXT
3f7eeb86 192static int tls_servername_cb(SSL *s, int *ad ARG_UNUSED, void *arg);
3bcbbbe2 193#endif
f2de3a33 194#ifndef DISABLE_OCSP
f5d78688 195static int tls_server_stapling_cb(SSL *s, void *arg);
3f7eeb86
PP
196#endif
197
059ec3d9
PH
198
199/*************************************************
200* Handle TLS error *
201*************************************************/
202
203/* Called from lots of places when errors occur before actually starting to do
204the TLS handshake, that is, while the session is still in clear. Always returns
205DEFER for a server and FAIL for a client so that most calls can use "return
206tls_error(...)" to do this processing and then give an appropriate return. A
207single function is used for both server and client, because it is called from
208some shared functions.
209
210Argument:
211 prefix text to include in the logged error
212 host NULL if setting up a server;
213 the connected host if setting up a client
7199e1ee 214 msg error message or NULL if we should ask OpenSSL
cf0c6164 215 errstr pointer to output error message
059ec3d9
PH
216
217Returns: OK/DEFER/FAIL
218*/
219
220static int
cf0c6164 221tls_error(uschar * prefix, const host_item * host, uschar * msg, uschar ** errstr)
059ec3d9 222{
c562fd30 223if (!msg)
7199e1ee
TF
224 {
225 ERR_error_string(ERR_get_error(), ssl_errstring);
cf0c6164 226 msg = US ssl_errstring;
7199e1ee
TF
227 }
228
cf0c6164
JH
229if (errstr) *errstr = string_sprintf("(%s): %s", prefix, msg);
230return host ? FAIL : DEFER;
059ec3d9
PH
231}
232
233
234
235/*************************************************
236* Callback to generate RSA key *
237*************************************************/
238
239/*
240Arguments:
3ae79556 241 s SSL connection (not used)
059ec3d9
PH
242 export not used
243 keylength keylength
244
245Returns: pointer to generated key
246*/
247
248static RSA *
249rsa_callback(SSL *s, int export, int keylength)
250{
251RSA *rsa_key;
c8dfb21d
JH
252#ifdef EXIM_HAVE_RSA_GENKEY_EX
253BIGNUM *bn = BN_new();
254#endif
255
059ec3d9
PH
256export = export; /* Shut picky compilers up */
257DEBUG(D_tls) debug_printf("Generating %d bit RSA key...\n", keylength);
c8dfb21d
JH
258
259#ifdef EXIM_HAVE_RSA_GENKEY_EX
260if ( !BN_set_word(bn, (unsigned long)RSA_F4)
f2cb6292 261 || !(rsa_key = RSA_new())
c8dfb21d
JH
262 || !RSA_generate_key_ex(rsa_key, keylength, bn, NULL)
263 )
264#else
23bb6982 265if (!(rsa_key = RSA_generate_key(keylength, RSA_F4, NULL, NULL)))
c8dfb21d
JH
266#endif
267
059ec3d9
PH
268 {
269 ERR_error_string(ERR_get_error(), ssl_errstring);
270 log_write(0, LOG_MAIN|LOG_PANIC, "TLS error (RSA_generate_key): %s",
271 ssl_errstring);
272 return NULL;
273 }
274return rsa_key;
275}
276
277
278
f5d78688 279/* Extreme debug
f2de3a33 280#ifndef DISABLE_OCSP
f5d78688
JH
281void
282x509_store_dump_cert_s_names(X509_STORE * store)
283{
284STACK_OF(X509_OBJECT) * roots= store->objs;
285int i;
286static uschar name[256];
287
288for(i= 0; i<sk_X509_OBJECT_num(roots); i++)
289 {
290 X509_OBJECT * tmp_obj= sk_X509_OBJECT_value(roots, i);
291 if(tmp_obj->type == X509_LU_X509)
292 {
293 X509 * current_cert= tmp_obj->data.x509;
294 X509_NAME_oneline(X509_get_subject_name(current_cert), CS name, sizeof(name));
f69979cf 295 name[sizeof(name)-1] = '\0';
f5d78688
JH
296 debug_printf(" %s\n", name);
297 }
298 }
299}
300#endif
301*/
302
059ec3d9 303
0cbf2b82 304#ifndef DISABLE_EVENT
f69979cf
JH
305static int
306verify_event(tls_support * tlsp, X509 * cert, int depth, const uschar * dn,
307 BOOL *calledp, const BOOL *optionalp, const uschar * what)
308{
309uschar * ev;
310uschar * yield;
311X509 * old_cert;
312
313ev = tlsp == &tls_out ? client_static_cbinfo->event_action : event_action;
314if (ev)
315 {
aaba7d03 316 DEBUG(D_tls) debug_printf("verify_event: %s %d\n", what, depth);
f69979cf
JH
317 old_cert = tlsp->peercert;
318 tlsp->peercert = X509_dup(cert);
319 /* NB we do not bother setting peerdn */
320 if ((yield = event_raise(ev, US"tls:cert", string_sprintf("%d", depth))))
321 {
322 log_write(0, LOG_MAIN, "[%s] %s verify denied by event-action: "
323 "depth=%d cert=%s: %s",
324 tlsp == &tls_out ? deliver_host_address : sender_host_address,
325 what, depth, dn, yield);
326 *calledp = TRUE;
327 if (!*optionalp)
328 {
329 if (old_cert) tlsp->peercert = old_cert; /* restore 1st failing cert */
330 return 1; /* reject (leaving peercert set) */
331 }
332 DEBUG(D_tls) debug_printf("Event-action verify failure overridden "
333 "(host in tls_try_verify_hosts)\n");
334 }
335 X509_free(tlsp->peercert);
336 tlsp->peercert = old_cert;
337 }
338return 0;
339}
340#endif
341
059ec3d9
PH
342/*************************************************
343* Callback for verification *
344*************************************************/
345
346/* The SSL library does certificate verification if set up to do so. This
347callback has the current yes/no state is in "state". If verification succeeded,
f69979cf
JH
348we set the certificate-verified flag. If verification failed, what happens
349depends on whether the client is required to present a verifiable certificate
350or not.
059ec3d9
PH
351
352If verification is optional, we change the state to yes, but still log the
353verification error. For some reason (it really would help to have proper
354documentation of OpenSSL), this callback function then gets called again, this
f69979cf
JH
355time with state = 1. We must take care not to set the private verified flag on
356the second time through.
059ec3d9
PH
357
358Note: this function is not called if the client fails to present a certificate
359when asked. We get here only if a certificate has been received. Handling of
360optional verification for this case is done when requesting SSL to verify, by
361setting SSL_VERIFY_FAIL_IF_NO_PEER_CERT in the non-optional case.
362
a7538db1
JH
363May be called multiple times for different issues with a certificate, even
364for a given "depth" in the certificate chain.
365
059ec3d9 366Arguments:
f2f2c91b
JH
367 preverify_ok current yes/no state as 1/0
368 x509ctx certificate information.
369 tlsp per-direction (client vs. server) support data
370 calledp has-been-called flag
371 optionalp verification-is-optional flag
059ec3d9 372
f2f2c91b 373Returns: 0 if verification should fail, otherwise 1
059ec3d9
PH
374*/
375
376static int
f2f2c91b 377verify_callback(int preverify_ok, X509_STORE_CTX *x509ctx,
421aff85 378 tls_support *tlsp, BOOL *calledp, BOOL *optionalp)
059ec3d9 379{
421aff85 380X509 * cert = X509_STORE_CTX_get_current_cert(x509ctx);
a7538db1 381int depth = X509_STORE_CTX_get_error_depth(x509ctx);
f69979cf 382uschar dn[256];
059ec3d9 383
f69979cf
JH
384X509_NAME_oneline(X509_get_subject_name(cert), CS dn, sizeof(dn));
385dn[sizeof(dn)-1] = '\0';
059ec3d9 386
f2f2c91b 387if (preverify_ok == 0)
059ec3d9 388 {
f77197ae
JH
389 uschar * extra = verify_mode ? string_sprintf(" (during %c-verify for [%s])",
390 *verify_mode, sender_host_address)
391 : US"";
392 log_write(0, LOG_MAIN, "[%s] SSL verify error%s: depth=%d error=%s cert=%s",
393 tlsp == &tls_out ? deliver_host_address : sender_host_address,
394 extra, depth,
395 X509_verify_cert_error_string(X509_STORE_CTX_get_error(x509ctx)), dn);
a2ff477a 396 *calledp = TRUE;
9d1c15ef
JH
397 if (!*optionalp)
398 {
f69979cf
JH
399 if (!tlsp->peercert)
400 tlsp->peercert = X509_dup(cert); /* record failing cert */
401 return 0; /* reject */
9d1c15ef 402 }
059ec3d9
PH
403 DEBUG(D_tls) debug_printf("SSL verify failure overridden (host in "
404 "tls_try_verify_hosts)\n");
059ec3d9
PH
405 }
406
a7538db1 407else if (depth != 0)
059ec3d9 408 {
f69979cf 409 DEBUG(D_tls) debug_printf("SSL verify ok: depth=%d SN=%s\n", depth, dn);
f2de3a33 410#ifndef DISABLE_OCSP
f5d78688
JH
411 if (tlsp == &tls_out && client_static_cbinfo->u_ocsp.client.verify_store)
412 { /* client, wanting stapling */
413 /* Add the server cert's signing chain as the one
414 for the verification of the OCSP stapled information. */
94431adb 415
f5d78688 416 if (!X509_STORE_add_cert(client_static_cbinfo->u_ocsp.client.verify_store,
421aff85 417 cert))
f5d78688 418 ERR_clear_error();
c3033f13 419 sk_X509_push(client_static_cbinfo->verify_stack, cert);
f5d78688 420 }
a7538db1 421#endif
0cbf2b82 422#ifndef DISABLE_EVENT
f69979cf
JH
423 if (verify_event(tlsp, cert, depth, dn, calledp, optionalp, US"SSL"))
424 return 0; /* reject, with peercert set */
f5d78688 425#endif
059ec3d9
PH
426 }
427else
428 {
55414b25 429 const uschar * verify_cert_hostnames;
e51c7be2 430
e51c7be2
JH
431 if ( tlsp == &tls_out
432 && ((verify_cert_hostnames = client_static_cbinfo->verify_cert_hostnames)))
433 /* client, wanting hostname check */
e51c7be2 434 {
f69979cf 435
740f36d4 436#ifdef EXIM_HAVE_OPENSSL_CHECKHOST
f69979cf
JH
437# ifndef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
438# define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0
439# endif
440# ifndef X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS
441# define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0
442# endif
e51c7be2 443 int sep = 0;
55414b25 444 const uschar * list = verify_cert_hostnames;
e51c7be2 445 uschar * name;
d8e7834a
JH
446 int rc;
447 while ((name = string_nextinlist(&list, &sep, NULL, 0)))
f40d5be3 448 if ((rc = X509_check_host(cert, CCS name, 0,
8d692470 449 X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
740f36d4
JH
450 | X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS,
451 NULL)))
d8e7834a
JH
452 {
453 if (rc < 0)
454 {
93a6fce2 455 log_write(0, LOG_MAIN, "[%s] SSL verify error: internal error",
f77197ae 456 tlsp == &tls_out ? deliver_host_address : sender_host_address);
d8e7834a
JH
457 name = NULL;
458 }
e51c7be2 459 break;
d8e7834a 460 }
e51c7be2 461 if (!name)
f69979cf 462#else
e51c7be2 463 if (!tls_is_name_for_cert(verify_cert_hostnames, cert))
f69979cf 464#endif
e51c7be2 465 {
f77197ae
JH
466 uschar * extra = verify_mode
467 ? string_sprintf(" (during %c-verify for [%s])",
468 *verify_mode, sender_host_address)
469 : US"";
e51c7be2 470 log_write(0, LOG_MAIN,
f77197ae
JH
471 "[%s] SSL verify error%s: certificate name mismatch: DN=\"%s\" H=\"%s\"",
472 tlsp == &tls_out ? deliver_host_address : sender_host_address,
473 extra, dn, verify_cert_hostnames);
a3ef7310
JH
474 *calledp = TRUE;
475 if (!*optionalp)
f69979cf
JH
476 {
477 if (!tlsp->peercert)
478 tlsp->peercert = X509_dup(cert); /* record failing cert */
479 return 0; /* reject */
480 }
a3ef7310
JH
481 DEBUG(D_tls) debug_printf("SSL verify failure overridden (host in "
482 "tls_try_verify_hosts)\n");
e51c7be2 483 }
f69979cf 484 }
e51c7be2 485
0cbf2b82 486#ifndef DISABLE_EVENT
f69979cf
JH
487 if (verify_event(tlsp, cert, depth, dn, calledp, optionalp, US"SSL"))
488 return 0; /* reject, with peercert set */
e51c7be2
JH
489#endif
490
93dcb1c2 491 DEBUG(D_tls) debug_printf("SSL%s verify ok: depth=0 SN=%s\n",
f69979cf 492 *calledp ? "" : " authenticated", dn);
93dcb1c2
JH
493 if (!*calledp) tlsp->certificate_verified = TRUE;
494 *calledp = TRUE;
059ec3d9
PH
495 }
496
a7538db1 497return 1; /* accept, at least for this level */
059ec3d9
PH
498}
499
a2ff477a 500static int
f2f2c91b 501verify_callback_client(int preverify_ok, X509_STORE_CTX *x509ctx)
a2ff477a 502{
f2f2c91b
JH
503return verify_callback(preverify_ok, x509ctx, &tls_out,
504 &client_verify_callback_called, &client_verify_optional);
a2ff477a
JH
505}
506
507static int
f2f2c91b 508verify_callback_server(int preverify_ok, X509_STORE_CTX *x509ctx)
a2ff477a 509{
f2f2c91b
JH
510return verify_callback(preverify_ok, x509ctx, &tls_in,
511 &server_verify_callback_called, &server_verify_optional);
a2ff477a
JH
512}
513
059ec3d9 514
e5cccda9 515#ifdef EXPERIMENTAL_DANE
53a7196b 516
e5cccda9
JH
517/* This gets called *by* the dane library verify callback, which interposes
518itself.
519*/
520static int
f2f2c91b 521verify_callback_client_dane(int preverify_ok, X509_STORE_CTX * x509ctx)
e5cccda9
JH
522{
523X509 * cert = X509_STORE_CTX_get_current_cert(x509ctx);
f69979cf 524uschar dn[256];
83b27293 525int depth = X509_STORE_CTX_get_error_depth(x509ctx);
5c75db2e 526#ifndef DISABLE_EVENT
f69979cf 527BOOL dummy_called, optional = FALSE;
83b27293 528#endif
e5cccda9 529
f69979cf
JH
530X509_NAME_oneline(X509_get_subject_name(cert), CS dn, sizeof(dn));
531dn[sizeof(dn)-1] = '\0';
e5cccda9 532
f2f2c91b
JH
533DEBUG(D_tls) debug_printf("verify_callback_client_dane: %s depth %d %s\n",
534 preverify_ok ? "ok":"BAD", depth, dn);
e5cccda9 535
0cbf2b82 536#ifndef DISABLE_EVENT
f69979cf
JH
537 if (verify_event(&tls_out, cert, depth, dn,
538 &dummy_called, &optional, US"DANE"))
539 return 0; /* reject, with peercert set */
83b27293
JH
540#endif
541
f2f2c91b 542if (preverify_ok == 1)
53a7196b 543 tls_out.dane_verified =
e5cccda9 544 tls_out.certificate_verified = TRUE;
f2f2c91b
JH
545else
546 {
547 int err = X509_STORE_CTX_get_error(x509ctx);
548 DEBUG(D_tls)
549 debug_printf(" - err %d '%s'\n", err, X509_verify_cert_error_string(err));
3c51463e 550 if (err == X509_V_ERR_APPLICATION_VERIFICATION)
f2f2c91b
JH
551 preverify_ok = 1;
552 }
553return preverify_ok;
e5cccda9 554}
53a7196b
JH
555
556#endif /*EXPERIMENTAL_DANE*/
e5cccda9 557
059ec3d9
PH
558
559/*************************************************
560* Information callback *
561*************************************************/
562
563/* The SSL library functions call this from time to time to indicate what they
7be682ca
PP
564are doing. We copy the string to the debugging output when TLS debugging has
565been requested.
059ec3d9
PH
566
567Arguments:
568 s the SSL connection
569 where
570 ret
571
572Returns: nothing
573*/
574
575static void
576info_callback(SSL *s, int where, int ret)
577{
578where = where;
579ret = ret;
580DEBUG(D_tls) debug_printf("SSL info: %s\n", SSL_state_string_long(s));
581}
582
583
584
585/*************************************************
586* Initialize for DH *
587*************************************************/
588
589/* If dhparam is set, expand it, and load up the parameters for DH encryption.
590
591Arguments:
038597d2 592 sctx The current SSL CTX (inbound or outbound)
a799883d 593 dhparam DH parameter file or fixed parameter identity string
7199e1ee 594 host connected host, if client; NULL if server
cf0c6164 595 errstr error string pointer
059ec3d9
PH
596
597Returns: TRUE if OK (nothing to set up, or setup worked)
598*/
599
600static BOOL
cf0c6164 601init_dh(SSL_CTX *sctx, uschar *dhparam, const host_item *host, uschar ** errstr)
059ec3d9 602{
059ec3d9
PH
603BIO *bio;
604DH *dh;
605uschar *dhexpanded;
a799883d 606const char *pem;
6600985a 607int dh_bitsize;
059ec3d9 608
cf0c6164 609if (!expand_check(dhparam, US"tls_dhparam", &dhexpanded, errstr))
059ec3d9
PH
610 return FALSE;
611
0df4ab80 612if (!dhexpanded || !*dhexpanded)
a799883d 613 bio = BIO_new_mem_buf(CS std_dh_prime_default(), -1);
a799883d 614else if (dhexpanded[0] == '/')
059ec3d9 615 {
0df4ab80 616 if (!(bio = BIO_new_file(CS dhexpanded, "r")))
059ec3d9 617 {
7199e1ee 618 tls_error(string_sprintf("could not read dhparams file %s", dhexpanded),
cf0c6164 619 host, US strerror(errno), errstr);
a799883d 620 return FALSE;
059ec3d9 621 }
a799883d
PP
622 }
623else
624 {
625 if (Ustrcmp(dhexpanded, "none") == 0)
059ec3d9 626 {
a799883d
PP
627 DEBUG(D_tls) debug_printf("Requested no DH parameters.\n");
628 return TRUE;
059ec3d9 629 }
a799883d 630
0df4ab80 631 if (!(pem = std_dh_prime_named(dhexpanded)))
a799883d
PP
632 {
633 tls_error(string_sprintf("Unknown standard DH prime \"%s\"", dhexpanded),
cf0c6164 634 host, US strerror(errno), errstr);
a799883d
PP
635 return FALSE;
636 }
637 bio = BIO_new_mem_buf(CS pem, -1);
638 }
639
0df4ab80 640if (!(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)))
a799883d 641 {
059ec3d9 642 BIO_free(bio);
a799883d 643 tls_error(string_sprintf("Could not read tls_dhparams \"%s\"", dhexpanded),
cf0c6164 644 host, NULL, errstr);
a799883d
PP
645 return FALSE;
646 }
647
6600985a
PP
648/* note: our default limit of 2236 is not a multiple of 8; the limit comes from
649 * an NSS limit, and the GnuTLS APIs handle bit-sizes fine, so we went with
650 * 2236. But older OpenSSL can only report in bytes (octets), not bits.
651 * If someone wants to dance at the edge, then they can raise the limit or use
652 * current libraries. */
653#ifdef EXIM_HAVE_OPENSSL_DH_BITS
654/* Added in commit 26c79d5641d; `git describe --contains` says OpenSSL_1_1_0-pre1~1022
655 * This predates OpenSSL_1_1_0 (before a, b, ...) so is in all 1.1.0 */
656dh_bitsize = DH_bits(dh);
657#else
658dh_bitsize = 8 * DH_size(dh);
659#endif
660
a799883d
PP
661/* Even if it is larger, we silently return success rather than cause things
662 * to fail out, so that a too-large DH will not knock out all TLS; it's a
663 * debatable choice. */
6600985a 664if (dh_bitsize > tls_dh_max_bits)
a799883d
PP
665 {
666 DEBUG(D_tls)
170f4904 667 debug_printf("dhparams file %d bits, is > tls_dh_max_bits limit of %d\n",
6600985a 668 dh_bitsize, tls_dh_max_bits);
a799883d
PP
669 }
670else
671 {
672 SSL_CTX_set_tmp_dh(sctx, dh);
673 DEBUG(D_tls)
674 debug_printf("Diffie-Hellman initialized from %s with %d-bit prime\n",
6600985a 675 dhexpanded ? dhexpanded : US"default", dh_bitsize);
059ec3d9
PH
676 }
677
a799883d
PP
678DH_free(dh);
679BIO_free(bio);
680
681return TRUE;
059ec3d9
PH
682}
683
684
685
686
038597d2
PP
687/*************************************************
688* Initialize for ECDH *
689*************************************************/
690
691/* Load parameters for ECDH encryption.
692
693For now, we stick to NIST P-256 because: it's simple and easy to configure;
694it avoids any patent issues that might bite redistributors; despite events in
695the news and concerns over curve choices, we're not cryptographers, we're not
696pretending to be, and this is "good enough" to be better than no support,
697protecting against most adversaries. Given another year or two, there might
698be sufficient clarity about a "right" way forward to let us make an informed
699decision, instead of a knee-jerk reaction.
700
701Longer-term, we should look at supporting both various named curves and
702external files generated with "openssl ecparam", much as we do for init_dh().
703We should also support "none" as a value, to explicitly avoid initialisation.
704
705Patches welcome.
706
707Arguments:
708 sctx The current SSL CTX (inbound or outbound)
709 host connected host, if client; NULL if server
cf0c6164 710 errstr error string pointer
038597d2
PP
711
712Returns: TRUE if OK (nothing to set up, or setup worked)
713*/
714
715static BOOL
cf0c6164 716init_ecdh(SSL_CTX * sctx, host_item * host, uschar ** errstr)
038597d2 717{
63f0dbe0
JH
718#ifdef OPENSSL_NO_ECDH
719return TRUE;
720#else
721
10ca4f1c
JH
722EC_KEY * ecdh;
723uschar * exp_curve;
724int nid;
725BOOL rv;
726
038597d2
PP
727if (host) /* No ECDH setup for clients, only for servers */
728 return TRUE;
729
10ca4f1c 730# ifndef EXIM_HAVE_ECDH
038597d2
PP
731DEBUG(D_tls)
732 debug_printf("No OpenSSL API to define ECDH parameters, skipping\n");
733return TRUE;
038597d2 734# else
10ca4f1c 735
cf0c6164 736if (!expand_check(tls_eccurve, US"tls_eccurve", &exp_curve, errstr))
10ca4f1c
JH
737 return FALSE;
738if (!exp_curve || !*exp_curve)
739 return TRUE;
740
8e53a4fc 741/* "auto" needs to be handled carefully.
4c04137d 742 * OpenSSL < 1.0.2: we do not select anything, but fallback to prime256v1
8e53a4fc 743 * OpenSSL < 1.1.0: we have to call SSL_CTX_set_ecdh_auto
4c04137d 744 * (openssl/ssl.h defines SSL_CTRL_SET_ECDH_AUTO)
8e53a4fc
HSHR
745 * OpenSSL >= 1.1.0: we do not set anything, the libray does autoselection
746 * https://github.com/openssl/openssl/commit/fe6ef2472db933f01b59cad82aa925736935984b
747 */
10ca4f1c 748if (Ustrcmp(exp_curve, "auto") == 0)
038597d2 749 {
8e53a4fc 750#if OPENSSL_VERSION_NUMBER < 0x10002000L
10ca4f1c 751 DEBUG(D_tls) debug_printf(
8e53a4fc 752 "ECDH OpenSSL < 1.0.2: temp key parameter settings: overriding \"auto\" with \"prime256v1\"\n");
78a3bbd5 753 exp_curve = US"prime256v1";
8e53a4fc
HSHR
754#else
755# if defined SSL_CTRL_SET_ECDH_AUTO
756 DEBUG(D_tls) debug_printf(
757 "ECDH OpenSSL 1.0.2+ temp key parameter settings: autoselection\n");
10ca4f1c
JH
758 SSL_CTX_set_ecdh_auto(sctx, 1);
759 return TRUE;
8e53a4fc
HSHR
760# else
761 DEBUG(D_tls) debug_printf(
762 "ECDH OpenSSL 1.1.0+ temp key parameter settings: default selection\n");
763 return TRUE;
764# endif
765#endif
10ca4f1c 766 }
038597d2 767
10ca4f1c
JH
768DEBUG(D_tls) debug_printf("ECDH: curve '%s'\n", exp_curve);
769if ( (nid = OBJ_sn2nid (CCS exp_curve)) == NID_undef
770# ifdef EXIM_HAVE_OPENSSL_EC_NIST2NID
771 && (nid = EC_curve_nist2nid(CCS exp_curve)) == NID_undef
772# endif
773 )
774 {
cf0c6164
JH
775 tls_error(string_sprintf("Unknown curve name tls_eccurve '%s'", exp_curve),
776 host, NULL, errstr);
10ca4f1c
JH
777 return FALSE;
778 }
038597d2 779
10ca4f1c
JH
780if (!(ecdh = EC_KEY_new_by_curve_name(nid)))
781 {
cf0c6164 782 tls_error(US"Unable to create ec curve", host, NULL, errstr);
10ca4f1c 783 return FALSE;
038597d2 784 }
10ca4f1c
JH
785
786/* The "tmp" in the name here refers to setting a temporary key
787not to the stability of the interface. */
788
789if ((rv = SSL_CTX_set_tmp_ecdh(sctx, ecdh) == 0))
cf0c6164 790 tls_error(string_sprintf("Error enabling '%s' curve", exp_curve), host, NULL, errstr);
10ca4f1c
JH
791else
792 DEBUG(D_tls) debug_printf("ECDH: enabled '%s' curve\n", exp_curve);
793
794EC_KEY_free(ecdh);
795return !rv;
796
797# endif /*EXIM_HAVE_ECDH*/
798#endif /*OPENSSL_NO_ECDH*/
038597d2
PP
799}
800
801
802
803
f2de3a33 804#ifndef DISABLE_OCSP
3f7eeb86
PP
805/*************************************************
806* Load OCSP information into state *
807*************************************************/
f5d78688 808/* Called to load the server OCSP response from the given file into memory, once
3f7eeb86
PP
809caller has determined this is needed. Checks validity. Debugs a message
810if invalid.
811
812ASSUMES: single response, for single cert.
813
814Arguments:
815 sctx the SSL_CTX* to update
816 cbinfo various parts of session state
817 expanded the filename putatively holding an OCSP response
818
819*/
820
821static void
f5d78688 822ocsp_load_response(SSL_CTX *sctx, tls_ext_ctx_cb *cbinfo, const uschar *expanded)
3f7eeb86 823{
ee5b1e28
JH
824BIO * bio;
825OCSP_RESPONSE * resp;
826OCSP_BASICRESP * basic_response;
827OCSP_SINGLERESP * single_response;
828ASN1_GENERALIZEDTIME * rev, * thisupd, * nextupd;
ee5b1e28 829STACK_OF(X509) * sk;
3f7eeb86
PP
830unsigned long verify_flags;
831int status, reason, i;
832
f5d78688
JH
833cbinfo->u_ocsp.server.file_expanded = string_copy(expanded);
834if (cbinfo->u_ocsp.server.response)
3f7eeb86 835 {
f5d78688
JH
836 OCSP_RESPONSE_free(cbinfo->u_ocsp.server.response);
837 cbinfo->u_ocsp.server.response = NULL;
3f7eeb86
PP
838 }
839
ee5b1e28 840if (!(bio = BIO_new_file(CS cbinfo->u_ocsp.server.file_expanded, "rb")))
3f7eeb86
PP
841 {
842 DEBUG(D_tls) debug_printf("Failed to open OCSP response file \"%s\"\n",
f5d78688 843 cbinfo->u_ocsp.server.file_expanded);
3f7eeb86
PP
844 return;
845 }
846
847resp = d2i_OCSP_RESPONSE_bio(bio, NULL);
848BIO_free(bio);
849if (!resp)
850 {
851 DEBUG(D_tls) debug_printf("Error reading OCSP response.\n");
852 return;
853 }
854
ee5b1e28 855if ((status = OCSP_response_status(resp)) != OCSP_RESPONSE_STATUS_SUCCESSFUL)
3f7eeb86
PP
856 {
857 DEBUG(D_tls) debug_printf("OCSP response not valid: %s (%d)\n",
858 OCSP_response_status_str(status), status);
f5d78688 859 goto bad;
3f7eeb86
PP
860 }
861
ee5b1e28 862if (!(basic_response = OCSP_response_get1_basic(resp)))
3f7eeb86
PP
863 {
864 DEBUG(D_tls)
865 debug_printf("OCSP response parse error: unable to extract basic response.\n");
f5d78688 866 goto bad;
3f7eeb86
PP
867 }
868
c3033f13 869sk = cbinfo->verify_stack;
3f7eeb86
PP
870verify_flags = OCSP_NOVERIFY; /* check sigs, but not purpose */
871
872/* May need to expose ability to adjust those flags?
873OCSP_NOSIGS OCSP_NOVERIFY OCSP_NOCHAIN OCSP_NOCHECKS OCSP_NOEXPLICIT
874OCSP_TRUSTOTHER OCSP_NOINTERN */
875
4c04137d 876/* This does a full verify on the OCSP proof before we load it for serving
ee5b1e28
JH
877up; possibly overkill - just date-checks might be nice enough.
878
879OCSP_basic_verify takes a "store" arg, but does not
880use it for the chain verification, which is all we do
881when OCSP_NOVERIFY is set. The content from the wire
882"basic_response" and a cert-stack "sk" are all that is used.
883
c3033f13
JH
884We have a stack, loaded in setup_certs() if tls_verify_certificates
885was a file (not a directory, or "system"). It is unfortunate we
886cannot used the connection context store, as that would neatly
887handle the "system" case too, but there seems to be no library
888function for getting a stack from a store.
e3555426 889[ In OpenSSL 1.1 - ? X509_STORE_CTX_get0_chain(ctx) ? ]
c3033f13
JH
890We do not free the stack since it could be needed a second time for
891SNI handling.
892
4c04137d 893Separately we might try to replace using OCSP_basic_verify() - which seems to not
ee5b1e28
JH
894be a public interface into the OpenSSL library (there's no manual entry) -
895But what with? We also use OCSP_basic_verify in the client stapling callback.
4c04137d 896And there we NEED it; we must verify that status... unless the
ee5b1e28
JH
897library does it for us anyway? */
898
899if ((i = OCSP_basic_verify(basic_response, sk, NULL, verify_flags)) < 0)
3f7eeb86 900 {
ee5b1e28
JH
901 DEBUG(D_tls)
902 {
3f7eeb86
PP
903 ERR_error_string(ERR_get_error(), ssl_errstring);
904 debug_printf("OCSP response verify failure: %s\n", US ssl_errstring);
f5d78688
JH
905 }
906 goto bad;
3f7eeb86
PP
907 }
908
909/* Here's the simplifying assumption: there's only one response, for the
910one certificate we use, and nothing for anything else in a chain. If this
911proves false, we need to extract a cert id from our issued cert
912(tls_certificate) and use that for OCSP_resp_find_status() (which finds the
913right cert in the stack and then calls OCSP_single_get0_status()).
914
915I'm hoping to avoid reworking a bunch more of how we handle state here. */
ee5b1e28
JH
916
917if (!(single_response = OCSP_resp_get0(basic_response, 0)))
3f7eeb86
PP
918 {
919 DEBUG(D_tls)
920 debug_printf("Unable to get first response from OCSP basic response.\n");
f5d78688 921 goto bad;
3f7eeb86
PP
922 }
923
924status = OCSP_single_get0_status(single_response, &reason, &rev, &thisupd, &nextupd);
f5d78688 925if (status != V_OCSP_CERTSTATUS_GOOD)
3f7eeb86 926 {
f5d78688
JH
927 DEBUG(D_tls) debug_printf("OCSP response bad cert status: %s (%d) %s (%d)\n",
928 OCSP_cert_status_str(status), status,
929 OCSP_crl_reason_str(reason), reason);
930 goto bad;
3f7eeb86
PP
931 }
932
933if (!OCSP_check_validity(thisupd, nextupd, EXIM_OCSP_SKEW_SECONDS, EXIM_OCSP_MAX_AGE))
934 {
935 DEBUG(D_tls) debug_printf("OCSP status invalid times.\n");
f5d78688 936 goto bad;
3f7eeb86
PP
937 }
938
f5d78688 939supply_response:
47195144 940 cbinfo->u_ocsp.server.response = resp; /*XXX stack?*/
f5d78688
JH
941return;
942
943bad:
018058b2
JH
944 if (running_in_test_harness)
945 {
946 extern char ** environ;
947 uschar ** p;
47195144 948 if (environ) for (p = USS environ; *p; p++)
018058b2
JH
949 if (Ustrncmp(*p, "EXIM_TESTHARNESS_DISABLE_OCSPVALIDITYCHECK", 42) == 0)
950 {
951 DEBUG(D_tls) debug_printf("Supplying known bad OCSP response\n");
952 goto supply_response;
953 }
954 }
f5d78688 955return;
3f7eeb86 956}
f2de3a33 957#endif /*!DISABLE_OCSP*/
3f7eeb86
PP
958
959
960
961
23bb6982
JH
962/* Create and install a selfsigned certificate, for use in server mode */
963
964static int
cf0c6164 965tls_install_selfsign(SSL_CTX * sctx, uschar ** errstr)
23bb6982
JH
966{
967X509 * x509 = NULL;
968EVP_PKEY * pkey;
969RSA * rsa;
970X509_NAME * name;
971uschar * where;
972
973where = US"allocating pkey";
974if (!(pkey = EVP_PKEY_new()))
975 goto err;
976
977where = US"allocating cert";
978if (!(x509 = X509_new()))
979 goto err;
980
981where = US"generating pkey";
3ae79556 982if (!(rsa = rsa_callback(NULL, 0, 1024)))
23bb6982
JH
983 goto err;
984
4c04137d 985where = US"assigning pkey";
23bb6982
JH
986if (!EVP_PKEY_assign_RSA(pkey, rsa))
987 goto err;
988
989X509_set_version(x509, 2); /* N+1 - version 3 */
990ASN1_INTEGER_set(X509_get_serialNumber(x509), 0);
991X509_gmtime_adj(X509_get_notBefore(x509), 0);
992X509_gmtime_adj(X509_get_notAfter(x509), (long)60 * 60); /* 1 hour */
993X509_set_pubkey(x509, pkey);
994
995name = X509_get_subject_name(x509);
996X509_NAME_add_entry_by_txt(name, "C",
4dc2379a 997 MBSTRING_ASC, CUS "UK", -1, -1, 0);
23bb6982 998X509_NAME_add_entry_by_txt(name, "O",
4dc2379a 999 MBSTRING_ASC, CUS "Exim Developers", -1, -1, 0);
23bb6982 1000X509_NAME_add_entry_by_txt(name, "CN",
4dc2379a 1001 MBSTRING_ASC, CUS smtp_active_hostname, -1, -1, 0);
23bb6982
JH
1002X509_set_issuer_name(x509, name);
1003
1004where = US"signing cert";
1005if (!X509_sign(x509, pkey, EVP_md5()))
1006 goto err;
1007
1008where = US"installing selfsign cert";
1009if (!SSL_CTX_use_certificate(sctx, x509))
1010 goto err;
1011
1012where = US"installing selfsign key";
1013if (!SSL_CTX_use_PrivateKey(sctx, pkey))
1014 goto err;
1015
1016return OK;
1017
1018err:
cf0c6164 1019 (void) tls_error(where, NULL, NULL, errstr);
23bb6982
JH
1020 if (x509) X509_free(x509);
1021 if (pkey) EVP_PKEY_free(pkey);
1022 return DEFER;
1023}
1024
1025
1026
1027
ba86e143
JH
1028static int
1029tls_add_certfile(SSL_CTX * sctx, tls_ext_ctx_cb * cbinfo, uschar * file,
1030 uschar ** errstr)
1031{
1032DEBUG(D_tls) debug_printf("tls_certificate file %s\n", file);
1033if (!SSL_CTX_use_certificate_chain_file(sctx, CS file))
1034 return tls_error(string_sprintf(
1035 "SSL_CTX_use_certificate_chain_file file=%s", file),
1036 cbinfo->host, NULL, errstr);
1037return 0;
1038}
1039
1040static int
1041tls_add_pkeyfile(SSL_CTX * sctx, tls_ext_ctx_cb * cbinfo, uschar * file,
1042 uschar ** errstr)
1043{
1044DEBUG(D_tls) debug_printf("tls_privatekey file %s\n", file);
1045if (!SSL_CTX_use_PrivateKey_file(sctx, CS file, SSL_FILETYPE_PEM))
1046 return tls_error(string_sprintf(
1047 "SSL_CTX_use_PrivateKey_file file=%s", file), cbinfo->host, NULL, errstr);
1048return 0;
1049}
1050
1051
7be682ca
PP
1052/*************************************************
1053* Expand key and cert file specs *
1054*************************************************/
1055
f5d78688 1056/* Called once during tls_init and possibly again during TLS setup, for a
7be682ca
PP
1057new context, if Server Name Indication was used and tls_sni was seen in
1058the certificate string.
1059
1060Arguments:
1061 sctx the SSL_CTX* to update
1062 cbinfo various parts of session state
cf0c6164 1063 errstr error string pointer
7be682ca
PP
1064
1065Returns: OK/DEFER/FAIL
1066*/
1067
1068static int
cf0c6164
JH
1069tls_expand_session_files(SSL_CTX *sctx, tls_ext_ctx_cb *cbinfo,
1070 uschar ** errstr)
7be682ca
PP
1071{
1072uschar *expanded;
1073
23bb6982 1074if (!cbinfo->certificate)
7be682ca 1075 {
ba86e143 1076 if (!cbinfo->is_server) /* client */
23bb6982
JH
1077 return OK;
1078 /* server */
cf0c6164 1079 if (tls_install_selfsign(sctx, errstr) != OK)
23bb6982 1080 return DEFER;
7be682ca 1081 }
23bb6982
JH
1082else
1083 {
ba86e143
JH
1084 int err;
1085
23bb6982
JH
1086 if (Ustrstr(cbinfo->certificate, US"tls_sni") ||
1087 Ustrstr(cbinfo->certificate, US"tls_in_sni") ||
1088 Ustrstr(cbinfo->certificate, US"tls_out_sni")
1089 )
1090 reexpand_tls_files_for_sni = TRUE;
7be682ca 1091
cf0c6164 1092 if (!expand_check(cbinfo->certificate, US"tls_certificate", &expanded, errstr))
23bb6982
JH
1093 return DEFER;
1094
ba86e143
JH
1095 if (expanded)
1096 if (cbinfo->is_server)
1097 {
1098 const uschar * file_list = expanded;
1099 int sep = 0;
1100 uschar * file;
1101
1102 while (file = string_nextinlist(&file_list, &sep, NULL, 0))
1103 if ((err = tls_add_certfile(sctx, cbinfo, file, errstr)))
1104 return err;
1105 }
1106 else /* would there ever be a need for multiple client certs? */
1107 if ((err = tls_add_certfile(sctx, cbinfo, expanded, errstr)))
1108 return err;
7be682ca 1109
23bb6982 1110 if (cbinfo->privatekey != NULL &&
cf0c6164 1111 !expand_check(cbinfo->privatekey, US"tls_privatekey", &expanded, errstr))
23bb6982 1112 return DEFER;
7be682ca 1113
23bb6982
JH
1114 /* If expansion was forced to fail, key_expanded will be NULL. If the result
1115 of the expansion is an empty string, ignore it also, and assume the private
1116 key is in the same file as the certificate. */
1117
1118 if (expanded && *expanded)
ba86e143
JH
1119 if (cbinfo->is_server)
1120 {
1121 const uschar * file_list = expanded;
1122 int sep = 0;
1123 uschar * file;
1124
1125 while (file = string_nextinlist(&file_list, &sep, NULL, 0))
1126 if ((err = tls_add_pkeyfile(sctx, cbinfo, file, errstr)))
1127 return err;
1128 }
1129 else /* would there ever be a need for multiple client certs? */
1130 if ((err = tls_add_pkeyfile(sctx, cbinfo, expanded, errstr)))
1131 return err;
7be682ca
PP
1132 }
1133
f2de3a33 1134#ifndef DISABLE_OCSP
f40d5be3 1135if (cbinfo->is_server && cbinfo->u_ocsp.server.file)
3f7eeb86 1136 {
47195144 1137 /*XXX stack*/
cf0c6164 1138 if (!expand_check(cbinfo->u_ocsp.server.file, US"tls_ocsp_file", &expanded, errstr))
3f7eeb86
PP
1139 return DEFER;
1140
f40d5be3 1141 if (expanded && *expanded)
3f7eeb86
PP
1142 {
1143 DEBUG(D_tls) debug_printf("tls_ocsp_file %s\n", expanded);
f40d5be3
JH
1144 if ( cbinfo->u_ocsp.server.file_expanded
1145 && (Ustrcmp(expanded, cbinfo->u_ocsp.server.file_expanded) == 0))
3f7eeb86 1146 {
f40d5be3
JH
1147 DEBUG(D_tls) debug_printf(" - value unchanged, using existing values\n");
1148 }
1149 else
f40d5be3 1150 ocsp_load_response(sctx, cbinfo, expanded);
3f7eeb86
PP
1151 }
1152 }
1153#endif
1154
7be682ca
PP
1155return OK;
1156}
1157
1158
1159
1160
1161/*************************************************
1162* Callback to handle SNI *
1163*************************************************/
1164
1165/* Called when acting as server during the TLS session setup if a Server Name
1166Indication extension was sent by the client.
1167
1168API documentation is OpenSSL s_server.c implementation.
1169
1170Arguments:
1171 s SSL* of the current session
1172 ad unknown (part of OpenSSL API) (unused)
1173 arg Callback of "our" registered data
1174
1175Returns: SSL_TLSEXT_ERR_{OK,ALERT_WARNING,ALERT_FATAL,NOACK}
1176*/
1177
3bcbbbe2 1178#ifdef EXIM_HAVE_OPENSSL_TLSEXT
7be682ca
PP
1179static int
1180tls_servername_cb(SSL *s, int *ad ARG_UNUSED, void *arg)
1181{
1182const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
3f7eeb86 1183tls_ext_ctx_cb *cbinfo = (tls_ext_ctx_cb *) arg;
7be682ca 1184int rc;
3f0945ff 1185int old_pool = store_pool;
cf0c6164 1186uschar * dummy_errstr;
7be682ca
PP
1187
1188if (!servername)
1189 return SSL_TLSEXT_ERR_OK;
1190
3f0945ff 1191DEBUG(D_tls) debug_printf("Received TLS SNI \"%s\"%s\n", servername,
7be682ca
PP
1192 reexpand_tls_files_for_sni ? "" : " (unused for certificate selection)");
1193
1194/* Make the extension value available for expansion */
3f0945ff 1195store_pool = POOL_PERM;
817d9f57 1196tls_in.sni = string_copy(US servername);
3f0945ff 1197store_pool = old_pool;
7be682ca
PP
1198
1199if (!reexpand_tls_files_for_sni)
1200 return SSL_TLSEXT_ERR_OK;
1201
1202/* Can't find an SSL_CTX_clone() or equivalent, so we do it manually;
1203not confident that memcpy wouldn't break some internal reference counting.
1204Especially since there's a references struct member, which would be off. */
1205
0df4ab80 1206if (!(server_sni = SSL_CTX_new(SSLv23_server_method())))
7be682ca
PP
1207 {
1208 ERR_error_string(ERR_get_error(), ssl_errstring);
1209 DEBUG(D_tls) debug_printf("SSL_CTX_new() failed: %s\n", ssl_errstring);
1210 return SSL_TLSEXT_ERR_NOACK;
1211 }
1212
1213/* Not sure how many of these are actually needed, since SSL object
1214already exists. Might even need this selfsame callback, for reneg? */
1215
817d9f57
JH
1216SSL_CTX_set_info_callback(server_sni, SSL_CTX_get_info_callback(server_ctx));
1217SSL_CTX_set_mode(server_sni, SSL_CTX_get_mode(server_ctx));
1218SSL_CTX_set_options(server_sni, SSL_CTX_get_options(server_ctx));
1219SSL_CTX_set_timeout(server_sni, SSL_CTX_get_timeout(server_ctx));
1220SSL_CTX_set_tlsext_servername_callback(server_sni, tls_servername_cb);
1221SSL_CTX_set_tlsext_servername_arg(server_sni, cbinfo);
038597d2 1222
cf0c6164
JH
1223if ( !init_dh(server_sni, cbinfo->dhparam, NULL, &dummy_errstr)
1224 || !init_ecdh(server_sni, NULL, &dummy_errstr)
038597d2
PP
1225 )
1226 return SSL_TLSEXT_ERR_NOACK;
1227
7be682ca 1228if (cbinfo->server_cipher_list)
817d9f57 1229 SSL_CTX_set_cipher_list(server_sni, CS cbinfo->server_cipher_list);
f2de3a33 1230#ifndef DISABLE_OCSP
f5d78688 1231if (cbinfo->u_ocsp.server.file)
3f7eeb86 1232 {
f5d78688 1233 SSL_CTX_set_tlsext_status_cb(server_sni, tls_server_stapling_cb);
14c7b357 1234 SSL_CTX_set_tlsext_status_arg(server_sni, cbinfo);
3f7eeb86
PP
1235 }
1236#endif
7be682ca 1237
c3033f13 1238if ((rc = setup_certs(server_sni, tls_verify_certificates, tls_crl, NULL, FALSE,
cf0c6164 1239 verify_callback_server, &dummy_errstr)) != OK)
c3033f13 1240 return SSL_TLSEXT_ERR_NOACK;
7be682ca 1241
3f7eeb86
PP
1242/* do this after setup_certs, because this can require the certs for verifying
1243OCSP information. */
cf0c6164 1244if ((rc = tls_expand_session_files(server_sni, cbinfo, &dummy_errstr)) != OK)
0df4ab80 1245 return SSL_TLSEXT_ERR_NOACK;
a799883d 1246
7be682ca 1247DEBUG(D_tls) debug_printf("Switching SSL context.\n");
817d9f57 1248SSL_set_SSL_CTX(s, server_sni);
7be682ca
PP
1249
1250return SSL_TLSEXT_ERR_OK;
1251}
3bcbbbe2 1252#endif /* EXIM_HAVE_OPENSSL_TLSEXT */
7be682ca
PP
1253
1254
1255
1256
f2de3a33 1257#ifndef DISABLE_OCSP
f5d78688 1258
3f7eeb86
PP
1259/*************************************************
1260* Callback to handle OCSP Stapling *
1261*************************************************/
1262
1263/* Called when acting as server during the TLS session setup if the client
1264requests OCSP information with a Certificate Status Request.
1265
1266Documentation via openssl s_server.c and the Apache patch from the OpenSSL
1267project.
1268
1269*/
1270
1271static int
f5d78688 1272tls_server_stapling_cb(SSL *s, void *arg)
3f7eeb86
PP
1273{
1274const tls_ext_ctx_cb *cbinfo = (tls_ext_ctx_cb *) arg;
47195144 1275uschar *response_der; /*XXX blob */
3f7eeb86
PP
1276int response_der_len;
1277
47195144
JH
1278/*XXX stack: use SSL_get_certificate() to see which cert; from that work
1279out which ocsp blob to send. Unfortunately, SSL_get_certificate is known
1280buggy in current OpenSSL; it returns the last cert loaded always rather than
1281the one actually presented. So we can't support a stack of OCSP proofs at
1282this time. */
1283
af4a1bca 1284DEBUG(D_tls)
b3ef41c9 1285 debug_printf("Received TLS status request (OCSP stapling); %s response\n",
f5d78688
JH
1286 cbinfo->u_ocsp.server.response ? "have" : "lack");
1287
44662487 1288tls_in.ocsp = OCSP_NOT_RESP;
f5d78688 1289if (!cbinfo->u_ocsp.server.response)
3f7eeb86
PP
1290 return SSL_TLSEXT_ERR_NOACK;
1291
1292response_der = NULL;
47195144 1293response_der_len = i2d_OCSP_RESPONSE(cbinfo->u_ocsp.server.response, /*XXX stack*/
44662487 1294 &response_der);
3f7eeb86
PP
1295if (response_der_len <= 0)
1296 return SSL_TLSEXT_ERR_NOACK;
1297
5e55c7a9 1298SSL_set_tlsext_status_ocsp_resp(server_ssl, response_der, response_der_len);
44662487 1299tls_in.ocsp = OCSP_VFIED;
3f7eeb86
PP
1300return SSL_TLSEXT_ERR_OK;
1301}
1302
3f7eeb86 1303
f5d78688
JH
1304static void
1305time_print(BIO * bp, const char * str, ASN1_GENERALIZEDTIME * time)
1306{
1307BIO_printf(bp, "\t%s: ", str);
1308ASN1_GENERALIZEDTIME_print(bp, time);
1309BIO_puts(bp, "\n");
1310}
1311
1312static int
1313tls_client_stapling_cb(SSL *s, void *arg)
1314{
1315tls_ext_ctx_cb * cbinfo = arg;
1316const unsigned char * p;
1317int len;
1318OCSP_RESPONSE * rsp;
1319OCSP_BASICRESP * bs;
1320int i;
1321
1322DEBUG(D_tls) debug_printf("Received TLS status response (OCSP stapling):");
1323len = SSL_get_tlsext_status_ocsp_resp(s, &p);
1324if(!p)
1325 {
44662487 1326 /* Expect this when we requested ocsp but got none */
6c6d6e48 1327 if (cbinfo->u_ocsp.client.verify_required && LOGGING(tls_cipher))
44662487 1328 log_write(0, LOG_MAIN, "Received TLS status callback, null content");
f5d78688
JH
1329 else
1330 DEBUG(D_tls) debug_printf(" null\n");
44662487 1331 return cbinfo->u_ocsp.client.verify_required ? 0 : 1;
f5d78688 1332 }
018058b2 1333
f5d78688
JH
1334if(!(rsp = d2i_OCSP_RESPONSE(NULL, &p, len)))
1335 {
018058b2 1336 tls_out.ocsp = OCSP_FAILED;
6c6d6e48 1337 if (LOGGING(tls_cipher))
1eca31ca 1338 log_write(0, LOG_MAIN, "Received TLS cert status response, parse error");
f5d78688
JH
1339 else
1340 DEBUG(D_tls) debug_printf(" parse error\n");
1341 return 0;
1342 }
1343
1344if(!(bs = OCSP_response_get1_basic(rsp)))
1345 {
018058b2 1346 tls_out.ocsp = OCSP_FAILED;
6c6d6e48 1347 if (LOGGING(tls_cipher))
1eca31ca 1348 log_write(0, LOG_MAIN, "Received TLS cert status response, error parsing response");
f5d78688
JH
1349 else
1350 DEBUG(D_tls) debug_printf(" error parsing response\n");
1351 OCSP_RESPONSE_free(rsp);
1352 return 0;
1353 }
1354
1355/* We'd check the nonce here if we'd put one in the request. */
1356/* However that would defeat cacheability on the server so we don't. */
1357
f5d78688
JH
1358/* This section of code reworked from OpenSSL apps source;
1359 The OpenSSL Project retains copyright:
1360 Copyright (c) 1999 The OpenSSL Project. All rights reserved.
1361*/
1362 {
1363 BIO * bp = NULL;
f5d78688
JH
1364 int status, reason;
1365 ASN1_GENERALIZEDTIME *rev, *thisupd, *nextupd;
1366
1367 DEBUG(D_tls) bp = BIO_new_fp(stderr, BIO_NOCLOSE);
1368
1369 /*OCSP_RESPONSE_print(bp, rsp, 0); extreme debug: stapling content */
1370
1371 /* Use the chain that verified the server cert to verify the stapled info */
1372 /* DEBUG(D_tls) x509_store_dump_cert_s_names(cbinfo->u_ocsp.client.verify_store); */
1373
c3033f13 1374 if ((i = OCSP_basic_verify(bs, cbinfo->verify_stack,
44662487 1375 cbinfo->u_ocsp.client.verify_store, 0)) <= 0)
f5d78688 1376 {
018058b2 1377 tls_out.ocsp = OCSP_FAILED;
6c6d6e48 1378 if (LOGGING(tls_cipher))
1eca31ca 1379 log_write(0, LOG_MAIN, "Received TLS cert status response, itself unverifiable");
f5d78688
JH
1380 BIO_printf(bp, "OCSP response verify failure\n");
1381 ERR_print_errors(bp);
c8dfb21d 1382 goto failed;
f5d78688
JH
1383 }
1384
1385 BIO_printf(bp, "OCSP response well-formed and signed OK\n");
1386
c8dfb21d
JH
1387 /*XXX So we have a good stapled OCSP status. How do we know
1388 it is for the cert of interest? OpenSSL 1.1.0 has a routine
1389 OCSP_resp_find_status() which matches on a cert id, which presumably
1390 we should use. Making an id needs OCSP_cert_id_new(), which takes
1391 issuerName, issuerKey, serialNumber. Are they all in the cert?
1392
1393 For now, carry on blindly accepting the resp. */
1394
f5d78688 1395 {
f5d78688
JH
1396 OCSP_SINGLERESP * single;
1397
c8dfb21d
JH
1398#ifdef EXIM_HAVE_OCSP_RESP_COUNT
1399 if (OCSP_resp_count(bs) != 1)
1400#else
1401 STACK_OF(OCSP_SINGLERESP) * sresp = bs->tbsResponseData->responses;
f5d78688 1402 if (sk_OCSP_SINGLERESP_num(sresp) != 1)
c8dfb21d 1403#endif
f5d78688 1404 {
018058b2 1405 tls_out.ocsp = OCSP_FAILED;
44662487
JH
1406 log_write(0, LOG_MAIN, "OCSP stapling "
1407 "with multiple responses not handled");
c8dfb21d 1408 goto failed;
f5d78688
JH
1409 }
1410 single = OCSP_resp_get0(bs, 0);
44662487
JH
1411 status = OCSP_single_get0_status(single, &reason, &rev,
1412 &thisupd, &nextupd);
f5d78688
JH
1413 }
1414
f5d78688
JH
1415 DEBUG(D_tls) time_print(bp, "This OCSP Update", thisupd);
1416 DEBUG(D_tls) if(nextupd) time_print(bp, "Next OCSP Update", nextupd);
44662487
JH
1417 if (!OCSP_check_validity(thisupd, nextupd,
1418 EXIM_OCSP_SKEW_SECONDS, EXIM_OCSP_MAX_AGE))
f5d78688 1419 {
018058b2 1420 tls_out.ocsp = OCSP_FAILED;
f5d78688
JH
1421 DEBUG(D_tls) ERR_print_errors(bp);
1422 log_write(0, LOG_MAIN, "Server OSCP dates invalid");
f5d78688 1423 }
44662487 1424 else
f5d78688 1425 {
44662487
JH
1426 DEBUG(D_tls) BIO_printf(bp, "Certificate status: %s\n",
1427 OCSP_cert_status_str(status));
1428 switch(status)
1429 {
1430 case V_OCSP_CERTSTATUS_GOOD:
44662487 1431 tls_out.ocsp = OCSP_VFIED;
018058b2 1432 i = 1;
c8dfb21d 1433 goto good;
44662487 1434 case V_OCSP_CERTSTATUS_REVOKED:
018058b2 1435 tls_out.ocsp = OCSP_FAILED;
44662487
JH
1436 log_write(0, LOG_MAIN, "Server certificate revoked%s%s",
1437 reason != -1 ? "; reason: " : "",
1438 reason != -1 ? OCSP_crl_reason_str(reason) : "");
1439 DEBUG(D_tls) time_print(bp, "Revocation Time", rev);
44662487
JH
1440 break;
1441 default:
018058b2 1442 tls_out.ocsp = OCSP_FAILED;
44662487
JH
1443 log_write(0, LOG_MAIN,
1444 "Server certificate status unknown, in OCSP stapling");
44662487
JH
1445 break;
1446 }
f5d78688 1447 }
c8dfb21d
JH
1448 failed:
1449 i = cbinfo->u_ocsp.client.verify_required ? 0 : 1;
1450 good:
f5d78688
JH
1451 BIO_free(bp);
1452 }
1453
1454OCSP_RESPONSE_free(rsp);
1455return i;
1456}
f2de3a33 1457#endif /*!DISABLE_OCSP*/
3f7eeb86
PP
1458
1459
059ec3d9
PH
1460/*************************************************
1461* Initialize for TLS *
1462*************************************************/
1463
e51c7be2
JH
1464/* Called from both server and client code, to do preliminary initialization
1465of the library. We allocate and return a context structure.
059ec3d9
PH
1466
1467Arguments:
946ecbe0 1468 ctxp returned SSL context
059ec3d9
PH
1469 host connected host, if client; NULL if server
1470 dhparam DH parameter file
1471 certificate certificate file
1472 privatekey private key
f5d78688 1473 ocsp_file file of stapling info (server); flag for require ocsp (client)
059ec3d9 1474 addr address if client; NULL if server (for some randomness)
946ecbe0 1475 cbp place to put allocated callback context
cf0c6164 1476 errstr error string pointer
059ec3d9
PH
1477
1478Returns: OK/DEFER/FAIL
1479*/
1480
1481static int
817d9f57 1482tls_init(SSL_CTX **ctxp, host_item *host, uschar *dhparam, uschar *certificate,
3f7eeb86 1483 uschar *privatekey,
f2de3a33 1484#ifndef DISABLE_OCSP
47195144 1485 uschar *ocsp_file, /*XXX stack, in server*/
3f7eeb86 1486#endif
cf0c6164 1487 address_item *addr, tls_ext_ctx_cb ** cbp, uschar ** errstr)
059ec3d9 1488{
7006ee24 1489SSL_CTX * ctx;
77bb000f 1490long init_options;
7be682ca 1491int rc;
a7538db1 1492tls_ext_ctx_cb * cbinfo;
7be682ca
PP
1493
1494cbinfo = store_malloc(sizeof(tls_ext_ctx_cb));
1495cbinfo->certificate = certificate;
1496cbinfo->privatekey = privatekey;
a6510420 1497cbinfo->is_server = host==NULL;
f2de3a33 1498#ifndef DISABLE_OCSP
c3033f13 1499cbinfo->verify_stack = NULL;
a6510420 1500if (!host)
f5d78688
JH
1501 {
1502 cbinfo->u_ocsp.server.file = ocsp_file;
1503 cbinfo->u_ocsp.server.file_expanded = NULL;
1504 cbinfo->u_ocsp.server.response = NULL;
1505 }
1506else
1507 cbinfo->u_ocsp.client.verify_store = NULL;
3f7eeb86 1508#endif
7be682ca 1509cbinfo->dhparam = dhparam;
0df4ab80 1510cbinfo->server_cipher_list = NULL;
7be682ca 1511cbinfo->host = host;
0cbf2b82 1512#ifndef DISABLE_EVENT
a7538db1
JH
1513cbinfo->event_action = NULL;
1514#endif
77bb000f 1515
059ec3d9
PH
1516SSL_load_error_strings(); /* basic set up */
1517OpenSSL_add_ssl_algorithms();
1518
c8dfb21d 1519#ifdef EXIM_HAVE_SHA256
77bb000f 1520/* SHA256 is becoming ever more popular. This makes sure it gets added to the
a0475b69
TK
1521list of available digests. */
1522EVP_add_digest(EVP_sha256());
cf1ef1a9 1523#endif
a0475b69 1524
f0f5a555
PP
1525/* Create a context.
1526The OpenSSL docs in 1.0.1b have not been updated to clarify TLS variant
1527negotiation in the different methods; as far as I can tell, the only
1528*_{server,client}_method which allows negotiation is SSLv23, which exists even
1529when OpenSSL is built without SSLv2 support.
1530By disabling with openssl_options, we can let admins re-enable with the
1531existing knob. */
059ec3d9 1532
7006ee24
JH
1533if (!(ctx = SSL_CTX_new(host ? SSLv23_client_method() : SSLv23_server_method())))
1534 return tls_error(US"SSL_CTX_new", host, NULL, errstr);
059ec3d9
PH
1535
1536/* It turns out that we need to seed the random number generator this early in
1537order to get the full complement of ciphers to work. It took me roughly a day
1538of work to discover this by experiment.
1539
1540On systems that have /dev/urandom, SSL may automatically seed itself from
1541there. Otherwise, we have to make something up as best we can. Double check
1542afterwards. */
1543
1544if (!RAND_status())
1545 {
1546 randstuff r;
9e3331ea 1547 gettimeofday(&r.tv, NULL);
059ec3d9
PH
1548 r.p = getpid();
1549
5903c6ff
JH
1550 RAND_seed(US (&r), sizeof(r));
1551 RAND_seed(US big_buffer, big_buffer_size);
1552 if (addr != NULL) RAND_seed(US addr, sizeof(addr));
059ec3d9
PH
1553
1554 if (!RAND_status())
7199e1ee 1555 return tls_error(US"RAND_status", host,
cf0c6164 1556 US"unable to seed random number generator", errstr);
059ec3d9
PH
1557 }
1558
1559/* Set up the information callback, which outputs if debugging is at a suitable
1560level. */
1561
7006ee24 1562DEBUG(D_tls) SSL_CTX_set_info_callback(ctx, (void (*)())info_callback);
059ec3d9 1563
c80c5570 1564/* Automatically re-try reads/writes after renegotiation. */
7006ee24 1565(void) SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
c80c5570 1566
77bb000f
PP
1567/* Apply administrator-supplied work-arounds.
1568Historically we applied just one requested option,
1569SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS, but when bug 994 requested a second, we
1570moved to an administrator-controlled list of options to specify and
1571grandfathered in the first one as the default value for "openssl_options".
059ec3d9 1572
77bb000f
PP
1573No OpenSSL version number checks: the options we accept depend upon the
1574availability of the option value macros from OpenSSL. */
059ec3d9 1575
7006ee24 1576if (!tls_openssl_options_parse(openssl_options, &init_options))
cf0c6164 1577 return tls_error(US"openssl_options parsing failed", host, NULL, errstr);
77bb000f
PP
1578
1579if (init_options)
1580 {
1581 DEBUG(D_tls) debug_printf("setting SSL CTX options: %#lx\n", init_options);
7006ee24 1582 if (!(SSL_CTX_set_options(ctx, init_options)))
77bb000f 1583 return tls_error(string_sprintf(
cf0c6164 1584 "SSL_CTX_set_option(%#lx)", init_options), host, NULL, errstr);
77bb000f
PP
1585 }
1586else
1587 DEBUG(D_tls) debug_printf("no SSL CTX options to set\n");
059ec3d9 1588
7006ee24
JH
1589/* Disable session cache unconditionally */
1590
1591(void) SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
1592
059ec3d9 1593/* Initialize with DH parameters if supplied */
10ca4f1c 1594/* Initialize ECDH temp key parameter selection */
059ec3d9 1595
7006ee24
JH
1596if ( !init_dh(ctx, dhparam, host, errstr)
1597 || !init_ecdh(ctx, host, errstr)
038597d2
PP
1598 )
1599 return DEFER;
059ec3d9 1600
3f7eeb86 1601/* Set up certificate and key (and perhaps OCSP info) */
059ec3d9 1602
7006ee24 1603if ((rc = tls_expand_session_files(ctx, cbinfo, errstr)) != OK)
23bb6982 1604 return rc;
c91535f3 1605
c3033f13
JH
1606/* If we need to handle SNI or OCSP, do so */
1607
3bcbbbe2 1608#ifdef EXIM_HAVE_OPENSSL_TLSEXT
c3033f13
JH
1609# ifndef DISABLE_OCSP
1610 if (!(cbinfo->verify_stack = sk_X509_new_null()))
1611 {
1612 DEBUG(D_tls) debug_printf("failed to create stack for stapling verify\n");
1613 return FAIL;
1614 }
1615# endif
1616
f5d78688 1617if (host == NULL) /* server */
3f0945ff 1618 {
f2de3a33 1619# ifndef DISABLE_OCSP
f5d78688 1620 /* We check u_ocsp.server.file, not server.response, because we care about if
3f7eeb86
PP
1621 the option exists, not what the current expansion might be, as SNI might
1622 change the certificate and OCSP file in use between now and the time the
1623 callback is invoked. */
f5d78688 1624 if (cbinfo->u_ocsp.server.file)
3f7eeb86 1625 {
7006ee24
JH
1626 SSL_CTX_set_tlsext_status_cb(ctx, tls_server_stapling_cb);
1627 SSL_CTX_set_tlsext_status_arg(ctx, cbinfo);
3f7eeb86 1628 }
f5d78688 1629# endif
3f0945ff
PP
1630 /* We always do this, so that $tls_sni is available even if not used in
1631 tls_certificate */
7006ee24
JH
1632 SSL_CTX_set_tlsext_servername_callback(ctx, tls_servername_cb);
1633 SSL_CTX_set_tlsext_servername_arg(ctx, cbinfo);
3f0945ff 1634 }
f2de3a33 1635# ifndef DISABLE_OCSP
f5d78688
JH
1636else /* client */
1637 if(ocsp_file) /* wanting stapling */
1638 {
1639 if (!(cbinfo->u_ocsp.client.verify_store = X509_STORE_new()))
1640 {
1641 DEBUG(D_tls) debug_printf("failed to create store for stapling verify\n");
1642 return FAIL;
1643 }
7006ee24
JH
1644 SSL_CTX_set_tlsext_status_cb(ctx, tls_client_stapling_cb);
1645 SSL_CTX_set_tlsext_status_arg(ctx, cbinfo);
f5d78688
JH
1646 }
1647# endif
7be682ca 1648#endif
059ec3d9 1649
e51c7be2 1650cbinfo->verify_cert_hostnames = NULL;
e51c7be2 1651
c8dfb21d 1652#ifdef EXIM_HAVE_EPHEM_RSA_KEX
059ec3d9 1653/* Set up the RSA callback */
7006ee24 1654SSL_CTX_set_tmp_rsa_callback(ctx, rsa_callback);
c8dfb21d 1655#endif
059ec3d9
PH
1656
1657/* Finally, set the timeout, and we are done */
1658
7006ee24 1659SSL_CTX_set_timeout(ctx, ssl_session_timeout);
059ec3d9 1660DEBUG(D_tls) debug_printf("Initialized TLS\n");
7be682ca 1661
817d9f57 1662*cbp = cbinfo;
7006ee24 1663*ctxp = ctx;
7be682ca 1664
059ec3d9
PH
1665return OK;
1666}
1667
1668
1669
1670
1671/*************************************************
1672* Get name of cipher in use *
1673*************************************************/
1674
817d9f57 1675/*
059ec3d9 1676Argument: pointer to an SSL structure for the connection
817d9f57
JH
1677 buffer to use for answer
1678 size of buffer
1679 pointer to number of bits for cipher
059ec3d9
PH
1680Returns: nothing
1681*/
1682
1683static void
817d9f57 1684construct_cipher_name(SSL *ssl, uschar *cipherbuf, int bsize, int *bits)
059ec3d9 1685{
57b3a7f5
PP
1686/* With OpenSSL 1.0.0a, this needs to be const but the documentation doesn't
1687yet reflect that. It should be a safe change anyway, even 0.9.8 versions have
1688the accessor functions use const in the prototype. */
1689const SSL_CIPHER *c;
d9784128 1690const uschar *ver;
059ec3d9 1691
d9784128 1692ver = (const uschar *)SSL_get_version(ssl);
059ec3d9 1693
57b3a7f5 1694c = (const SSL_CIPHER *) SSL_get_current_cipher(ssl);
817d9f57 1695SSL_CIPHER_get_bits(c, bits);
059ec3d9 1696
817d9f57
JH
1697string_format(cipherbuf, bsize, "%s:%s:%u", ver,
1698 SSL_CIPHER_get_name(c), *bits);
059ec3d9
PH
1699
1700DEBUG(D_tls) debug_printf("Cipher: %s\n", cipherbuf);
1701}
1702
1703
f69979cf
JH
1704static void
1705peer_cert(SSL * ssl, tls_support * tlsp, uschar * peerdn, unsigned bsize)
1706{
1707/*XXX we might consider a list-of-certs variable for the cert chain.
1708SSL_get_peer_cert_chain(SSL*). We'd need a new variable type and support
1709in list-handling functions, also consider the difference between the entire
1710chain and the elements sent by the peer. */
1711
1712/* Will have already noted peercert on a verify fail; possibly not the leaf */
1713if (!tlsp->peercert)
1714 tlsp->peercert = SSL_get_peer_certificate(ssl);
1715/* Beware anonymous ciphers which lead to server_cert being NULL */
1716if (tlsp->peercert)
1717 {
1718 X509_NAME_oneline(X509_get_subject_name(tlsp->peercert), CS peerdn, bsize);
1719 peerdn[bsize-1] = '\0';
1720 tlsp->peerdn = peerdn; /*XXX a static buffer... */
1721 }
1722else
1723 tlsp->peerdn = NULL;
1724}
1725
1726
059ec3d9
PH
1727
1728
1729
1730/*************************************************
1731* Set up for verifying certificates *
1732*************************************************/
1733
c3033f13
JH
1734/* Load certs from file, return TRUE on success */
1735
1736static BOOL
1737chain_from_pem_file(const uschar * file, STACK_OF(X509) * verify_stack)
1738{
1739BIO * bp;
1740X509 * x;
1741
1742if (!(bp = BIO_new_file(CS file, "r"))) return FALSE;
1743while ((x = PEM_read_bio_X509(bp, NULL, 0, NULL)))
1744 sk_X509_push(verify_stack, x);
1745BIO_free(bp);
1746return TRUE;
1747}
1748
1749
1750
059ec3d9
PH
1751/* Called by both client and server startup
1752
1753Arguments:
7be682ca 1754 sctx SSL_CTX* to initialise
059ec3d9
PH
1755 certs certs file or NULL
1756 crl CRL file or NULL
1757 host NULL in a server; the remote host in a client
1758 optional TRUE if called from a server for a host in tls_try_verify_hosts;
1759 otherwise passed as FALSE
983207c1 1760 cert_vfy_cb Callback function for certificate verification
cf0c6164 1761 errstr error string pointer
059ec3d9
PH
1762
1763Returns: OK/DEFER/FAIL
1764*/
1765
1766static int
983207c1 1767setup_certs(SSL_CTX *sctx, uschar *certs, uschar *crl, host_item *host, BOOL optional,
cf0c6164 1768 int (*cert_vfy_cb)(int, X509_STORE_CTX *), uschar ** errstr)
059ec3d9
PH
1769{
1770uschar *expcerts, *expcrl;
1771
cf0c6164 1772if (!expand_check(certs, US"tls_verify_certificates", &expcerts, errstr))
059ec3d9 1773 return DEFER;
57cc2785 1774DEBUG(D_tls) debug_printf("tls_verify_certificates: %s\n", expcerts);
059ec3d9 1775
10a831a3 1776if (expcerts && *expcerts)
059ec3d9 1777 {
10a831a3
JH
1778 /* Tell the library to use its compiled-in location for the system default
1779 CA bundle. Then add the ones specified in the config, if any. */
cb1d7830 1780
10a831a3 1781 if (!SSL_CTX_set_default_verify_paths(sctx))
cf0c6164 1782 return tls_error(US"SSL_CTX_set_default_verify_paths", host, NULL, errstr);
10a831a3
JH
1783
1784 if (Ustrcmp(expcerts, "system") != 0)
059ec3d9 1785 {
cb1d7830
JH
1786 struct stat statbuf;
1787
cb1d7830
JH
1788 if (Ustat(expcerts, &statbuf) < 0)
1789 {
1790 log_write(0, LOG_MAIN|LOG_PANIC,
1791 "failed to stat %s for certificates", expcerts);
1792 return DEFER;
1793 }
059ec3d9 1794 else
059ec3d9 1795 {
cb1d7830
JH
1796 uschar *file, *dir;
1797 if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
1798 { file = NULL; dir = expcerts; }
1799 else
c3033f13
JH
1800 {
1801 file = expcerts; dir = NULL;
1802#ifndef DISABLE_OCSP
1803 /* In the server if we will be offering an OCSP proof, load chain from
1804 file for verifying the OCSP proof at load time. */
1805
1806 if ( !host
1807 && statbuf.st_size > 0
1808 && server_static_cbinfo->u_ocsp.server.file
1809 && !chain_from_pem_file(file, server_static_cbinfo->verify_stack)
1810 )
1811 {
1812 log_write(0, LOG_MAIN|LOG_PANIC,
1813 "failed to load cert hain from %s", file);
1814 return DEFER;
1815 }
1816#endif
1817 }
cb1d7830
JH
1818
1819 /* If a certificate file is empty, the next function fails with an
1820 unhelpful error message. If we skip it, we get the correct behaviour (no
1821 certificates are recognized, but the error message is still misleading (it
c3033f13 1822 says no certificate was supplied). But this is better. */
cb1d7830 1823
f2f2c91b
JH
1824 if ( (!file || statbuf.st_size > 0)
1825 && !SSL_CTX_load_verify_locations(sctx, CS file, CS dir))
cf0c6164 1826 return tls_error(US"SSL_CTX_load_verify_locations", host, NULL, errstr);
cb1d7830
JH
1827
1828 /* Load the list of CAs for which we will accept certs, for sending
1829 to the client. This is only for the one-file tls_verify_certificates
1830 variant.
1831 If a list isn't loaded into the server, but
1832 some verify locations are set, the server end appears to make
4c04137d 1833 a wildcard request for client certs.
10a831a3 1834 Meanwhile, the client library as default behaviour *ignores* the list
cb1d7830
JH
1835 we send over the wire - see man SSL_CTX_set_client_cert_cb.
1836 Because of this, and that the dir variant is likely only used for
1837 the public-CA bundle (not for a private CA), not worth fixing.
1838 */
f2f2c91b 1839 if (file)
cb1d7830
JH
1840 {
1841 STACK_OF(X509_NAME) * names = SSL_load_client_CA_file(CS file);
f2f2c91b
JH
1842
1843 DEBUG(D_tls) debug_printf("Added %d certificate authorities.\n",
cb1d7830
JH
1844 sk_X509_NAME_num(names));
1845 SSL_CTX_set_client_CA_list(sctx, names);
1846 }
059ec3d9
PH
1847 }
1848 }
1849
1850 /* Handle a certificate revocation list. */
1851
10a831a3 1852#if OPENSSL_VERSION_NUMBER > 0x00907000L
059ec3d9 1853
8b417f2c 1854 /* This bit of code is now the version supplied by Lars Mainka. (I have
10a831a3 1855 merely reformatted it into the Exim code style.)
8b417f2c 1856
10a831a3
JH
1857 "From here I changed the code to add support for multiple crl's
1858 in pem format in one file or to support hashed directory entries in
1859 pem format instead of a file. This method now uses the library function
1860 X509_STORE_load_locations to add the CRL location to the SSL context.
1861 OpenSSL will then handle the verify against CA certs and CRLs by
1862 itself in the verify callback." */
8b417f2c 1863
cf0c6164 1864 if (!expand_check(crl, US"tls_crl", &expcrl, errstr)) return DEFER;
10a831a3 1865 if (expcrl && *expcrl)
059ec3d9 1866 {
8b417f2c
PH
1867 struct stat statbufcrl;
1868 if (Ustat(expcrl, &statbufcrl) < 0)
1869 {
1870 log_write(0, LOG_MAIN|LOG_PANIC,
1871 "failed to stat %s for certificates revocation lists", expcrl);
1872 return DEFER;
1873 }
1874 else
059ec3d9 1875 {
8b417f2c
PH
1876 /* is it a file or directory? */
1877 uschar *file, *dir;
7be682ca 1878 X509_STORE *cvstore = SSL_CTX_get_cert_store(sctx);
8b417f2c 1879 if ((statbufcrl.st_mode & S_IFMT) == S_IFDIR)
059ec3d9 1880 {
8b417f2c
PH
1881 file = NULL;
1882 dir = expcrl;
1883 DEBUG(D_tls) debug_printf("SSL CRL value is a directory %s\n", dir);
059ec3d9
PH
1884 }
1885 else
1886 {
8b417f2c
PH
1887 file = expcrl;
1888 dir = NULL;
1889 DEBUG(D_tls) debug_printf("SSL CRL value is a file %s\n", file);
059ec3d9 1890 }
8b417f2c 1891 if (X509_STORE_load_locations(cvstore, CS file, CS dir) == 0)
cf0c6164 1892 return tls_error(US"X509_STORE_load_locations", host, NULL, errstr);
8b417f2c
PH
1893
1894 /* setting the flags to check against the complete crl chain */
1895
1896 X509_STORE_set_flags(cvstore,
1897 X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
059ec3d9 1898 }
059ec3d9
PH
1899 }
1900
10a831a3 1901#endif /* OPENSSL_VERSION_NUMBER > 0x00907000L */
059ec3d9
PH
1902
1903 /* If verification is optional, don't fail if no certificate */
1904
7be682ca 1905 SSL_CTX_set_verify(sctx,
059ec3d9 1906 SSL_VERIFY_PEER | (optional? 0 : SSL_VERIFY_FAIL_IF_NO_PEER_CERT),
983207c1 1907 cert_vfy_cb);
059ec3d9
PH
1908 }
1909
1910return OK;
1911}
1912
1913
1914
1915/*************************************************
1916* Start a TLS session in a server *
1917*************************************************/
1918
1919/* This is called when Exim is running as a server, after having received
1920the STARTTLS command. It must respond to that command, and then negotiate
1921a TLS session.
1922
1923Arguments:
1924 require_ciphers allowed ciphers
cf0c6164 1925 errstr pointer to error message
059ec3d9
PH
1926
1927Returns: OK on success
1928 DEFER for errors before the start of the negotiation
4c04137d 1929 FAIL for errors during the negotiation; the server can't
059ec3d9
PH
1930 continue running.
1931*/
1932
1933int
cf0c6164 1934tls_server_start(const uschar * require_ciphers, uschar ** errstr)
059ec3d9
PH
1935{
1936int rc;
cf0c6164
JH
1937uschar * expciphers;
1938tls_ext_ctx_cb * cbinfo;
f69979cf 1939static uschar peerdn[256];
817d9f57 1940static uschar cipherbuf[256];
059ec3d9
PH
1941
1942/* Check for previous activation */
1943
817d9f57 1944if (tls_in.active >= 0)
059ec3d9 1945 {
cf0c6164 1946 tls_error(US"STARTTLS received after TLS started", NULL, US"", errstr);
925ac8e4 1947 smtp_printf("554 Already in TLS\r\n", FALSE);
059ec3d9
PH
1948 return FAIL;
1949 }
1950
1951/* Initialize the SSL library. If it fails, it will already have logged
1952the error. */
1953
817d9f57 1954rc = tls_init(&server_ctx, NULL, tls_dhparam, tls_certificate, tls_privatekey,
f2de3a33 1955#ifndef DISABLE_OCSP
47195144 1956 tls_ocsp_file, /*XXX stack*/
3f7eeb86 1957#endif
cf0c6164 1958 NULL, &server_static_cbinfo, errstr);
059ec3d9 1959if (rc != OK) return rc;
817d9f57 1960cbinfo = server_static_cbinfo;
059ec3d9 1961
cf0c6164 1962if (!expand_check(require_ciphers, US"tls_require_ciphers", &expciphers, errstr))
059ec3d9
PH
1963 return FAIL;
1964
1965/* In OpenSSL, cipher components are separated by hyphens. In GnuTLS, they
17c76198
PP
1966were historically separated by underscores. So that I can use either form in my
1967tests, and also for general convenience, we turn underscores into hyphens here.
1968*/
059ec3d9 1969
c3033f13 1970if (expciphers)
059ec3d9 1971 {
c3033f13 1972 uschar * s = expciphers;
059ec3d9
PH
1973 while (*s != 0) { if (*s == '_') *s = '-'; s++; }
1974 DEBUG(D_tls) debug_printf("required ciphers: %s\n", expciphers);
817d9f57 1975 if (!SSL_CTX_set_cipher_list(server_ctx, CS expciphers))
cf0c6164 1976 return tls_error(US"SSL_CTX_set_cipher_list", NULL, NULL, errstr);
7be682ca 1977 cbinfo->server_cipher_list = expciphers;
059ec3d9
PH
1978 }
1979
1980/* If this is a host for which certificate verification is mandatory or
1981optional, set up appropriately. */
1982
817d9f57 1983tls_in.certificate_verified = FALSE;
53a7196b
JH
1984#ifdef EXPERIMENTAL_DANE
1985tls_in.dane_verified = FALSE;
1986#endif
a2ff477a 1987server_verify_callback_called = FALSE;
059ec3d9
PH
1988
1989if (verify_check_host(&tls_verify_hosts) == OK)
1990 {
983207c1 1991 rc = setup_certs(server_ctx, tls_verify_certificates, tls_crl, NULL,
cf0c6164 1992 FALSE, verify_callback_server, errstr);
059ec3d9 1993 if (rc != OK) return rc;
a2ff477a 1994 server_verify_optional = FALSE;
059ec3d9
PH
1995 }
1996else if (verify_check_host(&tls_try_verify_hosts) == OK)
1997 {
983207c1 1998 rc = setup_certs(server_ctx, tls_verify_certificates, tls_crl, NULL,
cf0c6164 1999 TRUE, verify_callback_server, errstr);
059ec3d9 2000 if (rc != OK) return rc;
a2ff477a 2001 server_verify_optional = TRUE;
059ec3d9
PH
2002 }
2003
2004/* Prepare for new connection */
2005
cf0c6164
JH
2006if (!(server_ssl = SSL_new(server_ctx)))
2007 return tls_error(US"SSL_new", NULL, NULL, errstr);
da3ad30d
PP
2008
2009/* Warning: we used to SSL_clear(ssl) here, it was removed.
2010 *
2011 * With the SSL_clear(), we get strange interoperability bugs with
2012 * OpenSSL 1.0.1b and TLS1.1/1.2. It looks as though this may be a bug in
2013 * OpenSSL itself, as a clear should not lead to inability to follow protocols.
2014 *
2015 * The SSL_clear() call is to let an existing SSL* be reused, typically after
2016 * session shutdown. In this case, we have a brand new object and there's no
2017 * obvious reason to immediately clear it. I'm guessing that this was
2018 * originally added because of incomplete initialisation which the clear fixed,
2019 * in some historic release.
2020 */
059ec3d9
PH
2021
2022/* Set context and tell client to go ahead, except in the case of TLS startup
2023on connection, where outputting anything now upsets the clients and tends to
2024make them disconnect. We need to have an explicit fflush() here, to force out
2025the response. Other smtp_printf() calls do not need it, because in non-TLS
2026mode, the fflush() happens when smtp_getc() is called. */
2027
817d9f57
JH
2028SSL_set_session_id_context(server_ssl, sid_ctx, Ustrlen(sid_ctx));
2029if (!tls_in.on_connect)
059ec3d9 2030 {
925ac8e4 2031 smtp_printf("220 TLS go ahead\r\n", FALSE);
059ec3d9
PH
2032 fflush(smtp_out);
2033 }
2034
2035/* Now negotiate the TLS session. We put our own timer on it, since it seems
2036that the OpenSSL library doesn't. */
2037
817d9f57
JH
2038SSL_set_wfd(server_ssl, fileno(smtp_out));
2039SSL_set_rfd(server_ssl, fileno(smtp_in));
2040SSL_set_accept_state(server_ssl);
059ec3d9
PH
2041
2042DEBUG(D_tls) debug_printf("Calling SSL_accept\n");
2043
2044sigalrm_seen = FALSE;
2045if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
817d9f57 2046rc = SSL_accept(server_ssl);
059ec3d9
PH
2047alarm(0);
2048
2049if (rc <= 0)
2050 {
cf0c6164 2051 (void) tls_error(US"SSL_accept", NULL, sigalrm_seen ? US"timed out" : NULL, errstr);
059ec3d9
PH
2052 return FAIL;
2053 }
2054
2055DEBUG(D_tls) debug_printf("SSL_accept was successful\n");
2056
2057/* TLS has been set up. Adjust the input functions to read via TLS,
2058and initialize things. */
2059
f69979cf
JH
2060peer_cert(server_ssl, &tls_in, peerdn, sizeof(peerdn));
2061
817d9f57
JH
2062construct_cipher_name(server_ssl, cipherbuf, sizeof(cipherbuf), &tls_in.bits);
2063tls_in.cipher = cipherbuf;
059ec3d9
PH
2064
2065DEBUG(D_tls)
2066 {
2067 uschar buf[2048];
817d9f57 2068 if (SSL_get_shared_ciphers(server_ssl, CS buf, sizeof(buf)) != NULL)
059ec3d9
PH
2069 debug_printf("Shared ciphers: %s\n", buf);
2070 }
2071
9d1c15ef
JH
2072/* Record the certificate we presented */
2073 {
2074 X509 * crt = SSL_get_certificate(server_ssl);
2075 tls_in.ourcert = crt ? X509_dup(crt) : NULL;
2076 }
059ec3d9 2077
817d9f57
JH
2078/* Only used by the server-side tls (tls_in), including tls_getc.
2079 Client-side (tls_out) reads (seem to?) go via
2080 smtp_read_response()/ip_recv().
2081 Hence no need to duplicate for _in and _out.
2082 */
059ec3d9
PH
2083ssl_xfer_buffer = store_malloc(ssl_xfer_buffer_size);
2084ssl_xfer_buffer_lwm = ssl_xfer_buffer_hwm = 0;
2085ssl_xfer_eof = ssl_xfer_error = 0;
2086
2087receive_getc = tls_getc;
0d81dabc 2088receive_getbuf = tls_getbuf;
584e96c6 2089receive_get_cache = tls_get_cache;
059ec3d9
PH
2090receive_ungetc = tls_ungetc;
2091receive_feof = tls_feof;
2092receive_ferror = tls_ferror;
58eb016e 2093receive_smtp_buffered = tls_smtp_buffered;
059ec3d9 2094
817d9f57 2095tls_in.active = fileno(smtp_out);
059ec3d9
PH
2096return OK;
2097}
2098
2099
2100
2101
043b1248
JH
2102static int
2103tls_client_basic_ctx_init(SSL_CTX * ctx,
cf0c6164
JH
2104 host_item * host, smtp_transport_options_block * ob, tls_ext_ctx_cb * cbinfo,
2105 uschar ** errstr)
043b1248
JH
2106{
2107int rc;
94431adb 2108/* stick to the old behaviour for compatibility if tls_verify_certificates is
043b1248
JH
2109 set but both tls_verify_hosts and tls_try_verify_hosts is not set. Check only
2110 the specified host patterns if one of them is defined */
2111
610ff438
JH
2112if ( ( !ob->tls_verify_hosts
2113 && (!ob->tls_try_verify_hosts || !*ob->tls_try_verify_hosts)
2114 )
5130845b 2115 || (verify_check_given_host(&ob->tls_verify_hosts, host) == OK)
aa2a70ba 2116 )
043b1248 2117 client_verify_optional = FALSE;
5130845b 2118else if (verify_check_given_host(&ob->tls_try_verify_hosts, host) == OK)
aa2a70ba
JH
2119 client_verify_optional = TRUE;
2120else
2121 return OK;
2122
2123if ((rc = setup_certs(ctx, ob->tls_verify_certificates,
cf0c6164
JH
2124 ob->tls_crl, host, client_verify_optional, verify_callback_client,
2125 errstr)) != OK)
aa2a70ba 2126 return rc;
043b1248 2127
5130845b 2128if (verify_check_given_host(&ob->tls_verify_cert_hostnames, host) == OK)
043b1248 2129 {
4af0d74a 2130 cbinfo->verify_cert_hostnames =
8c5d388a 2131#ifdef SUPPORT_I18N
4af0d74a
JH
2132 string_domain_utf8_to_alabel(host->name, NULL);
2133#else
2134 host->name;
2135#endif
aa2a70ba
JH
2136 DEBUG(D_tls) debug_printf("Cert hostname to check: \"%s\"\n",
2137 cbinfo->verify_cert_hostnames);
043b1248 2138 }
043b1248
JH
2139return OK;
2140}
059ec3d9 2141
fde080a4
JH
2142
2143#ifdef EXPERIMENTAL_DANE
fde080a4 2144static int
cf0c6164 2145dane_tlsa_load(SSL * ssl, host_item * host, dns_answer * dnsa, uschar ** errstr)
fde080a4
JH
2146{
2147dns_record * rr;
2148dns_scan dnss;
2149const char * hostnames[2] = { CS host->name, NULL };
2150int found = 0;
2151
2152if (DANESSL_init(ssl, NULL, hostnames) != 1)
cf0c6164 2153 return tls_error(US"hostnames load", host, NULL, errstr);
fde080a4
JH
2154
2155for (rr = dns_next_rr(dnsa, &dnss, RESET_ANSWERS);
2156 rr;
2157 rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)
2158 ) if (rr->type == T_TLSA)
2159 {
c3033f13 2160 const uschar * p = rr->data;
fde080a4
JH
2161 uint8_t usage, selector, mtype;
2162 const char * mdname;
2163
fde080a4 2164 usage = *p++;
133d2546
JH
2165
2166 /* Only DANE-TA(2) and DANE-EE(3) are supported */
2167 if (usage != 2 && usage != 3) continue;
2168
fde080a4
JH
2169 selector = *p++;
2170 mtype = *p++;
2171
2172 switch (mtype)
2173 {
133d2546
JH
2174 default: continue; /* Only match-types 0, 1, 2 are supported */
2175 case 0: mdname = NULL; break;
2176 case 1: mdname = "sha256"; break;
2177 case 2: mdname = "sha512"; break;
fde080a4
JH
2178 }
2179
133d2546 2180 found++;
fde080a4
JH
2181 switch (DANESSL_add_tlsa(ssl, usage, selector, mdname, p, rr->size - 3))
2182 {
2183 default:
cf0c6164 2184 return tls_error(US"tlsa load", host, NULL, errstr);
c035b645 2185 case 0: /* action not taken */
fde080a4
JH
2186 case 1: break;
2187 }
594706ea
JH
2188
2189 tls_out.tlsa_usage |= 1<<usage;
fde080a4
JH
2190 }
2191
2192if (found)
2193 return OK;
2194
133d2546 2195log_write(0, LOG_MAIN, "DANE error: No usable TLSA records");
6ebd79ec 2196return DEFER;
fde080a4
JH
2197}
2198#endif /*EXPERIMENTAL_DANE*/
2199
2200
2201
059ec3d9
PH
2202/*************************************************
2203* Start a TLS session in a client *
2204*************************************************/
2205
2206/* Called from the smtp transport after STARTTLS has been accepted.
2207
2208Argument:
2209 fd the fd of the connection
2210 host connected host (for messages)
83da1223 2211 addr the first address
a7538db1 2212 tb transport (always smtp)
0e66b3b6 2213 tlsa_dnsa tlsa lookup, if DANE, else null
cf0c6164 2214 errstr error string pointer
059ec3d9
PH
2215
2216Returns: OK on success
2217 FAIL otherwise - note that tls_error() will not give DEFER
2218 because this is not a server
2219*/
2220
2221int
f5d78688 2222tls_client_start(int fd, host_item *host, address_item *addr,
cf0c6164 2223 transport_instance * tb,
0e66b3b6 2224#ifdef EXPERIMENTAL_DANE
cf0c6164 2225 dns_answer * tlsa_dnsa,
0e66b3b6 2226#endif
cf0c6164 2227 uschar ** errstr)
059ec3d9 2228{
a7538db1
JH
2229smtp_transport_options_block * ob =
2230 (smtp_transport_options_block *)tb->options_block;
f69979cf 2231static uschar peerdn[256];
868f5672 2232uschar * expciphers;
059ec3d9 2233int rc;
817d9f57 2234static uschar cipherbuf[256];
043b1248
JH
2235
2236#ifndef DISABLE_OCSP
043b1248 2237BOOL request_ocsp = FALSE;
6634ac8d 2238BOOL require_ocsp = FALSE;
043b1248 2239#endif
043b1248
JH
2240
2241#ifdef EXPERIMENTAL_DANE
594706ea 2242tls_out.tlsa_usage = 0;
043b1248
JH
2243#endif
2244
f2de3a33 2245#ifndef DISABLE_OCSP
043b1248 2246 {
4f59c424
JH
2247# ifdef EXPERIMENTAL_DANE
2248 if ( tlsa_dnsa
2249 && ob->hosts_request_ocsp[0] == '*'
2250 && ob->hosts_request_ocsp[1] == '\0'
2251 )
2252 {
2253 /* Unchanged from default. Use a safer one under DANE */
2254 request_ocsp = TRUE;
2255 ob->hosts_request_ocsp = US"${if or { {= {0}{$tls_out_tlsa_usage}} "
2256 " {= {4}{$tls_out_tlsa_usage}} } "
2257 " {*}{}}";
2258 }
2259# endif
2260
5130845b
JH
2261 if ((require_ocsp =
2262 verify_check_given_host(&ob->hosts_require_ocsp, host) == OK))
fca41d5a
JH
2263 request_ocsp = TRUE;
2264 else
fca41d5a 2265# ifdef EXPERIMENTAL_DANE
4f59c424 2266 if (!request_ocsp)
fca41d5a 2267# endif
5130845b
JH
2268 request_ocsp =
2269 verify_check_given_host(&ob->hosts_request_ocsp, host) == OK;
043b1248 2270 }
f5d78688 2271#endif
059ec3d9 2272
65867078
JH
2273rc = tls_init(&client_ctx, host, NULL,
2274 ob->tls_certificate, ob->tls_privatekey,
f2de3a33 2275#ifndef DISABLE_OCSP
44662487 2276 (void *)(long)request_ocsp,
3f7eeb86 2277#endif
cf0c6164 2278 addr, &client_static_cbinfo, errstr);
059ec3d9
PH
2279if (rc != OK) return rc;
2280
817d9f57 2281tls_out.certificate_verified = FALSE;
a2ff477a 2282client_verify_callback_called = FALSE;
059ec3d9 2283
65867078 2284if (!expand_check(ob->tls_require_ciphers, US"tls_require_ciphers",
cf0c6164 2285 &expciphers, errstr))
059ec3d9
PH
2286 return FAIL;
2287
2288/* In OpenSSL, cipher components are separated by hyphens. In GnuTLS, they
2289are separated by underscores. So that I can use either form in my tests, and
2290also for general convenience, we turn underscores into hyphens here. */
2291
cf0c6164 2292if (expciphers)
059ec3d9
PH
2293 {
2294 uschar *s = expciphers;
cf0c6164 2295 while (*s) { if (*s == '_') *s = '-'; s++; }
059ec3d9 2296 DEBUG(D_tls) debug_printf("required ciphers: %s\n", expciphers);
817d9f57 2297 if (!SSL_CTX_set_cipher_list(client_ctx, CS expciphers))
cf0c6164 2298 return tls_error(US"SSL_CTX_set_cipher_list", host, NULL, errstr);
059ec3d9
PH
2299 }
2300
043b1248 2301#ifdef EXPERIMENTAL_DANE
0e66b3b6 2302if (tlsa_dnsa)
a63be306 2303 {
02af313d
JH
2304 SSL_CTX_set_verify(client_ctx,
2305 SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
2306 verify_callback_client_dane);
e5cccda9 2307
043b1248 2308 if (!DANESSL_library_init())
cf0c6164 2309 return tls_error(US"library init", host, NULL, errstr);
043b1248 2310 if (DANESSL_CTX_init(client_ctx) <= 0)
cf0c6164 2311 return tls_error(US"context init", host, NULL, errstr);
043b1248
JH
2312 }
2313else
e51c7be2 2314
043b1248
JH
2315#endif
2316
cf0c6164
JH
2317 if ((rc = tls_client_basic_ctx_init(client_ctx, host, ob,
2318 client_static_cbinfo, errstr)) != OK)
65867078 2319 return rc;
059ec3d9 2320
65867078 2321if ((client_ssl = SSL_new(client_ctx)) == NULL)
cf0c6164 2322 return tls_error(US"SSL_new", host, NULL, errstr);
817d9f57
JH
2323SSL_set_session_id_context(client_ssl, sid_ctx, Ustrlen(sid_ctx));
2324SSL_set_fd(client_ssl, fd);
2325SSL_set_connect_state(client_ssl);
059ec3d9 2326
65867078 2327if (ob->tls_sni)
3f0945ff 2328 {
cf0c6164 2329 if (!expand_check(ob->tls_sni, US"tls_sni", &tls_out.sni, errstr))
3f0945ff 2330 return FAIL;
cf0c6164 2331 if (!tls_out.sni)
2c9a0e86
PP
2332 {
2333 DEBUG(D_tls) debug_printf("Setting TLS SNI forced to fail, not sending\n");
2334 }
ec4b68e5 2335 else if (!Ustrlen(tls_out.sni))
817d9f57 2336 tls_out.sni = NULL;
3f0945ff
PP
2337 else
2338 {
35731706 2339#ifdef EXIM_HAVE_OPENSSL_TLSEXT
817d9f57
JH
2340 DEBUG(D_tls) debug_printf("Setting TLS SNI \"%s\"\n", tls_out.sni);
2341 SSL_set_tlsext_host_name(client_ssl, tls_out.sni);
35731706 2342#else
66802652 2343 log_write(0, LOG_MAIN, "SNI unusable with this OpenSSL library version; ignoring \"%s\"\n",
02d9264f 2344 tls_out.sni);
35731706 2345#endif
3f0945ff
PP
2346 }
2347 }
2348
594706ea 2349#ifdef EXPERIMENTAL_DANE
0e66b3b6 2350if (tlsa_dnsa)
cf0c6164 2351 if ((rc = dane_tlsa_load(client_ssl, host, tlsa_dnsa, errstr)) != OK)
594706ea
JH
2352 return rc;
2353#endif
2354
f2de3a33 2355#ifndef DISABLE_OCSP
f5d78688
JH
2356/* Request certificate status at connection-time. If the server
2357does OCSP stapling we will get the callback (set in tls_init()) */
b50c8b84 2358# ifdef EXPERIMENTAL_DANE
594706ea
JH
2359if (request_ocsp)
2360 {
2361 const uschar * s;
41afb5cb
JH
2362 if ( ((s = ob->hosts_require_ocsp) && Ustrstr(s, US"tls_out_tlsa_usage"))
2363 || ((s = ob->hosts_request_ocsp) && Ustrstr(s, US"tls_out_tlsa_usage"))
594706ea
JH
2364 )
2365 { /* Re-eval now $tls_out_tlsa_usage is populated. If
2366 this means we avoid the OCSP request, we wasted the setup
2367 cost in tls_init(). */
5130845b
JH
2368 require_ocsp = verify_check_given_host(&ob->hosts_require_ocsp, host) == OK;
2369 request_ocsp = require_ocsp
2370 || verify_check_given_host(&ob->hosts_request_ocsp, host) == OK;
594706ea
JH
2371 }
2372 }
b50c8b84
JH
2373# endif
2374
44662487
JH
2375if (request_ocsp)
2376 {
f5d78688 2377 SSL_set_tlsext_status_type(client_ssl, TLSEXT_STATUSTYPE_ocsp);
44662487
JH
2378 client_static_cbinfo->u_ocsp.client.verify_required = require_ocsp;
2379 tls_out.ocsp = OCSP_NOT_RESP;
2380 }
f5d78688
JH
2381#endif
2382
0cbf2b82 2383#ifndef DISABLE_EVENT
774ef2d7 2384client_static_cbinfo->event_action = tb->event_action;
a7538db1 2385#endif
043b1248 2386
059ec3d9
PH
2387/* There doesn't seem to be a built-in timeout on connection. */
2388
2389DEBUG(D_tls) debug_printf("Calling SSL_connect\n");
2390sigalrm_seen = FALSE;
65867078 2391alarm(ob->command_timeout);
817d9f57 2392rc = SSL_connect(client_ssl);
059ec3d9
PH
2393alarm(0);
2394
043b1248 2395#ifdef EXPERIMENTAL_DANE
0e66b3b6 2396if (tlsa_dnsa)
fde080a4 2397 DANESSL_cleanup(client_ssl);
043b1248
JH
2398#endif
2399
059ec3d9 2400if (rc <= 0)
cf0c6164
JH
2401 return tls_error(US"SSL_connect", host, sigalrm_seen ? US"timed out" : NULL,
2402 errstr);
059ec3d9
PH
2403
2404DEBUG(D_tls) debug_printf("SSL_connect succeeded\n");
2405
f69979cf 2406peer_cert(client_ssl, &tls_out, peerdn, sizeof(peerdn));
059ec3d9 2407
817d9f57
JH
2408construct_cipher_name(client_ssl, cipherbuf, sizeof(cipherbuf), &tls_out.bits);
2409tls_out.cipher = cipherbuf;
059ec3d9 2410
9d1c15ef
JH
2411/* Record the certificate we presented */
2412 {
2413 X509 * crt = SSL_get_certificate(client_ssl);
2414 tls_out.ourcert = crt ? X509_dup(crt) : NULL;
2415 }
2416
817d9f57 2417tls_out.active = fd;
059ec3d9
PH
2418return OK;
2419}
2420
2421
2422
2423
2424
0d81dabc
JH
2425static BOOL
2426tls_refill(unsigned lim)
2427{
2428int error;
2429int inbytes;
2430
2431DEBUG(D_tls) debug_printf("Calling SSL_read(%p, %p, %u)\n", server_ssl,
2432 ssl_xfer_buffer, ssl_xfer_buffer_size);
2433
2434if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
2435inbytes = SSL_read(server_ssl, CS ssl_xfer_buffer,
2436 MIN(ssl_xfer_buffer_size, lim));
2437error = SSL_get_error(server_ssl, inbytes);
2438alarm(0);
2439
2440/* SSL_ERROR_ZERO_RETURN appears to mean that the SSL session has been
2441closed down, not that the socket itself has been closed down. Revert to
2442non-SSL handling. */
2443
2444if (error == SSL_ERROR_ZERO_RETURN)
2445 {
2446 DEBUG(D_tls) debug_printf("Got SSL_ERROR_ZERO_RETURN\n");
2447
2448 receive_getc = smtp_getc;
2449 receive_getbuf = smtp_getbuf;
2450 receive_get_cache = smtp_get_cache;
2451 receive_ungetc = smtp_ungetc;
2452 receive_feof = smtp_feof;
2453 receive_ferror = smtp_ferror;
2454 receive_smtp_buffered = smtp_buffered;
2455
2456 SSL_free(server_ssl);
2457 server_ssl = NULL;
2458 tls_in.active = -1;
2459 tls_in.bits = 0;
2460 tls_in.cipher = NULL;
2461 tls_in.peerdn = NULL;
2462 tls_in.sni = NULL;
2463
2464 return FALSE;
2465 }
2466
2467/* Handle genuine errors */
2468
2469else if (error == SSL_ERROR_SSL)
2470 {
2471 ERR_error_string(ERR_get_error(), ssl_errstring);
2472 log_write(0, LOG_MAIN, "TLS error (SSL_read): %s", ssl_errstring);
2473 ssl_xfer_error = 1;
2474 return FALSE;
2475 }
2476
2477else if (error != SSL_ERROR_NONE)
2478 {
2479 DEBUG(D_tls) debug_printf("Got SSL error %d\n", error);
2480 ssl_xfer_error = 1;
2481 return FALSE;
2482 }
2483
2484#ifndef DISABLE_DKIM
2485dkim_exim_verify_feed(ssl_xfer_buffer, inbytes);
2486#endif
2487ssl_xfer_buffer_hwm = inbytes;
2488ssl_xfer_buffer_lwm = 0;
2489return TRUE;
2490}
2491
2492
059ec3d9
PH
2493/*************************************************
2494* TLS version of getc *
2495*************************************************/
2496
2497/* This gets the next byte from the TLS input buffer. If the buffer is empty,
2498it refills the buffer via the SSL reading function.
2499
bd8fbe36 2500Arguments: lim Maximum amount to read/buffer
059ec3d9 2501Returns: the next character or EOF
817d9f57
JH
2502
2503Only used by the server-side TLS.
059ec3d9
PH
2504*/
2505
2506int
bd8fbe36 2507tls_getc(unsigned lim)
059ec3d9
PH
2508{
2509if (ssl_xfer_buffer_lwm >= ssl_xfer_buffer_hwm)
0d81dabc
JH
2510 if (!tls_refill(lim))
2511 return ssl_xfer_error ? EOF : smtp_getc(lim);
059ec3d9 2512
0d81dabc 2513/* Something in the buffer; return next uschar */
059ec3d9 2514
0d81dabc
JH
2515return ssl_xfer_buffer[ssl_xfer_buffer_lwm++];
2516}
059ec3d9 2517
0d81dabc
JH
2518uschar *
2519tls_getbuf(unsigned * len)
2520{
2521unsigned size;
2522uschar * buf;
ba084640 2523
0d81dabc
JH
2524if (ssl_xfer_buffer_lwm >= ssl_xfer_buffer_hwm)
2525 if (!tls_refill(*len))
059ec3d9 2526 {
0d81dabc
JH
2527 if (!ssl_xfer_error) return smtp_getbuf(len);
2528 *len = 0;
2529 return NULL;
059ec3d9 2530 }
c80c5570 2531
0d81dabc
JH
2532if ((size = ssl_xfer_buffer_hwm - ssl_xfer_buffer_lwm) > *len)
2533 size = *len;
2534buf = &ssl_xfer_buffer[ssl_xfer_buffer_lwm];
2535ssl_xfer_buffer_lwm += size;
2536*len = size;
2537return buf;
059ec3d9
PH
2538}
2539
0d81dabc 2540
584e96c6
JH
2541void
2542tls_get_cache()
2543{
9960d1e5 2544#ifndef DISABLE_DKIM
584e96c6
JH
2545int n = ssl_xfer_buffer_hwm - ssl_xfer_buffer_lwm;
2546if (n > 0)
2547 dkim_exim_verify_feed(ssl_xfer_buffer+ssl_xfer_buffer_lwm, n);
584e96c6 2548#endif
9960d1e5 2549}
584e96c6 2550
059ec3d9 2551
925ac8e4
JH
2552BOOL
2553tls_could_read(void)
2554{
a5ffa9b4 2555return ssl_xfer_buffer_lwm < ssl_xfer_buffer_hwm || SSL_pending(server_ssl) > 0;
925ac8e4
JH
2556}
2557
059ec3d9
PH
2558
2559/*************************************************
2560* Read bytes from TLS channel *
2561*************************************************/
2562
2563/*
2564Arguments:
2565 buff buffer of data
2566 len size of buffer
2567
2568Returns: the number of bytes read
2569 -1 after a failed read
817d9f57
JH
2570
2571Only used by the client-side TLS.
059ec3d9
PH
2572*/
2573
2574int
389ca47a 2575tls_read(BOOL is_server, uschar *buff, size_t len)
059ec3d9 2576{
389ca47a 2577SSL *ssl = is_server ? server_ssl : client_ssl;
059ec3d9
PH
2578int inbytes;
2579int error;
2580
389ca47a 2581DEBUG(D_tls) debug_printf("Calling SSL_read(%p, %p, %u)\n", ssl,
c80c5570 2582 buff, (unsigned int)len);
059ec3d9 2583
389ca47a
JH
2584inbytes = SSL_read(ssl, CS buff, len);
2585error = SSL_get_error(ssl, inbytes);
059ec3d9
PH
2586
2587if (error == SSL_ERROR_ZERO_RETURN)
2588 {
2589 DEBUG(D_tls) debug_printf("Got SSL_ERROR_ZERO_RETURN\n");
2590 return -1;
2591 }
2592else if (error != SSL_ERROR_NONE)
059ec3d9 2593 return -1;
059ec3d9
PH
2594
2595return inbytes;
2596}
2597
2598
2599
2600
2601
2602/*************************************************
2603* Write bytes down TLS channel *
2604*************************************************/
2605
2606/*
2607Arguments:
817d9f57 2608 is_server channel specifier
059ec3d9
PH
2609 buff buffer of data
2610 len number of bytes
925ac8e4 2611 more further data expected soon
059ec3d9
PH
2612
2613Returns: the number of bytes after a successful write,
2614 -1 after a failed write
817d9f57
JH
2615
2616Used by both server-side and client-side TLS.
059ec3d9
PH
2617*/
2618
2619int
925ac8e4 2620tls_write(BOOL is_server, const uschar *buff, size_t len, BOOL more)
059ec3d9 2621{
a5ffa9b4 2622int outbytes, error, left;
817d9f57 2623SSL *ssl = is_server ? server_ssl : client_ssl;
acec9514 2624static gstring * corked = NULL;
a5ffa9b4 2625
ef698bf6 2626DEBUG(D_tls) debug_printf("%s(%p, %lu%s)\n", __FUNCTION__,
b93be52e 2627 buff, (unsigned long)len, more ? ", more" : "");
a5ffa9b4
JH
2628
2629/* Lacking a CORK or MSG_MORE facility (such as GnuTLS has) we copy data when
2630"more" is notified. This hack is only ok if small amounts are involved AND only
2631one stream does it, in one context (i.e. no store reset). Currently it is used
2632for the responses to the received SMTP MAIL , RCPT, DATA sequence, only. */
2633
2634if (is_server && (more || corked))
2635 {
acec9514 2636 corked = string_catn(corked, buff, len);
a5ffa9b4
JH
2637 if (more)
2638 return len;
acec9514
JH
2639 buff = CUS corked->s;
2640 len = corked->ptr;
2641 corked = NULL;
a5ffa9b4 2642 }
059ec3d9 2643
a5ffa9b4 2644for (left = len; left > 0;)
059ec3d9 2645 {
c80c5570 2646 DEBUG(D_tls) debug_printf("SSL_write(SSL, %p, %d)\n", buff, left);
059ec3d9
PH
2647 outbytes = SSL_write(ssl, CS buff, left);
2648 error = SSL_get_error(ssl, outbytes);
2649 DEBUG(D_tls) debug_printf("outbytes=%d error=%d\n", outbytes, error);
2650 switch (error)
2651 {
2652 case SSL_ERROR_SSL:
96f5fe4c
JH
2653 ERR_error_string(ERR_get_error(), ssl_errstring);
2654 log_write(0, LOG_MAIN, "TLS error (SSL_write): %s", ssl_errstring);
2655 return -1;
059ec3d9
PH
2656
2657 case SSL_ERROR_NONE:
96f5fe4c
JH
2658 left -= outbytes;
2659 buff += outbytes;
2660 break;
059ec3d9
PH
2661
2662 case SSL_ERROR_ZERO_RETURN:
96f5fe4c
JH
2663 log_write(0, LOG_MAIN, "SSL channel closed on write");
2664 return -1;
059ec3d9 2665
817d9f57 2666 case SSL_ERROR_SYSCALL:
96f5fe4c
JH
2667 log_write(0, LOG_MAIN, "SSL_write: (from %s) syscall: %s",
2668 sender_fullhost ? sender_fullhost : US"<unknown>",
2669 strerror(errno));
2670 return -1;
817d9f57 2671
059ec3d9 2672 default:
96f5fe4c
JH
2673 log_write(0, LOG_MAIN, "SSL_write error %d", error);
2674 return -1;
059ec3d9
PH
2675 }
2676 }
2677return len;
2678}
2679
2680
2681
2682/*************************************************
2683* Close down a TLS session *
2684*************************************************/
2685
2686/* This is also called from within a delivery subprocess forked from the
2687daemon, to shut down the TLS library, without actually doing a shutdown (which
2688would tamper with the SSL session in the parent process).
2689
2690Arguments: TRUE if SSL_shutdown is to be called
2691Returns: nothing
817d9f57
JH
2692
2693Used by both server-side and client-side TLS.
059ec3d9
PH
2694*/
2695
2696void
817d9f57 2697tls_close(BOOL is_server, BOOL shutdown)
059ec3d9 2698{
817d9f57 2699SSL **sslp = is_server ? &server_ssl : &client_ssl;
389ca47a 2700int *fdp = is_server ? &tls_in.active : &tls_out.active;
817d9f57
JH
2701
2702if (*fdp < 0) return; /* TLS was not active */
059ec3d9
PH
2703
2704if (shutdown)
2705 {
ec8b777a 2706 DEBUG(D_tls) debug_printf("tls_close(): shutting down SSL\n");
817d9f57 2707 SSL_shutdown(*sslp);
059ec3d9
PH
2708 }
2709
817d9f57
JH
2710SSL_free(*sslp);
2711*sslp = NULL;
059ec3d9 2712
817d9f57 2713*fdp = -1;
059ec3d9
PH
2714}
2715
36f12725
NM
2716
2717
2718
3375e053
PP
2719/*************************************************
2720* Let tls_require_ciphers be checked at startup *
2721*************************************************/
2722
2723/* The tls_require_ciphers option, if set, must be something which the
2724library can parse.
2725
2726Returns: NULL on success, or error message
2727*/
2728
2729uschar *
2730tls_validate_require_cipher(void)
2731{
2732SSL_CTX *ctx;
2733uschar *s, *expciphers, *err;
2734
2735/* this duplicates from tls_init(), we need a better "init just global
2736state, for no specific purpose" singleton function of our own */
2737
2738SSL_load_error_strings();
2739OpenSSL_add_ssl_algorithms();
2740#if (OPENSSL_VERSION_NUMBER >= 0x0090800fL) && !defined(OPENSSL_NO_SHA256)
2741/* SHA256 is becoming ever more popular. This makes sure it gets added to the
2742list of available digests. */
2743EVP_add_digest(EVP_sha256());
2744#endif
2745
2746if (!(tls_require_ciphers && *tls_require_ciphers))
2747 return NULL;
2748
cf0c6164
JH
2749if (!expand_check(tls_require_ciphers, US"tls_require_ciphers", &expciphers,
2750 &err))
3375e053
PP
2751 return US"failed to expand tls_require_ciphers";
2752
2753if (!(expciphers && *expciphers))
2754 return NULL;
2755
2756/* normalisation ripped from above */
2757s = expciphers;
2758while (*s != 0) { if (*s == '_') *s = '-'; s++; }
2759
2760err = NULL;
2761
2762ctx = SSL_CTX_new(SSLv23_server_method());
2763if (!ctx)
2764 {
2765 ERR_error_string(ERR_get_error(), ssl_errstring);
2766 return string_sprintf("SSL_CTX_new() failed: %s", ssl_errstring);
2767 }
2768
2769DEBUG(D_tls)
2770 debug_printf("tls_require_ciphers expands to \"%s\"\n", expciphers);
2771
2772if (!SSL_CTX_set_cipher_list(ctx, CS expciphers))
2773 {
2774 ERR_error_string(ERR_get_error(), ssl_errstring);
cf0c6164
JH
2775 err = string_sprintf("SSL_CTX_set_cipher_list(%s) failed: %s",
2776 expciphers, ssl_errstring);
3375e053
PP
2777 }
2778
2779SSL_CTX_free(ctx);
2780
2781return err;
2782}
2783
2784
2785
2786
36f12725
NM
2787/*************************************************
2788* Report the library versions. *
2789*************************************************/
2790
2791/* There have historically been some issues with binary compatibility in
2792OpenSSL libraries; if Exim (like many other applications) is built against
2793one version of OpenSSL but the run-time linker picks up another version,
2794it can result in serious failures, including crashing with a SIGSEGV. So
2795report the version found by the compiler and the run-time version.
2796
f64a1e23
PP
2797Note: some OS vendors backport security fixes without changing the version
2798number/string, and the version date remains unchanged. The _build_ date
2799will change, so we can more usefully assist with version diagnosis by also
2800reporting the build date.
2801
36f12725
NM
2802Arguments: a FILE* to print the results to
2803Returns: nothing
2804*/
2805
2806void
2807tls_version_report(FILE *f)
2808{
754a0503 2809fprintf(f, "Library version: OpenSSL: Compile: %s\n"
f64a1e23
PP
2810 " Runtime: %s\n"
2811 " : %s\n",
754a0503 2812 OPENSSL_VERSION_TEXT,
f64a1e23
PP
2813 SSLeay_version(SSLEAY_VERSION),
2814 SSLeay_version(SSLEAY_BUILT_ON));
2815/* third line is 38 characters for the %s and the line is 73 chars long;
2816the OpenSSL output includes a "built on: " prefix already. */
36f12725
NM
2817}
2818
9e3331ea
TK
2819
2820
2821
2822/*************************************************
17c76198 2823* Random number generation *
9e3331ea
TK
2824*************************************************/
2825
2826/* Pseudo-random number generation. The result is not expected to be
2827cryptographically strong but not so weak that someone will shoot themselves
2828in the foot using it as a nonce in input in some email header scheme or
2829whatever weirdness they'll twist this into. The result should handle fork()
2830and avoid repeating sequences. OpenSSL handles that for us.
2831
2832Arguments:
2833 max range maximum
2834Returns a random number in range [0, max-1]
2835*/
2836
2837int
17c76198 2838vaguely_random_number(int max)
9e3331ea
TK
2839{
2840unsigned int r;
2841int i, needed_len;
de6135a0
PP
2842static pid_t pidlast = 0;
2843pid_t pidnow;
9e3331ea
TK
2844uschar *p;
2845uschar smallbuf[sizeof(r)];
2846
2847if (max <= 1)
2848 return 0;
2849
de6135a0
PP
2850pidnow = getpid();
2851if (pidnow != pidlast)
2852 {
2853 /* Although OpenSSL documents that "OpenSSL makes sure that the PRNG state
2854 is unique for each thread", this doesn't apparently apply across processes,
2855 so our own warning from vaguely_random_number_fallback() applies here too.
2856 Fix per PostgreSQL. */
2857 if (pidlast != 0)
2858 RAND_cleanup();
2859 pidlast = pidnow;
2860 }
2861
9e3331ea
TK
2862/* OpenSSL auto-seeds from /dev/random, etc, but this a double-check. */
2863if (!RAND_status())
2864 {
2865 randstuff r;
2866 gettimeofday(&r.tv, NULL);
2867 r.p = getpid();
2868
5903c6ff 2869 RAND_seed(US (&r), sizeof(r));
9e3331ea
TK
2870 }
2871/* We're after pseudo-random, not random; if we still don't have enough data
2872in the internal PRNG then our options are limited. We could sleep and hope
2873for entropy to come along (prayer technique) but if the system is so depleted
2874in the first place then something is likely to just keep taking it. Instead,
2875we'll just take whatever little bit of pseudo-random we can still manage to
2876get. */
2877
2878needed_len = sizeof(r);
2879/* Don't take 8 times more entropy than needed if int is 8 octets and we were
2880asked for a number less than 10. */
2881for (r = max, i = 0; r; ++i)
2882 r >>= 1;
2883i = (i + 7) / 8;
2884if (i < needed_len)
2885 needed_len = i;
2886
c8dfb21d 2887#ifdef EXIM_HAVE_RAND_PSEUDO
9e3331ea 2888/* We do not care if crypto-strong */
17c76198 2889i = RAND_pseudo_bytes(smallbuf, needed_len);
c8dfb21d
JH
2890#else
2891i = RAND_bytes(smallbuf, needed_len);
2892#endif
2893
17c76198
PP
2894if (i < 0)
2895 {
2896 DEBUG(D_all)
2897 debug_printf("OpenSSL RAND_pseudo_bytes() not supported by RAND method, using fallback.\n");
2898 return vaguely_random_number_fallback(max);
2899 }
2900
9e3331ea
TK
2901r = 0;
2902for (p = smallbuf; needed_len; --needed_len, ++p)
2903 {
2904 r *= 256;
2905 r += *p;
2906 }
2907
2908/* We don't particularly care about weighted results; if someone wants
2909smooth distribution and cares enough then they should submit a patch then. */
2910return r % max;
2911}
2912
77bb000f
PP
2913
2914
2915
2916/*************************************************
2917* OpenSSL option parse *
2918*************************************************/
2919
2920/* Parse one option for tls_openssl_options_parse below
2921
2922Arguments:
2923 name one option name
2924 value place to store a value for it
2925Returns success or failure in parsing
2926*/
2927
2928struct exim_openssl_option {
2929 uschar *name;
2930 long value;
2931};
2932/* We could use a macro to expand, but we need the ifdef and not all the
2933options document which version they were introduced in. Policylet: include
2934all options unless explicitly for DTLS, let the administrator choose which
2935to apply.
2936
2937This list is current as of:
e2fbf4a2
PP
2938 ==> 1.0.1b <==
2939Plus SSL_OP_SAFARI_ECDHE_ECDSA_BUG from 2013-June patch/discussion on openssl-dev
2940*/
77bb000f
PP
2941static struct exim_openssl_option exim_openssl_options[] = {
2942/* KEEP SORTED ALPHABETICALLY! */
2943#ifdef SSL_OP_ALL
73a46702 2944 { US"all", SSL_OP_ALL },
77bb000f
PP
2945#endif
2946#ifdef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION
73a46702 2947 { US"allow_unsafe_legacy_renegotiation", SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION },
77bb000f
PP
2948#endif
2949#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
73a46702 2950 { US"cipher_server_preference", SSL_OP_CIPHER_SERVER_PREFERENCE },
77bb000f
PP
2951#endif
2952#ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
73a46702 2953 { US"dont_insert_empty_fragments", SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS },
77bb000f
PP
2954#endif
2955#ifdef SSL_OP_EPHEMERAL_RSA
73a46702 2956 { US"ephemeral_rsa", SSL_OP_EPHEMERAL_RSA },
77bb000f
PP
2957#endif
2958#ifdef SSL_OP_LEGACY_SERVER_CONNECT
73a46702 2959 { US"legacy_server_connect", SSL_OP_LEGACY_SERVER_CONNECT },
77bb000f
PP
2960#endif
2961#ifdef SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER
73a46702 2962 { US"microsoft_big_sslv3_buffer", SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER },
77bb000f
PP
2963#endif
2964#ifdef SSL_OP_MICROSOFT_SESS_ID_BUG
73a46702 2965 { US"microsoft_sess_id_bug", SSL_OP_MICROSOFT_SESS_ID_BUG },
77bb000f
PP
2966#endif
2967#ifdef SSL_OP_MSIE_SSLV2_RSA_PADDING
73a46702 2968 { US"msie_sslv2_rsa_padding", SSL_OP_MSIE_SSLV2_RSA_PADDING },
77bb000f
PP
2969#endif
2970#ifdef SSL_OP_NETSCAPE_CHALLENGE_BUG
73a46702 2971 { US"netscape_challenge_bug", SSL_OP_NETSCAPE_CHALLENGE_BUG },
77bb000f
PP
2972#endif
2973#ifdef SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG
73a46702 2974 { US"netscape_reuse_cipher_change_bug", SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG },
77bb000f 2975#endif
c80c5570
PP
2976#ifdef SSL_OP_NO_COMPRESSION
2977 { US"no_compression", SSL_OP_NO_COMPRESSION },
2978#endif
77bb000f 2979#ifdef SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
73a46702 2980 { US"no_session_resumption_on_renegotiation", SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION },
77bb000f 2981#endif
c0c7b2da
PP
2982#ifdef SSL_OP_NO_SSLv2
2983 { US"no_sslv2", SSL_OP_NO_SSLv2 },
2984#endif
2985#ifdef SSL_OP_NO_SSLv3
2986 { US"no_sslv3", SSL_OP_NO_SSLv3 },
2987#endif
2988#ifdef SSL_OP_NO_TICKET
2989 { US"no_ticket", SSL_OP_NO_TICKET },
2990#endif
2991#ifdef SSL_OP_NO_TLSv1
2992 { US"no_tlsv1", SSL_OP_NO_TLSv1 },
2993#endif
c80c5570
PP
2994#ifdef SSL_OP_NO_TLSv1_1
2995#if SSL_OP_NO_TLSv1_1 == 0x00000400L
2996 /* Error in chosen value in 1.0.1a; see first item in CHANGES for 1.0.1b */
2997#warning OpenSSL 1.0.1a uses a bad value for SSL_OP_NO_TLSv1_1, ignoring
2998#else
2999 { US"no_tlsv1_1", SSL_OP_NO_TLSv1_1 },
3000#endif
3001#endif
3002#ifdef SSL_OP_NO_TLSv1_2
3003 { US"no_tlsv1_2", SSL_OP_NO_TLSv1_2 },
3004#endif
e2fbf4a2
PP
3005#ifdef SSL_OP_SAFARI_ECDHE_ECDSA_BUG
3006 { US"safari_ecdhe_ecdsa_bug", SSL_OP_SAFARI_ECDHE_ECDSA_BUG },
3007#endif
77bb000f 3008#ifdef SSL_OP_SINGLE_DH_USE
73a46702 3009 { US"single_dh_use", SSL_OP_SINGLE_DH_USE },
77bb000f
PP
3010#endif
3011#ifdef SSL_OP_SINGLE_ECDH_USE
73a46702 3012 { US"single_ecdh_use", SSL_OP_SINGLE_ECDH_USE },
77bb000f
PP
3013#endif
3014#ifdef SSL_OP_SSLEAY_080_CLIENT_DH_BUG
73a46702 3015 { US"ssleay_080_client_dh_bug", SSL_OP_SSLEAY_080_CLIENT_DH_BUG },
77bb000f
PP
3016#endif
3017#ifdef SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG
73a46702 3018 { US"sslref2_reuse_cert_type_bug", SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG },
77bb000f
PP
3019#endif
3020#ifdef SSL_OP_TLS_BLOCK_PADDING_BUG
73a46702 3021 { US"tls_block_padding_bug", SSL_OP_TLS_BLOCK_PADDING_BUG },
77bb000f
PP
3022#endif
3023#ifdef SSL_OP_TLS_D5_BUG
73a46702 3024 { US"tls_d5_bug", SSL_OP_TLS_D5_BUG },
77bb000f
PP
3025#endif
3026#ifdef SSL_OP_TLS_ROLLBACK_BUG
73a46702 3027 { US"tls_rollback_bug", SSL_OP_TLS_ROLLBACK_BUG },
77bb000f
PP
3028#endif
3029};
3030static int exim_openssl_options_size =
3031 sizeof(exim_openssl_options)/sizeof(struct exim_openssl_option);
3032
c80c5570 3033
77bb000f
PP
3034static BOOL
3035tls_openssl_one_option_parse(uschar *name, long *value)
3036{
3037int first = 0;
3038int last = exim_openssl_options_size;
3039while (last > first)
3040 {
3041 int middle = (first + last)/2;
3042 int c = Ustrcmp(name, exim_openssl_options[middle].name);
3043 if (c == 0)
3044 {
3045 *value = exim_openssl_options[middle].value;
3046 return TRUE;
3047 }
3048 else if (c > 0)
3049 first = middle + 1;
3050 else
3051 last = middle;
3052 }
3053return FALSE;
3054}
3055
3056
3057
3058
3059/*************************************************
3060* OpenSSL option parsing logic *
3061*************************************************/
3062
3063/* OpenSSL has a number of compatibility options which an administrator might
3064reasonably wish to set. Interpret a list similarly to decode_bits(), so that
3065we look like log_selector.
3066
3067Arguments:
3068 option_spec the administrator-supplied string of options
3069 results ptr to long storage for the options bitmap
3070Returns success or failure
3071*/
3072
3073BOOL
3074tls_openssl_options_parse(uschar *option_spec, long *results)
3075{
3076long result, item;
3077uschar *s, *end;
3078uschar keep_c;
3079BOOL adding, item_parsed;
3080
7006ee24 3081result = SSL_OP_NO_TICKET;
b1770b6e 3082/* Prior to 4.80 we or'd in SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS; removed
da3ad30d 3083 * from default because it increases BEAST susceptibility. */
f0f5a555
PP
3084#ifdef SSL_OP_NO_SSLv2
3085result |= SSL_OP_NO_SSLv2;
3086#endif
a57b6200
JH
3087#ifdef SSL_OP_SINGLE_DH_USE
3088result |= SSL_OP_SINGLE_DH_USE;
3089#endif
77bb000f 3090
7006ee24 3091if (!option_spec)
77bb000f
PP
3092 {
3093 *results = result;
3094 return TRUE;
3095 }
3096
3097for (s=option_spec; *s != '\0'; /**/)
3098 {
3099 while (isspace(*s)) ++s;
3100 if (*s == '\0')
3101 break;
3102 if (*s != '+' && *s != '-')
3103 {
3104 DEBUG(D_tls) debug_printf("malformed openssl option setting: "
0e944a0d 3105 "+ or - expected but found \"%s\"\n", s);
77bb000f
PP
3106 return FALSE;
3107 }
3108 adding = *s++ == '+';
3109 for (end = s; (*end != '\0') && !isspace(*end); ++end) /**/ ;
3110 keep_c = *end;
3111 *end = '\0';
3112 item_parsed = tls_openssl_one_option_parse(s, &item);
96f5fe4c 3113 *end = keep_c;
77bb000f
PP
3114 if (!item_parsed)
3115 {
0e944a0d 3116 DEBUG(D_tls) debug_printf("openssl option setting unrecognised: \"%s\"\n", s);
77bb000f
PP
3117 return FALSE;
3118 }
3119 DEBUG(D_tls) debug_printf("openssl option, %s from %lx: %lx (%s)\n",
3120 adding ? "adding" : "removing", result, item, s);
3121 if (adding)
3122 result |= item;
3123 else
3124 result &= ~item;
77bb000f
PP
3125 s = end;
3126 }
3127
3128*results = result;
3129return TRUE;
3130}
3131
9d1c15ef
JH
3132/* vi: aw ai sw=2
3133*/
059ec3d9 3134/* End of tls-openssl.c */