summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2010-10-12 14:45:15 -0400
committerNick Mathewson <nickm@torproject.org>2010-10-12 14:52:33 -0400
commitfbacbf9fd92a7f10a86a314b20d34f609fb1e72f (patch)
treede07a47f196592c5c9756405d095944a505226ec
parenta9172c87beaf94119b0c0dc280267d9c76b957b7 (diff)
downloadtor-fbacbf9fd92a7f10a86a314b20d34f609fb1e72f.tar.gz
tor-fbacbf9fd92a7f10a86a314b20d34f609fb1e72f.zip
Set OpenSSL 0.9.8l renegotiation flag early enough for bufferevents
This seems to fix another case of bug2001.
-rw-r--r--src/common/tortls.c20
-rw-r--r--src/common/tortls.h1
2 files changed, 21 insertions, 0 deletions
diff --git a/src/common/tortls.c b/src/common/tortls.c
index d560cbf940..40a7c5e9f3 100644
--- a/src/common/tortls.c
+++ b/src/common/tortls.c
@@ -863,6 +863,10 @@ tor_tls_server_info_callback(const SSL *ssl, int type, int val)
if (tls) {
tls->wasV2Handshake = 1;
+#ifdef USE_BUFFEREVENTS
+ if (use_unsafe_renegotiation_flag)
+ tls->ssl->s3->flags |= SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
+#endif
} else {
log_warn(LD_BUG, "Couldn't look up the tls for an SSL*. How odd!");
}
@@ -1071,6 +1075,18 @@ tor_tls_block_renegotiation(tor_tls_t *tls)
tls->ssl->s3->flags &= ~SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
}
+void
+tor_tls_assert_renegotiation_unblocked(tor_tls_t *tls)
+{
+ if (use_unsafe_renegotiation_flag) {
+ tor_assert(0 != (tls->ssl->s3->flags & SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION));
+ }
+ if (use_unsafe_renegotiation_op) {
+ long options = SSL_get_options(tls->ssl);
+ tor_assert(0 != (options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION));
+ }
+}
+
/** Return whether this tls initiated the connect (client) or
* received it (server). */
int
@@ -1752,6 +1768,10 @@ tor_tls_init_bufferevent(tor_tls_t *tls, struct bufferevent *bufev_in,
state,
BEV_OPT_DEFER_CALLBACKS);
#endif
+ /* Unblock _after_ creating the bufferevent, since accept/connect tend to
+ * clear flags. */
+ tor_tls_unblock_renegotiation(tls);
+
return out;
}
#endif
diff --git a/src/common/tortls.h b/src/common/tortls.h
index 950d430788..c1de456611 100644
--- a/src/common/tortls.h
+++ b/src/common/tortls.h
@@ -68,6 +68,7 @@ int tor_tls_finish_handshake(tor_tls_t *tls);
int tor_tls_renegotiate(tor_tls_t *tls);
void tor_tls_unblock_renegotiation(tor_tls_t *tls);
void tor_tls_block_renegotiation(tor_tls_t *tls);
+void tor_tls_assert_renegotiation_unblocked(tor_tls_t *tls);
int tor_tls_shutdown(tor_tls_t *tls);
int tor_tls_get_pending_bytes(tor_tls_t *tls);
size_t tor_tls_get_forced_write_size(tor_tls_t *tls);