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