1package org.bouncycastle.asn1.x509;
2
3import org.bouncycastle.asn1.ASN1Encodable;
4import org.bouncycastle.asn1.ASN1EncodableVector;
5import org.bouncycastle.asn1.ASN1Sequence;
6import org.bouncycastle.asn1.DEREncodable;
7import org.bouncycastle.asn1.DERObject;
8import org.bouncycastle.asn1.DERIA5String;
9import org.bouncycastle.asn1.DERObjectIdentifier;
10import org.bouncycastle.asn1.DERSequence;
11
12/**
13 * Policy qualifiers, used in the X509V3 CertificatePolicies
14 * extension.
15 *
16 * <pre>
17 *   PolicyQualifierInfo ::= SEQUENCE {
18 *       policyQualifierId  PolicyQualifierId,
19 *       qualifier          ANY DEFINED BY policyQualifierId }
20 * </pre>
21 */
22public class PolicyQualifierInfo
23    extends ASN1Encodable
24{
25   private DERObjectIdentifier policyQualifierId;
26   private DEREncodable        qualifier;
27
28   /**
29    * Creates a new <code>PolicyQualifierInfo</code> instance.
30    *
31    * @param policyQualifierId a <code>PolicyQualifierId</code> value
32    * @param qualifier the qualifier, defined by the above field.
33    */
34   public PolicyQualifierInfo(
35       DERObjectIdentifier policyQualifierId,
36       DEREncodable qualifier)
37   {
38      this.policyQualifierId = policyQualifierId;
39      this.qualifier = qualifier;
40   }
41
42   /**
43    * Creates a new <code>PolicyQualifierInfo</code> containing a
44    * cPSuri qualifier.
45    *
46    * @param cps the CPS (certification practice statement) uri as a
47    * <code>String</code>.
48    */
49   public PolicyQualifierInfo(
50       String cps)
51   {
52      policyQualifierId = PolicyQualifierId.id_qt_cps;
53      qualifier = new DERIA5String (cps);
54   }
55
56   /**
57    * Creates a new <code>PolicyQualifierInfo</code> instance.
58    *
59    * @param as <code>PolicyQualifierInfo</code> X509 structure
60    * encoded as an ASN1Sequence.
61    */
62   public PolicyQualifierInfo(
63       ASN1Sequence as)
64   {
65        if (as.size() != 2)
66        {
67            throw new IllegalArgumentException("Bad sequence size: "
68                    + as.size());
69        }
70
71        policyQualifierId = DERObjectIdentifier.getInstance(as.getObjectAt(0));
72        qualifier = as.getObjectAt(1);
73   }
74
75   public static PolicyQualifierInfo getInstance(
76       Object as)
77   {
78        if (as instanceof PolicyQualifierInfo)
79        {
80            return (PolicyQualifierInfo)as;
81        }
82        else if (as instanceof ASN1Sequence)
83        {
84            return new PolicyQualifierInfo((ASN1Sequence)as);
85        }
86
87        throw new IllegalArgumentException("unknown object in getInstance.");
88   }
89
90
91   public DERObjectIdentifier getPolicyQualifierId()
92   {
93       return policyQualifierId;
94   }
95
96   public DEREncodable getQualifier()
97   {
98       return qualifier;
99   }
100
101   /**
102    * Returns a DER-encodable representation of this instance.
103    *
104    * @return a <code>DERObject</code> value
105    */
106   public DERObject toASN1Object()
107   {
108      ASN1EncodableVector dev = new ASN1EncodableVector();
109      dev.add(policyQualifierId);
110      dev.add(qualifier);
111
112      return new DERSequence(dev);
113   }
114}
115