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