merge r67228-r67235, r67237, r67251 and r67256-67259 to trunk (they are
[mono.git] / mcs / class / Mono.Security / Mono.Security.X509.Extensions / AuthorityKeyIdentifierExtension.cs
1 //
2 // AuthorityKeyIdentifierExtension.cs: Handles X.509 AuthorityKeyIdentifier extensions.
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 using System;
30 using System.Globalization;
31 using System.Text;
32
33 using Mono.Security;
34 using Mono.Security.X509;
35
36 namespace Mono.Security.X509.Extensions {
37
38         /*
39          * id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::=  { id-ce 35 }
40          * 
41          * AuthorityKeyIdentifier ::= SEQUENCE {
42          *    keyIdentifier             [0] KeyIdentifier           OPTIONAL,
43          *    authorityCertIssuer       [1] GeneralNames            OPTIONAL,
44          *    authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL  }
45          * 
46          * KeyIdentifier ::= OCTET STRING
47          */
48
49         public class AuthorityKeyIdentifierExtension : X509Extension {
50
51                 private byte[] aki;
52
53                 public AuthorityKeyIdentifierExtension () : base () 
54                 {
55                         extnOid = "2.5.29.35";
56                 }
57
58                 public AuthorityKeyIdentifierExtension (ASN1 asn1) : base (asn1)
59                 {
60                 }
61
62                 public AuthorityKeyIdentifierExtension (X509Extension extension) : base (extension)
63                 {
64                 }
65
66                 protected override void Decode () 
67                 {
68                         ASN1 sequence = new ASN1 (extnValue.Value);
69                         if (sequence.Tag != 0x30)
70                                 throw new ArgumentException ("Invalid AuthorityKeyIdentifier extension");
71                         for (int i=0; i < sequence.Count; i++) {
72                                 ASN1 el = sequence [i];
73                                 switch (el.Tag) {
74                                         case 0x80:
75                                                 aki = el.Value;
76                                                 break;
77                                         case 0x81:
78                                         case 0x82:
79                                         default:
80                                                 throw new ArgumentException ("Invalid AuthorityKeyIdentifier extension");
81                                 }
82                         }
83                 }
84
85                 public override string Name {
86                         get { return "Authority Key Identifier"; }
87                 }
88
89                 public byte[] Identifier {
90                         get {
91                                 if (aki == null)
92                                         return null;
93                                 return (byte[]) aki.Clone (); 
94                         }
95                 }
96
97                 public override string ToString () 
98                 {
99                         StringBuilder sb = new StringBuilder ();
100                         if (aki != null) {
101                                 // [0] KeyIdentifier
102                                 int x = 0;
103                                 sb.Append ("KeyID=");
104                                 while (x < aki.Length) {
105                                         sb.Append (aki [x].ToString ("X2", CultureInfo.InvariantCulture));
106                                         if (x % 2 == 1)
107                                                 sb.Append (" ");
108                                         x++;
109                                 }
110                                 // [1] GeneralNames
111                                 // TODO
112                                 // [2] CertificateSerialNumber
113                                 // TODO
114                         }
115                         return sb.ToString ();
116                 }
117         }
118 }