Files
2026-06-04 11:42:34 +02:00

131 lines
4.2 KiB
C#

using System;
using System.Security.Cryptography;
using Mono.Security.Cryptography;
namespace Mono.Security.Protocol.Tls.Handshake.Client
{
// Token: 0x020000A8 RID: 168
internal class TlsClientCertificateVerify : HandshakeMessage
{
// Token: 0x06000666 RID: 1638 RVA: 0x0002395C File Offset: 0x00021B5C
public TlsClientCertificateVerify(Context context)
: base(context, HandshakeType.CertificateVerify)
{
}
// Token: 0x06000667 RID: 1639 RVA: 0x00023968 File Offset: 0x00021B68
public override void Update()
{
base.Update();
base.Reset();
}
// Token: 0x06000668 RID: 1640 RVA: 0x00023978 File Offset: 0x00021B78
protected override void ProcessAsSsl3()
{
AsymmetricAlgorithm asymmetricAlgorithm = null;
ClientContext clientContext = (ClientContext)base.Context;
asymmetricAlgorithm = clientContext.SslStream.RaisePrivateKeySelection(clientContext.ClientSettings.ClientCertificate, clientContext.ClientSettings.TargetHost);
if (asymmetricAlgorithm == null)
{
throw new TlsException(AlertDescription.UserCancelled, "Client certificate Private Key unavailable.");
}
SslHandshakeHash sslHandshakeHash = new SslHandshakeHash(clientContext.MasterSecret);
sslHandshakeHash.TransformFinalBlock(clientContext.HandshakeMessages.ToArray(), 0, (int)clientContext.HandshakeMessages.Length);
byte[] array = null;
if (!(asymmetricAlgorithm is RSACryptoServiceProvider))
{
try
{
array = sslHandshakeHash.CreateSignature((RSA)asymmetricAlgorithm);
}
catch (NotImplementedException)
{
}
}
if (array == null)
{
RSA clientCertRSA = this.getClientCertRSA((RSA)asymmetricAlgorithm);
array = sslHandshakeHash.CreateSignature(clientCertRSA);
}
base.Write((short)array.Length);
this.Write(array, 0, array.Length);
}
// Token: 0x06000669 RID: 1641 RVA: 0x00023A68 File Offset: 0x00021C68
protected override void ProcessAsTls1()
{
AsymmetricAlgorithm asymmetricAlgorithm = null;
ClientContext clientContext = (ClientContext)base.Context;
asymmetricAlgorithm = clientContext.SslStream.RaisePrivateKeySelection(clientContext.ClientSettings.ClientCertificate, clientContext.ClientSettings.TargetHost);
if (asymmetricAlgorithm == null)
{
throw new TlsException(AlertDescription.UserCancelled, "Client certificate Private Key unavailable.");
}
MD5SHA1 md5SHA = new MD5SHA1();
md5SHA.ComputeHash(clientContext.HandshakeMessages.ToArray(), 0, (int)clientContext.HandshakeMessages.Length);
byte[] array = null;
if (!(asymmetricAlgorithm is RSACryptoServiceProvider))
{
try
{
array = md5SHA.CreateSignature((RSA)asymmetricAlgorithm);
}
catch (NotImplementedException)
{
}
}
if (array == null)
{
RSA clientCertRSA = this.getClientCertRSA((RSA)asymmetricAlgorithm);
array = md5SHA.CreateSignature(clientCertRSA);
}
base.Write((short)array.Length);
this.Write(array, 0, array.Length);
}
// Token: 0x0600066A RID: 1642 RVA: 0x00023B50 File Offset: 0x00021D50
private RSA getClientCertRSA(RSA privKey)
{
RSAParameters rsaparameters = default(RSAParameters);
RSAParameters rsaparameters2 = privKey.ExportParameters(true);
ASN1 asn = new ASN1(base.Context.ClientSettings.Certificates[0].GetPublicKey());
ASN1 asn2 = asn[0];
if (asn2 == null || asn2.Tag != 2)
{
return null;
}
ASN1 asn3 = asn[1];
if (asn3.Tag != 2)
{
return null;
}
rsaparameters.Modulus = this.getUnsignedBigInteger(asn2.Value);
rsaparameters.Exponent = asn3.Value;
rsaparameters.D = rsaparameters2.D;
rsaparameters.DP = rsaparameters2.DP;
rsaparameters.DQ = rsaparameters2.DQ;
rsaparameters.InverseQ = rsaparameters2.InverseQ;
rsaparameters.P = rsaparameters2.P;
rsaparameters.Q = rsaparameters2.Q;
int num = rsaparameters.Modulus.Length << 3;
RSAManaged rsamanaged = new RSAManaged(num);
rsamanaged.ImportParameters(rsaparameters);
return rsamanaged;
}
// Token: 0x0600066B RID: 1643 RVA: 0x00023C58 File Offset: 0x00021E58
private byte[] getUnsignedBigInteger(byte[] integer)
{
if (integer[0] == 0)
{
int num = integer.Length - 1;
byte[] array = new byte[num];
Buffer.BlockCopy(integer, 1, array, 0, num);
return array;
}
return integer;
}
}
}