* FileSystemInfo.cs: corrected COM visibility of UTC properties
[mono.git] / mcs / class / Mono.Security / Mono.Security.X509.Extensions / SubjectAltNameExtension.cs
1 //
2 // SubjectAltNameExtension.cs: Handles X.509 SubjectAltName extensions.
3 //
4 // Author:
5 //      Sebastien Pouliot (spouliot@motus.com)
6 //
7 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
8 //
9
10 using System;
11 using System.Net;
12 using System.Collections;
13 using System.Text;
14
15 using Mono.Security;
16 using Mono.Security.X509;
17
18 namespace Mono.Security.X509.Extensions {
19
20         /*
21          * id-ce-subjectAltName OBJECT IDENTIFIER ::=  { id-ce 17 }
22          * 
23          * SubjectAltName ::= GeneralNames
24          * 
25          * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
26          * 
27          * GeneralName ::= CHOICE {
28          *    otherName                       [0]     OtherName,
29          *    rfc822Name                      [1]     IA5String,
30          *    dNSName                         [2]     IA5String,
31          *    x400Address                     [3]     ORAddress,
32          *    directoryName                   [4]     Name,
33          *    ediPartyName                    [5]     EDIPartyName,
34          *    uniformResourceIdentifier       [6]     IA5String,
35          *    iPAddress                       [7]     OCTET STRING,
36          *    registeredID                    [8]     OBJECT IDENTIFIER 
37          * }
38          * 
39          * OtherName ::= SEQUENCE {
40          *    type-id    OBJECT IDENTIFIER,
41          *    value      [0] EXPLICIT ANY DEFINED BY type-id 
42          * }
43          * 
44          * EDIPartyName ::= SEQUENCE {
45          *    nameAssigner            [0]     DirectoryString OPTIONAL,
46          *    partyName               [1]     DirectoryString 
47          * }
48          */
49
50         // TODO - incomplete (only rfc822Name, dNSName are supported)
51         public class SubjectAltNameExtension : X509Extension {
52                 
53                 private ArrayList rfc822Name;
54                 private ArrayList dnsName;
55                 private ArrayList ipAddr;
56
57                 public SubjectAltNameExtension () : base () 
58                 {
59                         extnOid = "2.5.29.17";
60                 }
61
62                 public SubjectAltNameExtension (ASN1 asn1) : base (asn1) {}
63
64                 public SubjectAltNameExtension (X509Extension extension) : base (extension) {}
65
66                 protected override void Decode () 
67                 {
68                         ASN1 sequence = new ASN1 (extnValue.Value);
69                         if (sequence.Tag != 0x30)
70                                 throw new ArgumentException ("Invalid SubjectAltName extension");
71                         for (int i=0; i < sequence.Count; i++) {
72                                 switch (sequence [i].Tag) {
73                                         case 0x81: // rfc822Name        [1]     IA5String
74                                                 if (rfc822Name == null)
75                                                         rfc822Name = new ArrayList ();
76                                                 rfc822Name.Add (Encoding.ASCII.GetString (sequence [i].Value));
77                                                 break;
78                                         case 0x82: // dNSName           [2]     IA5String
79                                                 if (dnsName == null)
80                                                         dnsName = new ArrayList ();
81                                                 dnsName.Add (Encoding.ASCII.GetString (sequence [i].Value));
82                                                 break;
83                                         case 0x87: // iPAddress         [7]     OCTET STRING
84                                                 if (ipAddr == null)
85                                                         ipAddr = new ArrayList ();
86                                                 // TODO - Must find sample certificates
87                                                 break;
88                                         default:
89                                                 break;
90                                 }
91                         }
92                 }
93
94                 public override string Name {
95                         get { return "Subject Alternative Name"; }
96                 }
97
98                 public string[] RFC822 {
99                         get {
100                                 string[] names = new string [rfc822Name.Count];
101                                 for (int i=0; i < rfc822Name.Count; i++)
102                                         names [i] = (string) rfc822Name [i];
103                                 return names;
104                         }
105                 }
106
107                 public string[] DNSNames {
108                         get {
109                                 if (dnsName == null)
110                                         return new string [0];
111                                 return (string[]) dnsName.ToArray (typeof(string));
112                         }
113                 }
114
115                 // Incomplete support
116                 public string[] IPAddresses {
117                         get {
118                                 if (ipAddr == null)
119                                         return new string [0];
120                                 return (string[]) ipAddr.ToArray (typeof(string));
121                         }
122                 }
123
124                 public override string ToString () 
125                 {
126                         StringBuilder sb = new StringBuilder ();
127                         if (rfc822Name != null) {
128                                 foreach (string s in rfc822Name) {
129                                         sb.Append ("RFC822 Name=");
130                                         sb.Append (s);
131                                         sb.Append (Environment.NewLine);
132                                 }
133                         }
134                         if (dnsName != null) {
135                                 foreach (string s in dnsName) {
136                                         sb.Append ("DNS Name=");
137                                         sb.Append (s);
138                                         sb.Append (Environment.NewLine);
139                                 }
140                         }
141                         if (ipAddr != null) {
142                                 foreach (string s in ipAddr) {
143                                         sb.Append ("IP Address=");
144                                         sb.Append (s);
145                                         sb.Append (Environment.NewLine);
146                                 }
147                         }
148                         return sb.ToString ();
149                 }
150         }
151 }