diff options
author | Nick Mathewson <nickm@torproject.org> | 2011-09-13 13:46:21 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2011-10-10 23:14:10 -0400 |
commit | c39688de6c5d4bf19739ecffb2e98aa560a4630a (patch) | |
tree | ea40192d830f9cccdb2b164a48b4145aaef6e155 /src/common/tortls.c | |
parent | df78daa5da0fd27fdd2fd8ad13aa12e74696a4ef (diff) | |
download | tor-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.c | 30 |
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. |