001package org.apache.commons.ssl.org.bouncycastle.asn1.ocsp;
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.ASN1TaggedObject;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
011import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
012
013public class Signature
014    extends ASN1Object
015{
016    AlgorithmIdentifier signatureAlgorithm;
017    DERBitString        signature;
018    ASN1Sequence        certs;
019
020    public Signature(
021        AlgorithmIdentifier signatureAlgorithm,
022        DERBitString        signature)
023    {
024        this.signatureAlgorithm = signatureAlgorithm;
025        this.signature = signature;
026    }
027
028    public Signature(
029        AlgorithmIdentifier signatureAlgorithm,
030        DERBitString        signature,
031        ASN1Sequence        certs)
032    {
033        this.signatureAlgorithm = signatureAlgorithm;
034        this.signature = signature;
035        this.certs = certs;
036    }
037
038    private Signature(
039        ASN1Sequence    seq)
040    {
041        signatureAlgorithm  = AlgorithmIdentifier.getInstance(seq.getObjectAt(0));
042        signature = (DERBitString)seq.getObjectAt(1);
043
044        if (seq.size() == 3)
045        {
046            certs = ASN1Sequence.getInstance(
047                                (ASN1TaggedObject)seq.getObjectAt(2), true);
048        }
049    }
050
051    public static Signature getInstance(
052        ASN1TaggedObject obj,
053        boolean          explicit)
054    {
055        return getInstance(ASN1Sequence.getInstance(obj, explicit));
056    }
057
058    public static Signature getInstance(
059        Object  obj)
060    {
061        if (obj instanceof Signature)
062        {
063            return (Signature)obj;
064        }
065        else if (obj != null)
066        {
067            return new Signature(ASN1Sequence.getInstance(obj));
068        }
069
070        return null;
071    }
072
073    public AlgorithmIdentifier getSignatureAlgorithm()
074    {
075        return signatureAlgorithm;
076    }
077
078    public DERBitString getSignature()
079    {
080        return signature;
081    }
082
083    public ASN1Sequence getCerts()
084    {
085        return certs;
086    }
087
088    /**
089     * Produce an object suitable for an ASN1OutputStream.
090     * <pre>
091     * Signature       ::=     SEQUENCE {
092     *     signatureAlgorithm      AlgorithmIdentifier,
093     *     signature               BIT STRING,
094     *     certs               [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL}
095     * </pre>
096     */
097    public ASN1Primitive toASN1Primitive()
098    {
099        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}