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