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"
386static char CLIENT_CIPHER_LIST_TLSv13[] =
388#include "lib/tls/ciphers_v13.inc"
399tor_tls_cert_matches_key,(
const tor_tls_t *tls,
const tor_x509_cert_t *cert))
405 X509 *peercert = peer->cert;
406 EVP_PKEY *link_key = NULL, *cert_key = NULL;
409 link_key = X509_get_pubkey(peercert);
410 cert_key = X509_get_pubkey(cert->cert);
412 result = link_key && cert_key && EVP_PKEY_cmp(cert_key, link_key) == 1;
414 tor_x509_cert_free(peer);
416 EVP_PKEY_free(link_key);
418 EVP_PKEY_free(cert_key);
424tor_tls_context_impl_free_(
struct ssl_ctx_st *ctx)
432#define NID_tor_default_ecdhe_group NID_X9_62_prime256v1
440 unsigned flags,
int is_client)
442 EVP_PKEY *pkey = NULL;
458 if (!(result->ctx = SSL_CTX_new(TLS_method())))
460 if (!SSL_CTX_set_min_proto_version(result->ctx, TLS1_2_VERSION))
463#ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL
465 SSL_CTX_set_security_level(result->ctx, 1);
470 SSL_CTX_set_options(result->ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);
482#ifdef SSL_OP_NO_TICKET
484 SSL_CTX_set_options(result->ctx, SSL_OP_NO_TICKET);
488 SSL_CTX_set_options(result->ctx, SSL_OP_SINGLE_DH_USE);
489 SSL_CTX_set_options(result->ctx, SSL_OP_SINGLE_ECDH_USE);
491#ifdef SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
492 SSL_CTX_set_options(result->ctx,
493 SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
495#ifdef SSL_OP_NO_RENEGOTIATION
496 SSL_CTX_set_options(result->ctx, SSL_OP_NO_RENEGOTIATION);
498#ifdef SSL_OP_NO_CLIENT_RENEGOTIATION
499 SSL_CTX_set_options(result->ctx, SSL_OP_NO_CLIENT_RENEGOTIATION);
505#ifdef SSL_OP_NO_COMPRESSION
506 SSL_CTX_set_options(result->ctx, SSL_OP_NO_COMPRESSION);
509#ifdef SSL_MODE_RELEASE_BUFFERS
510 SSL_CTX_set_mode(result->ctx, SSL_MODE_RELEASE_BUFFERS);
513 if (result->my_link_cert &&
514 !SSL_CTX_use_certificate(result->ctx,
515 result->my_link_cert->cert)) {
523 SSL_CTX_set_session_cache_mode(result->ctx, SSL_SESS_CACHE_OFF);
526 if (!(pkey = crypto_pk_get_openssl_evp_pkey_(result->link_key,1)))
528 if (!SSL_CTX_use_PrivateKey(result->ctx, pkey))
532 if (!SSL_CTX_check_private_key(result->ctx))
539 SSL_CTX_set_tmp_dh(result->ctx, dh);
552 static const struct {
570 OPENSSL_V_SERIES(3,5,0),
571 "?*X25519MLKEM768 / ?SecP256r1MLKEM768:?X25519 / *P-256:P-224"
573 { 0,
"P-256:X25519:P-224" },
574 { 0,
"P-256:P-224" },
576 bool success =
false;
577 long our_version = tor_OpenSSL_version_num();
578 for (
unsigned j = 0; j <
ARRAY_LENGTH(group_lists); ++j) {
579 const char *list = group_lists[j].groups;
580 if (group_lists[j].min_version > our_version) {
581 log_info(
LD_NET,
"Not trying groups %s because of OpenSSL version.",
585 int r = (int) SSL_CTX_set1_groups_list(result->ctx, list);
587 static bool have_logged_already =
false;
588 if (!have_logged_already) {
590 log_notice(
LD_NET,
"Set list of supported TLS groups to: %s", list);
591 have_logged_already =
true;
596 log_info(
LD_NET,
"Group list %s wasn't accepted", list);
599 log_warn(
LD_NET,
"No lists of TLS groups were supported. "
600 "Using library defaults");
605 SSL_CTX_set_verify(result->ctx, SSL_VERIFY_PEER,
606 always_accept_verify_cb);
609 SSL_CTX_set_verify(result->ctx, SSL_VERIFY_NONE, NULL);
612 SSL_CTX_set_mode(result->ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
614#ifdef SSL_OP_TLSEXT_PADDING
617 SSL_CTX_set_options(result->ctx, SSL_OP_TLSEXT_PADDING);
632tor_tls_debug_state_callback(
const SSL *ssl,
int type,
int val)
635 log_debug(
LD_HANDSHAKE,
"SSL %p is now in state %s [type=%d,val=%d].",
636 ssl, SSL_state_string_long(ssl), type, val);
649 result->magic = TOR_TLS_MAGIC;
651 check_no_tls_errors();
653 if (!(result->
ssl = SSL_new(context->ctx))) {
659#ifdef SSL_set_tlsext_host_name
663 SSL_set_tlsext_host_name(result->
ssl, fake_hostname);
668#ifdef SSL_CTRL_SET_MAX_PROTO_VERSION
669 if (openssl_bug_7712_is_present) {
671 SSL_set_max_proto_version(result->
ssl, TLS1_2_VERSION);
677 size_t TLSv13len = strlen(CLIENT_CIPHER_LIST_TLSv13);
678 if (TLSv13len && CLIENT_CIPHER_LIST_TLSv13[TLSv13len - 1] ==
':') {
679 CLIENT_CIPHER_LIST_TLSv13[TLSv13len - 1] =
'\0';
682 const bool tls12_ciphers_ok = SSL_set_cipher_list(
684 isServer ? UNRESTRICTED_TLS1_2_SERVER_CIPHER_LIST : CLIENT_CIPHER_LIST);
686 bool tls13_ciphers_ok =
true;
687#ifdef HAVE_SSL_SET_CIPHERSUITES
690 SSL_set_ciphersuites(result->
ssl, CLIENT_CIPHER_LIST_TLSv13);
694 if (!tls12_ciphers_ok || !tls13_ciphers_ok) {
696#ifdef SSL_set_tlsext_host_name
697 SSL_set_tlsext_host_name(result->
ssl, NULL);
699 SSL_free(result->
ssl);
705 bio = BIO_new_socket(sock, BIO_CLOSE);
708#ifdef SSL_set_tlsext_host_name
709 SSL_set_tlsext_host_name(result->
ssl, NULL);
711 SSL_free(result->
ssl);
717 SSL_set_ex_data(result->
ssl, tor_tls_object_ex_data_index, result);
720 "Couldn't set the tls for an SSL*; connection will fail");
723 SSL_set_bio(result->
ssl, bio, bio);
725 result->context = context;
726 result->
state = TOR_TLS_ST_HANDSHAKE;
728 result->wantwrite_n = 0;
729 result->last_write_count = (
unsigned long) BIO_number_written(bio);
730 result->last_read_count = (
unsigned long) BIO_number_read(bio);
731 if (result->last_write_count || result->last_read_count) {
732 log_warn(
LD_NET,
"Newly created BIO has read count %lu, write count %lu",
733 result->last_read_count, result->last_write_count);
736 SSL_set_info_callback(result->
ssl, tor_tls_debug_state_callback);
758 rbio = SSL_get_rbio(tls->
ssl);
759 wbio = SSL_get_wbio(tls->
ssl);
762 (void) BIO_set_close(rbio, BIO_NOCLOSE);
764 if (wbio && wbio != rbio) {
765 (void) BIO_set_close(wbio, BIO_NOCLOSE);
770tor_tls_impl_free_(tor_tls_impl_t *ssl)
775#ifdef SSL_set_tlsext_host_name
776 SSL_set_tlsext_host_name(ssl, NULL);
787tor_tls_read,(
tor_tls_t *tls,
char *cp,
size_t len))
794 r = SSL_read(tls->
ssl, cp, (
int)len);
798 err = tor_tls_get_error(tls, r, CATCH_ZERO,
"reading",
LOG_DEBUG,
LD_NET);
799 if (err == TOR_TLS_ZERORETURN_ || err == TOR_TLS_CLOSE) {
800 log_debug(
LD_NET,
"read returned r=%d; TLS is closed",r);
801 tls->
state = TOR_TLS_ST_CLOSED;
802 return TOR_TLS_CLOSE;
805 log_debug(
LD_NET,
"read returned r=%d, err=%d",r,err);
812STATIC uint64_t total_bytes_written_over_tls = 0;
815STATIC uint64_t total_bytes_written_by_tls = 0;
832 if (tls->wantwrite_n) {
835 log_debug(
LD_NET,
"resuming pending-write, (%d to flush, reusing %d)",
836 (
int)n, (
int)tls->wantwrite_n);
837 n = tls->wantwrite_n;
838 tls->wantwrite_n = 0;
840 r = SSL_write(tls->
ssl, cp, (
int)n);
842 if (err == TOR_TLS_DONE) {
843 total_bytes_written_over_tls += r;
846 if (err == TOR_TLS_WANTWRITE || err == TOR_TLS_WANTREAD) {
847 tls->wantwrite_n = n;
864 check_no_tls_errors();
866 OSSL_HANDSHAKE_STATE oldstate = SSL_get_state(tls->
ssl);
869 log_debug(
LD_HANDSHAKE,
"About to call SSL_accept on %p (%s)", tls,
870 SSL_state_string_long(tls->
ssl));
871 r = SSL_accept(tls->
ssl);
873 log_debug(
LD_HANDSHAKE,
"About to call SSL_connect on %p (%s)", tls,
874 SSL_state_string_long(tls->
ssl));
875 r = SSL_connect(tls->
ssl);
878 OSSL_HANDSHAKE_STATE newstate = SSL_get_state(tls->
ssl);
880 if (oldstate != newstate)
881 log_debug(
LD_HANDSHAKE,
"After call, %p was in state %s",
882 tls, SSL_state_string_long(tls->
ssl));
885 if (ERR_peek_error() != 0) {
888 return TOR_TLS_ERROR_MISC;
890 if (r == TOR_TLS_DONE) {
891 tls->
state = TOR_TLS_ST_OPEN;
902 cert = SSL_get_peer_certificate(tls->
ssl);
916 cert = SSL_get_peer_certificate(tls->
ssl);
920 return tor_x509_cert_new(cert);
928 X509 *cert = SSL_get_certificate(tls->
ssl);
930 "getting own-connection certificate");
935 X509 *duplicate = X509_dup(cert);
936 if (BUG(duplicate == NULL))
938 return tor_x509_cert_new(duplicate);
947 return SSL_pending(tls->
ssl);
955 return tls->wantwrite_n;
966 r = (
unsigned long) BIO_number_read(SSL_get_rbio(tls->
ssl));
974 wbio = SSL_get_wbio(tls->
ssl);
975 if (BIO_method_type(wbio) == BIO_TYPE_BUFFER &&
976 (tmpbio = BIO_next(wbio)) != NULL)
978 w = (
unsigned long) BIO_number_written(wbio);
985 *n_read = (size_t)(r - tls->last_read_count);
986 *n_written = (size_t)(w - tls->last_write_count);
987 if (*n_read > INT_MAX || *n_written > INT_MAX) {
988 log_warn(
LD_BUG,
"Preposterously large value in tor_tls_get_n_raw_bytes. "
989 "r=%lu, last_read=%lu, w=%lu, last_written=%lu",
990 r, tls->last_read_count, w, tls->last_write_count);
992 total_bytes_written_by_tls += *n_written;
993 tls->last_read_count = r;
994 tls->last_write_count = w;
1000tls_get_write_overhead_ratio,(
void))
1002 if (total_bytes_written_over_tls == 0)
1005 return ((
double)total_bytes_written_by_tls) /
1006 ((double)total_bytes_written_over_tls);
1012check_no_tls_errors_(
const char *fname,
int line)
1014 if (ERR_peek_error() == 0)
1016 log_warn(
LD_CRYPTO,
"Unhandled OpenSSL errors found at %s:%d: ",
1017 tor_fix_source_file(fname), line);
1029tor_tls_export_key_material,(
tor_tls_t *tls, uint8_t *secrets_out,
1030 const uint8_t *context,
1037 int r = SSL_export_keying_material(tls->
ssl,
1039 label, strlen(label),
1040 context, context_len, 1);
1047#ifdef TLS1_3_VERSION
1049 strlen(label) > 12 &&
1050 SSL_version(tls->
ssl) >= TLS1_3_VERSION) {
1052 if (! openssl_bug_7712_is_present) {
1057 "short", 5, context, context_len, 1);
1061 openssl_bug_7712_is_present = 1;
1062 log_warn(
LD_GENERAL,
"Detected OpenSSL bug 7712: disabling TLS 1.3 on "
1063 "future connections.");
1066 if (openssl_bug_7712_is_present)
1073 return (r == 1) ? 0 : -1;
1085 size_t *rbuf_capacity,
size_t *rbuf_bytes,
1086 size_t *wbuf_capacity,
size_t *wbuf_bytes)
1089 (void)rbuf_capacity;
1091 (void)wbuf_capacity;
1108 nid = NID_tor_default_ecdhe_group;
1109 else if (!strcasecmp(ecgroup,
"P256"))
1110 nid = NID_X9_62_prime256v1;
1111 else if (!strcasecmp(ecgroup,
"P224"))
1112 nid = NID_secp224r1;
1116 ec_key = EC_KEY_new_by_curve_name(nid);
1117 ret = (ec_key != NULL);
1118 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 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)
void tor_tls_get_state_description(tor_tls_t *tls, char *buf, size_t sz)
void tor_tls_release_socket(tor_tls_t *tls)
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)