2005-01-20 Sebastien Pouliot <sebastien@ximian.com>
authorSebastien Pouliot <sebastien@ximian.com>
Fri, 21 Jan 2005 00:37:04 +0000 (00:37 -0000)
committerSebastien Pouliot <sebastien@ximian.com>
Fri, 21 Jan 2005 00:37:04 +0000 (00:37 -0000)
* AsnEncodedData.cs: Added "internal" support for SubjectAltName
extension as it is required for SSL support.
* Oid.cs: Added Oid / FriendlyName definitions for SubjectAltName.

svn path=/trunk/mcs/; revision=39294

mcs/class/System.Security/System.Security.Cryptography/AsnEncodedData.cs
mcs/class/System.Security/System.Security.Cryptography/ChangeLog
mcs/class/System.Security/System.Security.Cryptography/Oid.cs

index fe4c3f43eb1e7a4132ffc4c638af7d657a1c7182..561bcd91e257e34e5617517dc10d34fa7476537b 100755 (executable)
@@ -32,6 +32,9 @@
 using System.Security.Cryptography.X509Certificates;
 using System.Text;
 
+using Mono.Security;
+using Mono.Security.Cryptography;
+
 namespace System.Security.Cryptography {
 
        internal enum AsnDecodeStatus {
@@ -143,6 +146,8 @@ namespace System.Security.Cryptography {
                                return SubjectKeyIdentifierExtension (multiLine);
                        // other known objects (i.e. supported structure) - 
                        // but without any corresponding framework class
+                       case Oid.oidSubjectAltName:
+                               return SubjectAltName (multiLine);
                        case Oid.oidNetscapeCertType:
                                return NetscapeCertType (multiLine);
                        default:
@@ -209,6 +214,50 @@ namespace System.Security.Cryptography {
 
                // Indirectly (undocumented but) supported extensions
 
+               internal string SubjectAltName (bool multiLine)
+               {
+                       if (_raw.Length < 5)
+                               return "Information Not Available";
+
+                       try {
+                               ASN1 ex = new ASN1 (_raw);
+                               StringBuilder sb = new StringBuilder ();
+                               for (int i=0; i < ex.Count; i++) {
+                                       ASN1 el = ex [i];
+
+                                       string type = null;
+                                       string name = null;
+
+                                       switch (el.Tag) {
+                                       case 0x81:
+                                               type = "RFC822 Name=";
+                                               name = Encoding.ASCII.GetString (el.Value);
+                                               break;
+                                       case 0x82:
+                                               type = "DNS Name=";
+                                               name = Encoding.ASCII.GetString (el.Value);
+                                               break;
+                                       default:
+                                               type = String.Format ("Unknown ({0})=", el.Tag);
+                                               name = CryptoConvert.ToHex (el.Value);
+                                               break;
+                                       }
+
+                                       sb.Append (type);
+                                       sb.Append (name);
+                                       if (multiLine) {
+                                               sb.Append (Environment.NewLine);
+                                       } else if (i < ex.Count - 1) {
+                                               sb.Append (", ");
+                                       }
+                               }
+                               return sb.ToString ();
+                       }
+                       catch {
+                               return String.Empty;
+                       }
+               }
+
                internal string NetscapeCertType (bool multiLine)
                {
                        // 4 byte long, BITSTRING (0x03), Value length of 2
index 6101006b6f3297fd35e1d808651d65b9a6b07dc9..72cc0858008cbab66fe836734954ef1b4f832157 100755 (executable)
@@ -1,3 +1,9 @@
+2005-01-20  Sebastien Pouliot  <sebastien@ximian.com>
+
+       * AsnEncodedData.cs: Added "internal" support for SubjectAltName 
+       extension as it is required for SSL support.
+       * Oid.cs: Added Oid / FriendlyName definitions for SubjectAltName.
+
 2005-01-17  Sebastien Pouliot  <sebastien@ximian.com>
 
        * AsnEncodedData.cs: Added more decoding/formatting code as this class
index 9db7bac1d58f811288030467dbf82b0907d68eb3..f2da65231ecea625eddc19488e9723b8c6d251f4 100755 (executable)
@@ -100,6 +100,8 @@ namespace System.Security.Cryptography {
                internal const string name3Des = "3des";
                internal const string oidSha1 = "1.3.14.3.2.26";
                internal const string nameSha1 = "sha1";
+               internal const string oidSubjectAltName = "2.5.29.17";
+               internal const string nameSubjectAltName = "Subject Alternative Name";
                internal const string oidNetscapeCertType = "2.16.840.1.113730.1.1";
                internal const string nameNetscapeCertType = "Netscape Cert Type";
 
@@ -127,6 +129,8 @@ namespace System.Security.Cryptography {
                                        return X509EnhancedKeyUsageExtension.friendlyName;
                                case X509SubjectKeyIdentifierExtension.oid:
                                        return X509SubjectKeyIdentifierExtension.friendlyName;
+                               case oidSubjectAltName:
+                                       return nameSubjectAltName;
                                case oidNetscapeCertType:
                                        return nameNetscapeCertType;
                                case oidMd5:
@@ -162,6 +166,8 @@ namespace System.Security.Cryptography {
                                        return X509EnhancedKeyUsageExtension.oid;
                                case X509SubjectKeyIdentifierExtension.friendlyName:
                                        return X509SubjectKeyIdentifierExtension.oid;
+                               case nameSubjectAltName:
+                                       return oidSubjectAltName;
                                case nameNetscapeCertType:
                                        return oidNetscapeCertType;
                                case nameMd5: