Merge pull request #2720 from mono/fix-39325
[mono.git] / mcs / class / System / System.Security.Cryptography.X509Certificates / X500DistinguishedName.cs
index db0377e12a871846e3c79d62c57f16590494a6ec..795f0d04b21acfabb51a09db288cfa3ccfecd274 100644 (file)
 
 #if SECURITY_DEP
 
-#if MONOTOUCH
-using Mono.Security;
-using MX = Mono.Security.X509;
-#else
+#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;
@@ -52,6 +52,7 @@ namespace System.Security.Cryptography.X509Certificates {
                        X500DistinguishedNameFlags.UseT61Encoding | X500DistinguishedNameFlags.ForceUTF8Encoding;
 
                private string name;
+               private byte[] canonEncoding;
 
 
                public X500DistinguishedName (AsnEncodedData encodedDistinguishedName)
@@ -122,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; }
@@ -215,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);