1 /* $Cambridge: exim/src/src/tls-openssl.c,v 1.17 2009/10/16 09:10:40 tom Exp $ */
3 /*************************************************
4 * Exim - an Internet mail transport agent *
5 *************************************************/
7 /* Copyright (c) University of Cambridge 1995 - 2007 */
8 /* See the file NOTICE for conditions of use and distribution. */
10 /* This module provides the TLS (aka SSL) support for Exim using the OpenSSL
11 library. It is #included into the tls.c file when that library is used. The
12 code herein is based on a patch that was originally contributed by Steve
13 Haslam. It was adapted from stunnel, a GPL program by Michal Trojnara.
15 No cryptographic code is included in Exim. All this module does is to call
16 functions from the OpenSSL library. */
21 #include <openssl/lhash.h>
22 #include <openssl/ssl.h>
23 #include <openssl/err.h>
24 #include <openssl/rand.h>
26 /* Structure for collecting random data for seeding. */
28 typedef struct randstuff {
33 /* Local static variables */
35 static BOOL verify_callback_called = FALSE;
36 static const uschar *sid_ctx = US"exim";
38 static SSL_CTX *ctx = NULL;
39 static SSL *ssl = NULL;
41 static char ssl_errstring[256];
43 static int ssl_session_timeout = 200;
44 static BOOL verify_optional = FALSE;
50 /*************************************************
52 *************************************************/
54 /* Called from lots of places when errors occur before actually starting to do
55 the TLS handshake, that is, while the session is still in clear. Always returns
56 DEFER for a server and FAIL for a client so that most calls can use "return
57 tls_error(...)" to do this processing and then give an appropriate return. A
58 single function is used for both server and client, because it is called from
59 some shared functions.
62 prefix text to include in the logged error
63 host NULL if setting up a server;
64 the connected host if setting up a client
65 msg error message or NULL if we should ask OpenSSL
67 Returns: OK/DEFER/FAIL
71 tls_error(uschar *prefix, host_item *host, uschar *msg)
75 ERR_error_string(ERR_get_error(), ssl_errstring);
81 uschar *conn_info = smtp_get_connection_info();
82 if (strncmp(conn_info, "SMTP ", 5) == 0)
84 log_write(0, LOG_MAIN, "TLS error on %s (%s): %s",
85 conn_info, prefix, msg);
90 log_write(0, LOG_MAIN, "TLS error on connection to %s [%s] (%s): %s",
91 host->name, host->address, prefix, msg);
98 /*************************************************
99 * Callback to generate RSA key *
100 *************************************************/
108 Returns: pointer to generated key
112 rsa_callback(SSL *s, int export, int keylength)
115 export = export; /* Shut picky compilers up */
116 DEBUG(D_tls) debug_printf("Generating %d bit RSA key...\n", keylength);
117 rsa_key = RSA_generate_key(keylength, RSA_F4, NULL, NULL);
120 ERR_error_string(ERR_get_error(), ssl_errstring);
121 log_write(0, LOG_MAIN|LOG_PANIC, "TLS error (RSA_generate_key): %s",
131 /*************************************************
132 * Callback for verification *
133 *************************************************/
135 /* The SSL library does certificate verification if set up to do so. This
136 callback has the current yes/no state is in "state". If verification succeeded,
137 we set up the tls_peerdn string. If verification failed, what happens depends
138 on whether the client is required to present a verifiable certificate or not.
140 If verification is optional, we change the state to yes, but still log the
141 verification error. For some reason (it really would help to have proper
142 documentation of OpenSSL), this callback function then gets called again, this
143 time with state = 1. In fact, that's useful, because we can set up the peerdn
144 value, but we must take care not to set the private verified flag on the second
147 Note: this function is not called if the client fails to present a certificate
148 when asked. We get here only if a certificate has been received. Handling of
149 optional verification for this case is done when requesting SSL to verify, by
150 setting SSL_VERIFY_FAIL_IF_NO_PEER_CERT in the non-optional case.
153 state current yes/no state as 1/0
154 x509ctx certificate information.
156 Returns: 1 if verified, 0 if not
160 verify_callback(int state, X509_STORE_CTX *x509ctx)
162 static uschar txt[256];
164 X509_NAME_oneline(X509_get_subject_name(x509ctx->current_cert),
165 CS txt, sizeof(txt));
169 log_write(0, LOG_MAIN, "SSL verify error: depth=%d error=%s cert=%s",
170 x509ctx->error_depth,
171 X509_verify_cert_error_string(x509ctx->error),
173 tls_certificate_verified = FALSE;
174 verify_callback_called = TRUE;
175 if (!verify_optional) return 0; /* reject */
176 DEBUG(D_tls) debug_printf("SSL verify failure overridden (host in "
177 "tls_try_verify_hosts)\n");
178 return 1; /* accept */
181 if (x509ctx->error_depth != 0)
183 DEBUG(D_tls) debug_printf("SSL verify ok: depth=%d cert=%s\n",
184 x509ctx->error_depth, txt);
188 DEBUG(D_tls) debug_printf("SSL%s peer: %s\n",
189 verify_callback_called? "" : " authenticated", txt);
193 if (!verify_callback_called) tls_certificate_verified = TRUE;
194 verify_callback_called = TRUE;
196 return 1; /* accept */
201 /*************************************************
202 * Information callback *
203 *************************************************/
205 /* The SSL library functions call this from time to time to indicate what they
206 are doing. We copy the string to the debugging output when the level is high
218 info_callback(SSL *s, int where, int ret)
222 DEBUG(D_tls) debug_printf("SSL info: %s\n", SSL_state_string_long(s));
227 /*************************************************
228 * Initialize for DH *
229 *************************************************/
231 /* If dhparam is set, expand it, and load up the parameters for DH encryption.
234 dhparam DH parameter file
235 host connected host, if client; NULL if server
237 Returns: TRUE if OK (nothing to set up, or setup worked)
241 init_dh(uschar *dhparam, host_item *host)
248 if (!expand_check(dhparam, US"tls_dhparam", &dhexpanded))
251 if (dhexpanded == NULL) return TRUE;
253 if ((bio = BIO_new_file(CS dhexpanded, "r")) == NULL)
255 tls_error(string_sprintf("could not read dhparams file %s", dhexpanded),
256 host, strerror(errno));
261 if ((dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)) == NULL)
263 tls_error(string_sprintf("could not read dhparams file %s", dhexpanded),
269 SSL_CTX_set_tmp_dh(ctx, dh);
271 debug_printf("Diffie-Hellman initialized from %s with %d-bit key\n",
272 dhexpanded, 8*DH_size(dh));
284 /*************************************************
285 * Initialize for TLS *
286 *************************************************/
288 /* Called from both server and client code, to do preliminary initialization of
292 host connected host, if client; NULL if server
293 dhparam DH parameter file
294 certificate certificate file
295 privatekey private key
296 addr address if client; NULL if server (for some randomness)
298 Returns: OK/DEFER/FAIL
302 tls_init(host_item *host, uschar *dhparam, uschar *certificate,
303 uschar *privatekey, address_item *addr)
305 SSL_load_error_strings(); /* basic set up */
306 OpenSSL_add_ssl_algorithms();
308 /* SHA256 is becoming ever moar popular. This makes sure it gets added to the
309 list of available digests. */
310 EVP_add_digest(EVP_sha256());
312 /* Create a context */
314 ctx = SSL_CTX_new((host == NULL)?
315 SSLv23_server_method() : SSLv23_client_method());
317 if (ctx == NULL) return tls_error(US"SSL_CTX_new", host, NULL);
319 /* It turns out that we need to seed the random number generator this early in
320 order to get the full complement of ciphers to work. It took me roughly a day
321 of work to discover this by experiment.
323 On systems that have /dev/urandom, SSL may automatically seed itself from
324 there. Otherwise, we have to make something up as best we can. Double check
330 gettimeofday(&r.tv, NULL);
333 RAND_seed((uschar *)(&r), sizeof(r));
334 RAND_seed((uschar *)big_buffer, big_buffer_size);
335 if (addr != NULL) RAND_seed((uschar *)addr, sizeof(addr));
338 return tls_error(US"RAND_status", host,
339 "unable to seed random number generator");
342 /* Set up the information callback, which outputs if debugging is at a suitable
345 SSL_CTX_set_info_callback(ctx, (void (*)())info_callback);
347 /* The following patch was supplied by Robert Roselius */
349 #if OPENSSL_VERSION_NUMBER > 0x00906040L
350 /* Enable client-bug workaround.
351 Versions of OpenSSL as of 0.9.6d include a "CBC countermeasure" feature,
352 which causes problems with some clients (such as the Certicom SSL Plus
353 library used by Eudora). This option, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS,
354 disables the coutermeasure allowing Eudora to connect.
355 Some poppers and MTAs use SSL_OP_ALL, which enables all such bug
357 /* XXX (Silently?) ignore failure here? XXX*/
359 if (!(SSL_CTX_set_options(ctx, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)))
360 return tls_error(US"SSL_CTX_set_option", host, NULL);
363 /* Initialize with DH parameters if supplied */
365 if (!init_dh(dhparam, host)) return DEFER;
367 /* Set up certificate and key */
369 if (certificate != NULL)
372 if (!expand_check(certificate, US"tls_certificate", &expanded))
375 if (expanded != NULL)
377 DEBUG(D_tls) debug_printf("tls_certificate file %s\n", expanded);
378 if (!SSL_CTX_use_certificate_chain_file(ctx, CS expanded))
379 return tls_error(string_sprintf(
380 "SSL_CTX_use_certificate_chain_file file=%s", expanded), host, NULL);
383 if (privatekey != NULL &&
384 !expand_check(privatekey, US"tls_privatekey", &expanded))
387 /* If expansion was forced to fail, key_expanded will be NULL. If the result
388 of the expansion is an empty string, ignore it also, and assume the private
389 key is in the same file as the certificate. */
391 if (expanded != NULL && *expanded != 0)
393 DEBUG(D_tls) debug_printf("tls_privatekey file %s\n", expanded);
394 if (!SSL_CTX_use_PrivateKey_file(ctx, CS expanded, SSL_FILETYPE_PEM))
395 return tls_error(string_sprintf(
396 "SSL_CTX_use_PrivateKey_file file=%s", expanded), host, NULL);
400 /* Set up the RSA callback */
402 SSL_CTX_set_tmp_rsa_callback(ctx, rsa_callback);
404 /* Finally, set the timeout, and we are done */
406 SSL_CTX_set_timeout(ctx, ssl_session_timeout);
407 DEBUG(D_tls) debug_printf("Initialized TLS\n");
414 /*************************************************
415 * Get name of cipher in use *
416 *************************************************/
418 /* The answer is left in a static buffer, and tls_cipher is set to point
421 Argument: pointer to an SSL structure for the connection
426 construct_cipher_name(SSL *ssl)
428 static uschar cipherbuf[256];
433 switch (ssl->session->ssl_version)
451 c = SSL_get_current_cipher(ssl);
452 SSL_CIPHER_get_bits(c, &bits);
454 string_format(cipherbuf, sizeof(cipherbuf), "%s:%s:%u", ver,
455 SSL_CIPHER_get_name(c), bits);
456 tls_cipher = cipherbuf;
458 DEBUG(D_tls) debug_printf("Cipher: %s\n", cipherbuf);
465 /*************************************************
466 * Set up for verifying certificates *
467 *************************************************/
469 /* Called by both client and server startup
472 certs certs file or NULL
474 host NULL in a server; the remote host in a client
475 optional TRUE if called from a server for a host in tls_try_verify_hosts;
476 otherwise passed as FALSE
478 Returns: OK/DEFER/FAIL
482 setup_certs(uschar *certs, uschar *crl, host_item *host, BOOL optional)
484 uschar *expcerts, *expcrl;
486 if (!expand_check(certs, US"tls_verify_certificates", &expcerts))
489 if (expcerts != NULL)
492 if (!SSL_CTX_set_default_verify_paths(ctx))
493 return tls_error(US"SSL_CTX_set_default_verify_paths", host, NULL);
495 if (Ustat(expcerts, &statbuf) < 0)
497 log_write(0, LOG_MAIN|LOG_PANIC,
498 "failed to stat %s for certificates", expcerts);
504 if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
505 { file = NULL; dir = expcerts; }
507 { file = expcerts; dir = NULL; }
509 /* If a certificate file is empty, the next function fails with an
510 unhelpful error message. If we skip it, we get the correct behaviour (no
511 certificates are recognized, but the error message is still misleading (it
512 says no certificate was supplied.) But this is better. */
514 if ((file == NULL || statbuf.st_size > 0) &&
515 !SSL_CTX_load_verify_locations(ctx, CS file, CS dir))
516 return tls_error(US"SSL_CTX_load_verify_locations", host, NULL);
520 SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(CS file));
524 /* Handle a certificate revocation list. */
526 #if OPENSSL_VERSION_NUMBER > 0x00907000L
528 /* This bit of code is now the version supplied by Lars Mainka. (I have
529 * merely reformatted it into the Exim code style.)
531 * "From here I changed the code to add support for multiple crl's
532 * in pem format in one file or to support hashed directory entries in
533 * pem format instead of a file. This method now uses the library function
534 * X509_STORE_load_locations to add the CRL location to the SSL context.
535 * OpenSSL will then handle the verify against CA certs and CRLs by
536 * itself in the verify callback." */
538 if (!expand_check(crl, US"tls_crl", &expcrl)) return DEFER;
539 if (expcrl != NULL && *expcrl != 0)
541 struct stat statbufcrl;
542 if (Ustat(expcrl, &statbufcrl) < 0)
544 log_write(0, LOG_MAIN|LOG_PANIC,
545 "failed to stat %s for certificates revocation lists", expcrl);
550 /* is it a file or directory? */
552 X509_STORE *cvstore = SSL_CTX_get_cert_store(ctx);
553 if ((statbufcrl.st_mode & S_IFMT) == S_IFDIR)
557 DEBUG(D_tls) debug_printf("SSL CRL value is a directory %s\n", dir);
563 DEBUG(D_tls) debug_printf("SSL CRL value is a file %s\n", file);
565 if (X509_STORE_load_locations(cvstore, CS file, CS dir) == 0)
566 return tls_error(US"X509_STORE_load_locations", host, NULL);
568 /* setting the flags to check against the complete crl chain */
570 X509_STORE_set_flags(cvstore,
571 X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
575 #endif /* OPENSSL_VERSION_NUMBER > 0x00907000L */
577 /* If verification is optional, don't fail if no certificate */
579 SSL_CTX_set_verify(ctx,
580 SSL_VERIFY_PEER | (optional? 0 : SSL_VERIFY_FAIL_IF_NO_PEER_CERT),
589 /*************************************************
590 * Start a TLS session in a server *
591 *************************************************/
593 /* This is called when Exim is running as a server, after having received
594 the STARTTLS command. It must respond to that command, and then negotiate
598 require_ciphers allowed ciphers
599 ------------------------------------------------------
600 require_mac list of allowed MACs ) Not used
601 require_kx list of allowed key_exchange methods ) for
602 require_proto list of allowed protocols ) OpenSSL
603 ------------------------------------------------------
605 Returns: OK on success
606 DEFER for errors before the start of the negotiation
607 FAIL for errors during the negotation; the server can't
612 tls_server_start(uschar *require_ciphers, uschar *require_mac,
613 uschar *require_kx, uschar *require_proto)
618 /* Check for previous activation */
622 tls_error("STARTTLS received after TLS started", NULL, "");
623 smtp_printf("554 Already in TLS\r\n");
627 /* Initialize the SSL library. If it fails, it will already have logged
630 rc = tls_init(NULL, tls_dhparam, tls_certificate, tls_privatekey, NULL);
631 if (rc != OK) return rc;
633 if (!expand_check(require_ciphers, US"tls_require_ciphers", &expciphers))
636 /* In OpenSSL, cipher components are separated by hyphens. In GnuTLS, they
637 are separated by underscores. So that I can use either form in my tests, and
638 also for general convenience, we turn underscores into hyphens here. */
640 if (expciphers != NULL)
642 uschar *s = expciphers;
643 while (*s != 0) { if (*s == '_') *s = '-'; s++; }
644 DEBUG(D_tls) debug_printf("required ciphers: %s\n", expciphers);
645 if (!SSL_CTX_set_cipher_list(ctx, CS expciphers))
646 return tls_error(US"SSL_CTX_set_cipher_list", NULL, NULL);
649 /* If this is a host for which certificate verification is mandatory or
650 optional, set up appropriately. */
652 tls_certificate_verified = FALSE;
653 verify_callback_called = FALSE;
655 if (verify_check_host(&tls_verify_hosts) == OK)
657 rc = setup_certs(tls_verify_certificates, tls_crl, NULL, FALSE);
658 if (rc != OK) return rc;
659 verify_optional = FALSE;
661 else if (verify_check_host(&tls_try_verify_hosts) == OK)
663 rc = setup_certs(tls_verify_certificates, tls_crl, NULL, TRUE);
664 if (rc != OK) return rc;
665 verify_optional = TRUE;
668 /* Prepare for new connection */
670 if ((ssl = SSL_new(ctx)) == NULL) return tls_error(US"SSL_new", NULL, NULL);
673 /* Set context and tell client to go ahead, except in the case of TLS startup
674 on connection, where outputting anything now upsets the clients and tends to
675 make them disconnect. We need to have an explicit fflush() here, to force out
676 the response. Other smtp_printf() calls do not need it, because in non-TLS
677 mode, the fflush() happens when smtp_getc() is called. */
679 SSL_set_session_id_context(ssl, sid_ctx, Ustrlen(sid_ctx));
682 smtp_printf("220 TLS go ahead\r\n");
686 /* Now negotiate the TLS session. We put our own timer on it, since it seems
687 that the OpenSSL library doesn't. */
689 SSL_set_wfd(ssl, fileno(smtp_out));
690 SSL_set_rfd(ssl, fileno(smtp_in));
691 SSL_set_accept_state(ssl);
693 DEBUG(D_tls) debug_printf("Calling SSL_accept\n");
695 sigalrm_seen = FALSE;
696 if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
697 rc = SSL_accept(ssl);
702 tls_error(US"SSL_accept", NULL, sigalrm_seen ? US"timed out" : NULL);
706 DEBUG(D_tls) debug_printf("SSL_accept was successful\n");
708 /* TLS has been set up. Adjust the input functions to read via TLS,
709 and initialize things. */
711 construct_cipher_name(ssl);
716 if (SSL_get_shared_ciphers(ssl, CS buf, sizeof(buf)) != NULL)
717 debug_printf("Shared ciphers: %s\n", buf);
721 ssl_xfer_buffer = store_malloc(ssl_xfer_buffer_size);
722 ssl_xfer_buffer_lwm = ssl_xfer_buffer_hwm = 0;
723 ssl_xfer_eof = ssl_xfer_error = 0;
725 receive_getc = tls_getc;
726 receive_ungetc = tls_ungetc;
727 receive_feof = tls_feof;
728 receive_ferror = tls_ferror;
729 receive_smtp_buffered = tls_smtp_buffered;
731 tls_active = fileno(smtp_out);
739 /*************************************************
740 * Start a TLS session in a client *
741 *************************************************/
743 /* Called from the smtp transport after STARTTLS has been accepted.
746 fd the fd of the connection
747 host connected host (for messages)
748 addr the first address
749 dhparam DH parameter file
750 certificate certificate file
751 privatekey private key file
752 verify_certs file for certificate verify
753 crl file containing CRL
754 require_ciphers list of allowed ciphers
755 ------------------------------------------------------
756 require_mac list of allowed MACs ) Not used
757 require_kx list of allowed key_exchange methods ) for
758 require_proto list of allowed protocols ) OpenSSL
759 ------------------------------------------------------
760 timeout startup timeout
762 Returns: OK on success
763 FAIL otherwise - note that tls_error() will not give DEFER
764 because this is not a server
768 tls_client_start(int fd, host_item *host, address_item *addr, uschar *dhparam,
769 uschar *certificate, uschar *privatekey, uschar *verify_certs, uschar *crl,
770 uschar *require_ciphers, uschar *require_mac, uschar *require_kx,
771 uschar *require_proto, int timeout)
773 static uschar txt[256];
778 rc = tls_init(host, dhparam, certificate, privatekey, addr);
779 if (rc != OK) return rc;
781 tls_certificate_verified = FALSE;
782 verify_callback_called = FALSE;
784 if (!expand_check(require_ciphers, US"tls_require_ciphers", &expciphers))
787 /* In OpenSSL, cipher components are separated by hyphens. In GnuTLS, they
788 are separated by underscores. So that I can use either form in my tests, and
789 also for general convenience, we turn underscores into hyphens here. */
791 if (expciphers != NULL)
793 uschar *s = expciphers;
794 while (*s != 0) { if (*s == '_') *s = '-'; s++; }
795 DEBUG(D_tls) debug_printf("required ciphers: %s\n", expciphers);
796 if (!SSL_CTX_set_cipher_list(ctx, CS expciphers))
797 return tls_error(US"SSL_CTX_set_cipher_list", host, NULL);
800 rc = setup_certs(verify_certs, crl, host, FALSE);
801 if (rc != OK) return rc;
803 if ((ssl = SSL_new(ctx)) == NULL) return tls_error(US"SSL_new", host, NULL);
804 SSL_set_session_id_context(ssl, sid_ctx, Ustrlen(sid_ctx));
806 SSL_set_connect_state(ssl);
808 /* There doesn't seem to be a built-in timeout on connection. */
810 DEBUG(D_tls) debug_printf("Calling SSL_connect\n");
811 sigalrm_seen = FALSE;
813 rc = SSL_connect(ssl);
817 return tls_error(US"SSL_connect", host, sigalrm_seen ? US"timed out" : NULL);
819 DEBUG(D_tls) debug_printf("SSL_connect succeeded\n");
821 server_cert = SSL_get_peer_certificate (ssl);
822 tls_peerdn = US X509_NAME_oneline(X509_get_subject_name(server_cert),
823 CS txt, sizeof(txt));
826 construct_cipher_name(ssl); /* Sets tls_cipher */
836 /*************************************************
837 * TLS version of getc *
838 *************************************************/
840 /* This gets the next byte from the TLS input buffer. If the buffer is empty,
841 it refills the buffer via the SSL reading function.
844 Returns: the next character or EOF
850 if (ssl_xfer_buffer_lwm >= ssl_xfer_buffer_hwm)
855 DEBUG(D_tls) debug_printf("Calling SSL_read(%lx, %lx, %u)\n", (long)ssl,
856 (long)ssl_xfer_buffer, ssl_xfer_buffer_size);
858 if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
859 inbytes = SSL_read(ssl, CS ssl_xfer_buffer, ssl_xfer_buffer_size);
860 error = SSL_get_error(ssl, inbytes);
863 /* SSL_ERROR_ZERO_RETURN appears to mean that the SSL session has been
864 closed down, not that the socket itself has been closed down. Revert to
867 if (error == SSL_ERROR_ZERO_RETURN)
869 DEBUG(D_tls) debug_printf("Got SSL_ERROR_ZERO_RETURN\n");
871 receive_getc = smtp_getc;
872 receive_ungetc = smtp_ungetc;
873 receive_feof = smtp_feof;
874 receive_ferror = smtp_ferror;
875 receive_smtp_buffered = smtp_buffered;
886 /* Handle genuine errors */
888 else if (error != SSL_ERROR_NONE)
890 DEBUG(D_tls) debug_printf("Got SSL error %d\n", error);
895 dkim_exim_verify_feed(ssl_xfer_buffer, inbytes);
897 ssl_xfer_buffer_hwm = inbytes;
898 ssl_xfer_buffer_lwm = 0;
901 /* Something in the buffer; return next uschar */
903 return ssl_xfer_buffer[ssl_xfer_buffer_lwm++];
908 /*************************************************
909 * Read bytes from TLS channel *
910 *************************************************/
917 Returns: the number of bytes read
918 -1 after a failed read
922 tls_read(uschar *buff, size_t len)
927 DEBUG(D_tls) debug_printf("Calling SSL_read(%lx, %lx, %u)\n", (long)ssl,
928 (long)buff, (unsigned int)len);
930 inbytes = SSL_read(ssl, CS buff, len);
931 error = SSL_get_error(ssl, inbytes);
933 if (error == SSL_ERROR_ZERO_RETURN)
935 DEBUG(D_tls) debug_printf("Got SSL_ERROR_ZERO_RETURN\n");
938 else if (error != SSL_ERROR_NONE)
950 /*************************************************
951 * Write bytes down TLS channel *
952 *************************************************/
959 Returns: the number of bytes after a successful write,
960 -1 after a failed write
964 tls_write(const uschar *buff, size_t len)
970 DEBUG(D_tls) debug_printf("tls_do_write(%lx, %d)\n", (long)buff, left);
973 DEBUG(D_tls) debug_printf("SSL_write(SSL, %lx, %d)\n", (long)buff, left);
974 outbytes = SSL_write(ssl, CS buff, left);
975 error = SSL_get_error(ssl, outbytes);
976 DEBUG(D_tls) debug_printf("outbytes=%d error=%d\n", outbytes, error);
980 ERR_error_string(ERR_get_error(), ssl_errstring);
981 log_write(0, LOG_MAIN, "TLS error (SSL_write): %s", ssl_errstring);
989 case SSL_ERROR_ZERO_RETURN:
990 log_write(0, LOG_MAIN, "SSL channel closed on write");
994 log_write(0, LOG_MAIN, "SSL_write error %d", error);
1003 /*************************************************
1004 * Close down a TLS session *
1005 *************************************************/
1007 /* This is also called from within a delivery subprocess forked from the
1008 daemon, to shut down the TLS library, without actually doing a shutdown (which
1009 would tamper with the SSL session in the parent process).
1011 Arguments: TRUE if SSL_shutdown is to be called
1016 tls_close(BOOL shutdown)
1018 if (tls_active < 0) return; /* TLS was not active */
1022 DEBUG(D_tls) debug_printf("tls_close(): shutting down SSL\n");
1035 /*************************************************
1036 * Report the library versions. *
1037 *************************************************/
1039 /* There have historically been some issues with binary compatibility in
1040 OpenSSL libraries; if Exim (like many other applications) is built against
1041 one version of OpenSSL but the run-time linker picks up another version,
1042 it can result in serious failures, including crashing with a SIGSEGV. So
1043 report the version found by the compiler and the run-time version.
1045 Arguments: a FILE* to print the results to
1050 tls_version_report(FILE *f)
1052 fprintf(f, "OpenSSL compile-time version: %s\n", OPENSSL_VERSION_TEXT);
1053 fprintf(f, "OpenSSL runtime version: %s\n", SSLeay_version(SSLEAY_VERSION));
1059 /*************************************************
1060 * Pseudo-random number generation *
1061 *************************************************/
1063 /* Pseudo-random number generation. The result is not expected to be
1064 cryptographically strong but not so weak that someone will shoot themselves
1065 in the foot using it as a nonce in input in some email header scheme or
1066 whatever weirdness they'll twist this into. The result should handle fork()
1067 and avoid repeating sequences. OpenSSL handles that for us.
1071 Returns a random number in range [0, max-1]
1075 pseudo_random_number(int max)
1080 uschar smallbuf[sizeof(r)];
1085 /* OpenSSL auto-seeds from /dev/random, etc, but this a double-check. */
1089 gettimeofday(&r.tv, NULL);
1092 RAND_seed((uschar *)(&r), sizeof(r));
1094 /* We're after pseudo-random, not random; if we still don't have enough data
1095 in the internal PRNG then our options are limited. We could sleep and hope
1096 for entropy to come along (prayer technique) but if the system is so depleted
1097 in the first place then something is likely to just keep taking it. Instead,
1098 we'll just take whatever little bit of pseudo-random we can still manage to
1101 needed_len = sizeof(r);
1102 /* Don't take 8 times more entropy than needed if int is 8 octets and we were
1103 asked for a number less than 10. */
1104 for (r = max, i = 0; r; ++i)
1110 /* We do not care if crypto-strong */
1111 (void) RAND_pseudo_bytes(smallbuf, needed_len);
1113 for (p = smallbuf; needed_len; --needed_len, ++p)
1119 /* We don't particularly care about weighted results; if someone wants
1120 smooth distribution and cares enough then they should submit a patch then. */
1124 /* End of tls-openssl.c */