001package org.apache.commons.ssl.org.bouncycastle.asn1.x509;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
009
010public class CertificatePolicies
011    extends ASN1Object
012{
013    private final PolicyInformation[] policyInformation;
014
015    public static CertificatePolicies getInstance(
016        Object  obj)
017    {
018        if (obj instanceof CertificatePolicies)
019        {
020            return (CertificatePolicies)obj;
021        }
022
023        if (obj != null)
024        {
025            return new CertificatePolicies(ASN1Sequence.getInstance(obj));
026        }
027
028        return null;
029    }
030
031    public static CertificatePolicies getInstance(
032        ASN1TaggedObject obj,
033        boolean          explicit)
034    {
035        return getInstance(ASN1Sequence.getInstance(obj, explicit));
036    }
037
038    /**
039     * Retrieve a CertificatePolicies for a passed in Extensions object, if present.
040     *
041     * @param extensions the extensions object to be examined.
042     * @return  the CertificatePolicies, null if the extension is not present.
043     */
044    public static CertificatePolicies fromExtensions(Extensions extensions)
045    {
046        return CertificatePolicies.getInstance(extensions.getExtensionParsedValue(Extension.certificatePolicies));
047    }
048
049    /**
050     * Construct a CertificatePolicies object containing one PolicyInformation.
051     * 
052     * @param name the name to be contained.
053     */
054    public CertificatePolicies(
055        PolicyInformation  name)
056    {
057        this.policyInformation = new PolicyInformation[] { name };
058    }
059
060    public CertificatePolicies(
061        PolicyInformation[] policyInformation)
062    {
063        this.policyInformation = policyInformation;
064    }
065
066    private CertificatePolicies(
067        ASN1Sequence  seq)
068    {
069        this.policyInformation = new PolicyInformation[seq.size()];
070
071        for (int i = 0; i != seq.size(); i++)
072        {
073            policyInformation[i] = PolicyInformation.getInstance(seq.getObjectAt(i));
074        }
075    }
076
077    public PolicyInformation[] getPolicyInformation()
078    {
079        PolicyInformation[] tmp = new PolicyInformation[policyInformation.length];
080
081        System.arraycopy(policyInformation, 0, tmp, 0, policyInformation.length);
082
083        return tmp;
084    }
085
086    public PolicyInformation getPolicyInformation(ASN1ObjectIdentifier policyIdentifier)
087    {
088        for (int i = 0; i != policyInformation.length; i++)
089        {
090            if (policyIdentifier.equals(policyInformation[i].getPolicyIdentifier()))
091            {
092                 return policyInformation[i];
093            }
094        }
095
096        return null;
097    }
098
099    /**
100     * Produce an object suitable for an ASN1OutputStream.
101     * <pre>
102     * CertificatePolicies ::= SEQUENCE SIZE {1..MAX} OF PolicyInformation
103     * </pre>
104     */
105    public ASN1Primitive toASN1Primitive()
106    {
107        return new DERSequence(policyInformation);
108    }
109
110    public String toString()
111    {
112        String p = null;
113        for (int i = 0; i < policyInformation.length; i++)
114        {
115            if (p != null)
116            {
117                p += ", ";
118            }
119            p += policyInformation[i];
120        }
121
122        return "CertificatePolicies: " + p;
123    }
124}