|
@@ -53,6 +53,24 @@
|
|
|
|
|
|
#define ADDR(tls) (((tls) && (tls)->address) ? tls->address : "peer")
|
|
#define ADDR(tls) (((tls) && (tls)->address) ? tls->address : "peer")
|
|
|
|
|
|
|
|
+
|
|
|
|
+ * a version of OpenSSL that does not match its header files. (Apple: I am
|
|
|
|
+ * looking at you.)
|
|
|
|
+ */
|
|
|
|
+#ifndef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION
|
|
|
|
+#define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x00040000L
|
|
|
|
+#endif
|
|
|
|
+#ifndef SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION
|
|
|
|
+#define SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x0010
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ * SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION? */
|
|
|
|
+static int use_unsafe_renegotiation_op = 0;
|
|
|
|
+
|
|
|
|
+ * SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION? */
|
|
|
|
+static int use_unsafe_renegotiation_flag = 0;
|
|
|
|
+
|
|
|
|
|
|
typedef struct tor_tls_context_t {
|
|
typedef struct tor_tls_context_t {
|
|
int refcnt;
|
|
int refcnt;
|
|
@@ -309,9 +327,29 @@ static void
|
|
tor_tls_init(void)
|
|
tor_tls_init(void)
|
|
{
|
|
{
|
|
if (!tls_library_is_initialized) {
|
|
if (!tls_library_is_initialized) {
|
|
|
|
+ long version;
|
|
SSL_library_init();
|
|
SSL_library_init();
|
|
SSL_load_error_strings();
|
|
SSL_load_error_strings();
|
|
crypto_global_init(-1);
|
|
crypto_global_init(-1);
|
|
|
|
+
|
|
|
|
+ version = SSLeay();
|
|
|
|
+ if (version >= 0x009070c0L && version < 0x00908000L) {
|
|
|
|
+ log_notice(LD_GENERAL, "OpenSSL %s looks like version 0.9.7l or later; "
|
|
|
|
+ "I will try SSL3_FLAGS and SSL3_OP to enable renegotation",
|
|
|
|
+ SSLeay_version(SSLEAY_VERSION));
|
|
|
|
+ use_unsafe_renegotiation_flag = 1;
|
|
|
|
+ use_unsafe_renegotiation_op = 1;
|
|
|
|
+ } else if (version >= 0x009080c0L) {
|
|
|
|
+ log_notice(LD_GENERAL, "OpenSSL %s looks like version 0.9.8l or later; "
|
|
|
|
+ "I will try SSL3_FLAGS and SSL_OP to enable renegotiation",
|
|
|
|
+ SSLeay_version(SSLEAY_VERSION));
|
|
|
|
+ use_unsafe_renegotiation_flag = 1;
|
|
|
|
+ use_unsafe_renegotiation_op = 1;
|
|
|
|
+ } else {
|
|
|
|
+ log_info(LD_GENERAL, "OpenSSL %s has version %lx",
|
|
|
|
+ SSLeay_version(SSLEAY_VERSION), version);
|
|
|
|
+ }
|
|
|
|
+
|
|
tls_library_is_initialized = 1;
|
|
tls_library_is_initialized = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -568,7 +606,6 @@ tor_tls_context_new(crypto_pk_env_t *identity, unsigned int key_lifetime)
|
|
SSL_CTX_set_options(result->ctx,
|
|
SSL_CTX_set_options(result->ctx,
|
|
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
|
|
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
|
|
#endif
|
|
#endif
|
|
-#ifdef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION
|
|
|
|
|
|
|
|
* as authenticating any earlier-received data.
|
|
* as authenticating any earlier-received data.
|
|
*
|
|
*
|
|
@@ -577,9 +614,10 @@ tor_tls_context_new(crypto_pk_env_t *identity, unsigned int key_lifetime)
|
|
* seems) broke anything that used SSL3_FLAGS_* for the purpose. So we need
|
|
* seems) broke anything that used SSL3_FLAGS_* for the purpose. So we need
|
|
* to do both.)
|
|
* to do both.)
|
|
*/
|
|
*/
|
|
- SSL_CTX_set_options(result->ctx,
|
|
+ if (use_unsafe_renegotiation_op) {
|
|
- SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION);
|
|
+ SSL_CTX_set_options(result->ctx,
|
|
-#endif
|
|
+ SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION);
|
|
|
|
+ }
|
|
|
|
|
|
* we transmit is all encrypted anyway. */
|
|
* we transmit is all encrypted anyway. */
|
|
if (result->ctx->comp_methods)
|
|
if (result->ctx->comp_methods)
|
|
@@ -920,19 +958,16 @@ tor_tls_set_renegotiate_callback(tor_tls_t *tls,
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- * <b>tls</b>. (Our protocol never requires this for security, but it's nice
|
|
+ * <b>tls</b>.
|
|
- * to use belt-and-suspenders here.)
|
|
|
|
*/
|
|
*/
|
|
static void
|
|
static void
|
|
tor_tls_unblock_renegotiation(tor_tls_t *tls)
|
|
tor_tls_unblock_renegotiation(tor_tls_t *tls)
|
|
{
|
|
{
|
|
-#ifdef SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION
|
|
|
|
|
|
|
|
* as authenticating any earlier-received data. */
|
|
* as authenticating any earlier-received data. */
|
|
- tls->ssl->s3->flags |= SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
|
|
+ if (use_unsafe_renegotiation_flag) {
|
|
-#else
|
|
+ tls->ssl->s3->flags |= SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
|
|
- (void)tls;
|
|
+ }
|
|
-#endif
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -942,11 +977,7 @@ tor_tls_unblock_renegotiation(tor_tls_t *tls)
|
|
void
|
|
void
|
|
tor_tls_block_renegotiation(tor_tls_t *tls)
|
|
tor_tls_block_renegotiation(tor_tls_t *tls)
|
|
{
|
|
{
|
|
-#ifdef SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION
|
|
|
|
tls->ssl->s3->flags &= ~SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
|
|
tls->ssl->s3->flags &= ~SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
|
|
-#else
|
|
|
|
- (void)tls;
|
|
|
|
-#endif
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|