1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.x509;
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
46e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport java.util.Enumeration;
56e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Encodable;
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1EncodableVector;
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Sequence;
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1TaggedObject;
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERBitString;
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERObject;
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERSequence;
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/**
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * PKIX RFC-2459
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * The X.509 v2 CRL syntax is as follows.  For signature calculation,
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * the data that is to be signed is ASN.1 DER encoded.
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * <pre>
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * CertificateList  ::=  SEQUENCE  {
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      tbsCertList          TBSCertList,
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      signatureAlgorithm   AlgorithmIdentifier,
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      signatureValue       BIT STRING  }
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * </pre>
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class CertificateList
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    extends ASN1Encodable
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    TBSCertList            tbsCertList;
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    AlgorithmIdentifier    sigAlgId;
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    DERBitString           sig;
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static CertificateList getInstance(
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1TaggedObject obj,
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean          explicit)
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return getInstance(ASN1Sequence.getInstance(obj, explicit));
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static CertificateList getInstance(
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Object  obj)
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (obj instanceof CertificateList)
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return (CertificateList)obj;
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        else if (obj != null)
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return new CertificateList(ASN1Sequence.getInstance(obj));
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return null;
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public CertificateList(
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Sequence seq)
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (seq.size() == 3)
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            tbsCertList = TBSCertList.getInstance(seq.getObjectAt(0));
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            sigAlgId = AlgorithmIdentifier.getInstance(seq.getObjectAt(1));
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            sig = DERBitString.getInstance(seq.getObjectAt(2));
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        else
66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new IllegalArgumentException("sequence wrong size for CertificateList");
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public TBSCertList getTBSCertList()
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tbsCertList;
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public TBSCertList.CRLEntry[] getRevokedCertificates()
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tbsCertList.getRevokedCertificates();
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
81c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public Enumeration getRevokedCertificateEnumeration()
82c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
83c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        return tbsCertList.getRevokedCertificateEnumeration();
84c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
85c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public AlgorithmIdentifier getSignatureAlgorithm()
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return sigAlgId;
89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public DERBitString getSignature()
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return sig;
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public int getVersion()
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tbsCertList.getVersion();
99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public X509Name getIssuer()
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tbsCertList.getIssuer();
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public Time getThisUpdate()
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tbsCertList.getThisUpdate();
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public Time getNextUpdate()
112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tbsCertList.getNextUpdate();
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public DERObject toASN1Object()
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1EncodableVector v = new ASN1EncodableVector();
119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        v.add(tbsCertList);
121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        v.add(sigAlgId);
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        v.add(sig);
123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return new DERSequence(v);
125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
127