Signature.java revision 4eb438010b8024cfa97cdad1906a8e6963a16f5b
1package org.bouncycastle.asn1.ocsp;
2
3import org.bouncycastle.asn1.ASN1EncodableVector;
4import org.bouncycastle.asn1.ASN1Object;
5import org.bouncycastle.asn1.ASN1Primitive;
6import org.bouncycastle.asn1.ASN1Sequence;
7import org.bouncycastle.asn1.ASN1TaggedObject;
8import org.bouncycastle.asn1.DERBitString;
9import org.bouncycastle.asn1.DERSequence;
10import org.bouncycastle.asn1.DERTaggedObject;
11import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
12
13public class Signature
14    extends ASN1Object
15{
16    AlgorithmIdentifier signatureAlgorithm;
17    DERBitString        signature;
18    ASN1Sequence        certs;
19
20    public Signature(
21        AlgorithmIdentifier signatureAlgorithm,
22        DERBitString        signature)
23    {
24        this.signatureAlgorithm = signatureAlgorithm;
25        this.signature = signature;
26    }
27
28    public Signature(
29        AlgorithmIdentifier signatureAlgorithm,
30        DERBitString        signature,
31        ASN1Sequence        certs)
32    {
33        this.signatureAlgorithm = signatureAlgorithm;
34        this.signature = signature;
35        this.certs = certs;
36    }
37
38    private Signature(
39        ASN1Sequence    seq)
40    {
41        signatureAlgorithm  = AlgorithmIdentifier.getInstance(seq.getObjectAt(0));
42        signature = (DERBitString)seq.getObjectAt(1);
43
44        if (seq.size() == 3)
45        {
46            certs = ASN1Sequence.getInstance(
47                                (ASN1TaggedObject)seq.getObjectAt(2), true);
48        }
49    }
50
51    public static Signature getInstance(
52        ASN1TaggedObject obj,
53        boolean          explicit)
54    {
55        return getInstance(ASN1Sequence.getInstance(obj, explicit));
56    }
57
58    public static Signature getInstance(
59        Object  obj)
60    {
61        if (obj instanceof Signature)
62        {
63            return (Signature)obj;
64        }
65        else if (obj != null)
66        {
67            return new Signature(ASN1Sequence.getInstance(obj));
68        }
69
70        return null;
71    }
72
73    public AlgorithmIdentifier getSignatureAlgorithm()
74    {
75        return signatureAlgorithm;
76    }
77
78    public DERBitString getSignature()
79    {
80        return signature;
81    }
82
83    public ASN1Sequence getCerts()
84    {
85        return certs;
86    }
87
88    /**
89     * Produce an object suitable for an ASN1OutputStream.
90     * <pre>
91     * Signature       ::=     SEQUENCE {
92     *     signatureAlgorithm      AlgorithmIdentifier,
93     *     signature               BIT STRING,
94     *     certs               [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL}
95     * </pre>
96     */
97    public ASN1Primitive toASN1Primitive()
98    {
99        ASN1EncodableVector    v = new ASN1EncodableVector();
100
101        v.add(signatureAlgorithm);
102        v.add(signature);
103
104        if (certs != null)
105        {
106            v.add(new DERTaggedObject(true, 0, certs));
107        }
108
109        return new DERSequence(v);
110    }
111}
112