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); }