Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(728)

Unified Diff: net/third_party/nss/ssl/ssl3con.c

Issue 27589002: Support new ChannelID extension. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add patch file Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/third_party/nss/ssl/ssl3con.c
diff --git a/net/third_party/nss/ssl/ssl3con.c b/net/third_party/nss/ssl/ssl3con.c
index 8b8b758c0b47c50fb1b55a51658bf84ee3493a9b..1c55bc4488c3413267c9d0e484b1aa19b3146ec2 100644
--- a/net/third_party/nss/ssl/ssl3con.c
+++ b/net/third_party/nss/ssl/ssl3con.c
@@ -7570,6 +7570,30 @@ ssl3_SendClientSecondRound(sslSocket *ss)
goto loser; /* err code was set. */
}
+ if (!ss->ssl3.hs.isResuming &&
+ ssl3_ExtensionNegotiated(ss, ssl_channel_id_xtn)) {
+ /* If we are negotiating ChannelID on a full handshake then we record
+ * the handshake hashes in |sid| at this point. They will be needed in
+ * the event that we resume this session and use ChannelID on the
+ * resumption handshake. */
+ SSL3Hashes hashes;
+ SECItem *lastHandshakeHash = &ss->sec.ci.sid->u.ssl3.lastHandshakeHash;
+
wtc 2013/11/14 00:50:56 Can you assert ss->sec.ci.sid->cached == never_cac
agl 2013/11/14 18:50:42 Done.
+ ssl_GetSpecReadLock(ss);
+ /* the cwSpec and zero arguments are only used for SSLv3, but we know
wtc 2013/11/14 00:50:56 The cwSpec argument is also used by ssl3_ComputeHa
agl 2013/11/14 18:50:42 This comment is clearly confusing. I've deleted it
+ * that this connection is not SSLv3 because we negotiated ChannelID. */
+ PORT_Assert(ss->version > SSL_LIBRARY_VERSION_3_0);
+ ssl3_ComputeHandshakeHashes(ss, ss->ssl3.cwSpec, &hashes, 0);
wtc 2013/11/14 00:50:56 Check the return value?
agl 2013/11/14 18:50:42 Done.
+ ssl_ReleaseSpecReadLock(ss);
+
+ PORT_Assert(lastHandshakeHash->len == 0);
+ lastHandshakeHash->data = PORT_Alloc(hashes.len);
+ if (!lastHandshakeHash->data)
+ goto loser;
wtc 2013/11/14 00:50:56 This should be simply "return SECFailure" if you m
agl 2013/11/14 18:50:42 Done.
+ lastHandshakeHash->len = hashes.len;
+ memcpy(lastHandshakeHash->data, hashes.u.raw, hashes.len);
+ }
+
ssl_ReleaseXmitBufLock(ss); /*******************************/
wtc 2013/11/14 00:50:56 We should call ssl_ReleaseXmitBufLock(ss) before r
agl 2013/11/14 18:50:42 Done.
if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn))
@@ -10568,6 +10592,7 @@ static SECStatus
ssl3_SendEncryptedExtensions(sslSocket *ss)
{
static const char CHANNEL_ID_MAGIC[] = "TLS Channel ID signature";
+ static const char CHANNEL_ID_RESUMPTION_MAGIC[] = "Resumption";
/* This is the ASN.1 prefix for a P-256 public key. Specifically it's:
* SEQUENCE
* SEQUENCE
@@ -10593,7 +10618,10 @@ ssl3_SendEncryptedExtensions(sslSocket *ss)
SECItem *spki = NULL;
SSL3Hashes hashes;
const unsigned char *pub_bytes;
- unsigned char signed_data[sizeof(CHANNEL_ID_MAGIC) + sizeof(SSL3Hashes)];
+ unsigned char signed_data[sizeof(CHANNEL_ID_MAGIC) +
+ sizeof(CHANNEL_ID_RESUMPTION_MAGIC) +
+ sizeof(SSL3Hashes)*2];
+ size_t j;
wtc 2013/11/14 00:50:56 Nit: this variable should be named signed_data_len
agl 2013/11/14 18:50:42 Done.
unsigned char digest[SHA256_LENGTH];
SECItem digest_item;
unsigned char signature[64];
@@ -10643,11 +10671,24 @@ ssl3_SendEncryptedExtensions(sslSocket *ss)
pub_bytes = spki->data + sizeof(P256_SPKI_PREFIX);
- memcpy(signed_data, CHANNEL_ID_MAGIC, sizeof(CHANNEL_ID_MAGIC));
- memcpy(signed_data + sizeof(CHANNEL_ID_MAGIC), hashes.u.raw, hashes.len);
+ j = 0;
+ memcpy(signed_data + j, CHANNEL_ID_MAGIC, sizeof(CHANNEL_ID_MAGIC));
+ j += sizeof(CHANNEL_ID_MAGIC);
+ if (ss->ssl3.hs.isResuming) {
+ SECItem *lastHandshakeHash = &ss->sec.ci.sid->u.ssl3.lastHandshakeHash;
+ PORT_Assert(lastHandshakeHash->len > 0);
- rv = PK11_HashBuf(SEC_OID_SHA256, digest, signed_data,
- sizeof(CHANNEL_ID_MAGIC) + hashes.len);
+ memcpy(signed_data + j, CHANNEL_ID_RESUMPTION_MAGIC,
+ sizeof(CHANNEL_ID_RESUMPTION_MAGIC));
+ j += sizeof(CHANNEL_ID_RESUMPTION_MAGIC);
+ memcpy(signed_data + j, lastHandshakeHash->data,
+ lastHandshakeHash->len);
+ j += lastHandshakeHash->len;
+ }
+ memcpy(signed_data + j, hashes.u.raw, hashes.len);
+ j += hashes.len;
+
+ rv = PK11_HashBuf(SEC_OID_SHA256, digest, signed_data, j);
if (rv != SECSuccess)
goto loser;

Powered by Google App Engine
This is Rietveld 408576698