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