using System; using System.Collections; using System.Collections.Generic; using System.Text; using Mono.Security.X509; using Mono.Security.X509.Extensions; namespace System.Security.Cryptography.X509Certificates { /// Represents a chain-building engine for certificates. // Token: 0x0200028D RID: 653 public class X509Chain { /// Initializes a new instance of the class. // Token: 0x06001804 RID: 6148 RVA: 0x00050F74 File Offset: 0x0004F174 public X509Chain() : this(false) { } /// Initializes a new instance of the class specifying a value that indicates whether the machine context should be used. /// true to use the machine context; false to use the current user context. // Token: 0x06001805 RID: 6149 RVA: 0x00050F80 File Offset: 0x0004F180 public X509Chain(bool useMachineContext) { this.location = ((!useMachineContext) ? StoreLocation.CurrentUser : StoreLocation.LocalMachine); this.elements = new X509ChainElementCollection(); this.policy = new X509ChainPolicy(); } /// Initializes a new instance of the class using an handle to an X.509 chain. /// An handle to an X.509 chain. /// The parameter is null. /// The parameter points to an invalid context. // Token: 0x06001806 RID: 6150 RVA: 0x00050FB4 File Offset: 0x0004F1B4 [global::System.MonoTODO("Mono's X509Chain is fully managed. All handles are invalid.")] public X509Chain(IntPtr chainContext) { throw new NotSupportedException(); } /// Gets a handle to an X.509 chain. /// An handle to an X.509 chain. // Token: 0x1700078D RID: 1933 // (get) Token: 0x06001808 RID: 6152 RVA: 0x00050FD4 File Offset: 0x0004F1D4 [global::System.MonoTODO("Mono's X509Chain is fully managed. Always returns IntPtr.Zero.")] public IntPtr ChainContext { get { return IntPtr.Zero; } } /// Gets a collection of objects. /// An object. // Token: 0x1700078E RID: 1934 // (get) Token: 0x06001809 RID: 6153 RVA: 0x00050FDC File Offset: 0x0004F1DC public X509ChainElementCollection ChainElements { get { return this.elements; } } /// Gets or sets the to use when building an X.509 certificate chain. /// The object associated with this X.509 chain. /// The value being set for this property is null. // Token: 0x1700078F RID: 1935 // (get) Token: 0x0600180A RID: 6154 RVA: 0x00050FE4 File Offset: 0x0004F1E4 // (set) Token: 0x0600180B RID: 6155 RVA: 0x00050FEC File Offset: 0x0004F1EC public X509ChainPolicy ChainPolicy { get { return this.policy; } set { this.policy = value; } } /// Gets the status of each element in an object. /// An array of objects. /// /// /// // Token: 0x17000790 RID: 1936 // (get) Token: 0x0600180C RID: 6156 RVA: 0x00050FF8 File Offset: 0x0004F1F8 public X509ChainStatus[] ChainStatus { get { if (this.status == null) { return X509Chain.Empty; } return this.status; } } /// Builds an X.509 chain using the policy specified in . /// true if the X.509 certificate is valid; otherwise, false. /// An object. /// The is not a valid certificate or is null. /// The is unreadable. // Token: 0x0600180D RID: 6157 RVA: 0x00051014 File Offset: 0x0004F214 [global::System.MonoTODO("Not totally RFC3280 compliant, but neither is MS implementation...")] public bool Build(X509Certificate2 certificate) { if (certificate == null) { throw new ArgumentException("certificate"); } this.Reset(); X509ChainStatusFlags x509ChainStatusFlags; try { x509ChainStatusFlags = this.BuildChainFrom(certificate); this.ValidateChain(x509ChainStatusFlags); } catch (CryptographicException ex) { throw new ArgumentException("certificate", ex); } X509ChainStatusFlags x509ChainStatusFlags2 = X509ChainStatusFlags.NoError; ArrayList arrayList = new ArrayList(); foreach (X509ChainElement x509ChainElement in this.elements) { foreach (X509ChainStatus x509ChainStatus in x509ChainElement.ChainElementStatus) { if ((x509ChainStatusFlags2 & x509ChainStatus.Status) != x509ChainStatus.Status) { arrayList.Add(x509ChainStatus); x509ChainStatusFlags2 |= x509ChainStatus.Status; } } } if (x509ChainStatusFlags != X509ChainStatusFlags.NoError) { arrayList.Insert(0, new X509ChainStatus(x509ChainStatusFlags)); } this.status = (X509ChainStatus[])arrayList.ToArray(typeof(X509ChainStatus)); if (this.status.Length == 0 || this.ChainPolicy.VerificationFlags == X509VerificationFlags.AllFlags) { return true; } bool flag = true; foreach (X509ChainStatus x509ChainStatus2 in this.status) { X509ChainStatusFlags x509ChainStatusFlags3 = x509ChainStatus2.Status; if (x509ChainStatusFlags3 != X509ChainStatusFlags.NotTimeValid) { if (x509ChainStatusFlags3 != X509ChainStatusFlags.NotTimeNested) { if (x509ChainStatusFlags3 != X509ChainStatusFlags.UntrustedRoot) { if (x509ChainStatusFlags3 != X509ChainStatusFlags.InvalidExtension) { if (x509ChainStatusFlags3 != X509ChainStatusFlags.InvalidPolicyConstraints) { if (x509ChainStatusFlags3 == X509ChainStatusFlags.InvalidBasicConstraints) { flag &= (this.ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreInvalidBasicConstraints) != X509VerificationFlags.NoFlag; goto IL_316; } if (x509ChainStatusFlags3 == X509ChainStatusFlags.InvalidNameConstraints || x509ChainStatusFlags3 == X509ChainStatusFlags.HasNotSupportedNameConstraint || x509ChainStatusFlags3 == X509ChainStatusFlags.HasNotPermittedNameConstraint || x509ChainStatusFlags3 == X509ChainStatusFlags.HasExcludedNameConstraint) { flag &= (this.ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreInvalidName) != X509VerificationFlags.NoFlag; goto IL_316; } if (x509ChainStatusFlags3 == X509ChainStatusFlags.PartialChain) { goto IL_1FC; } if (x509ChainStatusFlags3 == X509ChainStatusFlags.CtlNotTimeValid) { flag &= (this.ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreCtlNotTimeValid) != X509VerificationFlags.NoFlag; goto IL_316; } if (x509ChainStatusFlags3 == X509ChainStatusFlags.CtlNotSignatureValid) { goto IL_316; } if (x509ChainStatusFlags3 == X509ChainStatusFlags.CtlNotValidForUsage) { flag &= (this.ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreWrongUsage) != X509VerificationFlags.NoFlag; goto IL_316; } if (x509ChainStatusFlags3 != X509ChainStatusFlags.NoIssuanceChainPolicy) { flag = false; goto IL_316; } } flag &= (this.ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreInvalidPolicy) != X509VerificationFlags.NoFlag; goto IL_316; } flag &= (this.ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreWrongUsage) != X509VerificationFlags.NoFlag; goto IL_316; } IL_1FC: flag &= (this.ChainPolicy.VerificationFlags & X509VerificationFlags.AllowUnknownCertificateAuthority) != X509VerificationFlags.NoFlag; } else { flag &= (this.ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreNotTimeNested) != X509VerificationFlags.NoFlag; } } else { flag &= (this.ChainPolicy.VerificationFlags & X509VerificationFlags.IgnoreNotTimeValid) != X509VerificationFlags.NoFlag; } IL_316: if (!flag) { return false; } } return true; } /// Clears the current object. // Token: 0x0600180E RID: 6158 RVA: 0x00051370 File Offset: 0x0004F570 public void Reset() { if (this.status != null && this.status.Length != 0) { this.status = null; } if (this.elements.Count > 0) { this.elements.Clear(); } if (this.roots != null) { this.roots.Close(); this.roots = null; } if (this.cas != null) { this.cas.Close(); this.cas = null; } this.collection = null; this.bce_restriction = null; this.working_public_key = null; } /// Creates an object after querying for the mapping defined in the CryptoConfig file, and maps the chain to that mapping. /// An object. /// /// /// // Token: 0x0600180F RID: 6159 RVA: 0x00051408 File Offset: 0x0004F608 public static X509Chain Create() { return (X509Chain)CryptoConfig.CreateFromName("X509Chain"); } // Token: 0x17000791 RID: 1937 // (get) Token: 0x06001810 RID: 6160 RVA: 0x0005141C File Offset: 0x0004F61C private X509Store Roots { get { if (this.roots == null) { this.roots = new X509Store(StoreName.Root, this.location); this.roots.Open(OpenFlags.ReadOnly); } return this.roots; } } // Token: 0x17000792 RID: 1938 // (get) Token: 0x06001811 RID: 6161 RVA: 0x00051450 File Offset: 0x0004F650 private X509Store CertificateAuthorities { get { if (this.cas == null) { this.cas = new X509Store(StoreName.CertificateAuthority, this.location); this.cas.Open(OpenFlags.ReadOnly); } return this.cas; } } // Token: 0x17000793 RID: 1939 // (get) Token: 0x06001812 RID: 6162 RVA: 0x00051484 File Offset: 0x0004F684 private X509Certificate2Collection CertificateCollection { get { if (this.collection == null) { this.collection = new X509Certificate2Collection(this.ChainPolicy.ExtraStore); if (this.Roots.Certificates.Count > 0) { this.collection.AddRange(this.Roots.Certificates); } if (this.CertificateAuthorities.Certificates.Count > 0) { this.collection.AddRange(this.CertificateAuthorities.Certificates); } } return this.collection; } } // Token: 0x06001813 RID: 6163 RVA: 0x00051510 File Offset: 0x0004F710 private X509ChainStatusFlags BuildChainFrom(X509Certificate2 certificate) { this.elements.Add(certificate); while (!this.IsChainComplete(certificate)) { certificate = this.FindParent(certificate); if (certificate == null) { return X509ChainStatusFlags.PartialChain; } if (this.elements.Contains(certificate)) { return X509ChainStatusFlags.Cyclic; } this.elements.Add(certificate); } if (!this.Roots.Certificates.Contains(certificate)) { this.elements[this.elements.Count - 1].StatusFlags |= X509ChainStatusFlags.UntrustedRoot; } return X509ChainStatusFlags.NoError; } // Token: 0x06001814 RID: 6164 RVA: 0x000515B0 File Offset: 0x0004F7B0 private X509Certificate2 SelectBestFromCollection(X509Certificate2 child, X509Certificate2Collection c) { int count = c.Count; if (count == 0) { return null; } if (count == 1) { return c[0]; } X509Certificate2Collection x509Certificate2Collection = c.Find(X509FindType.FindByTimeValid, this.ChainPolicy.VerificationTime, false); int count2 = x509Certificate2Collection.Count; if (count2 != 0) { if (count2 == 1) { return x509Certificate2Collection[0]; } } else { x509Certificate2Collection = c; } string authorityKeyIdentifier = this.GetAuthorityKeyIdentifier(child); if (string.IsNullOrEmpty(authorityKeyIdentifier)) { return x509Certificate2Collection[0]; } foreach (X509Certificate2 x509Certificate in x509Certificate2Collection) { string subjectKeyIdentifier = this.GetSubjectKeyIdentifier(x509Certificate); if (authorityKeyIdentifier == subjectKeyIdentifier) { return x509Certificate; } } return x509Certificate2Collection[0]; } // Token: 0x06001815 RID: 6165 RVA: 0x00051684 File Offset: 0x0004F884 private X509Certificate2 FindParent(X509Certificate2 certificate) { X509Certificate2Collection x509Certificate2Collection = this.CertificateCollection.Find(X509FindType.FindBySubjectDistinguishedName, certificate.Issuer, false); string authorityKeyIdentifier = this.GetAuthorityKeyIdentifier(certificate); if (authorityKeyIdentifier != null && authorityKeyIdentifier.Length > 0) { x509Certificate2Collection.AddRange(this.CertificateCollection.Find(X509FindType.FindBySubjectKeyIdentifier, authorityKeyIdentifier, false)); } X509Certificate2 x509Certificate = this.SelectBestFromCollection(certificate, x509Certificate2Collection); return (!certificate.Equals(x509Certificate)) ? x509Certificate : null; } // Token: 0x06001816 RID: 6166 RVA: 0x000516F0 File Offset: 0x0004F8F0 private bool IsChainComplete(X509Certificate2 certificate) { if (!this.IsSelfIssued(certificate)) { return false; } if (certificate.Version < 3) { return true; } string subjectKeyIdentifier = this.GetSubjectKeyIdentifier(certificate); if (string.IsNullOrEmpty(subjectKeyIdentifier)) { return true; } string authorityKeyIdentifier = this.GetAuthorityKeyIdentifier(certificate); return string.IsNullOrEmpty(authorityKeyIdentifier) || authorityKeyIdentifier == subjectKeyIdentifier; } // Token: 0x06001817 RID: 6167 RVA: 0x0005174C File Offset: 0x0004F94C private bool IsSelfIssued(X509Certificate2 certificate) { return certificate.Issuer == certificate.Subject; } // Token: 0x06001818 RID: 6168 RVA: 0x00051760 File Offset: 0x0004F960 private void ValidateChain(X509ChainStatusFlags flag) { int num = this.elements.Count - 1; X509Certificate2 certificate = this.elements[num].Certificate; if ((flag & X509ChainStatusFlags.PartialChain) == X509ChainStatusFlags.NoError) { this.Process(num); if (num == 0) { this.elements[0].UncompressFlags(); return; } num--; } this.working_public_key = certificate.PublicKey.Key; this.working_issuer_name = certificate.IssuerName; this.max_path_length = num; for (int i = num; i > 0; i--) { this.Process(i); this.PrepareForNextCertificate(i); } this.Process(0); this.CheckRevocationOnChain(flag); this.WrapUp(); } // Token: 0x06001819 RID: 6169 RVA: 0x00051814 File Offset: 0x0004FA14 private void Process(int n) { X509ChainElement x509ChainElement = this.elements[n]; X509Certificate2 certificate = x509ChainElement.Certificate; if (n != this.elements.Count - 1 && certificate.MonoCertificate.KeyAlgorithm == "1.2.840.10040.4.1" && certificate.MonoCertificate.KeyAlgorithmParameters == null) { X509Certificate2 certificate2 = this.elements[n + 1].Certificate; certificate.MonoCertificate.KeyAlgorithmParameters = certificate2.MonoCertificate.KeyAlgorithmParameters; } bool flag = this.working_public_key == null; if (!this.IsSignedWith(certificate, (!flag) ? this.working_public_key : certificate.PublicKey.Key) && (flag || n != this.elements.Count - 1 || this.IsSelfIssued(certificate))) { x509ChainElement.StatusFlags |= X509ChainStatusFlags.NotSignatureValid; } if (this.ChainPolicy.VerificationTime < certificate.NotBefore || this.ChainPolicy.VerificationTime > certificate.NotAfter) { x509ChainElement.StatusFlags |= X509ChainStatusFlags.NotTimeValid; } if (flag) { return; } if (!X500DistinguishedName.AreEqual(certificate.IssuerName, this.working_issuer_name)) { x509ChainElement.StatusFlags |= X509ChainStatusFlags.InvalidNameConstraints; } if (this.IsSelfIssued(certificate) || n != 0) { } } // Token: 0x0600181A RID: 6170 RVA: 0x00051988 File Offset: 0x0004FB88 private void PrepareForNextCertificate(int n) { X509ChainElement x509ChainElement = this.elements[n]; X509Certificate2 certificate = x509ChainElement.Certificate; this.working_issuer_name = certificate.SubjectName; this.working_public_key = certificate.PublicKey.Key; X509BasicConstraintsExtension x509BasicConstraintsExtension = (X509BasicConstraintsExtension)certificate.Extensions["2.5.29.19"]; if (x509BasicConstraintsExtension != null) { if (!x509BasicConstraintsExtension.CertificateAuthority) { x509ChainElement.StatusFlags |= X509ChainStatusFlags.InvalidBasicConstraints; } } else if (certificate.Version >= 3) { x509ChainElement.StatusFlags |= X509ChainStatusFlags.InvalidBasicConstraints; } if (!this.IsSelfIssued(certificate)) { if (this.max_path_length > 0) { this.max_path_length--; } else if (this.bce_restriction != null) { this.bce_restriction.StatusFlags |= X509ChainStatusFlags.InvalidBasicConstraints; } } if (x509BasicConstraintsExtension != null && x509BasicConstraintsExtension.HasPathLengthConstraint && x509BasicConstraintsExtension.PathLengthConstraint < this.max_path_length) { this.max_path_length = x509BasicConstraintsExtension.PathLengthConstraint; this.bce_restriction = x509ChainElement; } X509KeyUsageExtension x509KeyUsageExtension = (X509KeyUsageExtension)certificate.Extensions["2.5.29.15"]; if (x509KeyUsageExtension != null) { X509KeyUsageFlags x509KeyUsageFlags = X509KeyUsageFlags.KeyCertSign; if ((x509KeyUsageExtension.KeyUsages & x509KeyUsageFlags) != x509KeyUsageFlags) { x509ChainElement.StatusFlags |= X509ChainStatusFlags.NotValidForUsage; } } this.ProcessCertificateExtensions(x509ChainElement); } // Token: 0x0600181B RID: 6171 RVA: 0x00051AEC File Offset: 0x0004FCEC private void WrapUp() { X509ChainElement x509ChainElement = this.elements[0]; X509Certificate2 certificate = x509ChainElement.Certificate; if (this.IsSelfIssued(certificate)) { } this.ProcessCertificateExtensions(x509ChainElement); for (int i = this.elements.Count - 1; i >= 0; i--) { this.elements[i].UncompressFlags(); } } // Token: 0x0600181C RID: 6172 RVA: 0x00051B50 File Offset: 0x0004FD50 private void ProcessCertificateExtensions(X509ChainElement element) { foreach (X509Extension x509Extension in element.Certificate.Extensions) { if (x509Extension.Critical) { string value = x509Extension.Oid.Value; if (value != null) { if (X509Chain.<>f__switch$mapB == null) { X509Chain.<>f__switch$mapB = new Dictionary(2) { { "2.5.29.15", 0 }, { "2.5.29.19", 0 } }; } int num; if (X509Chain.<>f__switch$mapB.TryGetValue(value, out num)) { if (num == 0) { continue; } } } element.StatusFlags |= X509ChainStatusFlags.InvalidExtension; } } } // Token: 0x0600181D RID: 6173 RVA: 0x00051C0C File Offset: 0x0004FE0C private bool IsSignedWith(X509Certificate2 signed, AsymmetricAlgorithm pubkey) { if (pubkey == null) { return false; } X509Certificate monoCertificate = signed.MonoCertificate; return monoCertificate.VerifySignature(pubkey); } // Token: 0x0600181E RID: 6174 RVA: 0x00051C30 File Offset: 0x0004FE30 private string GetSubjectKeyIdentifier(X509Certificate2 certificate) { X509SubjectKeyIdentifierExtension x509SubjectKeyIdentifierExtension = (X509SubjectKeyIdentifierExtension)certificate.Extensions["2.5.29.14"]; return (x509SubjectKeyIdentifierExtension != null) ? x509SubjectKeyIdentifierExtension.SubjectKeyIdentifier : string.Empty; } // Token: 0x0600181F RID: 6175 RVA: 0x00051C6C File Offset: 0x0004FE6C private string GetAuthorityKeyIdentifier(X509Certificate2 certificate) { return this.GetAuthorityKeyIdentifier(certificate.MonoCertificate.Extensions["2.5.29.35"]); } // Token: 0x06001820 RID: 6176 RVA: 0x00051C94 File Offset: 0x0004FE94 private string GetAuthorityKeyIdentifier(X509Crl crl) { return this.GetAuthorityKeyIdentifier(crl.Extensions["2.5.29.35"]); } // Token: 0x06001821 RID: 6177 RVA: 0x00051CAC File Offset: 0x0004FEAC private string GetAuthorityKeyIdentifier(X509Extension ext) { if (ext == null) { return string.Empty; } AuthorityKeyIdentifierExtension authorityKeyIdentifierExtension = new AuthorityKeyIdentifierExtension(ext); byte[] identifier = authorityKeyIdentifierExtension.Identifier; if (identifier == null) { return string.Empty; } StringBuilder stringBuilder = new StringBuilder(); foreach (byte b in identifier) { stringBuilder.Append(b.ToString("X02")); } return stringBuilder.ToString(); } // Token: 0x06001822 RID: 6178 RVA: 0x00051D20 File Offset: 0x0004FF20 private void CheckRevocationOnChain(X509ChainStatusFlags flag) { bool flag2 = (flag & X509ChainStatusFlags.PartialChain) != X509ChainStatusFlags.NoError; bool flag3; switch (this.ChainPolicy.RevocationMode) { case X509RevocationMode.NoCheck: return; case X509RevocationMode.Online: flag3 = true; break; case X509RevocationMode.Offline: flag3 = false; break; default: throw new InvalidOperationException(global::Locale.GetText("Invalid revocation mode.")); } bool flag4 = flag2; for (int i = this.elements.Count - 1; i >= 0; i--) { bool flag5 = true; switch (this.ChainPolicy.RevocationFlag) { case X509RevocationFlag.EndCertificateOnly: flag5 = i == 0; break; case X509RevocationFlag.EntireChain: flag5 = true; break; case X509RevocationFlag.ExcludeRoot: flag5 = i != this.elements.Count - 1; break; } X509ChainElement x509ChainElement = this.elements[i]; if (!flag4) { flag4 |= (x509ChainElement.StatusFlags & X509ChainStatusFlags.NotSignatureValid) != X509ChainStatusFlags.NoError; } if (flag4) { x509ChainElement.StatusFlags |= X509ChainStatusFlags.RevocationStatusUnknown; x509ChainElement.StatusFlags |= X509ChainStatusFlags.OfflineRevocation; } else if (flag5 && !flag2 && !this.IsSelfIssued(x509ChainElement.Certificate)) { x509ChainElement.StatusFlags |= this.CheckRevocation(x509ChainElement.Certificate, i + 1, flag3); flag4 |= (x509ChainElement.StatusFlags & X509ChainStatusFlags.Revoked) != X509ChainStatusFlags.NoError; } } } // Token: 0x06001823 RID: 6179 RVA: 0x00051E98 File Offset: 0x00050098 private X509ChainStatusFlags CheckRevocation(X509Certificate2 certificate, int ca, bool online) { X509ChainStatusFlags x509ChainStatusFlags = X509ChainStatusFlags.RevocationStatusUnknown; X509ChainElement x509ChainElement = this.elements[ca]; X509Certificate2 x509Certificate = x509ChainElement.Certificate; while (this.IsSelfIssued(x509Certificate) && ca < this.elements.Count - 1) { x509ChainStatusFlags = this.CheckRevocation(certificate, x509Certificate, online); if (x509ChainStatusFlags != X509ChainStatusFlags.RevocationStatusUnknown) { break; } ca++; x509ChainElement = this.elements[ca]; x509Certificate = x509ChainElement.Certificate; } if (x509ChainStatusFlags == X509ChainStatusFlags.RevocationStatusUnknown) { x509ChainStatusFlags = this.CheckRevocation(certificate, x509Certificate, online); } return x509ChainStatusFlags; } // Token: 0x06001824 RID: 6180 RVA: 0x00051F24 File Offset: 0x00050124 private X509ChainStatusFlags CheckRevocation(X509Certificate2 certificate, X509Certificate2 ca_cert, bool online) { X509KeyUsageExtension x509KeyUsageExtension = (X509KeyUsageExtension)ca_cert.Extensions["2.5.29.15"]; if (x509KeyUsageExtension != null) { X509KeyUsageFlags x509KeyUsageFlags = X509KeyUsageFlags.CrlSign; if ((x509KeyUsageExtension.KeyUsages & x509KeyUsageFlags) != x509KeyUsageFlags) { return X509ChainStatusFlags.RevocationStatusUnknown; } } X509Crl x509Crl = this.FindCrl(ca_cert); if (x509Crl != null || online) { } if (x509Crl == null) { return X509ChainStatusFlags.RevocationStatusUnknown; } if (!x509Crl.VerifySignature(ca_cert.PublicKey.Key)) { return X509ChainStatusFlags.RevocationStatusUnknown; } X509Crl.X509CrlEntry crlEntry = x509Crl.GetCrlEntry(certificate.MonoCertificate); if (crlEntry != null) { if (!this.ProcessCrlEntryExtensions(crlEntry)) { return X509ChainStatusFlags.Revoked; } if (crlEntry.RevocationDate <= this.ChainPolicy.VerificationTime) { return X509ChainStatusFlags.Revoked; } } if (x509Crl.NextUpdate < this.ChainPolicy.VerificationTime) { return X509ChainStatusFlags.RevocationStatusUnknown | X509ChainStatusFlags.OfflineRevocation; } if (!this.ProcessCrlExtensions(x509Crl)) { return X509ChainStatusFlags.RevocationStatusUnknown; } return X509ChainStatusFlags.NoError; } // Token: 0x06001825 RID: 6181 RVA: 0x0005200C File Offset: 0x0005020C private X509Crl FindCrl(X509Certificate2 caCertificate) { string text = caCertificate.SubjectName.Decode(X500DistinguishedNameFlags.None); string subjectKeyIdentifier = this.GetSubjectKeyIdentifier(caCertificate); foreach (object obj in this.CertificateAuthorities.Store.Crls) { X509Crl x509Crl = (X509Crl)obj; if (x509Crl.IssuerName == text && (subjectKeyIdentifier.Length == 0 || subjectKeyIdentifier == this.GetAuthorityKeyIdentifier(x509Crl))) { return x509Crl; } } foreach (object obj2 in this.Roots.Store.Crls) { X509Crl x509Crl2 = (X509Crl)obj2; if (x509Crl2.IssuerName == text && (subjectKeyIdentifier.Length == 0 || subjectKeyIdentifier == this.GetAuthorityKeyIdentifier(x509Crl2))) { return x509Crl2; } } return null; } // Token: 0x06001826 RID: 6182 RVA: 0x00052174 File Offset: 0x00050374 private bool ProcessCrlExtensions(X509Crl crl) { foreach (object obj in crl.Extensions) { X509Extension x509Extension = (X509Extension)obj; if (x509Extension.Critical) { string oid = x509Extension.Oid; if (oid != null) { if (X509Chain.<>f__switch$mapC == null) { X509Chain.<>f__switch$mapC = new Dictionary(2) { { "2.5.29.20", 0 }, { "2.5.29.35", 0 } }; } int num; if (X509Chain.<>f__switch$mapC.TryGetValue(oid, out num)) { if (num == 0) { continue; } } } return false; } } return true; } // Token: 0x06001827 RID: 6183 RVA: 0x00052258 File Offset: 0x00050458 private bool ProcessCrlEntryExtensions(X509Crl.X509CrlEntry entry) { foreach (object obj in entry.Extensions) { X509Extension x509Extension = (X509Extension)obj; if (x509Extension.Critical) { string oid = x509Extension.Oid; if (oid != null) { if (X509Chain.<>f__switch$mapD == null) { X509Chain.<>f__switch$mapD = new Dictionary(1) { { "2.5.29.21", 0 } }; } int num; if (X509Chain.<>f__switch$mapD.TryGetValue(oid, out num)) { if (num == 0) { continue; } } } return false; } } return true; } // Token: 0x04001307 RID: 4871 private StoreLocation location; // Token: 0x04001308 RID: 4872 private X509ChainElementCollection elements; // Token: 0x04001309 RID: 4873 private X509ChainPolicy policy; // Token: 0x0400130A RID: 4874 private X509ChainStatus[] status; // Token: 0x0400130B RID: 4875 private static X509ChainStatus[] Empty = new X509ChainStatus[0]; // Token: 0x0400130C RID: 4876 private int max_path_length; // Token: 0x0400130D RID: 4877 private X500DistinguishedName working_issuer_name; // Token: 0x0400130E RID: 4878 private AsymmetricAlgorithm working_public_key; // Token: 0x0400130F RID: 4879 private X509ChainElement bce_restriction; // Token: 0x04001310 RID: 4880 private X509Store roots; // Token: 0x04001311 RID: 4881 private X509Store cas; // Token: 0x04001312 RID: 4882 private X509Certificate2Collection collection; } }