AK056/Assets/script/lib/Best HTTP (Pro)/BestHTTP/SecureProtocol/crypto/tls/SimulatedTlsSrpIdentityManager.cs
2025-05-07 11:20:40 +08:00

74 lines
3.0 KiB
C#

#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Agreement.Srp;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Macs;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Math;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Tls
{
/**
* An implementation of {@link TlsSRPIdentityManager} that simulates the existence of "unknown" identities
* to obscure the fact that there is no verifier for them.
*/
public class SimulatedTlsSrpIdentityManager
: TlsSrpIdentityManager
{
private static readonly byte[] PREFIX_PASSWORD = Strings.ToByteArray("password");
private static readonly byte[] PREFIX_SALT = Strings.ToByteArray("salt");
/**
* Create a {@link SimulatedTlsSRPIdentityManager} that implements the algorithm from RFC 5054 2.5.1.3
*
* @param group the {@link SRP6GroupParameters} defining the group that SRP is operating in
* @param seedKey the secret "seed key" referred to in RFC 5054 2.5.1.3
* @return an instance of {@link SimulatedTlsSRPIdentityManager}
*/
public static SimulatedTlsSrpIdentityManager GetRfc5054Default(Srp6GroupParameters group, byte[] seedKey)
{
Srp6VerifierGenerator verifierGenerator = new Srp6VerifierGenerator();
verifierGenerator.Init(group, TlsUtilities.CreateHash(HashAlgorithm.sha1));
HMac mac = new HMac(TlsUtilities.CreateHash(HashAlgorithm.sha1));
mac.Init(new KeyParameter(seedKey));
return new SimulatedTlsSrpIdentityManager(group, verifierGenerator, mac);
}
protected readonly Srp6GroupParameters mGroup;
protected readonly Srp6VerifierGenerator mVerifierGenerator;
protected readonly IMac mMac;
public SimulatedTlsSrpIdentityManager(Srp6GroupParameters group, Srp6VerifierGenerator verifierGenerator, IMac mac)
{
this.mGroup = group;
this.mVerifierGenerator = verifierGenerator;
this.mMac = mac;
}
public virtual TlsSrpLoginParameters GetLoginParameters(byte[] identity)
{
mMac.BlockUpdate(PREFIX_SALT, 0, PREFIX_SALT.Length);
mMac.BlockUpdate(identity, 0, identity.Length);
byte[] salt = new byte[mMac.GetMacSize()];
mMac.DoFinal(salt, 0);
mMac.BlockUpdate(PREFIX_PASSWORD, 0, PREFIX_PASSWORD.Length);
mMac.BlockUpdate(identity, 0, identity.Length);
byte[] password = new byte[mMac.GetMacSize()];
mMac.DoFinal(password, 0);
BigInteger verifier = mVerifierGenerator.GenerateVerifier(salt, identity, password);
return new TlsSrpLoginParameters(mGroup, verifier, salt);
}
}
}
#pragma warning restore
#endif