diff options
author | haavardm@opera.com <haavardm@opera.com@4ff67af0-8c30-449e-8e8b-ad334ec8d88c> | 2014-05-08 15:48:32 +0000 |
---|---|---|
committer | haavardm@opera.com <haavardm@opera.com@4ff67af0-8c30-449e-8e8b-ad334ec8d88c> | 2014-05-08 15:48:32 +0000 |
commit | 7f0be5dc6cd354f962618d88faa1b1d2b8e32238 (patch) | |
tree | 2c5b2792249737c292d9d605bf00299be688b123 /openssl/ssl/t1_lib.c | |
parent | 6dd990467cde73b946a0a27bb9360fd2a6a266b3 (diff) | |
download | openssl-7f0be5dc6cd354f962618d88faa1b1d2b8e32238.tar.gz |
New tls channel id version for OpenSSL
New tls channel id version extracted from patch 0015-channelid.patch attached to http://crbug.com/366961.
BUG=366961
Review URL: https://codereview.chromium.org/259963009
git-svn-id: http://src.chromium.org/svn/trunk/deps/third_party/openssl@269063 4ff67af0-8c30-449e-8e8b-ad334ec8d88c
Diffstat (limited to 'openssl/ssl/t1_lib.c')
-rw-r--r-- | openssl/ssl/t1_lib.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/openssl/ssl/t1_lib.c b/openssl/ssl/t1_lib.c index ea7fefa..d7ea9a5 100644 --- a/openssl/ssl/t1_lib.c +++ b/openssl/ssl/t1_lib.c @@ -2684,6 +2684,17 @@ tls1_channel_id_hash(EVP_MD_CTX *md, SSL *s) EVP_DigestUpdate(md, kClientIDMagic, sizeof(kClientIDMagic)); + if (s->hit) + { + static const char kResumptionMagic[] = "Resumption"; + EVP_DigestUpdate(md, kResumptionMagic, + sizeof(kResumptionMagic)); + if (s->session->original_handshake_hash_len == 0) + return 0; + EVP_DigestUpdate(md, s->session->original_handshake_hash, + s->session->original_handshake_hash_len); + } + EVP_MD_CTX_init(&ctx); for (i = 0; i < SSL_MAX_DIGEST; i++) { @@ -2698,3 +2709,29 @@ tls1_channel_id_hash(EVP_MD_CTX *md, SSL *s) return 1; } #endif + +/* tls1_record_handshake_hashes_for_channel_id records the current handshake + * hashes in |s->session| so that Channel ID resumptions can sign that data. */ +int tls1_record_handshake_hashes_for_channel_id(SSL *s) + { + int digest_len; + /* This function should never be called for a resumed session because + * the handshake hashes that we wish to record are for the original, + * full handshake. */ + if (s->hit) + return -1; + /* It only makes sense to call this function if Channel IDs have been + * negotiated. */ + if (!s->s3->tlsext_channel_id_valid) + return -1; + + digest_len = tls1_handshake_digest( + s, s->session->original_handshake_hash, + sizeof(s->session->original_handshake_hash)); + if (digest_len < 0) + return -1; + + s->session->original_handshake_hash_len = digest_len; + + return 1; + } |