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