Index: net/third_party/nss/ssl/sslinfo.c |
=================================================================== |
--- net/third_party/nss/ssl/sslinfo.c (revision 126517) |
+++ net/third_party/nss/ssl/sslinfo.c (working copy) |
@@ -317,18 +317,12 @@ |
return PR_FALSE; |
} |
-/* 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, |
- unsigned int labelLen, |
- const unsigned char *context, |
- unsigned int contextLen, |
- unsigned char *out, |
- unsigned int outLen) |
+ const char *label, unsigned int labelLen, |
+ PRBool hasContext, |
+ const unsigned char *context, unsigned int contextLen, |
+ unsigned char *out, unsigned int outLen) |
{ |
sslSocket *ss; |
unsigned char *val = NULL; |
@@ -347,18 +341,21 @@ |
return SECFailure; |
} |
+ /* construct PRF arguments */ |
valLen = SSL3_RANDOM_LENGTH * 2; |
- if (contextLen > 0) |
+ if (hasContext) { |
valLen += 2 /* uint16 length */ + contextLen; |
+ } |
val = PORT_Alloc(valLen); |
- if (val == NULL) |
+ if (!val) { |
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) { |
+ if (hasContext) { |
val[i++] = contextLen >> 8; |
val[i++] = contextLen; |
PORT_Memcpy(val + i, context, contextLen); |
@@ -366,6 +363,9 @@ |
} |
PORT_Assert(i == valLen); |
+ /* Allow TLS keying material to be exported sooner, when the master |
+ * secret is available and we have sent ChangeCipherSpec. |
+ */ |
ssl_GetSpecReadLock(ss); |
if (!ss->ssl3.cwSpec->master_secret && !ss->ssl3.cwSpec->msItem.len) { |
PORT_SetError(SSL_ERROR_HANDSHAKE_NOT_COMPLETED); |