Skip to content

Commit

Permalink
Merge NSS trunk to branch, a=merge
Browse files Browse the repository at this point in the history
--HG--
extra : rebase_source : 83d7eacd6e6bbff3cd1bb981545eaf7a6d54fcc0
  • Loading branch information
martinthomson committed Jun 1, 2017
2 parents abf795e + 90a5360 commit 0dc67fc
Show file tree
Hide file tree
Showing 26 changed files with 668 additions and 478 deletions.
1 change: 0 additions & 1 deletion cpputil/tls_parser.h
Expand Up @@ -41,7 +41,6 @@ const uint8_t kTlsAlertWarning = 1;
const uint8_t kTlsAlertFatal = 2;

const uint8_t kTlsAlertCloseNotify = 0;
const uint8_t kTlsAlertEndOfEarlyData = 1;
const uint8_t kTlsAlertUnexpectedMessage = 10;
const uint8_t kTlsAlertBadRecordMac = 20;
const uint8_t kTlsAlertRecordOverflow = 22;
Expand Down
15 changes: 8 additions & 7 deletions gtests/nss_bogo_shim/config.json
@@ -1,12 +1,14 @@
{
"DisabledTests": {
"### These tests break whenever we rev versions, so just leave them here for easy uncommenting":"",
"#*TLS13*":"(NSS=18, BoGo=16)",
"#*HelloRetryRequest*":"(NSS=18, BoGo=16)",
"#*KeyShare*":"(NSS=18, BoGo=16)",
"#*EncryptedExtensions*":"(NSS=18, BoGo=16)",
"#*SecondClientHello*":"(NSS=18, BoGo=16)",
"#*IgnoreClientVersionOrder*":"(NSS=18, BoGo=16)",
"*TLS13*":"(NSS=19, BoGo=18)",
"*HelloRetryRequest*":"(NSS=19, BoGo=18)",
"*KeyShare*":"(NSS=19, BoGo=18)",
"*EncryptedExtensions*":"(NSS=19, BoGo=18)",
"*SecondClientHello*":"(NSS=19, BoGo=18)",
"*IgnoreClientVersionOrder*":"(NSS=19, BoGo=18)",
"SkipEarlyData*":"(NSS=19, BoGo=18)",
"*Binder*":"(NSS=19, BoGo=18)",
"Resume-Server-BinderWrongLength":"Alert disagreement (Bug 1317633)",
"Resume-Server-NoPSKBinder":"Alert disagreement (Bug 1317633)",
"CheckRecordVersion-TLS*":"Bug 1317634",
Expand Down Expand Up @@ -66,4 +68,3 @@
":DIGEST_CHECK_FAILED:":"SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE"
}
}

2 changes: 0 additions & 2 deletions gtests/ssl_gtest/ssl_0rtt_unittest.cc
Expand Up @@ -310,7 +310,6 @@ TEST_P(TlsConnectTls13, SendTooMuchEarlyData) {
server_->Set0RttEnabled(true);
ExpectResumption(RESUME_TICKET);

ExpectAlert(client_, kTlsAlertEndOfEarlyData);
client_->Handshake();
CheckEarlyDataLimit(client_, short_size);

Expand Down Expand Up @@ -364,7 +363,6 @@ TEST_P(TlsConnectTls13, ReceiveTooMuchEarlyData) {
server_->Set0RttEnabled(true);
ExpectResumption(RESUME_TICKET);

client_->ExpectSendAlert(kTlsAlertEndOfEarlyData);
client_->Handshake(); // Send ClientHello
CheckEarlyDataLimit(client_, limit);

Expand Down
1 change: 0 additions & 1 deletion gtests/ssl_gtest/ssl_exporter_unittest.cc
Expand Up @@ -118,7 +118,6 @@ int32_t RegularExporterShouldFail(TlsAgent* agent, const SECItem* srvNameArr,

TEST_P(TlsConnectTls13, EarlyExporter) {
SetupForZeroRtt();
ExpectAlert(client_, kTlsAlertEndOfEarlyData);
client_->Set0RttEnabled(true);
server_->Set0RttEnabled(true);
ExpectResumption(RESUME_TICKET);
Expand Down
11 changes: 9 additions & 2 deletions gtests/ssl_gtest/ssl_extension_unittest.cc
Expand Up @@ -1037,12 +1037,16 @@ class TlsBogusExtensionTest13 : public TlsBogusExtensionTest {
return;
}

FailWithAlert(kTlsAlertUnsupportedExtension);
}

void FailWithAlert(uint8_t alert) {
client_->StartConnect();
server_->StartConnect();
client_->Handshake(); // ClientHello
server_->Handshake(); // ServerHello

client_->ExpectSendAlert(kTlsAlertUnsupportedExtension);
client_->ExpectSendAlert(alert);
client_->Handshake();
if (variant_ == ssl_variant_stream) {
server_->ExpectSendAlert(kTlsAlertBadRecordMac);
Expand All @@ -1067,9 +1071,12 @@ TEST_P(TlsBogusExtensionTest13, AddBogusExtensionCertificate) {
Run(kTlsHandshakeCertificate);
}

// It's perfectly valid to set unknown extensions in CertificateRequest.
TEST_P(TlsBogusExtensionTest13, AddBogusExtensionCertificateRequest) {
server_->RequestClientAuth(false);
Run(kTlsHandshakeCertificateRequest);
AddFilter(kTlsHandshakeCertificateRequest, 0xff);
FailWithAlert(kTlsAlertDecryptError);
client_->CheckErrorCode(SEC_ERROR_BAD_SIGNATURE);
}

TEST_P(TlsBogusExtensionTest13, AddBogusExtensionHelloRetryRequest) {
Expand Down
19 changes: 9 additions & 10 deletions gtests/ssl_gtest/tls_agent.cc
Expand Up @@ -622,12 +622,8 @@ void TlsAgent::CheckErrorCode(int32_t expected) const {
}

static uint8_t GetExpectedAlertLevel(uint8_t alert) {
switch (alert) {
case kTlsAlertCloseNotify:
case kTlsAlertEndOfEarlyData:
return kTlsAlertWarning;
default:
break;
if (alert == kTlsAlertCloseNotify) {
return kTlsAlertWarning;
}
return kTlsAlertFatal;
}
Expand Down Expand Up @@ -755,10 +751,13 @@ void TlsAgent::Connected() {

if (expected_version_ >= SSL_LIBRARY_VERSION_TLS_1_3) {
PRInt32 cipherSuites = SSLInt_CountTls13CipherSpecs(ssl_fd());
// We use one ciphersuite in each direction, plus one that's kept around
// by DTLS for retransmission.
PRInt32 expected =
((variant_ == ssl_variant_datagram) && (role_ == CLIENT)) ? 3 : 2;
// We use one ciphersuite in each direction.
PRInt32 expected = 2;
// For DTLS, the client retains the cipher spec for early data and the
// handshake so that it can retransmit EndOfEarlyData and its final flight.
if (variant_ == ssl_variant_datagram && role_ == CLIENT) {
expected = info_.earlyDataAccepted ? 4 : 3;
}
EXPECT_EQ(expected, cipherSuites);
if (expected != cipherSuites) {
SSLInt_PrintTls13CipherSpecs(ssl_fd());
Expand Down
4 changes: 0 additions & 4 deletions gtests/ssl_gtest/tls_connect.cc
Expand Up @@ -584,10 +584,6 @@ void TlsConnectTestBase::ZeroRttSendReceive(
const char* k0RttData = "ABCDEF";
const PRInt32 k0RttDataLen = static_cast<PRInt32>(strlen(k0RttData));

if (expect_writable && expect_readable) {
ExpectAlert(client_, kTlsAlertEndOfEarlyData);
}

client_->Handshake(); // Send ClientHello.
if (post_clienthello_check) {
if (!post_clienthello_check()) return;
Expand Down
7 changes: 0 additions & 7 deletions gtests/ssl_gtest/tls_filter.cc
Expand Up @@ -448,13 +448,6 @@ static bool FindCertReqExtensions(TlsParser* parser,
if (!parser->SkipVariable(1)) { // request context
return false;
}
// TODO remove the next two for -19
if (!parser->SkipVariable(2)) { // signature_algorithms
return false;
}
if (!parser->SkipVariable(2)) { // certificate_authorities
return false;
}
return true;
}

Expand Down
14 changes: 7 additions & 7 deletions gtests/ssl_gtest/tls_hkdf_unittest.cc
Expand Up @@ -241,13 +241,13 @@ TEST_P(TlsHkdfTest, HkdfExpandLabel) {
{/* ssl_hash_md5 */},
{/* ssl_hash_sha1 */},
{/* ssl_hash_sha224 */},
{0x34, 0x7c, 0x67, 0x80, 0xff, 0x0b, 0xba, 0xd7, 0x1c, 0x28, 0x3b,
0x16, 0xeb, 0x2f, 0x9c, 0xf6, 0x2d, 0x24, 0xe6, 0xcd, 0xb6, 0x13,
0xd5, 0x17, 0x76, 0x54, 0x8c, 0xb0, 0x7d, 0xcd, 0xe7, 0x4c},
{0x4b, 0x1e, 0x5e, 0xc1, 0x49, 0x30, 0x78, 0xea, 0x35, 0xbd, 0x3f, 0x01,
0x04, 0xe6, 0x1a, 0xea, 0x14, 0xcc, 0x18, 0x2a, 0xd1, 0xc4, 0x76, 0x21,
0xc4, 0x64, 0xc0, 0x4e, 0x4b, 0x36, 0x16, 0x05, 0x6f, 0x04, 0xab, 0xe9,
0x43, 0xb1, 0x2d, 0xa8, 0xa7, 0x17, 0x9a, 0x5f, 0x09, 0x91, 0x7d, 0x1f}};
{0xc6, 0xdd, 0x6e, 0xc4, 0x76, 0xb8, 0x55, 0xf2, 0xa4, 0xfc, 0x59,
0x04, 0xa4, 0x90, 0xdc, 0xa7, 0xa7, 0x0d, 0x94, 0x8f, 0xc2, 0xdc,
0x15, 0x6d, 0x48, 0x93, 0x9d, 0x05, 0xbb, 0x9a, 0xbc, 0xc1},
{0x41, 0xea, 0x77, 0x09, 0x8c, 0x90, 0x04, 0x10, 0xec, 0xbc, 0x37, 0xd8,
0x5b, 0x54, 0xcd, 0x7b, 0x08, 0x15, 0x13, 0x20, 0xed, 0x1e, 0x3f, 0x54,
0x74, 0xf7, 0x8b, 0x06, 0x38, 0x28, 0x06, 0x37, 0x75, 0x23, 0xa2, 0xb7,
0x34, 0xb1, 0x72, 0x2e, 0x59, 0x6d, 0x5a, 0x31, 0xf5, 0x53, 0xab, 0x99}};

const DataBuffer expected_data(tv[hash_type_], kHashLength[hash_type_]);
HkdfExpandLabel(&k1_, hash_type_, kSessionHash, kHashLength[hash_type_],
Expand Down
9 changes: 7 additions & 2 deletions lib/ssl/SSLerrs.h
Expand Up @@ -473,8 +473,7 @@ ER3(SSL_ERROR_RX_MALFORMED_PRE_SHARED_KEY, (SSL_ERROR_BASE + 147),
ER3(SSL_ERROR_RX_MALFORMED_EARLY_DATA, (SSL_ERROR_BASE + 148),
"SSL received an invalid EarlyData extension.")

ER3(SSL_ERROR_END_OF_EARLY_DATA_ALERT, (SSL_ERROR_BASE + 149),
"SSL received an unexpected end of early data alert.")
UNUSED_ERROR(149)

ER3(SSL_ERROR_MISSING_ALPN_EXTENSION, (SSL_ERROR_BASE + 150),
"SSL didn't receive an expected ALPN extension.")
Expand Down Expand Up @@ -511,3 +510,9 @@ ER3(SSL_ERROR_DOWNGRADE_WITH_EARLY_DATA, (SSL_ERROR_BASE + 160),

ER3(SSL_ERROR_TOO_MUCH_EARLY_DATA, (SSL_ERROR_BASE + 161),
"SSL received more early data than permitted.")

ER3(SSL_ERROR_RX_UNEXPECTED_END_OF_EARLY_DATA, (SSL_ERROR_BASE + 162),
"SSL received an unexpected End of Early Data message.")

ER3(SSL_ERROR_RX_MALFORMED_END_OF_EARLY_DATA, (SSL_ERROR_BASE + 163),
"SSL received a malformed End of Early Data message.")
42 changes: 16 additions & 26 deletions lib/ssl/ssl3con.c
Expand Up @@ -569,6 +569,9 @@ ssl3_DecodeHandshakeType(int msgType)
case new_session_ticket:
rv = "session_ticket (4)";
break;
case end_of_early_data:
rv = "end_of_early_data (5)";
break;
case hello_retry_request:
rv = "hello_retry_request (6)";
break;
Expand Down Expand Up @@ -3340,9 +3343,6 @@ ssl3_HandleAlert(sslSocket *ss, sslBuffer *buf)
case bad_certificate_hash_value:
error = SSL_ERROR_BAD_CERT_HASH_VALUE_ALERT;
break;
case end_of_early_data:
error = SSL_ERROR_END_OF_EARLY_DATA_ALERT;
break;
default:
error = SSL_ERROR_RX_UNKNOWN_ALERT;
break;
Expand All @@ -3354,7 +3354,6 @@ ssl3_HandleAlert(sslSocket *ss, sslBuffer *buf)
switch (desc) {
case close_notify:
case user_canceled:
case end_of_early_data:
break;
default:
level = alert_fatal;
Expand All @@ -3374,9 +3373,6 @@ ssl3_HandleAlert(sslSocket *ss, sslBuffer *buf)
PORT_SetError(error);
return SECFailure;
}
if (desc == end_of_early_data) {
return tls13_HandleEndOfEarlyData(ss);
}
if ((desc == no_certificate) && (ss->ssl3.hs.ws == wait_client_cert)) {
/* I'm a server. I've requested a client cert. He hasn't got one. */
SECStatus rv;
Expand Down Expand Up @@ -6435,8 +6431,8 @@ ssl3_PickServerSignatureScheme(sslSocket *ss)

/* Sets error code, if needed. */
return ssl_PickSignatureScheme(ss, keyPair->pubKey, keyPair->privKey,
ss->xtnData.clientSigSchemes,
ss->xtnData.numClientSigScheme,
ss->xtnData.sigSchemes,
ss->xtnData.numSigSchemes,
PR_FALSE /* requireSha1 */);
}

Expand Down Expand Up @@ -7296,7 +7292,7 @@ typedef struct dnameNode {
*/
SECStatus
ssl3_ParseCertificateRequestCAs(sslSocket *ss, PRUint8 **b, PRUint32 *length,
PLArenaPool *arena, CERTDistNames *ca_list)
CERTDistNames *ca_list)
{
PRUint32 remaining;
int nnames = 0;
Expand All @@ -7311,7 +7307,7 @@ ssl3_ParseCertificateRequestCAs(sslSocket *ss, PRUint8 **b, PRUint32 *length,
if (remaining > *length)
goto alert_loser;

ca_list->head = node = PORT_ArenaZNew(arena, dnameNode);
ca_list->head = node = PORT_ArenaZNew(ca_list->arena, dnameNode);
if (node == NULL)
goto no_mem;

Expand All @@ -7337,14 +7333,14 @@ ssl3_ParseCertificateRequestCAs(sslSocket *ss, PRUint8 **b, PRUint32 *length,
if (remaining <= 0)
break; /* success */

node->next = PORT_ArenaZNew(arena, dnameNode);
node->next = PORT_ArenaZNew(ca_list->arena, dnameNode);
node = node->next;
if (node == NULL)
goto no_mem;
}

ca_list->nnames = nnames;
ca_list->names = PORT_ArenaNewArray(arena, SECItem, nnames);
ca_list->names = PORT_ArenaNewArray(ca_list->arena, SECItem, nnames);
if (nnames > 0 && ca_list->names == NULL)
goto no_mem;

Expand Down Expand Up @@ -7488,7 +7484,7 @@ ssl3_HandleCertificateRequest(sslSocket *ss, PRUint8 *b, PRUint32 length)
}
}

rv = ssl3_ParseCertificateRequestCAs(ss, &b, &length, arena, &ca_list);
rv = ssl3_ParseCertificateRequestCAs(ss, &b, &length, &ca_list);
if (rv != SECSuccess)
goto done; /* alert sent in ssl3_ParseCertificateRequestCAs */

Expand Down Expand Up @@ -9628,10 +9624,10 @@ ssl3_SendCertificateRequest(sslSocket *ss)
const PRUint8 *certTypes;
SECStatus rv;
int length;
SECItem *names;
const SECItem *names;
unsigned int calen;
unsigned int nnames;
SECItem *name;
const SECItem *name;
int i;
int certTypesLength;
PRUint8 sigAlgs[MAX_SIGNATURE_SCHEMES * 2];
Expand Down Expand Up @@ -10177,8 +10173,8 @@ ssl3_SendEmptyCertificate(sslSocket *ss)
const SECItem *context;

if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_3) {
PORT_Assert(ss->ssl3.hs.certificateRequest);
context = &ss->ssl3.hs.certificateRequest->context;
PORT_Assert(ss->ssl3.hs.clientCertRequested);
context = &ss->xtnData.certReqContext;
len = context->len + 1;
isTLS13 = PR_TRUE;
}
Expand Down Expand Up @@ -10407,8 +10403,8 @@ ssl3_SendCertificate(sslSocket *ss)
if (isTLS13) {
contextLen = 1; /* Size of the context length */
if (!ss->sec.isServer) {
PORT_Assert(ss->ssl3.hs.certificateRequest);
context = ss->ssl3.hs.certificateRequest->context;
PORT_Assert(ss->ssl3.hs.clientCertRequested);
context = ss->xtnData.certReqContext;
contextLen += context.len;
}
}
Expand Down Expand Up @@ -12882,7 +12878,6 @@ ssl3_InitState(sslSocket *ss)
ss->ssl3.hs.serverHsTrafficSecret = NULL;
ss->ssl3.hs.clientTrafficSecret = NULL;
ss->ssl3.hs.serverTrafficSecret = NULL;
ss->ssl3.hs.certificateRequest = NULL;
PR_INIT_CLIST(&ss->ssl3.hs.cipherSpecs);

PORT_Assert(!ss->ssl3.hs.messages.buf && !ss->ssl3.hs.messages.space);
Expand Down Expand Up @@ -13224,11 +13219,6 @@ ssl3_DestroySSL3Info(sslSocket *ss)
SECITEM_FreeItem(&ss->ssl3.hs.newSessionTicket.ticket, PR_FALSE);
SECITEM_FreeItem(&ss->ssl3.hs.srvVirtName, PR_FALSE);

if (ss->ssl3.hs.certificateRequest) {
PORT_FreeArena(ss->ssl3.hs.certificateRequest->arena, PR_FALSE);
ss->ssl3.hs.certificateRequest = NULL;
}

/* free up the CipherSpecs */
ssl3_DestroyCipherSpec(&ss->ssl3.specs[0], PR_TRUE /*freeSrvName*/);
ssl3_DestroyCipherSpec(&ss->ssl3.specs[1], PR_TRUE /*freeSrvName*/);
Expand Down

0 comments on commit 0dc67fc

Please sign in to comment.