using System; using System.Text; using Mono.Security; using Mono.Security.X509; namespace System.Security.Cryptography.X509Certificates { /// Represents the distinguished name of an X509 certificate. This class cannot be inherited. // Token: 0x02000285 RID: 645 [global::System.MonoTODO("Some X500DistinguishedNameFlags options aren't supported, like DoNotUsePlusSign, DoNotUseQuotes and ForceUTF8Encoding")] public sealed class X500DistinguishedName : AsnEncodedData { /// Initializes a new instance of the class using the specified object. /// An object that represents the distinguished name. // Token: 0x06001787 RID: 6023 RVA: 0x0004E964 File Offset: 0x0004CB64 public X500DistinguishedName(AsnEncodedData encodedDistinguishedName) { if (encodedDistinguishedName == null) { throw new ArgumentNullException("encodedDistinguishedName"); } base.RawData = encodedDistinguishedName.RawData; if (base.RawData.Length > 0) { this.DecodeRawData(); } else { this.name = string.Empty; } } /// Initializes a new instance of the class using information from the specified byte array. /// A byte array that contains distinguished name information. // Token: 0x06001788 RID: 6024 RVA: 0x0004E9B8 File Offset: 0x0004CBB8 public X500DistinguishedName(byte[] encodedDistinguishedName) { if (encodedDistinguishedName == null) { throw new ArgumentNullException("encodedDistinguishedName"); } base.Oid = new Oid(); base.RawData = encodedDistinguishedName; if (encodedDistinguishedName.Length > 0) { this.DecodeRawData(); } else { this.name = string.Empty; } } /// Initializes a new instance of the class using information from the specified string. /// A string that represents the distinguished name. // Token: 0x06001789 RID: 6025 RVA: 0x0004EA10 File Offset: 0x0004CC10 public X500DistinguishedName(string distinguishedName) : this(distinguishedName, X500DistinguishedNameFlags.Reversed) { } /// Initializes a new instance of the class using the specified string and flag. /// A string that represents the distinguished name. /// An object that specifies the characteristics of the distinguished name. // Token: 0x0600178A RID: 6026 RVA: 0x0004EA1C File Offset: 0x0004CC1C public X500DistinguishedName(string distinguishedName, X500DistinguishedNameFlags flag) { if (distinguishedName == null) { throw new ArgumentNullException("distinguishedName"); } if (flag != X500DistinguishedNameFlags.None && (flag & (X500DistinguishedNameFlags.Reversed | X500DistinguishedNameFlags.UseSemicolons | X500DistinguishedNameFlags.DoNotUsePlusSign | X500DistinguishedNameFlags.DoNotUseQuotes | X500DistinguishedNameFlags.UseCommas | X500DistinguishedNameFlags.UseNewLines | X500DistinguishedNameFlags.UseUTF8Encoding | X500DistinguishedNameFlags.UseT61Encoding | X500DistinguishedNameFlags.ForceUTF8Encoding)) == X500DistinguishedNameFlags.None) { throw new ArgumentException("flag"); } base.Oid = new Oid(); if (distinguishedName.Length == 0) { byte[] array = new byte[2]; array[0] = 48; base.RawData = array; this.DecodeRawData(); } else { ASN1 asn = X501.FromString(distinguishedName); if ((flag & X500DistinguishedNameFlags.Reversed) != X500DistinguishedNameFlags.None) { ASN1 asn2 = new ASN1(48); for (int i = asn.Count - 1; i >= 0; i--) { asn2.Add(asn[i]); } asn = asn2; } base.RawData = asn.GetBytes(); if (flag == X500DistinguishedNameFlags.None) { this.name = distinguishedName; } else { this.name = this.Decode(flag); } } } /// Initializes a new instance of the class using the specified object. /// An object. // Token: 0x0600178B RID: 6027 RVA: 0x0004EAFC File Offset: 0x0004CCFC public X500DistinguishedName(X500DistinguishedName distinguishedName) { if (distinguishedName == null) { throw new ArgumentNullException("distinguishedName"); } base.Oid = new Oid(); base.RawData = distinguishedName.RawData; this.name = distinguishedName.name; } /// Gets the comma-delimited distinguished name from an X500 certificate. /// The comma-delimited distinguished name of the X509 certificate. // Token: 0x17000773 RID: 1907 // (get) Token: 0x0600178C RID: 6028 RVA: 0x0004EB44 File Offset: 0x0004CD44 public string Name { get { return this.name; } } /// Decodes a distinguished name using the characteristics specified by the parameter. /// The decoded distinguished name. /// A flag that specifies the characteristics of the object. /// The certificate has an invalid name. // Token: 0x0600178D RID: 6029 RVA: 0x0004EB4C File Offset: 0x0004CD4C public string Decode(X500DistinguishedNameFlags flag) { if (flag != X500DistinguishedNameFlags.None && (flag & (X500DistinguishedNameFlags.Reversed | X500DistinguishedNameFlags.UseSemicolons | X500DistinguishedNameFlags.DoNotUsePlusSign | X500DistinguishedNameFlags.DoNotUseQuotes | X500DistinguishedNameFlags.UseCommas | X500DistinguishedNameFlags.UseNewLines | X500DistinguishedNameFlags.UseUTF8Encoding | X500DistinguishedNameFlags.UseT61Encoding | X500DistinguishedNameFlags.ForceUTF8Encoding)) == X500DistinguishedNameFlags.None) { throw new ArgumentException("flag"); } if (base.RawData.Length == 0) { return string.Empty; } bool flag2 = (flag & X500DistinguishedNameFlags.Reversed) != X500DistinguishedNameFlags.None; bool flag3 = (flag & X500DistinguishedNameFlags.DoNotUseQuotes) == X500DistinguishedNameFlags.None; string separator = X500DistinguishedName.GetSeparator(flag); ASN1 asn = new ASN1(base.RawData); return X501.ToString(asn, flag2, separator, flag3); } /// Returns a formatted version of an X500 distinguished name for printing or for output to a text window or to a console. /// A formatted string that represents the X500 distinguished name. /// true if the return string should contain carriage returns; otherwise, false. // Token: 0x0600178E RID: 6030 RVA: 0x0004EBB8 File Offset: 0x0004CDB8 public override string Format(bool multiLine) { if (!multiLine) { return this.Decode(X500DistinguishedNameFlags.UseCommas); } string text = this.Decode(X500DistinguishedNameFlags.UseNewLines); if (text.Length > 0) { return text + Environment.NewLine; } return text; } // Token: 0x0600178F RID: 6031 RVA: 0x0004EBFC File Offset: 0x0004CDFC private static string GetSeparator(X500DistinguishedNameFlags flag) { if ((flag & X500DistinguishedNameFlags.UseSemicolons) != X500DistinguishedNameFlags.None) { return "; "; } if ((flag & X500DistinguishedNameFlags.UseCommas) != X500DistinguishedNameFlags.None) { return ", "; } if ((flag & X500DistinguishedNameFlags.UseNewLines) != X500DistinguishedNameFlags.None) { return Environment.NewLine; } return ", "; } // Token: 0x06001790 RID: 6032 RVA: 0x0004EC44 File Offset: 0x0004CE44 private void DecodeRawData() { if (base.RawData == null || base.RawData.Length < 3) { this.name = string.Empty; return; } ASN1 asn = new ASN1(base.RawData); this.name = X501.ToString(asn, true, ", ", true); } // Token: 0x06001791 RID: 6033 RVA: 0x0004EC98 File Offset: 0x0004CE98 private static string Canonize(string s) { int i = s.IndexOf('='); StringBuilder stringBuilder = new StringBuilder(s.Substring(0, i + 1)); while (char.IsWhiteSpace(s, ++i)) { } s = s.TrimEnd(new char[0]); bool flag = false; while (i < s.Length) { if (!flag) { goto IL_5C; } flag = char.IsWhiteSpace(s, i); if (!flag) { goto IL_5C; } IL_7D: i++; continue; IL_5C: if (char.IsWhiteSpace(s, i)) { flag = true; } stringBuilder.Append(char.ToUpperInvariant(s[i])); goto IL_7D; } return stringBuilder.ToString(); } // Token: 0x06001792 RID: 6034 RVA: 0x0004ED38 File Offset: 0x0004CF38 internal static bool AreEqual(X500DistinguishedName name1, X500DistinguishedName name2) { if (name1 == null) { return name2 == null; } if (name2 == null) { return false; } X500DistinguishedNameFlags x500DistinguishedNameFlags = X500DistinguishedNameFlags.DoNotUseQuotes | X500DistinguishedNameFlags.UseNewLines; string[] array = new string[] { Environment.NewLine }; string[] array2 = name1.Decode(x500DistinguishedNameFlags).Split(array, StringSplitOptions.RemoveEmptyEntries); string[] array3 = name2.Decode(x500DistinguishedNameFlags).Split(array, StringSplitOptions.RemoveEmptyEntries); if (array2.Length != array3.Length) { return false; } for (int i = 0; i < array2.Length; i++) { if (X500DistinguishedName.Canonize(array2[i]) != X500DistinguishedName.Canonize(array3[i])) { return false; } } return true; } // Token: 0x040012E5 RID: 4837 private const X500DistinguishedNameFlags AllFlags = X500DistinguishedNameFlags.Reversed | X500DistinguishedNameFlags.UseSemicolons | X500DistinguishedNameFlags.DoNotUsePlusSign | X500DistinguishedNameFlags.DoNotUseQuotes | X500DistinguishedNameFlags.UseCommas | X500DistinguishedNameFlags.UseNewLines | X500DistinguishedNameFlags.UseUTF8Encoding | X500DistinguishedNameFlags.UseT61Encoding | X500DistinguishedNameFlags.ForceUTF8Encoding; // Token: 0x040012E6 RID: 4838 private string name; } }