20#define TORTLS_OPENSSL_PRIVATE
21#define TOR_X509_PRIVATE
34#include "lib/crypt_ops/compat_openssl.h"
36#include "lib/tls/x509_internal.h"
40DISABLE_GCC_WARNING(
"-Wredundant-decls")
42#include <openssl/opensslv.h>
45#error "We require OpenSSL with ECC support"
48#include <openssl/ssl.h>
49#include <openssl/ssl3.h>
50#include <openssl/err.h>
51#include <openssl/tls1.h>
52#include <openssl/asn1.h>
53#include <openssl/bio.h>
54#include <openssl/bn.h>
55#include <openssl/rsa.h>
57ENABLE_GCC_WARNING(
"-Wredundant-decls")
59#include "lib/tls/tortls.h"
78#define LEGAL_NICKNAME_CHARACTERS \
79 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
81#define ADDR(tls) (((tls) && (tls)->address) ? tls->address : "peer")
84static int openssl_bug_7712_is_present = 0;
88STATIC int tor_tls_object_ex_data_index = -1;
92tor_tls_allocate_tor_tls_object_ex_data_index(
void)
94 if (tor_tls_object_ex_data_index == -1) {
95 tor_tls_object_ex_data_index =
96 SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);
97 tor_assert(tor_tls_object_ex_data_index != -1);
104tor_tls_get_by_ssl(
const SSL *ssl)
106 tor_tls_t *result = SSL_get_ex_data(ssl, tor_tls_object_ex_data_index);
113static int tls_library_is_initialized = 0;
116#define TOR_TLS_SYSCALL_ (MIN_TOR_TLS_ERROR_VAL_ - 2)
117#define TOR_TLS_ZERORETURN_ (MIN_TOR_TLS_ERROR_VAL_ - 1)
124 const char *ssl_state;
125 const char *tortls_state;
127 if (PREDICT_UNLIKELY(!tls || !tls->
ssl)) {
128 strlcpy(buf,
"(No SSL object)", sz);
132 ssl_state = SSL_state_string_long(tls->
ssl);
133 switch (tls->
state) {
134#define CASE(st) case TOR_TLS_ST_##st: tortls_state = " in "#st ; break
142 case TOR_TLS_ST_BUFFEREVENT:
146 tortls_state =
" in unknown TLS state";
157tor_tls_log_one_error(
tor_tls_t *tls,
unsigned long err,
158 int severity,
int domain,
const char *doing)
160 const char *state = NULL, *addr;
161 const char *msg, *lib, *func;
163 state = (tls && tls->
ssl)?SSL_state_string_long(tls->
ssl):
"---";
165 addr = tls ? tls->
address : NULL;
170 switch (ERR_GET_REASON(err)) {
171 case SSL_R_HTTP_REQUEST:
172 case SSL_R_HTTPS_PROXY_REQUEST:
173 case SSL_R_RECORD_LENGTH_MISMATCH:
174 case SSL_R_UNKNOWN_PROTOCOL:
175 case SSL_R_UNSUPPORTED_PROTOCOL:
182 msg = (
const char*)ERR_reason_error_string(err);
183 lib = (
const char*)ERR_lib_error_string(err);
184 func = (
const char*)ERR_func_error_string(err);
185 if (!msg) msg =
"(null)";
186 if (!lib) lib =
"(null)";
187 if (!func) func =
"(null)";
189 tor_log(severity, domain,
"TLS error while %s%s%s: %s (in %s:%s:%s)",
190 doing, addr?
" with ":
"", addr?addr:
"",
191 msg, lib, func, state);
193 tor_log(severity, domain,
"TLS error%s%s: %s (in %s:%s:%s)",
194 addr?
" with ":
"", addr?addr:
"",
195 msg, lib, func, state);
207 while ((err = ERR_get_error()) != 0) {
209 tls->last_error = err;
210 tor_tls_log_one_error(tls, err, severity, domain, doing);
226 if (tls->last_error == 0) {
229 return (
const char*)ERR_reason_error_string(tls->last_error);
232#define CATCH_SYSCALL 1
246tor_tls_get_error(
tor_tls_t *tls,
int r,
int extra,
247 const char *doing,
int severity,
int domain)
249 int err = SSL_get_error(tls->
ssl, r);
250 int tor_error = TOR_TLS_ERROR_MISC;
254 case SSL_ERROR_WANT_READ:
255 return TOR_TLS_WANTREAD;
256 case SSL_ERROR_WANT_WRITE:
257 return TOR_TLS_WANTWRITE;
258 case SSL_ERROR_SYSCALL:
259 if (extra&CATCH_SYSCALL)
260 return TOR_TLS_SYSCALL_;
262 tor_log(severity,
LD_NET,
"TLS error: unexpected close while %s (%s)",
263 doing, SSL_state_string_long(tls->
ssl));
264 tor_error = TOR_TLS_ERROR_IO;
266 int e = tor_socket_errno(tls->
socket);
268 "TLS error: <syscall error while %s> (errno=%d: %s; state=%s)",
269 doing, e, tor_socket_strerror(e),
270 SSL_state_string_long(tls->
ssl));
275 case SSL_ERROR_ZERO_RETURN:
276 if (extra&CATCH_ZERO)
277 return TOR_TLS_ZERORETURN_;
278 tor_log(severity,
LD_NET,
"TLS connection closed while %s in state %s",
279 doing, SSL_state_string_long(tls->
ssl));
281 return TOR_TLS_CLOSE;
284 return TOR_TLS_ERROR_MISC;
293 check_no_tls_errors();
295 if (!tls_library_is_initialized) {
296 OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS, NULL);
298 tor_tls_allocate_tor_tls_object_ex_data_index();
300 tls_library_is_initialized = 1;
309always_accept_verify_cb(
int preverify_ok,
310 X509_STORE_CTX *x509_ctx)
318static const char UNRESTRICTED_TLS1_2_SERVER_CIPHER_LIST[] =
321#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384
322 TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384
":"
324#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256
325 TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256
":"
327#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384
328 TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384
":"
330#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256
331 TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256
":"
333#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA
334 TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA
":"
336#ifdef TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA
337 TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA
":"
339#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384
340 TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384
":"
342#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256
343 TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256
":"
345#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_CCM
346 TLS1_TXT_DHE_RSA_WITH_AES_256_CCM
":"
348#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_CCM
349 TLS1_TXT_DHE_RSA_WITH_AES_128_CCM
":"
351#ifdef TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256
352 TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256
":"
354#ifdef TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256
355 TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256
":"
358 TLS1_TXT_DHE_RSA_WITH_AES_256_SHA
":"
360 TLS1_TXT_DHE_RSA_WITH_AES_128_SHA
":"
361#ifdef TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305
362 TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305
":"
364#ifdef TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305
365 TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305
374#define CIPHER(id, name) name ":"
375#define XCIPHER(id, name)
378static const char CLIENT_CIPHER_LIST[] =
380#include "lib/tls/ciphers.inc"
393tor_tls_cert_matches_key,(
const tor_tls_t *tls,
const tor_x509_cert_t *cert))
399 X509 *peercert = peer->cert;
400 EVP_PKEY *link_key = NULL, *cert_key = NULL;
403 link_key = X509_get_pubkey(peercert);
404 cert_key = X509_get_pubkey(cert->cert);
406 result = link_key && cert_key && EVP_PKEY_cmp(cert_key, link_key) == 1;
408 tor_x509_cert_free(peer);
410 EVP_PKEY_free(link_key);
412 EVP_PKEY_free(cert_key);
418tor_tls_context_impl_free_(
struct ssl_ctx_st *ctx)
426#define NID_tor_default_ecdhe_group NID_X9_62_prime256v1
434 unsigned flags,
int is_client)
436 EVP_PKEY *pkey = NULL;
452 if (!(result->ctx = SSL_CTX_new(TLS_method())))
454 if (!SSL_CTX_set_min_proto_version(result->ctx, TLS1_2_VERSION))
457#ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL
459 SSL_CTX_set_security_level(result->ctx, 1);
464 SSL_CTX_set_options(result->ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);
476#ifdef SSL_OP_NO_TICKET
478 SSL_CTX_set_options(result->ctx, SSL_OP_NO_TICKET);
482 SSL_CTX_set_options(result->ctx, SSL_OP_SINGLE_DH_USE);
483 SSL_CTX_set_options(result->ctx, SSL_OP_SINGLE_ECDH_USE);
485#ifdef SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
486 SSL_CTX_set_options(result->ctx,
487 SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
489#ifdef SSL_OP_NO_RENEGOTIATION
490 SSL_CTX_set_options(result->ctx, SSL_OP_NO_RENEGOTIATION);
492#ifdef SSL_OP_NO_CLIENT_RENEGOTIATION
493 SSL_CTX_set_options(result->ctx, SSL_OP_NO_CLIENT_RENEGOTIATION);
499#ifdef SSL_OP_NO_COMPRESSION
500 SSL_CTX_set_options(result->ctx, SSL_OP_NO_COMPRESSION);
503#ifdef SSL_MODE_RELEASE_BUFFERS
504 SSL_CTX_set_mode(result->ctx, SSL_MODE_RELEASE_BUFFERS);
507 if (result->my_link_cert &&
508 !SSL_CTX_use_certificate(result->ctx,
509 result->my_link_cert->cert)) {
517 SSL_CTX_set_session_cache_mode(result->ctx, SSL_SESS_CACHE_OFF);
520 if (!(pkey = crypto_pk_get_openssl_evp_pkey_(result->link_key,1)))
522 if (!SSL_CTX_use_PrivateKey(result->ctx, pkey))
526 if (!SSL_CTX_check_private_key(result->ctx))
533 SSL_CTX_set_tmp_dh(result->ctx, dh);
546 static const struct {
564 OPENSSL_V_SERIES(3,5,0),
565 "?*X25519MLKEM768 / ?SecP256r1MLKEM768:?X25519 / *P-256:P-224"
567 { 0,
"P-256:X25519:P-224" },
568 { 0,
"P-256:P-224" },
570 bool success =
false;
571 long our_version = tor_OpenSSL_version_num();
572 for (
unsigned j = 0; j <
ARRAY_LENGTH(group_lists); ++j) {
573 const char *list = group_lists[j].groups;
574 if (group_lists[j].min_version > our_version) {
575 log_info(
LD_NET,
"Not trying groups %s because of OpenSSL version.",
579 int r = (int) SSL_CTX_set1_groups_list(result->ctx, list);
581 log_notice(
LD_NET,
"Set list of supported TLS groups to: %s", list);
585 log_info(
LD_NET,
"Group list %s wasn't accepted", list);
588 log_warn(
LD_NET,
"No lists of TLS groups were supported. "
589 "Using library defaults");
594 SSL_CTX_set_verify(result->ctx, SSL_VERIFY_PEER,
595 always_accept_verify_cb);
598 SSL_CTX_set_verify(result->ctx, SSL_VERIFY_NONE, NULL);
601 SSL_CTX_set_mode(result->ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
603#ifdef SSL_OP_TLSEXT_PADDING
606 SSL_CTX_set_options(result->ctx, SSL_OP_TLSEXT_PADDING);
621tor_tls_debug_state_callback(
const SSL *ssl,
int type,
int val)
624 log_debug(
LD_HANDSHAKE,
"SSL %p is now in state %s [type=%d,val=%d].",
625 ssl, SSL_state_string_long(ssl), type, val);
638 result->magic = TOR_TLS_MAGIC;
640 check_no_tls_errors();
642 if (!(result->
ssl = SSL_new(context->ctx))) {
648#ifdef SSL_set_tlsext_host_name
652 SSL_set_tlsext_host_name(result->
ssl, fake_hostname);
657#ifdef SSL_CTRL_SET_MAX_PROTO_VERSION
658 if (openssl_bug_7712_is_present) {
660 SSL_set_max_proto_version(result->
ssl, TLS1_2_VERSION);
664 if (!SSL_set_cipher_list(result->
ssl,
665 isServer ? UNRESTRICTED_TLS1_2_SERVER_CIPHER_LIST
666 : CLIENT_CIPHER_LIST)) {
668#ifdef SSL_set_tlsext_host_name
669 SSL_set_tlsext_host_name(result->
ssl, NULL);
671 SSL_free(result->
ssl);
677 bio = BIO_new_socket(sock, BIO_CLOSE);
680#ifdef SSL_set_tlsext_host_name
681 SSL_set_tlsext_host_name(result->
ssl, NULL);
683 SSL_free(result->
ssl);
689 SSL_set_ex_data(result->
ssl, tor_tls_object_ex_data_index, result);
692 "Couldn't set the tls for an SSL*; connection will fail");
695 SSL_set_bio(result->
ssl, bio, bio);
697 result->context = context;
698 result->
state = TOR_TLS_ST_HANDSHAKE;
700 result->wantwrite_n = 0;
701 result->last_write_count = (
unsigned long) BIO_number_written(bio);
702 result->last_read_count = (
unsigned long) BIO_number_read(bio);
703 if (result->last_write_count || result->last_read_count) {
704 log_warn(
LD_NET,
"Newly created BIO has read count %lu, write count %lu",
705 result->last_read_count, result->last_write_count);
708 SSL_set_info_callback(result->
ssl, tor_tls_debug_state_callback);
730 rbio = SSL_get_rbio(tls->
ssl);
731 wbio = SSL_get_wbio(tls->
ssl);
734 (void) BIO_set_close(rbio, BIO_NOCLOSE);
736 if (wbio && wbio != rbio) {
737 (void) BIO_set_close(wbio, BIO_NOCLOSE);
742tor_tls_impl_free_(tor_tls_impl_t *ssl)
747#ifdef SSL_set_tlsext_host_name
748 SSL_set_tlsext_host_name(ssl, NULL);
766 r = SSL_read(tls->
ssl, cp, (
int)len);
770 err = tor_tls_get_error(tls, r, CATCH_ZERO,
"reading",
LOG_DEBUG,
LD_NET);
771 if (err == TOR_TLS_ZERORETURN_ || err == TOR_TLS_CLOSE) {
772 log_debug(
LD_NET,
"read returned r=%d; TLS is closed",r);
773 tls->
state = TOR_TLS_ST_CLOSED;
774 return TOR_TLS_CLOSE;
777 log_debug(
LD_NET,
"read returned r=%d, err=%d",r,err);
784STATIC uint64_t total_bytes_written_over_tls = 0;
787STATIC uint64_t total_bytes_written_by_tls = 0;
804 if (tls->wantwrite_n) {
807 log_debug(
LD_NET,
"resuming pending-write, (%d to flush, reusing %d)",
808 (
int)n, (
int)tls->wantwrite_n);
809 n = tls->wantwrite_n;
810 tls->wantwrite_n = 0;
812 r = SSL_write(tls->
ssl, cp, (
int)n);
814 if (err == TOR_TLS_DONE) {
815 total_bytes_written_over_tls += r;
818 if (err == TOR_TLS_WANTWRITE || err == TOR_TLS_WANTREAD) {
819 tls->wantwrite_n = n;
836 check_no_tls_errors();
838 OSSL_HANDSHAKE_STATE oldstate = SSL_get_state(tls->
ssl);
841 log_debug(
LD_HANDSHAKE,
"About to call SSL_accept on %p (%s)", tls,
842 SSL_state_string_long(tls->
ssl));
843 r = SSL_accept(tls->
ssl);
845 log_debug(
LD_HANDSHAKE,
"About to call SSL_connect on %p (%s)", tls,
846 SSL_state_string_long(tls->
ssl));
847 r = SSL_connect(tls->
ssl);
850 OSSL_HANDSHAKE_STATE newstate = SSL_get_state(tls->
ssl);
852 if (oldstate != newstate)
853 log_debug(
LD_HANDSHAKE,
"After call, %p was in state %s",
854 tls, SSL_state_string_long(tls->
ssl));
857 if (ERR_peek_error() != 0) {
860 return TOR_TLS_ERROR_MISC;
862 if (r == TOR_TLS_DONE) {
863 tls->
state = TOR_TLS_ST_OPEN;
874 cert = SSL_get_peer_certificate(tls->
ssl);
888 cert = SSL_get_peer_certificate(tls->
ssl);
892 return tor_x509_cert_new(cert);
900 X509 *cert = SSL_get_certificate(tls->
ssl);
902 "getting own-connection certificate");
907 X509 *duplicate = X509_dup(cert);
908 if (BUG(duplicate == NULL))
910 return tor_x509_cert_new(duplicate);
919 return SSL_pending(tls->
ssl);
927 return tls->wantwrite_n;
938 r = (
unsigned long) BIO_number_read(SSL_get_rbio(tls->
ssl));
946 wbio = SSL_get_wbio(tls->
ssl);
947 if (BIO_method_type(wbio) == BIO_TYPE_BUFFER &&
948 (tmpbio = BIO_next(wbio)) != NULL)
950 w = (
unsigned long) BIO_number_written(wbio);
957 *n_read = (size_t)(r - tls->last_read_count);
958 *n_written = (size_t)(w - tls->last_write_count);
959 if (*n_read > INT_MAX || *n_written > INT_MAX) {
960 log_warn(
LD_BUG,
"Preposterously large value in tor_tls_get_n_raw_bytes. "
961 "r=%lu, last_read=%lu, w=%lu, last_written=%lu",
962 r, tls->last_read_count, w, tls->last_write_count);
964 total_bytes_written_by_tls += *n_written;
965 tls->last_read_count = r;
966 tls->last_write_count = w;
974 if (total_bytes_written_over_tls == 0)
977 return ((
double)total_bytes_written_by_tls) /
978 ((double)total_bytes_written_over_tls);
984check_no_tls_errors_(
const char *fname,
int line)
986 if (ERR_peek_error() == 0)
988 log_warn(
LD_CRYPTO,
"Unhandled OpenSSL errors found at %s:%d: ",
989 tor_fix_source_file(fname), line);
1002 const uint8_t *context,
1009 int r = SSL_export_keying_material(tls->
ssl,
1011 label, strlen(label),
1012 context, context_len, 1);
1019#ifdef TLS1_3_VERSION
1021 strlen(label) > 12 &&
1022 SSL_version(tls->
ssl) >= TLS1_3_VERSION) {
1024 if (! openssl_bug_7712_is_present) {
1029 "short", 5, context, context_len, 1);
1033 openssl_bug_7712_is_present = 1;
1034 log_warn(
LD_GENERAL,
"Detected OpenSSL bug 7712: disabling TLS 1.3 on "
1035 "future connections.");
1038 if (openssl_bug_7712_is_present)
1045 return (r == 1) ? 0 : -1;
1057 size_t *rbuf_capacity,
size_t *rbuf_bytes,
1058 size_t *wbuf_capacity,
size_t *wbuf_bytes)
1061 (void)rbuf_capacity;
1063 (void)wbuf_capacity;
1080 nid = NID_tor_default_ecdhe_group;
1081 else if (!strcasecmp(ecgroup,
"P256"))
1082 nid = NID_X9_62_prime256v1;
1083 else if (!strcasecmp(ecgroup,
"P224"))
1084 nid = NID_secp224r1;
1088 ec_key = EC_KEY_new_by_curve_name(nid);
1089 ret = (ec_key != NULL);
1090 EC_KEY_free(ec_key);
Inline functions for reading and writing multibyte values from the middle of strings,...
Macro definitions for MIN, MAX, and CLAMP.
Header for compat_string.c.
Headers for crypto_cipher.c.
struct dh_st * crypto_dh_new_openssl_tls(void)
char * crypto_random_hostname(int min_rand_len, int max_rand_len, const char *prefix, const char *suffix)
Common functions for using (pseudo-)random number generators.
Common functions for cryptographic routines.
void tor_log(int severity, log_domain_mask_t domain, const char *format,...)
int tor_snprintf(char *str, size_t size, const char *format,...)
tor_tls_state_bitfield_t state
#define MOCK_IMPL(rv, funcname, arglist)
void tor_tls_context_incref(tor_tls_context_t *ctx)
tor_tls_context_t * tor_tls_context_get(int is_server)
void tor_tls_context_decref(tor_tls_context_t *ctx)
int tor_errno_to_tls_error(int e)
int tor_tls_context_init_certificates(tor_tls_context_t *result, crypto_pk_t *identity, unsigned key_lifetime, unsigned flags)
int tor_tls_peer_has_cert(tor_tls_t *tls)
void tor_tls_get_n_raw_bytes(tor_tls_t *tls, size_t *n_read, size_t *n_written)
int tor_tls_read(tor_tls_t *tls, char *cp, size_t len)
double tls_get_write_overhead_ratio(void)
int evaluate_ecgroup_for_tls(const char *ecgroup)
int tor_tls_write(tor_tls_t *tls, const char *cp, size_t n)
int tor_tls_get_buffer_sizes(tor_tls_t *tls, size_t *rbuf_capacity, size_t *rbuf_bytes, size_t *wbuf_capacity, size_t *wbuf_bytes)
struct tor_x509_cert_t * tor_tls_get_peer_cert(tor_tls_t *tls)
int tor_tls_get_pending_bytes(tor_tls_t *tls)
int tor_tls_handshake(tor_tls_t *tls)
tor_tls_t * tor_tls_new(tor_socket_t sock, int is_server)
const char * tor_tls_get_last_error_msg(const tor_tls_t *tls)
void tls_log_errors(tor_tls_t *tls, int severity, int domain, const char *doing)
struct tor_x509_cert_t * tor_tls_get_own_cert(tor_tls_t *tls)
void tor_tls_get_state_description(tor_tls_t *tls, char *buf, size_t sz)
void tor_tls_release_socket(tor_tls_t *tls)
int tor_tls_export_key_material(tor_tls_t *tls, uint8_t *secrets_out, const uint8_t *context, size_t context_len, const char *label)
size_t tor_tls_get_forced_write_size(tor_tls_t *tls)
Declare internal functions for lib/tls.
tor_tls_context_t * tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, unsigned flags, int is_client)
Structure declarations for internal TLS types.
Macros to manage assertions, fatal and non-fatal.
#define IF_BUG_ONCE(cond)