Merge pull request #2720 from mono/fix-39325
[mono.git] / mcs / class / System / System.Security.Cryptography.X509Certificates / X500DistinguishedName.cs
index 54f5691ca3ee9c74ef8b9ccbc208af0b459968a1..795f0d04b21acfabb51a09db288cfa3ccfecd274 100644 (file)
 
 #if SECURITY_DEP
 
-using System.Collections;
-using System.Text;
-
+#if MONO_SECURITY_ALIAS
+extern alias MonoSecurity;
+using MonoSecurity::Mono.Security;
+using MX = MonoSecurity::Mono.Security.X509;
+#else
 using Mono.Security;
 using MX = Mono.Security.X509;
+#endif
+
+using System.Collections;
+using System.Text;
 
 namespace System.Security.Cryptography.X509Certificates {
 
@@ -46,6 +52,7 @@ namespace System.Security.Cryptography.X509Certificates {
                        X500DistinguishedNameFlags.UseT61Encoding | X500DistinguishedNameFlags.ForceUTF8Encoding;
 
                private string name;
+               private byte[] canonEncoding;
 
 
                public X500DistinguishedName (AsnEncodedData encodedDistinguishedName)
@@ -91,7 +98,7 @@ namespace System.Security.Cryptography.X509Certificates {
                                RawData = new byte [2] { 0x30, 0x00 };
                                DecodeRawData ();
                        } else {
-                               ASN1 dn = MX.X501.FromString (distinguishedName);
+                               var dn = MX.X501.FromString (distinguishedName);
                                if ((flag & X500DistinguishedNameFlags.Reversed) != 0) {
                                        ASN1 rdn = new ASN1 (0x30);
                                        for (int i = dn.Count - 1; i >= 0; i--) 
@@ -116,6 +123,20 @@ namespace System.Security.Cryptography.X509Certificates {
                        name = distinguishedName.name;
                }
 
+               internal X500DistinguishedName (byte[] encoded, byte[] canonEncoding, string name)
+                       : this (encoded)
+               {
+                       this.canonEncoding = canonEncoding;
+                       this.name = name;
+
+                       Oid = new Oid ();
+                       RawData = encoded;
+               }
+
+               internal byte[] CanonicalEncoding {
+                       get { return canonEncoding; }
+               }
+
 
                public string Name {
                        get { return name; }
@@ -209,6 +230,16 @@ namespace System.Security.Cryptography.X509Certificates {
                        if (name2 == null)
                                return false;
 
+                       if (name1.canonEncoding != null && name2.canonEncoding != null) {
+                               if (name1.canonEncoding.Length != name2.canonEncoding.Length)
+                                       return false;
+                               for (int i = 0; i < name1.canonEncoding.Length; i++) {
+                                       if (name1.canonEncoding[i] != name2.canonEncoding[2])
+                                               return false;
+                               }
+                               return true;
+                       }
+
                        X500DistinguishedNameFlags flags = X500DistinguishedNameFlags.UseNewLines | X500DistinguishedNameFlags.DoNotUseQuotes;
                        string[] split = new string[] { Environment.NewLine };
                        string[] parts1 = name1.Decode (flags).Split (split, StringSplitOptions.RemoveEmptyEntries);