Files
Dec2017-Script-Dump/Mono.Security/Security/Protocol/Tls/Handshake/Server/TlsClientCertificate.cs
T
2026-06-04 11:42:34 +02:00

219 lines
7.1 KiB
C#

using System;
using System.Collections;
using System.Security.Cryptography.X509Certificates;
using Mono.Security.X509;
using Mono.Security.X509.Extensions;
namespace Mono.Security.Protocol.Tls.Handshake.Server
{
// Token: 0x020000B2 RID: 178
internal class TlsClientCertificate : HandshakeMessage
{
// Token: 0x06000699 RID: 1689 RVA: 0x00024D90 File Offset: 0x00022F90
public TlsClientCertificate(Context context, byte[] buffer)
: base(context, HandshakeType.Certificate, buffer)
{
}
// Token: 0x0600069A RID: 1690 RVA: 0x00024D9C File Offset: 0x00022F9C
public override void Update()
{
foreach (Mono.Security.X509.X509Certificate x509Certificate in this.clientCertificates)
{
base.Context.ClientSettings.Certificates.Add(new global::System.Security.Cryptography.X509Certificates.X509Certificate(x509Certificate.RawData));
}
}
// Token: 0x0600069B RID: 1691 RVA: 0x00024E20 File Offset: 0x00023020
protected override void ProcessAsSsl3()
{
this.ProcessAsTls1();
}
// Token: 0x0600069C RID: 1692 RVA: 0x00024E28 File Offset: 0x00023028
protected override void ProcessAsTls1()
{
int num = 0;
int i = base.ReadInt24();
this.clientCertificates = new Mono.Security.X509.X509CertificateCollection();
while (i > num)
{
int num2 = base.ReadInt24();
num += num2 + 3;
byte[] array = base.ReadBytes(num2);
this.clientCertificates.Add(new Mono.Security.X509.X509Certificate(array));
}
if (this.clientCertificates.Count > 0)
{
this.validateCertificates(this.clientCertificates);
}
else if ((base.Context as ServerContext).ClientCertificateRequired)
{
throw new TlsException(AlertDescription.NoCertificate);
}
}
// Token: 0x0600069D RID: 1693 RVA: 0x00024EBC File Offset: 0x000230BC
private bool checkCertificateUsage(Mono.Security.X509.X509Certificate cert)
{
ServerContext serverContext = (ServerContext)base.Context;
if (cert.Version < 3)
{
return true;
}
KeyUsages keyUsages = KeyUsages.none;
switch (serverContext.Negotiating.Cipher.ExchangeAlgorithmType)
{
case ExchangeAlgorithmType.DiffieHellman:
keyUsages = KeyUsages.keyAgreement;
break;
case ExchangeAlgorithmType.Fortezza:
return false;
case ExchangeAlgorithmType.RsaKeyX:
case ExchangeAlgorithmType.RsaSign:
keyUsages = KeyUsages.digitalSignature;
break;
}
KeyUsageExtension keyUsageExtension = null;
ExtendedKeyUsageExtension extendedKeyUsageExtension = null;
Mono.Security.X509.X509Extension x509Extension = cert.Extensions["2.5.29.15"];
if (x509Extension != null)
{
keyUsageExtension = new KeyUsageExtension(x509Extension);
}
x509Extension = cert.Extensions["2.5.29.37"];
if (x509Extension != null)
{
extendedKeyUsageExtension = new ExtendedKeyUsageExtension(x509Extension);
}
if (keyUsageExtension != null && extendedKeyUsageExtension != null)
{
return keyUsageExtension.Support(keyUsages) && extendedKeyUsageExtension.KeyPurpose.Contains("1.3.6.1.5.5.7.3.2");
}
if (keyUsageExtension != null)
{
return keyUsageExtension.Support(keyUsages);
}
if (extendedKeyUsageExtension != null)
{
return extendedKeyUsageExtension.KeyPurpose.Contains("1.3.6.1.5.5.7.3.2");
}
x509Extension = cert.Extensions["2.16.840.1.113730.1.1"];
if (x509Extension != null)
{
NetscapeCertTypeExtension netscapeCertTypeExtension = new NetscapeCertTypeExtension(x509Extension);
return netscapeCertTypeExtension.Support(NetscapeCertTypeExtension.CertTypes.SslClient);
}
return false;
}
// Token: 0x0600069E RID: 1694 RVA: 0x00024FF4 File Offset: 0x000231F4
private void validateCertificates(Mono.Security.X509.X509CertificateCollection certificates)
{
ServerContext serverContext = (ServerContext)base.Context;
AlertDescription alertDescription = AlertDescription.BadCertificate;
global::System.Security.Cryptography.X509Certificates.X509Certificate x509Certificate = null;
int[] array = null;
if (certificates.Count > 0)
{
Mono.Security.X509.X509Certificate x509Certificate2 = certificates[0];
ArrayList arrayList = new ArrayList();
if (!this.checkCertificateUsage(x509Certificate2))
{
arrayList.Add(-2146762490);
}
Mono.Security.X509.X509Chain x509Chain;
if (certificates.Count > 1)
{
Mono.Security.X509.X509CertificateCollection x509CertificateCollection = new Mono.Security.X509.X509CertificateCollection(certificates);
x509CertificateCollection.Remove(x509Certificate2);
x509Chain = new Mono.Security.X509.X509Chain(x509CertificateCollection);
}
else
{
x509Chain = new Mono.Security.X509.X509Chain();
}
bool flag = false;
try
{
flag = x509Chain.Build(x509Certificate2);
}
catch (Exception)
{
flag = false;
}
if (!flag)
{
Mono.Security.X509.X509ChainStatusFlags status = x509Chain.Status;
if (status != Mono.Security.X509.X509ChainStatusFlags.NotTimeValid)
{
if (status != Mono.Security.X509.X509ChainStatusFlags.NotTimeNested)
{
if (status != Mono.Security.X509.X509ChainStatusFlags.NotSignatureValid)
{
if (status != Mono.Security.X509.X509ChainStatusFlags.UntrustedRoot)
{
if (status != Mono.Security.X509.X509ChainStatusFlags.InvalidBasicConstraints)
{
if (status != Mono.Security.X509.X509ChainStatusFlags.PartialChain)
{
alertDescription = AlertDescription.CertificateUnknown;
arrayList.Add((int)x509Chain.Status);
}
else
{
alertDescription = AlertDescription.UnknownCA;
arrayList.Add(-2146762486);
}
}
else
{
arrayList.Add(-2146869223);
}
}
else
{
alertDescription = AlertDescription.UnknownCA;
arrayList.Add(-2146762487);
}
}
else
{
arrayList.Add(-2146869232);
}
}
else
{
arrayList.Add(-2146762494);
}
}
else
{
alertDescription = AlertDescription.CertificateExpired;
arrayList.Add(-2146762495);
}
}
x509Certificate = new global::System.Security.Cryptography.X509Certificates.X509Certificate(x509Certificate2.RawData);
array = (int[])arrayList.ToArray(typeof(int));
}
else
{
array = new int[0];
}
global::System.Security.Cryptography.X509Certificates.X509CertificateCollection x509CertificateCollection2 = new global::System.Security.Cryptography.X509Certificates.X509CertificateCollection();
foreach (Mono.Security.X509.X509Certificate x509Certificate3 in certificates)
{
x509CertificateCollection2.Add(new global::System.Security.Cryptography.X509Certificates.X509Certificate(x509Certificate3.RawData));
}
if (!serverContext.SslStream.RaiseClientCertificateValidation(x509Certificate, array))
{
throw new TlsException(alertDescription, "Invalid certificate received from client.");
}
base.Context.ClientSettings.ClientCertificate = x509Certificate;
}
// Token: 0x04000329 RID: 809
private Mono.Security.X509.X509CertificateCollection clientCertificates;
}
}