Merge pull request #1057 from lextm/master
[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,2007 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 #if INSIDE_SYSTEM
50         internal
51 #else
52         public
53 #endif
54         class AuthorityKeyIdentifierExtension : X509Extension {
55
56                 private byte[] aki;
57
58                 public AuthorityKeyIdentifierExtension () : base () 
59                 {
60                         extnOid = "2.5.29.35";
61                 }
62
63                 public AuthorityKeyIdentifierExtension (ASN1 asn1) : base (asn1)
64                 {
65                 }
66
67                 public AuthorityKeyIdentifierExtension (X509Extension extension) : base (extension)
68                 {
69                 }
70
71                 protected override void Decode () 
72                 {
73                         ASN1 sequence = new ASN1 (extnValue.Value);
74                         if (sequence.Tag != 0x30)
75                                 throw new ArgumentException ("Invalid AuthorityKeyIdentifier extension");
76                         for (int i=0; i < sequence.Count; i++) {
77                                 ASN1 el = sequence [i];
78                                 switch (el.Tag) {
79                                         case 0x80:
80                                                 aki = el.Value;
81                                                 break;
82                                         default:
83                                                 // don't throw on stuff we don't yet support
84                                                 // e.g. authorityCertIssuer/authorityCertSerialNumber
85                                                 break;
86                                 }
87                         }
88                 }
89
90                 protected override void Encode ()
91                 {
92                         ASN1 seq = new ASN1 (0x30);
93                         if (aki == null) {
94                                 throw new InvalidOperationException ("Invalid AuthorityKeyIdentifier extension");
95                         }
96
97                         seq.Add (new ASN1 (0x80, aki));
98                         extnValue = new ASN1 (0x04);
99                         extnValue.Add (seq);
100                 }
101
102                 public override string Name {
103                         get { return "Authority Key Identifier"; }
104                 }
105
106                 public byte[] Identifier {
107                         get {
108                                 if (aki == null)
109                                         return null;
110                                 return (byte[]) aki.Clone (); 
111                         }
112                         set { aki = value; }
113                 }
114
115                 public override string ToString () 
116                 {
117                         StringBuilder sb = new StringBuilder ();
118                         if (aki != null) {
119                                 // [0] KeyIdentifier
120                                 int x = 0;
121                                 sb.Append ("KeyID=");
122                                 while (x < aki.Length) {
123                                         sb.Append (aki [x].ToString ("X2", CultureInfo.InvariantCulture));
124                                         if (x % 2 == 1)
125                                                 sb.Append (" ");
126                                         x++;
127                                 }
128                                 // [1] GeneralNames
129                                 // TODO
130                                 // [2] CertificateSerialNumber
131                                 // TODO
132                         }
133                         return sb.ToString ();
134                 }
135         }
136 }