001package org.apache.commons.ssl.org.bouncycastle.asn1.ess;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
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.DERSequence;
008import org.apache.commons.ssl.org.bouncycastle.asn1.x509.PolicyInformation;
009
010public class SigningCertificateV2
011    extends ASN1Object
012{
013    ASN1Sequence certs;
014    ASN1Sequence policies;
015
016    public static SigningCertificateV2 getInstance(
017        Object o)
018    {
019        if (o == null || o instanceof SigningCertificateV2)
020        {
021            return (SigningCertificateV2) o;
022        }
023        else if (o instanceof ASN1Sequence)
024        {
025            return new SigningCertificateV2((ASN1Sequence) o);
026        }
027
028        return null;
029    }
030
031    private SigningCertificateV2(
032        ASN1Sequence seq)
033    {
034        if (seq.size() < 1 || seq.size() > 2)
035        {
036            throw new IllegalArgumentException("Bad sequence size: " + seq.size());
037        }
038
039        this.certs = ASN1Sequence.getInstance(seq.getObjectAt(0));
040
041        if (seq.size() > 1)
042        {
043            this.policies = ASN1Sequence.getInstance(seq.getObjectAt(1));
044        }
045    }
046
047    public SigningCertificateV2(
048        ESSCertIDv2 cert)
049    {
050        this.certs = new DERSequence(cert);
051    }
052
053    public SigningCertificateV2(
054        ESSCertIDv2[] certs)
055    {
056        ASN1EncodableVector v = new ASN1EncodableVector();
057        for (int i=0; i < certs.length; i++)
058        {
059            v.add(certs[i]);
060        }
061        this.certs = new DERSequence(v);
062    }
063
064    public SigningCertificateV2(
065        ESSCertIDv2[] certs,
066        PolicyInformation[] policies)
067    {
068        ASN1EncodableVector v = new ASN1EncodableVector();
069        for (int i=0; i < certs.length; i++)
070        {
071            v.add(certs[i]);
072        }
073        this.certs = new DERSequence(v);
074
075        if (policies != null)
076        {
077            v = new ASN1EncodableVector();
078            for (int i=0; i < policies.length; i++)
079            {
080                v.add(policies[i]);
081            }
082            this.policies = new DERSequence(v);
083        }
084    }
085
086    public ESSCertIDv2[] getCerts()
087    {
088        ESSCertIDv2[] certIds = new ESSCertIDv2[certs.size()];
089        for (int i = 0; i != certs.size(); i++)
090        {
091            certIds[i] = ESSCertIDv2.getInstance(certs.getObjectAt(i));
092        }
093        return certIds;
094    }
095
096    public PolicyInformation[] getPolicies()
097    {
098        if (policies == null)
099        {
100            return null;
101        }
102
103        PolicyInformation[] policyInformations = new PolicyInformation[policies.size()];
104        for (int i = 0; i != policies.size(); i++)
105        {
106            policyInformations[i] = PolicyInformation.getInstance(policies.getObjectAt(i));
107        }
108        return policyInformations;
109    }
110
111    /**
112     * The definition of SigningCertificateV2 is
113     * <pre>
114     * SigningCertificateV2 ::=  SEQUENCE {
115     *      certs        SEQUENCE OF ESSCertIDv2,
116     *      policies     SEQUENCE OF PolicyInformation OPTIONAL
117     * }
118     * </pre>
119     * id-aa-signingCertificateV2 OBJECT IDENTIFIER ::= { iso(1)
120     *    member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9)
121     *    smime(16) id-aa(2) 47 }
122     */
123    public ASN1Primitive toASN1Primitive()
124    {
125        ASN1EncodableVector v = new ASN1EncodableVector();
126
127        v.add(certs);
128
129        if (policies != null)
130        {
131            v.add(policies);
132        }
133
134        return new DERSequence(v);
135    }
136}