2 // CRLDistributionPointsExtension.cs: Handles X.509 CRLDistributionPoints extensions.
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // (C) 2004 Novell (http://www.novell.com)
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:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
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.
32 using System.Collections;
36 using Mono.Security.X509;
38 namespace Mono.Security.X509.Extensions {
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
47 * id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::= { id-ce 31 }
49 * CRLDistributionPoints ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint
51 * DistributionPoint ::= SEQUENCE {
52 * distributionPoint [0] DistributionPointName OPTIONAL,
53 * reasons [1] ReasonFlags OPTIONAL,
54 * cRLIssuer [2] GeneralNames OPTIONAL
57 * DistributionPointName ::= CHOICE {
58 * fullName [0] GeneralNames,
59 * nameRelativeToCRLIssuer [1] RelativeDistinguishedName
62 * ReasonFlags ::= BIT STRING {
66 * affiliationChanged (3),
68 * cessationOfOperation (5),
69 * certificateHold (6),
70 * privilegeWithdrawn (7),
74 public class CRLDistributionPointsExtension : X509Extension {
77 public string DistributionPoint;
78 public ReasonFlags Reasons;
79 public string CRLIssuer;
81 public DP (string dp, ReasonFlags reasons, string issuer)
83 DistributionPoint = dp;
90 for (int i = 0; i < dp.Count; i++) {
\r
93 case 0xA0: // DistributionPointName OPTIONAL
\r
94 for (int j = 0; j < el.Count; j++) {
\r
96 if (dpn.Tag == 0xA0) {
\r
97 DistributionPoint = new GeneralNames (dpn).ToString ();
\r
101 case 0xA1: // ReasonFlags OPTIONAL
\r
103 case 0xA2: // RelativeDistinguishedName
\r
111 public enum ReasonFlags
\r
116 AffiliationChanged = 3,
118 CessationOfOperation = 5,
120 PrivilegeWithdrawn = 7,
124 private ArrayList dps;
126 public CRLDistributionPointsExtension () : base ()
128 extnOid = "2.5.29.31";
129 dps = new ArrayList ();
132 public CRLDistributionPointsExtension (ASN1 asn1)
137 public CRLDistributionPointsExtension (X509Extension extension)
142 protected override void Decode ()
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]));
154 public override string Name {
155 get { return "CRL Distribution Points"; }
158 public override string ToString ()
160 StringBuilder sb = new StringBuilder ();
\r
162 foreach (DP dp in dps) {
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
174 return sb.ToString ();