aboutsummaryrefslogtreecommitdiff
path: root/src/common/tortls.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-09-13 13:46:21 -0400
committerNick Mathewson <nickm@torproject.org>2011-10-10 23:14:10 -0400
commitc39688de6c5d4bf19739ecffb2e98aa560a4630a (patch)
treeea40192d830f9cccdb2b164a48b4145aaef6e155 /src/common/tortls.c
parentdf78daa5da0fd27fdd2fd8ad13aa12e74696a4ef (diff)
downloadtor-c39688de6c5d4bf19739ecffb2e98aa560a4630a.tar
tor-c39688de6c5d4bf19739ecffb2e98aa560a4630a.tar.gz
Function to extract the TLSSECRETS field for v3 handshakes
Diffstat (limited to 'src/common/tortls.c')
-rw-r--r--src/common/tortls.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/common/tortls.c b/src/common/tortls.c
index b7119675e..2b12eea8d 100644
--- a/src/common/tortls.c
+++ b/src/common/tortls.c
@@ -1985,6 +1985,36 @@ tor_tls_server_got_renegotiate(tor_tls_t *tls)
return tls->got_renegotiate;
}
+/** Set the DIGEST256_LEN buffer at <b>secrets_out</b> to the value used in
+ * the v3 handshake to prove that the client knows the TLS secrets for the
+ * connection <b>tls</b>. Return 0 on success, -1 on failure.
+ */
+int
+tor_tls_get_tlssecrets(tor_tls_t *tls, uint8_t *secrets_out)
+{
+#define TLSSECRET_MAGIC "Tor V3 handshake TLS cross-certification"
+ char buf[128];
+ size_t len;
+ tor_assert(tls);
+ tor_assert(tls->ssl);
+ tor_assert(tls->ssl->s3);
+ tor_assert(tls->ssl->session);
+ /*
+ The value is an HMAC, using the TLS master key as the HMAC key, of
+ client_random | server_random | TLSSECRET_MAGIC
+ */
+ memcpy(buf + 0, tls->ssl->s3->client_random, 32);
+ memcpy(buf + 32, tls->ssl->s3->server_random, 32);
+ memcpy(buf + 64, TLSSECRET_MAGIC, strlen(TLSSECRET_MAGIC) + 1);
+ len = 64 + strlen(TLSSECRET_MAGIC) + 1;
+ crypto_hmac_sha256((char*)secrets_out,
+ (char*)tls->ssl->session->master_key,
+ tls->ssl->session->master_key_length,
+ buf, len);
+ memset(buf, 0, sizeof(buf));
+ return 0;
+}
+
/** Examine the amount of memory used and available for buffers in <b>tls</b>.
* Set *<b>rbuf_capacity</b> to the amount of storage allocated for the read
* buffer and *<b>rbuf_bytes</b> to the amount actually used.