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

Unified Diff: net/third_party/nss/patches/secret_exporter.patch

Issue 7464031: net: add NSS support for RFC 5705 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ... Created 9 years, 5 months 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/patches/secret_exporter.patch
diff --git a/net/third_party/nss/patches/secret_exporter.patch b/net/third_party/nss/patches/secret_exporter.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8e042521c4e33d5e2bb11f1d7b948f726e1aea63
--- /dev/null
+++ b/net/third_party/nss/patches/secret_exporter.patch
@@ -0,0 +1,236 @@
+commit 58913147a052b19246ac946077484d033d309287
+Author: Adam Langley <agl@chromium.org>
+Date: Thu Jul 21 11:34:32 2011 -0400
+
+ secret_extractor.patch
+
+diff --git a/mozilla/security/nss/lib/ssl/ssl.def b/mozilla/security/nss/lib/ssl/ssl.def
+index 7ef15db..1993d3e 100644
+--- a/mozilla/security/nss/lib/ssl/ssl.def
++++ b/mozilla/security/nss/lib/ssl/ssl.def
+@@ -154,6 +154,7 @@ SSL_SNISocketConfigHook;
+ ;+};
+ ;+NSS_CHROMIUM {
+ ;+ global:
++SSL_ExportKeyingMaterial;
+ SSL_GetNextProto;
+ 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
+--- 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,
+ /* 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.
++*/
++SSL_IMPORT SECStatus SSL_ExportKeyingMaterial(PRFileDesc *fd,
++ const char *label,
++ const unsigned char *context,
++ unsigned int contextlen,
++ unsigned char *out,
++ 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
+--- a/mozilla/security/nss/lib/ssl/ssl3con.c
++++ b/mozilla/security/nss/lib/ssl/ssl3con.c
+@@ -8442,18 +8442,17 @@ ssl3_RestartHandshakeAfterServerCert(sslSocket *ss)
+ return rv;
+ }
+
+-static SECStatus
+-ssl3_ComputeTLSFinished(ssl3CipherSpec *spec,
+- PRBool isServer,
+- const SSL3Finished * hashes,
+- TLSFinished * tlsFinished)
++/* The calling function must acquire and release the appropriate lock (i.e.,
++ * ssl_GetSpecReadLock / ssl_ReleaseSpecReadLock for ss->ssl3.crSpec). Any
++ * label must already be concatenated onto the beginning of val.
++ */
++SECStatus
++ssl3_TLSPRFWithMasterSecret(ssl3CipherSpec *spec, const char *label,
++ unsigned int labelLen, const unsigned char *val, unsigned int valLen,
++ unsigned char *out, unsigned int outLen)
+ {
+- const char * label;
+- unsigned int len;
+- SECStatus rv;
+-
+- 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,
+ return SECFailure;
+
+ rv = PK11_DigestBegin(prf_context);
+- rv |= PK11_DigestOp(prf_context, (const unsigned char *) label, len);
+- rv |= PK11_DigestOp(prf_context, hashes->md5, sizeof *hashes);
+- rv |= PK11_DigestFinal(prf_context, tlsFinished->verify_data,
+- &len, sizeof tlsFinished->verify_data);
+- PORT_Assert(rv != SECSuccess || len == sizeof *tlsFinished);
++ rv |= PK11_DigestOp(prf_context, (unsigned char *) label, labelLen);
++ rv |= PK11_DigestOp(prf_context, val, valLen);
++ rv |= PK11_DigestFinal(prf_context, out,
++ &retLen, outLen);
++ PORT_Assert(rv != SECSuccess || retLen == outLen);
+
+ PK11_DestroyContext(prf_context, PR_TRUE);
+ } else {
+@@ -8477,17 +8476,34 @@ ssl3_ComputeTLSFinished(ssl3CipherSpec *spec,
+ SECItem outData = { siBuffer, };
+ PRBool isFIPS = PR_FALSE;
+
+- inData.data = (unsigned char *)hashes->md5;
+- inData.len = sizeof hashes[0];
+- outData.data = tlsFinished->verify_data;
+- outData.len = sizeof tlsFinished->verify_data;
++ inData.data = (unsigned char *) val;
++ inData.len = valLen;
++ outData.data = out;
++ outData.len = outLen;
+ rv = TLS_PRF(&spec->msItem, label, &inData, &outData, isFIPS);
+- PORT_Assert(rv != SECSuccess || \
+- outData.len == sizeof tlsFinished->verify_data);
++ PORT_Assert(rv != SECSuccess || outData.len == outLen);
+ }
+ return rv;
+ }
+
++static SECStatus
++ssl3_ComputeTLSFinished(ssl3CipherSpec *spec,
++ PRBool isServer,
++ const SSL3Finished * hashes,
++ TLSFinished * tlsFinished)
++{
++ const char * label;
++ SECStatus rv;
++
++ label = isServer ? "server finished" : "client finished";
++
++ rv = ssl3_TLSPRFWithMasterSecret(spec, label, 15, hashes->md5,
++ sizeof *hashes, tlsFinished->verify_data,
++ sizeof tlsFinished->verify_data);
++
++ return rv;
++}
++
+ /* called from ssl3_HandleServerHelloDone
+ */
+ static SECStatus
+diff --git a/mozilla/security/nss/lib/ssl/sslimpl.h b/mozilla/security/nss/lib/ssl/sslimpl.h
+index df30029..073616f 100644
+--- a/mozilla/security/nss/lib/ssl/sslimpl.h
++++ b/mozilla/security/nss/lib/ssl/sslimpl.h
+@@ -1726,6 +1726,12 @@ SECStatus SSL_DisableDefaultExportCipherSuites(void);
+ SECStatus SSL_DisableExportCipherSuites(PRFileDesc * fd);
+ PRBool SSL_IsExportCipherSuite(PRUint16 cipherSuite);
+
++SECStatus ssl3_TLSPRFWithMasterSecret(
++ ssl3CipherSpec *spec, const char *label,
++ unsigned int labelLen, const unsigned char *val,
++ unsigned int valLen, unsigned char *out,
++ unsigned int outLen);
++
+ /********************** FNV hash *********************/
+
+ 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
+--- a/mozilla/security/nss/lib/ssl/sslinfo.c
++++ b/mozilla/security/nss/lib/ssl/sslinfo.c
+@@ -20,6 +20,7 @@
+ *
+ * Contributor(s):
+ * Dr Vipul Gupta <vipul.gupta@sun.com>, Sun Microsystems Laboratories
++ * Douglas Stebila <douglas@stebila.ca>
+ *
+ * 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)
+ return PR_FALSE;
+ }
+
++/* Export keying material according to draft-ietf-tls-extractor-06.
++** fd must correspond to a TLS 1.0 or higher socket, out must
++** be already allocated.
++*/
++SECStatus
++SSL_ExportKeyingMaterial(PRFileDesc *fd, const char *label,
++ const unsigned char *context,
++ unsigned int contextLen,
++ unsigned char *out,
++ unsigned int outLen)
++{
++ sslSocket *ss;
++ unsigned char *val = NULL;
++ unsigned int valLen, i;
++ SECStatus rv = SECFailure;
++
++ ss = ssl_FindSocket(fd);
++ if (!ss) {
++ SSL_DBG(("%d: SSL[%d]: bad socket in ExportKeyingMaterial",
++ SSL_GETPID(), fd));
++ return SECFailure;
++ }
++
++ if (ss->version < SSL_LIBRARY_VERSION_3_1_TLS) {
++ PORT_SetError(SSL_ERROR_UNSUPPORTED_VERSION);
++ 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;
++ val = PORT_Alloc(valLen);
++ if (val == NULL)
++ return SECFailure;
++ i = 0;
++ PORT_Memcpy(val + i, &ss->ssl3.hs.client_random.rand, SSL3_RANDOM_LENGTH);
++ i += SSL3_RANDOM_LENGTH;
++ PORT_Memcpy(val + i, &ss->ssl3.hs.server_random.rand, SSL3_RANDOM_LENGTH);
++ i += SSL3_RANDOM_LENGTH;
++ if (contextLen > 0) {
++ val[i++] = contextLen >> 8;
++ val[i++] = contextLen;
++ PORT_Memcpy(val + i, context, contextLen);
++ i += contextLen;
++ }
++ PORT_Assert(i == valLen);
++
++ ssl_GetSpecReadLock(ss);
++ rv = ssl3_TLSPRFWithMasterSecret(ss->ssl3.crSpec, label, strlen(label), val, valLen, out, outLen);
++ ssl_ReleaseSpecReadLock(ss);
++
++ if (val != NULL)
++ PORT_ZFree(val, valLen);
++ return rv;
++}
++
+ SECItem*
+ SSL_GetNegotiatedHostInfo(PRFileDesc *fd)
+ {

Powered by Google App Engine
This is Rietveld 408576698