| Index: net/third_party/nss/patches/keylog.patch
|
| diff --git a/net/third_party/nss/patches/keylog.patch b/net/third_party/nss/patches/keylog.patch
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7ad8e2de98e6f3baab0c3d806781b953cacec1e4
|
| --- /dev/null
|
| +++ b/net/third_party/nss/patches/keylog.patch
|
| @@ -0,0 +1,149 @@
|
| +diff --git a/net/third_party/nss/ssl/ssl3con.c b/net/third_party/nss/ssl/ssl3con.c
|
| +index f714a98..886d45b 100644
|
| +--- a/net/third_party/nss/ssl/ssl3con.c
|
| ++++ b/net/third_party/nss/ssl/ssl3con.c
|
| +@@ -4832,16 +4832,17 @@ sendRSAClientKeyExchange(sslSocket * ss, SECKEYPublicKey * svrPubKey)
|
| + goto loser;
|
| + }
|
| +
|
| +-#if defined(TRACE)
|
| +- if (ssl_trace >= 100 || ssl_keylog_iob) {
|
| ++ if (ssl_keylog_iob) {
|
| + SECStatus extractRV = PK11_ExtractKeyValue(pms);
|
| + if (extractRV == SECSuccess) {
|
| + SECItem * keyData = PK11_GetKeyData(pms);
|
| + if (keyData && keyData->data && keyData->len) {
|
| ++#ifdef TRACE
|
| + if (ssl_trace >= 100) {
|
| + ssl_PrintBuf(ss, "Pre-Master Secret",
|
| + keyData->data, keyData->len);
|
| + }
|
| ++#endif
|
| + if (ssl_keylog_iob && enc_pms.len >= 8 && keyData->len == 48) {
|
| + /* https://developer.mozilla.org/en/NSS_Key_Log_Format */
|
| +
|
| +@@ -4872,7 +4873,6 @@ sendRSAClientKeyExchange(sslSocket * ss, SECKEYPublicKey * svrPubKey)
|
| + }
|
| + }
|
| + }
|
| +-#endif
|
| +
|
| + rv = ssl3_InitPendingCipherSpec(ss, pms);
|
| + PK11_FreeSymKey(pms); pms = NULL;
|
| +@@ -8984,6 +8984,74 @@ loser:
|
| + return rv;
|
| + }
|
| +
|
| ++/* called from ssl3_SendFinished
|
| ++ *
|
| ++ * Caller must already hold the SpecReadLock. (wish we could assert that!).
|
| ++ * This function is simply a debugging aid and therefore does not return a
|
| ++ * SECStatus. */
|
| ++static void
|
| ++ssl3_RecordKeyLog(sslSocket *ss)
|
| ++{
|
| ++ sslSessionID *sid;
|
| ++ SECStatus rv;
|
| ++ SECItem *keyData;
|
| ++ char buf[14 /* "CLIENT_RANDOM " */ +
|
| ++ 32*2 /* client_random */ +
|
| ++ 1 /* " " */ +
|
| ++ 48*2 /* master secret */ +
|
| ++ 1 /* new line */];
|
| ++ static const char hextable[16] = "0123456789abcdef";
|
| ++ unsigned int i, j;
|
| ++
|
| ++ PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
|
| ++ PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
|
| ++
|
| ++ sid = ss->sec.ci.sid;
|
| ++
|
| ++ if (!ssl_keylog_iob)
|
| ++ return;
|
| ++
|
| ++ rv = PK11_ExtractKeyValue(ss->ssl3.cwSpec->master_secret);
|
| ++ if (rv != SECSuccess)
|
| ++ return;
|
| ++
|
| ++ /* keyData does not need to be freed. */
|
| ++ keyData = PK11_GetKeyData(ss->ssl3.cwSpec->master_secret);
|
| ++ if (!keyData || !keyData->data || keyData->len != 48)
|
| ++ return;
|
| ++
|
| ++ /* https://developer.mozilla.org/en/NSS_Key_Log_Format */
|
| ++
|
| ++ /* There could be multiple, concurrent writers to the
|
| ++ * keylog, so we have to do everything in a single call to
|
| ++ * fwrite. */
|
| ++
|
| ++ memcpy(buf, "CLIENT_RANDOM ", 14);
|
| ++ j = 14;
|
| ++ for (i = 0; i < SSL3_RANDOM_LENGTH; i++) {
|
| ++ buf[j + 2*i] = hextable[ss->ssl3.hs.client_random.rand[i] >> 4];
|
| ++ buf[j + 2*i + 1] = hextable[ss->ssl3.hs.client_random.rand[i] & 15];
|
| ++ }
|
| ++ j += SSL3_RANDOM_LENGTH*2;
|
| ++ buf[j++] = ' ';
|
| ++
|
| ++ for (i = 0; i < 48; i++) {
|
| ++ buf[j + 2*i] = hextable[keyData->data[i] >> 4];
|
| ++ buf[j + 2*i + 1] = hextable[keyData->data[i] & 15];
|
| ++ }
|
| ++ j += 48*2;
|
| ++ buf[j++] = '\n';
|
| ++
|
| ++ PORT_Assert(j == sizeof(buf));
|
| ++
|
| ++ if (fwrite(buf, sizeof(buf), 1, ssl_keylog_iob) != 1 ||
|
| ++ fflush(ssl_keylog_iob) != 0) {
|
| ++ return;
|
| ++ }
|
| ++
|
| ++ return;
|
| ++}
|
| ++
|
| + /* called from ssl3_HandleServerHelloDone
|
| + * ssl3_HandleClientHello
|
| + * ssl3_HandleFinished
|
| +@@ -9045,6 +9113,9 @@ ssl3_SendFinished(sslSocket *ss, PRInt32 flags)
|
| + if (rv != SECSuccess) {
|
| + goto fail; /* error code set by ssl3_FlushHandshake */
|
| + }
|
| ++
|
| ++ ssl3_RecordKeyLog(ss);
|
| ++
|
| + return SECSuccess;
|
| +
|
| + fail:
|
| +diff --git a/net/third_party/nss/ssl/sslsock.c b/net/third_party/nss/ssl/sslsock.c
|
| +index 9498828..146493f 100644
|
| +--- a/net/third_party/nss/ssl/sslsock.c
|
| ++++ b/net/third_party/nss/ssl/sslsock.c
|
| +@@ -2827,6 +2827,13 @@ ssl_SetDefaultsFromEnvironment(void)
|
| + ssl_trace = atoi(ev);
|
| + SSL_TRACE(("SSL: tracing set to %d", ssl_trace));
|
| + }
|
| ++#endif /* TRACE */
|
| ++ ev = getenv("SSLDEBUG");
|
| ++ if (ev && ev[0]) {
|
| ++ ssl_debug = atoi(ev);
|
| ++ SSL_TRACE(("SSL: debugging set to %d", ssl_debug));
|
| ++ }
|
| ++#endif /* DEBUG */
|
| + ev = getenv("SSLKEYLOGFILE");
|
| + if (ev && ev[0]) {
|
| + ssl_keylog_iob = fopen(ev, "a");
|
| +@@ -2836,13 +2843,6 @@ ssl_SetDefaultsFromEnvironment(void)
|
| + }
|
| + SSL_TRACE(("SSL: logging pre-master secrets to %s", ev));
|
| + }
|
| +-#endif /* TRACE */
|
| +- ev = getenv("SSLDEBUG");
|
| +- if (ev && ev[0]) {
|
| +- ssl_debug = atoi(ev);
|
| +- SSL_TRACE(("SSL: debugging set to %d", ssl_debug));
|
| +- }
|
| +-#endif /* DEBUG */
|
| + ev = getenv("SSLBYPASS");
|
| + if (ev && ev[0]) {
|
| + ssl_defaults.bypassPKCS11 = (ev[0] == '1');
|
|
|