public bool Build(X509Certificate2 certificate)
{
if (certificate == null)
{
throw new ArgumentException("certificate");
}
Reset();
X509ChainStatusFlags x509ChainStatusFlags;
try
{
x509ChainStatusFlags = BuildChainFrom(certificate);
ValidateChain(x509ChainStatusFlags);
}
catch (CryptographicException innerException)
{
throw new ArgumentException("certificate", innerException);
IL_0038:;
}
X509ChainStatusFlags x509ChainStatusFlags2 = X509ChainStatusFlags.NoError;
ArrayList arrayList = new ArrayList();
X509ChainElementEnumerator enumerator = elements.GetEnumerator();
while (enumerator.MoveNext())
{
X509ChainElement current = enumerator.Current;
X509ChainStatus[] chainElementStatus = current.ChainElementStatus;
for (int i = 0; i < chainElementStatus.Length; i++)
{
X509ChainStatus x509ChainStatus = chainElementStatus[i];
if ((x509ChainStatusFlags2 & x509ChainStatus.Status) != x509ChainStatus.Status)
{
arrayList.Add(x509ChainStatus);
x509ChainStatusFlags2 |= x509ChainStatus.Status;
}
}
}
if (x509ChainStatusFlags != 0)
{
arrayList.Insert(0, new X509ChainStatus(x509ChainStatusFlags));
}
status = (X509ChainStatus[])arrayList.ToArray(typeof(X509ChainStatus));
if (status.Length == 0 || ChainPolicy.VerificationFlags == X509VerificationFlags.AllFlags)
{
return(true);
}
bool flag = true;
X509ChainStatus[] array = status;
for (int j = 0; j < array.Length; j++)
{
X509ChainStatus x509ChainStatus2 = array[j];
switch (x509ChainStatus2.Status)
{
case X509ChainStatusFlags.UntrustedRoot:
case X509ChainStatusFlags.PartialChain:
flag &= ((ChainPolicy.VerificationFlags & X509VerificationFlags.AllowUnknownCertificateAuthority) != X509VerificationFlags.NoFlag);
break;
case X509ChainStatusFlags.NotTimeValid:
flag &= ((ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreNotTimeValid) != X509VerificationFlags.NoFlag);
break;
case X509ChainStatusFlags.NotTimeNested:
flag &= ((ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreNotTimeNested) != X509VerificationFlags.NoFlag);
break;
case X509ChainStatusFlags.InvalidBasicConstraints:
flag &= ((ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreInvalidBasicConstraints) != X509VerificationFlags.NoFlag);
break;
case X509ChainStatusFlags.InvalidPolicyConstraints:
case X509ChainStatusFlags.NoIssuanceChainPolicy:
flag &= ((ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreInvalidPolicy) != X509VerificationFlags.NoFlag);
break;
case X509ChainStatusFlags.InvalidNameConstraints:
case X509ChainStatusFlags.HasNotSupportedNameConstraint:
case X509ChainStatusFlags.HasNotPermittedNameConstraint:
case X509ChainStatusFlags.HasExcludedNameConstraint:
flag &= ((ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreInvalidName) != X509VerificationFlags.NoFlag);
break;
case X509ChainStatusFlags.InvalidExtension:
flag &= ((ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreWrongUsage) != X509VerificationFlags.NoFlag);
break;
case X509ChainStatusFlags.CtlNotTimeValid:
flag &= ((ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreCtlNotTimeValid) != X509VerificationFlags.NoFlag);
break;
case X509ChainStatusFlags.CtlNotValidForUsage:
flag &= ((ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreWrongUsage) != X509VerificationFlags.NoFlag);
break;
default:
flag = false;
break;
case X509ChainStatusFlags.CtlNotSignatureValid:
break;
}
if (!flag)
{
return(false);
}
}
return(true);
}