summaryrefslogtreecommitdiff
path: root/src/common/tortls.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/tortls.c')
-rw-r--r--src/common/tortls.c48
1 files changed, 42 insertions, 6 deletions
diff --git a/src/common/tortls.c b/src/common/tortls.c
index ce5b702a2b..c6ffe12108 100644
--- a/src/common/tortls.c
+++ b/src/common/tortls.c
@@ -44,6 +44,8 @@ const char tortls_c_id[] =
/** Structure holding the TLS state for a single connection. */
typedef struct tor_tls_context_t {
SSL_CTX *ctx;
+ X509 *my_cert;
+ X509 *my_id_cert;
} tor_tls_context_t;
/** Holds a SSL object and its associated data. Members are only
@@ -64,6 +66,7 @@ struct tor_tls_t {
unsigned long last_read_count;
};
+static void tor_tls_context_free(tor_tls_context_t *ctx);
static X509* tor_tls_create_certificate(crypto_pk_env_t *rsa,
crypto_pk_env_t *rsa_sign,
const char *cname,
@@ -211,8 +214,7 @@ void
tor_tls_free_all(void)
{
if (global_tls_context) {
- SSL_CTX_free(global_tls_context->ctx);
- tor_free(global_tls_context);
+ tor_tls_context_free(global_tls_context);
global_tls_context = NULL;
}
}
@@ -341,6 +343,16 @@ tor_tls_create_certificate(crypto_pk_env_t *rsa,
#error "Tor requires OpenSSL version 0.9.7 or later, for AES support."
#endif
+/** DOCDOC */
+static void
+tor_tls_context_free(tor_tls_context_t *ctx)
+{
+ SSL_CTX_free(ctx->ctx);
+ X509_free(ctx->my_cert);
+ X509_free(ctx->my_id_cert);
+ tor_free(ctx);
+}
+
/** Create a new TLS context for use with Tor TLS handshakes.
* <b>identity</b> should be set to the identity key used to sign the
* certificate, and <b>nickname</b> set to the nickname to use.
@@ -382,6 +394,9 @@ tor_tls_context_new(crypto_pk_env_t *identity, const char *nickname,
}
result = tor_malloc_zero(sizeof(tor_tls_context_t));
+ result->my_cert = X509_dup(cert);
+ result->my_id_cert = X509_dup(idcert);
+
#ifdef EVERYONE_HAS_AES
/* Tell OpenSSL to only use TLS1 */
if (!(result->ctx = SSL_CTX_new(TLSv1_method())))
@@ -431,8 +446,7 @@ tor_tls_context_new(crypto_pk_env_t *identity, const char *nickname,
if (global_tls_context) {
/* This is safe even if there are open connections: OpenSSL does
* reference counting with SSL and SSL_CTX objects. */
- SSL_CTX_free(global_tls_context->ctx);
- tor_free(global_tls_context);
+ tor_tls_context_free(global_tls_context);
}
global_tls_context = result;
if (rsa)
@@ -679,6 +693,29 @@ tor_tls_peer_has_cert(tor_tls_t *tls)
return 1;
}
+/** DOCDOC */
+int
+tor_tls_get_cert_digests(tor_tls_t *tls,
+ char *my_digest_out,
+ char *peer_digest_out)
+{
+ X509 *cert;
+ unsigned int len;
+ cert = SSL_get_certificate(tls->ssl);
+ if (cert) {
+ X509_digest(cert, EVP_sha1(), (unsigned char*)my_digest_out, &len);
+ if (len != DIGEST_LEN)
+ return -1;
+ }
+ cert = SSL_get_peer_certificate(tls->ssl);
+ if (cert) {
+ X509_digest(cert, EVP_sha1(), (unsigned char*)peer_digest_out, &len);
+ if (len != DIGEST_LEN)
+ return -1;
+ }
+ return 0;
+}
+
/** Warn that a certificate lifetime extends through a certain range. */
static void
log_cert_lifetime(X509 *cert, const char *problem)
@@ -736,7 +773,7 @@ log_cert_lifetime(X509 *cert, const char *problem)
* 0. Else, return -1 and log complaints with log-level <b>severity</b>.
*/
int
-tor_tls_verify(int severity, tor_tls_t *tls, crypto_pk_env_t **identity_key)
+tor_tls_verify_v1(int severity, tor_tls_t *tls, crypto_pk_env_t **identity_key)
{
X509 *cert = NULL, *id_cert = NULL;
STACK_OF(X509) *chain = NULL;
@@ -932,4 +969,3 @@ tor_tls_hmac_with_master_secret(tor_tls_t *tls, char *hmac_out,
return 0;
}
-