2 // SubjectAltNameExtension.cs: Handles X.509 SubjectAltName extensions.
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
8 // (C) 2004 Novell (http://www.novell.com)
13 using System.Collections;
17 using Mono.Security.X509;
19 namespace Mono.Security.X509.Extensions {
22 * id-ce-subjectAltName OBJECT IDENTIFIER ::= { id-ce 17 }
24 * SubjectAltName ::= GeneralNames
26 * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
28 * GeneralName ::= CHOICE {
29 * otherName [0] OtherName,
30 * rfc822Name [1] IA5String,
31 * dNSName [2] IA5String,
32 * x400Address [3] ORAddress,
33 * directoryName [4] Name,
34 * ediPartyName [5] EDIPartyName,
35 * uniformResourceIdentifier [6] IA5String,
36 * iPAddress [7] OCTET STRING,
37 * registeredID [8] OBJECT IDENTIFIER
40 * OtherName ::= SEQUENCE {
41 * type-id OBJECT IDENTIFIER,
42 * value [0] EXPLICIT ANY DEFINED BY type-id
45 * EDIPartyName ::= SEQUENCE {
46 * nameAssigner [0] DirectoryString OPTIONAL,
47 * partyName [1] DirectoryString
51 // TODO - incomplete (only rfc822Name, dNSName are supported)
52 public class SubjectAltNameExtension : X509Extension {
54 private ArrayList rfc822Name;
55 private ArrayList dnsName;
56 private ArrayList ipAddr;
58 public SubjectAltNameExtension () : base ()
60 extnOid = "2.5.29.17";
63 public SubjectAltNameExtension (ASN1 asn1) : base (asn1) {}
65 public SubjectAltNameExtension (X509Extension extension) : base (extension) {}
67 protected override void Decode ()
69 ASN1 sequence = new ASN1 (extnValue.Value);
70 if (sequence.Tag != 0x30)
71 throw new ArgumentException ("Invalid SubjectAltName extension");
72 for (int i=0; i < sequence.Count; i++) {
73 switch (sequence [i].Tag) {
74 case 0x81: // rfc822Name [1] IA5String
75 if (rfc822Name == null)
76 rfc822Name = new ArrayList ();
77 rfc822Name.Add (Encoding.ASCII.GetString (sequence [i].Value));
79 case 0x82: // dNSName [2] IA5String
81 dnsName = new ArrayList ();
82 dnsName.Add (Encoding.ASCII.GetString (sequence [i].Value));
84 case 0x87: // iPAddress [7] OCTET STRING
86 ipAddr = new ArrayList ();
87 // TODO - Must find sample certificates
95 public override string Name {
96 get { return "Subject Alternative Name"; }
99 public string[] RFC822 {
101 if (rfc822Name == null)
102 return new string [0];
103 return (string[]) rfc822Name.ToArray (typeof(string));
107 public string[] DNSNames {
110 return new string [0];
111 return (string[]) dnsName.ToArray (typeof(string));
115 // Incomplete support
116 public string[] IPAddresses {
119 return new string [0];
120 return (string[]) ipAddr.ToArray (typeof(string));
124 public override string ToString ()
126 StringBuilder sb = new StringBuilder ();
127 if (rfc822Name != null) {
128 foreach (string s in rfc822Name) {
129 sb.Append ("RFC822 Name=");
131 sb.Append (Environment.NewLine);
134 if (dnsName != null) {
135 foreach (string s in dnsName) {
136 sb.Append ("DNS Name=");
138 sb.Append (Environment.NewLine);
141 if (ipAddr != null) {
142 foreach (string s in ipAddr) {
143 sb.Append ("IP Address=");
145 sb.Append (Environment.NewLine);
148 return sb.ToString ();