001package org.apache.commons.ssl.org.bouncycastle.asn1.icao;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Set;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERSet;
011import org.apache.commons.ssl.org.bouncycastle.asn1.x509.Certificate;
012
013/**
014 * The CscaMasterList object. This object can be wrapped in a
015 * CMSSignedData to be published in LDAP.
016 *
017 * <pre>
018 * CscaMasterList ::= SEQUENCE {
019 *   version                CscaMasterListVersion,
020 *   certList               SET OF Certificate }
021 *
022 * CscaMasterListVersion :: INTEGER {v0(0)}
023 * </pre>
024 */
025
026public class CscaMasterList
027    extends ASN1Object
028{
029    private ASN1Integer version = new ASN1Integer(0);
030    private Certificate[] certList;
031
032    public static CscaMasterList getInstance(
033        Object obj)
034    {
035        if (obj instanceof CscaMasterList)
036        {
037            return (CscaMasterList)obj;
038        }
039        else if (obj != null)
040        {
041            return new CscaMasterList(ASN1Sequence.getInstance(obj));
042        }
043
044        return null;
045    }
046
047    private CscaMasterList(
048        ASN1Sequence seq)
049    {
050        if (seq == null || seq.size() == 0)
051        {
052            throw new IllegalArgumentException(
053                "null or empty sequence passed.");
054        }
055        if (seq.size() != 2)
056        {
057            throw new IllegalArgumentException(
058                "Incorrect sequence size: " + seq.size());
059        }
060
061        version = ASN1Integer.getInstance(seq.getObjectAt(0));
062        ASN1Set certSet = ASN1Set.getInstance(seq.getObjectAt(1));
063        certList = new Certificate[certSet.size()];
064        for (int i = 0; i < certList.length; i++)
065        {
066            certList[i]
067                = Certificate.getInstance(certSet.getObjectAt(i));
068        }
069    }
070
071    public CscaMasterList(
072        Certificate[] certStructs)
073    {
074        certList = copyCertList(certStructs);
075    }
076
077    public int getVersion()
078    {
079        return version.getValue().intValue();
080    }
081
082    public Certificate[] getCertStructs()
083    {
084        return copyCertList(certList);
085    }
086
087    private Certificate[] copyCertList(Certificate[] orig)
088    {
089        Certificate[] certs = new Certificate[orig.length];
090
091        for (int i = 0; i != certs.length; i++)
092        {
093            certs[i] = orig[i];
094        }
095
096        return certs;
097    }
098
099    public ASN1Primitive toASN1Primitive()
100    {
101        ASN1EncodableVector seq = new ASN1EncodableVector();
102
103        seq.add(version);
104
105        ASN1EncodableVector certSet = new ASN1EncodableVector();
106        for (int i = 0; i < certList.length; i++)
107        {
108            certSet.add(certList[i]);
109        }
110        seq.add(new DERSet(certSet));
111
112        return new DERSequence(seq);
113    }
114}