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

Side by Side 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: ... 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/third_party/nss/patches/channelid2.patch ('k') | net/third_party/nss/ssl/ssl3ext.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* 2 /*
3 * SSL3 Protocol 3 * SSL3 Protocol
4 * 4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public 5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this 6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8 8
9 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */ 9 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */
10 10
(...skipping 7576 matching lines...) Expand 10 before | Expand all | Expand 10 after
7587 } 7587 }
7588 } 7588 }
7589 7589
7590 rv = ssl3_SendFinished(ss, 0); 7590 rv = ssl3_SendFinished(ss, 0);
7591 if (rv != SECSuccess) { 7591 if (rv != SECSuccess) {
7592 goto loser; /* err code was set. */ 7592 goto loser; /* err code was set. */
7593 } 7593 }
7594 7594
7595 ssl_ReleaseXmitBufLock(ss); /*******************************/ 7595 ssl_ReleaseXmitBufLock(ss); /*******************************/
7596 7596
7597 if (!ss->ssl3.hs.isResuming &&
7598 ssl3_ExtensionNegotiated(ss, ssl_channel_id_xtn)) {
7599 /* If we are negotiating ChannelID on a full handshake then we record
7600 * the handshake hashes in |sid| at this point. They will be needed in
7601 * the event that we resume this session and use ChannelID on the
7602 * resumption handshake. */
7603 SSL3Hashes hashes;
7604 SECItem *originalHandshakeHash =
7605 &ss->sec.ci.sid->u.ssl3.originalHandshakeHash;
7606 PORT_Assert(ss->sec.ci.sid->cached == never_cached);
7607
7608 ssl_GetSpecReadLock(ss);
7609 PORT_Assert(ss->version > SSL_LIBRARY_VERSION_3_0);
7610 rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.cwSpec, &hashes, 0);
7611 ssl_ReleaseSpecReadLock(ss);
7612 if (rv != SECSuccess) {
7613 return rv;
7614 }
7615
7616 PORT_Assert(originalHandshakeHash->len == 0);
7617 originalHandshakeHash->data = PORT_Alloc(hashes.len);
7618 if (!originalHandshakeHash->data)
7619 return SECFailure;
7620 originalHandshakeHash->len = hashes.len;
7621 memcpy(originalHandshakeHash->data, hashes.u.raw, hashes.len);
7622 }
7623
7597 if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn)) 7624 if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn))
7598 ss->ssl3.hs.ws = wait_new_session_ticket; 7625 ss->ssl3.hs.ws = wait_new_session_ticket;
7599 else 7626 else
7600 ss->ssl3.hs.ws = wait_change_cipher; 7627 ss->ssl3.hs.ws = wait_change_cipher;
7601 7628
7602 if (ss->handshakeCallback && 7629 if (ss->handshakeCallback &&
7603 (ss->ssl3.hs.canFalseStart && !ss->canFalseStartCallback)) { 7630 (ss->ssl3.hs.canFalseStart && !ss->canFalseStartCallback)) {
7604 /* Call the handshake callback here for backwards compatibility with 7631 /* Call the handshake callback here for backwards compatibility with
7605 * applications that were using false start before 7632 * applications that were using false start before
7606 * canFalseStartCallback was added. Note that we do this after calling 7633 * canFalseStartCallback was added. Note that we do this after calling
(...skipping 2976 matching lines...) Expand 10 before | Expand all | Expand 10 after
10583 return; 10610 return;
10584 } 10611 }
10585 10612
10586 /* called from ssl3_SendClientSecondRound 10613 /* called from ssl3_SendClientSecondRound
10587 * ssl3_HandleFinished 10614 * ssl3_HandleFinished
10588 */ 10615 */
10589 static SECStatus 10616 static SECStatus
10590 ssl3_SendEncryptedExtensions(sslSocket *ss) 10617 ssl3_SendEncryptedExtensions(sslSocket *ss)
10591 { 10618 {
10592 static const char CHANNEL_ID_MAGIC[] = "TLS Channel ID signature"; 10619 static const char CHANNEL_ID_MAGIC[] = "TLS Channel ID signature";
10620 static const char CHANNEL_ID_RESUMPTION_MAGIC[] = "Resumption";
10593 /* This is the ASN.1 prefix for a P-256 public key. Specifically it's: 10621 /* This is the ASN.1 prefix for a P-256 public key. Specifically it's:
10594 * SEQUENCE 10622 * SEQUENCE
10595 * SEQUENCE 10623 * SEQUENCE
10596 * OID id-ecPublicKey 10624 * OID id-ecPublicKey
10597 * OID prime256v1 10625 * OID prime256v1
10598 * BIT STRING, length 66, 0 trailing bits: 0x04 10626 * BIT STRING, length 66, 0 trailing bits: 0x04
10599 * 10627 *
10600 * The 0x04 in the BIT STRING is the prefix for an uncompressed, X9.62 10628 * The 0x04 in the BIT STRING is the prefix for an uncompressed, X9.62
10601 * public key. Following that are the two field elements as 32-byte, 10629 * public key. Following that are the two field elements as 32-byte,
10602 * big-endian numbers, as required by the Channel ID. */ 10630 * big-endian numbers, as required by the Channel ID. */
10603 static const unsigned char P256_SPKI_PREFIX[] = { 10631 static const unsigned char P256_SPKI_PREFIX[] = {
10604 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 10632 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86,
10605 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 10633 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,
10606 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 10634 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
10607 0x42, 0x00, 0x04 10635 0x42, 0x00, 0x04
10608 }; 10636 };
10609 /* ChannelIDs are always 128 bytes long: 64 bytes of P-256 public key and 64 10637 /* ChannelIDs are always 128 bytes long: 64 bytes of P-256 public key and 64
10610 * bytes of ECDSA signature. */ 10638 * bytes of ECDSA signature. */
10611 static const int CHANNEL_ID_PUBLIC_KEY_LENGTH = 64; 10639 static const int CHANNEL_ID_PUBLIC_KEY_LENGTH = 64;
10612 static const int CHANNEL_ID_LENGTH = 128; 10640 static const int CHANNEL_ID_LENGTH = 128;
10613 10641
10614 SECStatus rv = SECFailure; 10642 SECStatus rv = SECFailure;
10615 SECItem *spki = NULL; 10643 SECItem *spki = NULL;
10616 SSL3Hashes hashes; 10644 SSL3Hashes hashes;
10617 const unsigned char *pub_bytes; 10645 const unsigned char *pub_bytes;
10618 unsigned char signed_data[sizeof(CHANNEL_ID_MAGIC) + sizeof(SSL3Hashes)]; 10646 unsigned char signed_data[sizeof(CHANNEL_ID_MAGIC) +
10647 sizeof(CHANNEL_ID_RESUMPTION_MAGIC) +
10648 sizeof(SSL3Hashes)*2];
10649 size_t signed_data_len;
10619 unsigned char digest[SHA256_LENGTH]; 10650 unsigned char digest[SHA256_LENGTH];
10620 SECItem digest_item; 10651 SECItem digest_item;
10621 unsigned char signature[64]; 10652 unsigned char signature[64];
10622 SECItem signature_item; 10653 SECItem signature_item;
10623 10654
10624 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 10655 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
10625 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 10656 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
10626 10657
10627 if (ss->ssl3.channelID == NULL) 10658 if (ss->ssl3.channelID == NULL)
10628 return SECSuccess; 10659 return SECSuccess;
(...skipping 29 matching lines...) Expand all
10658 10689
10659 if (spki->len != sizeof(P256_SPKI_PREFIX) + CHANNEL_ID_PUBLIC_KEY_LENGTH || 10690 if (spki->len != sizeof(P256_SPKI_PREFIX) + CHANNEL_ID_PUBLIC_KEY_LENGTH ||
10660 memcmp(spki->data, P256_SPKI_PREFIX, sizeof(P256_SPKI_PREFIX) != 0)) { 10691 memcmp(spki->data, P256_SPKI_PREFIX, sizeof(P256_SPKI_PREFIX) != 0)) {
10661 PORT_SetError(SSL_ERROR_INVALID_CHANNEL_ID_KEY); 10692 PORT_SetError(SSL_ERROR_INVALID_CHANNEL_ID_KEY);
10662 rv = SECFailure; 10693 rv = SECFailure;
10663 goto loser; 10694 goto loser;
10664 } 10695 }
10665 10696
10666 pub_bytes = spki->data + sizeof(P256_SPKI_PREFIX); 10697 pub_bytes = spki->data + sizeof(P256_SPKI_PREFIX);
10667 10698
10668 memcpy(signed_data, CHANNEL_ID_MAGIC, sizeof(CHANNEL_ID_MAGIC)); 10699 signed_data_len = 0;
10669 memcpy(signed_data + sizeof(CHANNEL_ID_MAGIC), hashes.u.raw, hashes.len); 10700 memcpy(signed_data + signed_data_len, CHANNEL_ID_MAGIC,
10701 sizeof(CHANNEL_ID_MAGIC));
10702 signed_data_len += sizeof(CHANNEL_ID_MAGIC);
10703 if (ss->ssl3.hs.isResuming) {
10704 SECItem *originalHandshakeHash =
10705 &ss->sec.ci.sid->u.ssl3.originalHandshakeHash;
10706 PORT_Assert(originalHandshakeHash->len > 0);
10670 10707
10671 rv = PK11_HashBuf(SEC_OID_SHA256, digest, signed_data, 10708 memcpy(signed_data + signed_data_len, CHANNEL_ID_RESUMPTION_MAGIC,
10672 » » sizeof(CHANNEL_ID_MAGIC) + hashes.len); 10709 sizeof(CHANNEL_ID_RESUMPTION_MAGIC));
10710 signed_data_len += sizeof(CHANNEL_ID_RESUMPTION_MAGIC);
10711 memcpy(signed_data + signed_data_len, originalHandshakeHash->data,
10712 originalHandshakeHash->len);
10713 signed_data_len += originalHandshakeHash->len;
10714 }
10715 memcpy(signed_data + signed_data_len, hashes.u.raw, hashes.len);
10716 signed_data_len += hashes.len;
10717
10718 rv = PK11_HashBuf(SEC_OID_SHA256, digest, signed_data, signed_data_len);
10673 if (rv != SECSuccess) 10719 if (rv != SECSuccess)
10674 goto loser; 10720 goto loser;
10675 10721
10676 digest_item.data = digest; 10722 digest_item.data = digest;
10677 digest_item.len = sizeof(digest); 10723 digest_item.len = sizeof(digest);
10678 10724
10679 signature_item.data = signature; 10725 signature_item.data = signature;
10680 signature_item.len = sizeof(signature); 10726 signature_item.len = sizeof(signature);
10681 10727
10682 rv = PK11_Sign(ss->ssl3.channelID, &signature_item, &digest_item); 10728 rv = PK11_Sign(ss->ssl3.channelID, &signature_item, &digest_item);
(...skipping 1907 matching lines...) Expand 10 before | Expand all | Expand 10 after
12590 PORT_Free(ss->ssl3.hs.recvdFragments.buf); 12636 PORT_Free(ss->ssl3.hs.recvdFragments.buf);
12591 } 12637 }
12592 } 12638 }
12593 12639
12594 ss->ssl3.initialized = PR_FALSE; 12640 ss->ssl3.initialized = PR_FALSE;
12595 12641
12596 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); 12642 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE);
12597 } 12643 }
12598 12644
12599 /* End of ssl3con.c */ 12645 /* End of ssl3con.c */
OLDNEW
« no previous file with comments | « net/third_party/nss/patches/channelid2.patch ('k') | net/third_party/nss/ssl/ssl3ext.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698