* FileSystemInfo.cs: corrected COM visibility of UTC properties
[mono.git] / mcs / class / Mono.Security / Mono.Security.X509.Extensions / CertificatePoliciesExtension.cs
1 //
2 // CertificatePoliciesExtension.cs: Handles X.509 CertificatePolicies extensions.
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // (C) 2004 Novell (http://www.novell.com)
8 //
9
10 using System;
11 using System.Collections;
12 using System.Text;
13
14 using Mono.Security;
15 using Mono.Security.X509;
16
17 namespace Mono.Security.X509.Extensions {
18
19         /*
20          * id-ce-certificatePolicies OBJECT IDENTIFIER ::=  { id-ce 32 }
21          * 
22          * anyPolicy OBJECT IDENTIFIER ::= { id-ce-certificate-policies 0 }
23          * 
24          * certificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation
25          * 
26          * PolicyInformation ::= SEQUENCE {
27          *    policyIdentifier   CertPolicyId,
28          *    policyQualifiers   SEQUENCE SIZE (1..MAX) OF PolicyQualifierInfo OPTIONAL 
29          * }
30          * 
31          * CertPolicyId ::= OBJECT IDENTIFIER
32          * 
33          * PolicyQualifierInfo ::= SEQUENCE {
34          *    policyQualifierId  PolicyQualifierId,
35          *    qualifier          ANY DEFINED BY policyQualifierId 
36          * }
37          * 
38          * -- policyQualifierIds for Internet policy qualifiers
39          * id-qt          OBJECT IDENTIFIER ::=  { id-pkix 2 }
40          * id-qt-cps      OBJECT IDENTIFIER ::=  { id-qt 1 }
41          * id-qt-unotice  OBJECT IDENTIFIER ::=  { id-qt 2 }
42          * 
43          * PolicyQualifierId ::= OBJECT IDENTIFIER ( id-qt-cps | id-qt-unotice )
44          * 
45          * Qualifier ::= CHOICE {
46          *    cPSuri           CPSuri,
47          *    userNotice       UserNotice 
48          * }
49          * 
50          * CPSuri ::= IA5String
51          * 
52          * UserNotice ::= SEQUENCE {
53          *    noticeRef        NoticeReference OPTIONAL,
54          *    explicitText     DisplayText OPTIONAL
55          * }
56          * 
57          * NoticeReference ::= SEQUENCE {
58          *    organization     DisplayText,
59          *    noticeNumbers    SEQUENCE OF INTEGER 
60          * }
61          * 
62          * DisplayText ::= CHOICE {
63          *    ia5String        IA5String      (SIZE (1..200)),
64          *    visibleString    VisibleString  (SIZE (1..200)),
65          *    bmpString        BMPString      (SIZE (1..200)),
66          *    utf8String       UTF8String     (SIZE (1..200)) 
67          * }
68          */
69
70         // note: partial implementation (only policyIdentifier OID are supported)
71         public class CertificatePoliciesExtension : X509Extension {
72
73                 private Hashtable policies;
74
75                 public CertificatePoliciesExtension () : base () 
76                 {
77                         extnOid = "2.5.29.32";
78                         policies = new Hashtable ();
79                 }
80
81                 public CertificatePoliciesExtension (ASN1 asn1) : base (asn1) {}
82
83                 public CertificatePoliciesExtension (X509Extension extension) : base (extension) {}
84
85                 protected override void Decode () 
86                 {
87                         policies = new Hashtable ();
88                         ASN1 sequence = new ASN1 (extnValue.Value);
89                         if (sequence.Tag != 0x30)
90                                 throw new ArgumentException ("Invalid CertificatePolicies extension");
91                         // for every policy OID
92                         for (int i=0; i < sequence.Count; i++) {
93                                 policies.Add (ASN1Convert.ToOID (sequence [i][0]), null);
94                         }
95                 }
96
97                 public override string Name {
98                         get { return "Certificate Policies"; }
99                 }
100
101                 public override string ToString () 
102                 {
103                         StringBuilder sb = new StringBuilder ();
104                         int n = 1;
105                         foreach (DictionaryEntry policy in policies) {
106                                 sb.Append ("[");
107                                 sb.Append (n++);
108                                 sb.Append ("]Certificate Policy:");
109                                 sb.Append (Environment.NewLine);
110                                 sb.Append ("\tPolicyIdentifier=");
111                                 sb.Append ((string)policy.Key);
112                                 sb.Append (Environment.NewLine);
113                         }
114                         return sb.ToString ();
115                 }
116         }
117 }