Index: net/third_party/nss/patches/channelid2.patch |
=================================================================== |
--- net/third_party/nss/patches/channelid2.patch (revision 242942) |
+++ net/third_party/nss/patches/channelid2.patch (working copy) |
@@ -1,155 +0,0 @@ |
-diff --git a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c |
-index 882e356..396c408 100644 |
---- a/nss/lib/ssl/ssl3con.c |
-+++ b/nss/lib/ssl/ssl3con.c |
-@@ -7594,6 +7594,33 @@ ssl3_SendClientSecondRound(sslSocket *ss) |
- |
- ssl_ReleaseXmitBufLock(ss); /*******************************/ |
- |
-+ 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 *originalHandshakeHash = |
-+ &ss->sec.ci.sid->u.ssl3.originalHandshakeHash; |
-+ PORT_Assert(ss->sec.ci.sid->cached == never_cached); |
-+ |
-+ ssl_GetSpecReadLock(ss); |
-+ PORT_Assert(ss->version > SSL_LIBRARY_VERSION_3_0); |
-+ rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.cwSpec, &hashes, 0); |
-+ ssl_ReleaseSpecReadLock(ss); |
-+ if (rv != SECSuccess) { |
-+ return rv; |
-+ } |
-+ |
-+ PORT_Assert(originalHandshakeHash->len == 0); |
-+ originalHandshakeHash->data = PORT_Alloc(hashes.len); |
-+ if (!originalHandshakeHash->data) |
-+ return SECFailure; |
-+ originalHandshakeHash->len = hashes.len; |
-+ memcpy(originalHandshakeHash->data, hashes.u.raw, hashes.len); |
-+ } |
-+ |
- if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn)) |
- ss->ssl3.hs.ws = wait_new_session_ticket; |
- else |
-@@ -10590,6 +10617,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 |
-@@ -10615,7 +10643,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 signed_data_len; |
- unsigned char digest[SHA256_LENGTH]; |
- SECItem digest_item; |
- unsigned char signature[64]; |
-@@ -10665,11 +10696,26 @@ 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); |
-+ signed_data_len = 0; |
-+ memcpy(signed_data + signed_data_len, CHANNEL_ID_MAGIC, |
-+ sizeof(CHANNEL_ID_MAGIC)); |
-+ signed_data_len += sizeof(CHANNEL_ID_MAGIC); |
-+ if (ss->ssl3.hs.isResuming) { |
-+ SECItem *originalHandshakeHash = |
-+ &ss->sec.ci.sid->u.ssl3.originalHandshakeHash; |
-+ PORT_Assert(originalHandshakeHash->len > 0); |
- |
-- rv = PK11_HashBuf(SEC_OID_SHA256, digest, signed_data, |
-- sizeof(CHANNEL_ID_MAGIC) + hashes.len); |
-+ memcpy(signed_data + signed_data_len, CHANNEL_ID_RESUMPTION_MAGIC, |
-+ sizeof(CHANNEL_ID_RESUMPTION_MAGIC)); |
-+ signed_data_len += sizeof(CHANNEL_ID_RESUMPTION_MAGIC); |
-+ memcpy(signed_data + signed_data_len, originalHandshakeHash->data, |
-+ originalHandshakeHash->len); |
-+ signed_data_len += originalHandshakeHash->len; |
-+ } |
-+ memcpy(signed_data + signed_data_len, hashes.u.raw, hashes.len); |
-+ signed_data_len += hashes.len; |
-+ |
-+ rv = PK11_HashBuf(SEC_OID_SHA256, digest, signed_data, signed_data_len); |
- if (rv != SECSuccess) |
- goto loser; |
- |
-diff --git a/nss/lib/ssl/ssl3ext.c b/nss/lib/ssl/ssl3ext.c |
-index 03cf05c..166022c 100644 |
---- a/nss/lib/ssl/ssl3ext.c |
-+++ b/nss/lib/ssl/ssl3ext.c |
-@@ -812,6 +812,15 @@ ssl3_ClientSendChannelIDXtn(sslSocket * ss, PRBool append, |
- return 0; |
- } |
- |
-+ if (ss->sec.ci.sid->cached != never_cached && |
-+ ss->sec.ci.sid->u.ssl3.originalHandshakeHash.len == 0) { |
-+ /* We can't do ChannelID on a connection if we're resuming and didn't |
-+ * do ChannelID on the original connection: without ChannelID on the |
-+ * original connection we didn't record the handshake hashes needed for |
-+ * the signature. */ |
-+ return 0; |
-+ } |
-+ |
- if (append) { |
- SECStatus rv; |
- rv = ssl3_AppendHandshakeNumber(ss, ssl_channel_id_xtn, 2); |
-diff --git a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h |
-index 9c789bf..ca68727 100644 |
---- a/nss/lib/ssl/sslimpl.h |
-+++ b/nss/lib/ssl/sslimpl.h |
-@@ -705,6 +705,14 @@ struct sslSessionIDStr { |
- */ |
- NewSessionTicket sessionTicket; |
- SECItem srvName; |
-+ |
-+ /* originalHandshakeHash contains the hash of the original, full |
-+ * handshake prior to the server's final flow. This is either a |
-+ * SHA-1/MD5 combination (for TLS < 1.2) or the TLS PRF hash (for |
-+ * TLS 1.2). This is recorded and used only when ChannelID is |
-+ * negotiated as it's used to bind the ChannelID signature on the |
-+ * resumption handshake to the original handshake. */ |
-+ SECItem originalHandshakeHash; |
- } ssl3; |
- } u; |
- }; |
-diff --git a/nss/lib/ssl/sslnonce.c b/nss/lib/ssl/sslnonce.c |
-index a6f7349..eb5004c 100644 |
---- a/nss/lib/ssl/sslnonce.c |
-+++ b/nss/lib/ssl/sslnonce.c |
-@@ -148,6 +148,9 @@ ssl_DestroySID(sslSessionID *sid) |
- if (sid->u.ssl3.srvName.data) { |
- SECITEM_FreeItem(&sid->u.ssl3.srvName, PR_FALSE); |
- } |
-+ if (sid->u.ssl3.originalHandshakeHash.data) { |
-+ SECITEM_FreeItem(&sid->u.ssl3.originalHandshakeHash, PR_FALSE); |
-+ } |
- |
- PORT_ZFree(sid, sizeof(sslSessionID)); |
- } |
-diff --git a/nss/lib/ssl/sslt.h b/nss/lib/ssl/sslt.h |
-index e4d188f..b813c04 100644 |
---- a/nss/lib/ssl/sslt.h |
-+++ b/nss/lib/ssl/sslt.h |
-@@ -204,7 +204,7 @@ typedef enum { |
- ssl_app_layer_protocol_xtn = 16, |
- ssl_session_ticket_xtn = 35, |
- ssl_next_proto_nego_xtn = 13172, |
-- ssl_channel_id_xtn = 30031, |
-+ ssl_channel_id_xtn = 30032, |
- ssl_padding_xtn = 35655, |
- ssl_renegotiation_info_xtn = 0xff01 /* experimental number */ |
- } SSLExtensionType; |