1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.x509;
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
46e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport java.util.Enumeration;
56e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1EncodableVector;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Sequence;
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1TaggedObject;
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERBitString;
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERSequence;
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x500.X500Name;
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/**
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * PKIX RFC-2459
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * The X.509 v2 CRL syntax is as follows.  For signature calculation,
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * the data that is to be signed is ASN.1 DER encoded.
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * <pre>
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * CertificateList  ::=  SEQUENCE  {
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      tbsCertList          TBSCertList,
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      signatureAlgorithm   AlgorithmIdentifier,
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      signatureValue       BIT STRING  }
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * </pre>
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class CertificateList
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    TBSCertList            tbsCertList;
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    AlgorithmIdentifier    sigAlgId;
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    DERBitString           sig;
345db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    boolean                isHashCodeSet = false;
355db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    int                    hashCodeValue;
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static CertificateList getInstance(
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1TaggedObject obj,
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean          explicit)
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return getInstance(ASN1Sequence.getInstance(obj, explicit));
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static CertificateList getInstance(
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Object  obj)
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (obj instanceof CertificateList)
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return (CertificateList)obj;
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        else if (obj != null)
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return new CertificateList(ASN1Sequence.getInstance(obj));
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return null;
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
595db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    /**
605db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * @deprecated use getInstance() method.
615db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * @param seq
625db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     */
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public CertificateList(
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Sequence seq)
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (seq.size() == 3)
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            tbsCertList = TBSCertList.getInstance(seq.getObjectAt(0));
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            sigAlgId = AlgorithmIdentifier.getInstance(seq.getObjectAt(1));
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            sig = DERBitString.getInstance(seq.getObjectAt(2));
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        else
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new IllegalArgumentException("sequence wrong size for CertificateList");
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public TBSCertList getTBSCertList()
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tbsCertList;
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public TBSCertList.CRLEntry[] getRevokedCertificates()
84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tbsCertList.getRevokedCertificates();
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
88c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public Enumeration getRevokedCertificateEnumeration()
89c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
90c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        return tbsCertList.getRevokedCertificateEnumeration();
91c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
92c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public AlgorithmIdentifier getSignatureAlgorithm()
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return sigAlgId;
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public DERBitString getSignature()
99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return sig;
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public int getVersionNumber()
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return tbsCertList.getVersionNumber();
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public X500Name getIssuer()
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tbsCertList.getIssuer();
111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public Time getThisUpdate()
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tbsCertList.getThisUpdate();
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public Time getNextUpdate()
119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return tbsCertList.getNextUpdate();
121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1EncodableVector v = new ASN1EncodableVector();
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        v.add(tbsCertList);
128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        v.add(sigAlgId);
129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        v.add(sig);
130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return new DERSequence(v);
132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
1335db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1345db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    public int hashCode()
1355db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
1365db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        if (!isHashCodeSet)
1375db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        {
1385db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            hashCodeValue = super.hashCode();
1395db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            isHashCodeSet = true;
1405db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        }
1415db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1425db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return hashCodeValue;
1435db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
145