培训考核三期,新版培训,网页版培训登录器
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

75 lines
3.1 KiB

#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
using System;
using System.Diagnostics;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Tls;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Tls.Crypto;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Tls.Crypto.Impl;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Encoders;
// https://www.m00nie.com/2015/05/decrypt-https-ssltls-with-wireshark/
// https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format
// https://github.com/bcgit/bc-csharp/issues/343
namespace BestHTTP.Connections.TLS
{
/// <summary>
/// https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format
/// </summary>
internal enum Labels
{
CLIENT_RANDOM,
CLIENT_EARLY_TRAFFIC_SECRET,
CLIENT_HANDSHAKE_TRAFFIC_SECRET,
SERVER_HANDSHAKE_TRAFFIC_SECRET,
CLIENT_TRAFFIC_SECRET_0,
SERVER_TRAFFIC_SECRET_0,
EARLY_EXPORTER_SECRET,
EXPORTER_SECRET
}
internal static class KeyLogFileWriter
{
private static string GetKeylogFileName() => Environment.GetEnvironmentVariable("SSLKEYLOGFILE", EnvironmentVariableTarget.User);
[Conditional("UNITY_EDITOR")]
public static void WriteLabel(Labels label, byte[] clientRandom, TlsSecret secret)
{
if (clientRandom != null && secret != null)
{
string SSLKEYLOGFILE = GetKeylogFileName();
if (!string.IsNullOrEmpty(SSLKEYLOGFILE))
using (var writer = new StreamWriter(System.IO.File.Open(SSLKEYLOGFILE, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)))
writer.WriteLine($"{label} {Hex.ToHexString(clientRandom)} {Hex.ToHexString((secret as AbstractTlsSecret).CopyData())}");
}
}
[Conditional("UNITY_EDITOR")]
public static void WriteLabel(Labels label, SecurityParameters securityParameters)
{
try
{
TlsSecret secret = null;
switch (label)
{
case Labels.CLIENT_RANDOM: secret = securityParameters.MasterSecret; break;
case Labels.CLIENT_HANDSHAKE_TRAFFIC_SECRET: secret = securityParameters.TrafficSecretClient; break;
case Labels.SERVER_HANDSHAKE_TRAFFIC_SECRET: secret = securityParameters.TrafficSecretServer; break;
case Labels.CLIENT_TRAFFIC_SECRET_0: secret = securityParameters.TrafficSecretClient; break;
case Labels.SERVER_TRAFFIC_SECRET_0: secret = securityParameters.TrafficSecretServer; break;
case Labels.EXPORTER_SECRET: secret = securityParameters.ExporterMasterSecret; break;
case Labels.CLIENT_EARLY_TRAFFIC_SECRET: break;
case Labels.EARLY_EXPORTER_SECRET: break;
}
if (secret != null)
WriteLabel(label, securityParameters.ClientRandom, secret);
}
catch
{ }
}
}
}
#endif