summaryrefslogtreecommitdiffstats
path: root/net/third_party
diff options
context:
space:
mode:
authoragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-26 16:04:20 +0000
committeragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-26 16:04:20 +0000
commitdeffb93ae82baf9125ab1129a64ad087f602ee6b (patch)
tree11bd5e7229dfa4eaeacda28cd18d099f97c75769 /net/third_party
parent33ca366d226f980c5a8513f09258ca84addc8f47 (diff)
downloadchromium_src-deffb93ae82baf9125ab1129a64ad087f602ee6b.zip
chromium_src-deffb93ae82baf9125ab1129a64ad087f602ee6b.tar.gz
chromium_src-deffb93ae82baf9125ab1129a64ad087f602ee6b.tar.bz2
net: allow SSL secrets to be exported sooner.
This also addresses some follows up from previous CLs. BUG=none TEST=none Review URL: http://codereview.chromium.org/7493056 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@94105 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/third_party')
-rw-r--r--net/third_party/nss/patches/secret_exporter.patch66
-rw-r--r--net/third_party/nss/ssl/ssl.h8
-rw-r--r--net/third_party/nss/ssl/ssl3con.c7
-rw-r--r--net/third_party/nss/ssl/sslinfo.c23
4 files changed, 56 insertions, 48 deletions
diff --git a/net/third_party/nss/patches/secret_exporter.patch b/net/third_party/nss/patches/secret_exporter.patch
index 8e04252..7e6eaa0 100644
--- a/net/third_party/nss/patches/secret_exporter.patch
+++ b/net/third_party/nss/patches/secret_exporter.patch
@@ -1,4 +1,4 @@
-commit 58913147a052b19246ac946077484d033d309287
+commit c92170f883e6cfdc2c2dc6dbb49d3e6b8e9928f1
Author: Adam Langley <agl@chromium.org>
Date: Thu Jul 21 11:34:32 2011 -0400
@@ -17,32 +17,34 @@ index 7ef15db..1993d3e 100644
SSL_GetStapledOCSPResponse;
SSL_HandshakeResumedSession;
diff --git a/mozilla/security/nss/lib/ssl/ssl.h b/mozilla/security/nss/lib/ssl/ssl.h
-index 53ca301..1537aae 100644
+index 53ca301..6b364bb 100644
--- a/mozilla/security/nss/lib/ssl/ssl.h
+++ b/mozilla/security/nss/lib/ssl/ssl.h
-@@ -686,6 +686,17 @@ SSL_IMPORT SECStatus SSL_GetCipherSuiteInfo(PRUint16 cipherSuite,
+@@ -686,6 +686,19 @@ SSL_IMPORT SECStatus SSL_GetCipherSuiteInfo(PRUint16 cipherSuite,
/* Returnes negotiated through SNI host info. */
SSL_IMPORT SECItem *SSL_GetNegotiatedHostInfo(PRFileDesc *fd);
+/* Export keying material according to RFC 5705.
+** fd must correspond to a TLS 1.0 or higher socket and out must
-+** already be allocated.
++** already be allocated. If contextLen is zero it uses the no-context
++** construction from the RFC.
+*/
+SSL_IMPORT SECStatus SSL_ExportKeyingMaterial(PRFileDesc *fd,
+ const char *label,
++ unsigned int labelLen,
+ const unsigned char *context,
-+ unsigned int contextlen,
++ unsigned int contextLen,
+ unsigned char *out,
-+ unsigned int outlen);
++ unsigned int outLen);
+
/*
** Return a new reference to the certificate that was most recently sent
** to the peer on this SSL/TLS connection, or NULL if none has been sent.
diff --git a/mozilla/security/nss/lib/ssl/ssl3con.c b/mozilla/security/nss/lib/ssl/ssl3con.c
-index c39b8f8..dee5555 100644
+index 66071d2..3bda2f3 100644
--- a/mozilla/security/nss/lib/ssl/ssl3con.c
+++ b/mozilla/security/nss/lib/ssl/ssl3con.c
-@@ -8442,18 +8442,17 @@ ssl3_RestartHandshakeAfterServerCert(sslSocket *ss)
+@@ -8443,33 +8443,33 @@ ssl3_RestartHandshakeAfterServerCert(sslSocket *ss)
return rv;
}
@@ -67,11 +69,15 @@ index c39b8f8..dee5555 100644
- label = isServer ? "server finished" : "client finished";
- len = 15;
+ SECStatus rv = SECSuccess;
-+ unsigned int retLen;
if (spec->master_secret && !spec->bypassCiphers) {
SECItem param = {siBuffer, NULL, 0};
-@@ -8464,11 +8463,11 @@ ssl3_ComputeTLSFinished(ssl3CipherSpec *spec,
+ PK11Context *prf_context =
+ PK11_CreateContextBySymKey(CKM_TLS_PRF_GENERAL, CKA_SIGN,
+ spec->master_secret, &param);
++ unsigned int retLen;
++
+ if (!prf_context)
return SECFailure;
rv = PK11_DigestBegin(prf_context);
@@ -88,7 +94,7 @@ index c39b8f8..dee5555 100644
PK11_DestroyContext(prf_context, PR_TRUE);
} else {
-@@ -8477,17 +8476,34 @@ ssl3_ComputeTLSFinished(ssl3CipherSpec *spec,
+@@ -8478,17 +8478,36 @@ ssl3_ComputeTLSFinished(ssl3CipherSpec *spec,
SECItem outData = { siBuffer, };
PRBool isFIPS = PR_FALSE;
@@ -116,10 +122,12 @@ index c39b8f8..dee5555 100644
+{
+ const char * label;
+ SECStatus rv;
++ unsigned int len;
+
+ label = isServer ? "server finished" : "client finished";
++ len = 15;
+
-+ rv = ssl3_TLSPRFWithMasterSecret(spec, label, 15, hashes->md5,
++ rv = ssl3_TLSPRFWithMasterSecret(spec, label, len, hashes->md5,
+ sizeof *hashes, tlsFinished->verify_data,
+ sizeof tlsFinished->verify_data);
+
@@ -147,7 +155,7 @@ index df30029..073616f 100644
void FNV1A64_Init(PRUint64 *digest);
diff --git a/mozilla/security/nss/lib/ssl/sslinfo.c b/mozilla/security/nss/lib/ssl/sslinfo.c
-index 96377b0..9a58b4d 100644
+index 96377b0..cf870c7 100644
--- a/mozilla/security/nss/lib/ssl/sslinfo.c
+++ b/mozilla/security/nss/lib/ssl/sslinfo.c
@@ -20,6 +20,7 @@
@@ -158,24 +166,18 @@ index 96377b0..9a58b4d 100644
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
-@@ -38,6 +39,7 @@
- #include "ssl.h"
- #include "sslimpl.h"
- #include "sslproto.h"
-+#include "pk11func.h"
-
- static const char *
- ssl_GetCompressionMethodName(SSLCompressionMethod compression)
-@@ -316,6 +318,67 @@ SSL_IsExportCipherSuite(PRUint16 cipherSuite)
+@@ -316,6 +317,69 @@ SSL_IsExportCipherSuite(PRUint16 cipherSuite)
return PR_FALSE;
}
-+/* Export keying material according to draft-ietf-tls-extractor-06.
++/* Export keying material according to RFC 5705.
+** fd must correspond to a TLS 1.0 or higher socket, out must
+** be already allocated.
+*/
+SECStatus
-+SSL_ExportKeyingMaterial(PRFileDesc *fd, const char *label,
++SSL_ExportKeyingMaterial(PRFileDesc *fd,
++ const char *label,
++ unsigned int labelLen,
+ const unsigned char *context,
+ unsigned int contextLen,
+ unsigned char *out,
@@ -198,11 +200,6 @@ index 96377b0..9a58b4d 100644
+ return SECFailure;
+ }
+
-+ if (ss->ssl3.hs.ws != idle_handshake) {
-+ PORT_SetError(SSL_ERROR_HANDSHAKE_NOT_COMPLETED);
-+ return SECFailure;
-+ }
-+
+ valLen = SSL3_RANDOM_LENGTH * 2;
+ if (contextLen > 0)
+ valLen += 2 /* uint16 length */ + contextLen;
@@ -223,11 +220,16 @@ index 96377b0..9a58b4d 100644
+ PORT_Assert(i == valLen);
+
+ ssl_GetSpecReadLock(ss);
-+ rv = ssl3_TLSPRFWithMasterSecret(ss->ssl3.crSpec, label, strlen(label), val, valLen, out, outLen);
++ if (!ss->ssl3.cwSpec->master_secret && !ss->ssl3.cwSpec->msItem.len) {
++ PORT_SetError(SSL_ERROR_HANDSHAKE_NOT_COMPLETED);
++ rv = SECFailure;
++ } else {
++ rv = ssl3_TLSPRFWithMasterSecret(ss->ssl3.cwSpec, label, labelLen, val,
++ valLen, out, outLen);
++ }
+ ssl_ReleaseSpecReadLock(ss);
+
-+ if (val != NULL)
-+ PORT_ZFree(val, valLen);
++ PORT_ZFree(val, valLen);
+ return rv;
+}
+
diff --git a/net/third_party/nss/ssl/ssl.h b/net/third_party/nss/ssl/ssl.h
index 1537aae..6b364bb 100644
--- a/net/third_party/nss/ssl/ssl.h
+++ b/net/third_party/nss/ssl/ssl.h
@@ -688,14 +688,16 @@ SSL_IMPORT SECItem *SSL_GetNegotiatedHostInfo(PRFileDesc *fd);
/* Export keying material according to RFC 5705.
** fd must correspond to a TLS 1.0 or higher socket and out must
-** already be allocated.
+** already be allocated. If contextLen is zero it uses the no-context
+** construction from the RFC.
*/
SSL_IMPORT SECStatus SSL_ExportKeyingMaterial(PRFileDesc *fd,
const char *label,
+ unsigned int labelLen,
const unsigned char *context,
- unsigned int contextlen,
+ unsigned int contextLen,
unsigned char *out,
- unsigned int outlen);
+ unsigned int outLen);
/*
** Return a new reference to the certificate that was most recently sent
diff --git a/net/third_party/nss/ssl/ssl3con.c b/net/third_party/nss/ssl/ssl3con.c
index dee5555..3ae9167 100644
--- a/net/third_party/nss/ssl/ssl3con.c
+++ b/net/third_party/nss/ssl/ssl3con.c
@@ -8452,13 +8452,14 @@ ssl3_TLSPRFWithMasterSecret(ssl3CipherSpec *spec, const char *label,
unsigned char *out, unsigned int outLen)
{
SECStatus rv = SECSuccess;
- unsigned int retLen;
if (spec->master_secret && !spec->bypassCiphers) {
SECItem param = {siBuffer, NULL, 0};
PK11Context *prf_context =
PK11_CreateContextBySymKey(CKM_TLS_PRF_GENERAL, CKA_SIGN,
spec->master_secret, &param);
+ unsigned int retLen;
+
if (!prf_context)
return SECFailure;
@@ -8494,10 +8495,12 @@ ssl3_ComputeTLSFinished(ssl3CipherSpec *spec,
{
const char * label;
SECStatus rv;
+ unsigned int len;
label = isServer ? "server finished" : "client finished";
+ len = 15;
- rv = ssl3_TLSPRFWithMasterSecret(spec, label, 15, hashes->md5,
+ rv = ssl3_TLSPRFWithMasterSecret(spec, label, len, hashes->md5,
sizeof *hashes, tlsFinished->verify_data,
sizeof tlsFinished->verify_data);
diff --git a/net/third_party/nss/ssl/sslinfo.c b/net/third_party/nss/ssl/sslinfo.c
index 9a58b4d..cf870c7 100644
--- a/net/third_party/nss/ssl/sslinfo.c
+++ b/net/third_party/nss/ssl/sslinfo.c
@@ -39,7 +39,6 @@
#include "ssl.h"
#include "sslimpl.h"
#include "sslproto.h"
-#include "pk11func.h"
static const char *
ssl_GetCompressionMethodName(SSLCompressionMethod compression)
@@ -318,12 +317,14 @@ SSL_IsExportCipherSuite(PRUint16 cipherSuite)
return PR_FALSE;
}
-/* Export keying material according to draft-ietf-tls-extractor-06.
+/* Export keying material according to RFC 5705.
** fd must correspond to a TLS 1.0 or higher socket, out must
** be already allocated.
*/
SECStatus
-SSL_ExportKeyingMaterial(PRFileDesc *fd, const char *label,
+SSL_ExportKeyingMaterial(PRFileDesc *fd,
+ const char *label,
+ unsigned int labelLen,
const unsigned char *context,
unsigned int contextLen,
unsigned char *out,
@@ -346,11 +347,6 @@ SSL_ExportKeyingMaterial(PRFileDesc *fd, const char *label,
return SECFailure;
}
- if (ss->ssl3.hs.ws != idle_handshake) {
- PORT_SetError(SSL_ERROR_HANDSHAKE_NOT_COMPLETED);
- return SECFailure;
- }
-
valLen = SSL3_RANDOM_LENGTH * 2;
if (contextLen > 0)
valLen += 2 /* uint16 length */ + contextLen;
@@ -371,11 +367,16 @@ SSL_ExportKeyingMaterial(PRFileDesc *fd, const char *label,
PORT_Assert(i == valLen);
ssl_GetSpecReadLock(ss);
- rv = ssl3_TLSPRFWithMasterSecret(ss->ssl3.crSpec, label, strlen(label), val, valLen, out, outLen);
+ if (!ss->ssl3.cwSpec->master_secret && !ss->ssl3.cwSpec->msItem.len) {
+ PORT_SetError(SSL_ERROR_HANDSHAKE_NOT_COMPLETED);
+ rv = SECFailure;
+ } else {
+ rv = ssl3_TLSPRFWithMasterSecret(ss->ssl3.cwSpec, label, labelLen, val,
+ valLen, out, outLen);
+ }
ssl_ReleaseSpecReadLock(ss);
- if (val != NULL)
- PORT_ZFree(val, valLen);
+ PORT_ZFree(val, valLen);
return rv;
}