2 // CertificatePoliciesExtension.cs: Handles X.509 CertificatePolicies extensions.
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // (C) 2004 Novell (http://www.novell.com)
11 using System.Collections;
15 using Mono.Security.X509;
17 namespace Mono.Security.X509.Extensions {
20 * id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 }
22 * anyPolicy OBJECT IDENTIFIER ::= { id-ce-certificate-policies 0 }
24 * certificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation
26 * PolicyInformation ::= SEQUENCE {
27 * policyIdentifier CertPolicyId,
28 * policyQualifiers SEQUENCE SIZE (1..MAX) OF PolicyQualifierInfo OPTIONAL
31 * CertPolicyId ::= OBJECT IDENTIFIER
33 * PolicyQualifierInfo ::= SEQUENCE {
34 * policyQualifierId PolicyQualifierId,
35 * qualifier ANY DEFINED BY policyQualifierId
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 }
43 * PolicyQualifierId ::= OBJECT IDENTIFIER ( id-qt-cps | id-qt-unotice )
45 * Qualifier ::= CHOICE {
47 * userNotice UserNotice
50 * CPSuri ::= IA5String
52 * UserNotice ::= SEQUENCE {
53 * noticeRef NoticeReference OPTIONAL,
54 * explicitText DisplayText OPTIONAL
57 * NoticeReference ::= SEQUENCE {
58 * organization DisplayText,
59 * noticeNumbers SEQUENCE OF INTEGER
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))
70 // note: partial implementation (only policyIdentifier OID are supported)
71 public class CertificatePoliciesExtension : X509Extension {
73 private Hashtable policies;
75 public CertificatePoliciesExtension () : base ()
77 extnOid = "2.5.29.32";
78 policies = new Hashtable ();
81 public CertificatePoliciesExtension (ASN1 asn1) : base (asn1) {}
83 public CertificatePoliciesExtension (X509Extension extension) : base (extension) {}
85 protected override void Decode ()
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);
97 public override string Name {
98 get { return "Certificate Policies"; }
101 public override string ToString ()
103 StringBuilder sb = new StringBuilder ();
105 foreach (DictionaryEntry policy in policies) {
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);
114 return sb.ToString ();