* HttpsClientStream.cs: Added a TrustFailure property so a WebException can now repor...
[mono.git] / mcs / class / Mono.Security / Mono.Security.X509.Extensions / CRLDistributionPointsExtension.cs
1 //
2 // CRLDistributionPointsExtension.cs: Handles X.509 CRLDistributionPoints 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.Collections;
33 using System.Text;
34
35 using Mono.Security;
36 using Mono.Security.X509;
37
38 namespace Mono.Security.X509.Extensions {
39
40         // References:
41         // a.   Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
42         //      http://www.ietf.org/rfc/rfc3280.txt
43         // b.   2.5.29.31 - CRL Distribution Points
44         //      http://www.alvestrand.no/objectid/2.5.29.31.html
45
46         /*
47          * id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::=  { id-ce 31 }
48          * 
49          * CRLDistributionPoints ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint
50          * 
51          * DistributionPoint ::= SEQUENCE {
52          *    distributionPoint       [0]     DistributionPointName OPTIONAL,
53          *    reasons                 [1]     ReasonFlags OPTIONAL,
54          *    cRLIssuer               [2]     GeneralNames OPTIONAL 
55          * }
56          * 
57          * DistributionPointName ::= CHOICE {
58          *    fullName                [0]     GeneralNames,
59          *    nameRelativeToCRLIssuer [1]     RelativeDistinguishedName 
60          * }
61          * 
62          * ReasonFlags ::= BIT STRING {
63          *    unused                  (0),
64          *    keyCompromise           (1),
65          *    cACompromise            (2),
66          *    affiliationChanged      (3),
67          *    superseded              (4),
68          *    cessationOfOperation    (5),
69          *    certificateHold         (6),
70          *    privilegeWithdrawn      (7),
71          *    aACompromise            (8) }
72          */
73
74         public class CRLDistributionPointsExtension : X509Extension {
75
76                 internal class DP {
77                         public string DistributionPoint;
78                         public ReasonFlags Reasons;
79                         public string CRLIssuer;
80
81                         public DP (string dp, ReasonFlags reasons, string issuer) 
82                         {
83                                 DistributionPoint = dp;
84                                 Reasons = reasons;
85                                 CRLIssuer = issuer;
86                         }\r
87 \r
88                         public DP (ASN1 dp)\r
89                         {\r
90                                 for (int i = 0; i < dp.Count; i++) {\r
91                                         ASN1 el = dp[i];\r
92                                         switch (el.Tag) {\r
93                                         case 0xA0: // DistributionPointName OPTIONAL\r
94                                                 for (int j = 0; j < el.Count; j++) {\r
95                                                         ASN1 dpn = el [j];\r
96                                                         if (dpn.Tag == 0xA0) {\r
97                                                                 DistributionPoint = new GeneralNames (dpn).ToString ();\r
98                                                         }\r
99                                                 }\r
100                                                 break;\r
101                                         case 0xA1: // ReasonFlags OPTIONAL\r
102                                                 break;\r
103                                         case 0xA2: // RelativeDistinguishedName\r
104                                                 break;\r
105                                         }\r
106                                 }\r
107                         }\r
108                 }\r
109 \r
110                 [Flags]\r
111                 public enum ReasonFlags\r
112                 {
113                         Unused = 0,
114                         KeyCompromise = 1,
115                         CACompromise = 2,
116                         AffiliationChanged = 3,
117                         Superseded = 4,
118                         CessationOfOperation = 5,
119                         CertificateHold = 6,
120                         PrivilegeWithdrawn = 7,
121                         AACompromise = 8
122                 }
123
124                 private ArrayList dps;
125
126                 public CRLDistributionPointsExtension () : base () 
127                 {
128                         extnOid = "2.5.29.31";
129                         dps = new ArrayList ();
130                 }
131
132                 public CRLDistributionPointsExtension (ASN1 asn1) 
133                         : base (asn1)
134                 {
135                 }
136
137                 public CRLDistributionPointsExtension (X509Extension extension) 
138                         : base (extension)
139                 {
140                 }
141
142                 protected override void Decode () 
143                 {
144                         dps = new ArrayList ();
145                         ASN1 sequence = new ASN1 (extnValue.Value);
146                         if (sequence.Tag != 0x30)
147                                 throw new ArgumentException ("Invalid CRLDistributionPoints extension");
148                         // for every distribution point
149                         for (int i=0; i < sequence.Count; i++) {
150                                 dps.Add (new DP (sequence [i]));
151                         }
152                 }
153
154                 public override string Name {
155                         get { return "CRL Distribution Points"; }
156                 }
157
158                 public override string ToString () 
159                 {
160                         StringBuilder sb = new StringBuilder ();\r
161                         int i = 1;
162                         foreach (DP dp in dps) {
163                                 sb.Append ("[");
164                                 sb.Append (i++);
165                                 sb.Append ("]CRL Distribution Point");
166                                 sb.Append (Environment.NewLine);
167                                 sb.Append ("\tDistribution Point Name:");
168                                 sb.Append ("\t\tFull Name:");
169                                 sb.Append (Environment.NewLine);\r
170                                 sb.Append ("\t\t\t");\r
171                                 sb.Append (dp.DistributionPoint);\r
172                                 sb.Append (Environment.NewLine);\r
173                         }
174                         return sb.ToString ();
175                 }
176         }
177 }