[corlib]: Try to convert the certificate from PEM to DER in X509Helper.Import().
authorMartin Baulig <martin.baulig@xamarin.com>
Thu, 5 May 2016 00:02:50 +0000 (20:02 -0400)
committerMartin Baulig <martin.baulig@xamarin.com>
Thu, 5 May 2016 00:05:37 +0000 (20:05 -0400)
mcs/class/corlib/System.Security.Cryptography.X509Certificates/X509Helper.cs

index 1f3f1f83d1f9281914969e2139926fde093d3107..01a55bce6a3704073f26621039b17ec517b28bc7 100644 (file)
@@ -148,9 +148,37 @@ namespace System.Security.Cryptography.X509Certificates
                        }
                }
 
+               static byte[] PEM (string type, byte[] data)
+               {
+                       string pem = Encoding.ASCII.GetString (data);
+                       string header = String.Format ("-----BEGIN {0}-----", type);
+                       string footer = String.Format ("-----END {0}-----", type);
+                       int start = pem.IndexOf (header) + header.Length;
+                       int end = pem.IndexOf (footer, start);
+                       string base64 = pem.Substring (start, (end - start));
+                       return Convert.FromBase64String (base64);
+               }
+
+               static byte[] ConvertData (byte[] data)
+               {
+                       if (data == null || data.Length == 0)
+                               return data;
+
+                       // does it looks like PEM ?
+                       if (data [0] != 0x30) {
+                               try {
+                                       return PEM ("CERTIFICATE", data);
+                               } catch {
+                                       // let the implementation take care of it.
+                               }
+                       }
+                       return data;
+               }
+
 #if !MONOTOUCH && !XAMMAC
                public static X509CertificateImpl Import (byte[] rawData, string password, X509KeyStorageFlags keyStorageFlags)
                {
+                       rawData = ConvertData (rawData);
                        if (nativeHelper != null)
                                return nativeHelper.Import (rawData, password, keyStorageFlags);