001package org.apache.commons.ssl.org.bouncycastle.asn1.tsp;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Boolean;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
011import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
012import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
013import org.apache.commons.ssl.org.bouncycastle.asn1.x509.Extensions;
014
015public class TimeStampReq
016    extends ASN1Object
017{
018    ASN1Integer version;
019
020    MessageImprint messageImprint;
021
022    ASN1ObjectIdentifier tsaPolicy;
023
024    ASN1Integer nonce;
025
026    ASN1Boolean certReq;
027
028    Extensions extensions;
029
030    public static TimeStampReq getInstance(Object o)
031    {
032        if (o instanceof TimeStampReq)
033        {
034            return (TimeStampReq) o;
035        }
036        else if (o != null)
037        {
038            return new TimeStampReq(ASN1Sequence.getInstance(o));
039        }
040
041        return null;
042    }
043
044    private TimeStampReq(ASN1Sequence seq)
045    {
046        int nbObjects = seq.size();
047
048        int seqStart = 0;
049
050        // version
051        version = ASN1Integer.getInstance(seq.getObjectAt(seqStart));
052
053        seqStart++;
054
055        // messageImprint
056        messageImprint = MessageImprint.getInstance(seq.getObjectAt(seqStart));
057
058        seqStart++;
059
060        for (int opt = seqStart; opt < nbObjects; opt++)
061        {
062            // tsaPolicy
063            if (seq.getObjectAt(opt) instanceof ASN1ObjectIdentifier)
064            {
065                tsaPolicy = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(opt));
066            }
067            // nonce
068            else if (seq.getObjectAt(opt) instanceof ASN1Integer)
069            {
070                nonce = ASN1Integer.getInstance(seq.getObjectAt(opt));
071            }
072            // certReq
073            else if (seq.getObjectAt(opt) instanceof ASN1Boolean)
074            {
075                certReq = ASN1Boolean.getInstance(seq.getObjectAt(opt));
076            }
077            // extensions
078            else if (seq.getObjectAt(opt) instanceof ASN1TaggedObject)
079            {
080                ASN1TaggedObject    tagged = (ASN1TaggedObject)seq.getObjectAt(opt);
081                if (tagged.getTagNo() == 0)
082                {
083                    extensions = Extensions.getInstance(tagged, false);
084                }
085            }
086        }
087    }
088
089    public TimeStampReq(
090        MessageImprint      messageImprint,
091        ASN1ObjectIdentifier tsaPolicy,
092        ASN1Integer          nonce,
093        ASN1Boolean          certReq,
094        Extensions      extensions)
095    {
096        // default
097        version = new ASN1Integer(1);
098
099        this.messageImprint = messageImprint;
100        this.tsaPolicy = tsaPolicy;
101        this.nonce = nonce;
102        this.certReq = certReq;
103        this.extensions = extensions;
104    }
105
106    public ASN1Integer getVersion()
107    {
108        return version;
109    }
110
111    public MessageImprint getMessageImprint()
112    {
113        return messageImprint;
114    }
115
116    public ASN1ObjectIdentifier getReqPolicy()
117    {
118        return tsaPolicy;
119    }
120
121    public ASN1Integer getNonce()
122    {
123        return nonce;
124    }
125
126    public ASN1Boolean getCertReq()
127    {
128        return certReq;
129    }
130
131    public Extensions getExtensions()
132    {
133        return extensions;
134    }
135
136    /**
137     * <pre>
138     * TimeStampReq ::= SEQUENCE  {
139     *  version                      INTEGER  { v1(1) },
140     *  messageImprint               MessageImprint,
141     *    --a hash algorithm OID and the hash value of the data to be
142     *    --time-stamped
143     *  reqPolicy             TSAPolicyId              OPTIONAL,
144     *  nonce                 INTEGER                  OPTIONAL,
145     *  certReq               BOOLEAN                  DEFAULT FALSE,
146     *  extensions            [0] IMPLICIT Extensions  OPTIONAL
147     * }
148     * </pre>
149     */
150    public ASN1Primitive toASN1Primitive()
151    {
152        ASN1EncodableVector v = new ASN1EncodableVector();
153        
154        v.add(version);
155        v.add(messageImprint);
156        
157        if (tsaPolicy != null)
158        {
159            v.add(tsaPolicy);
160        }
161        
162        if (nonce != null)
163        {
164            v.add(nonce);
165        }
166        
167        if (certReq != null && certReq.isTrue())
168        {
169            v.add(certReq);
170        }
171        
172        if (extensions != null)
173        {
174            v.add(new DERTaggedObject(false, 0, extensions));
175        }
176
177        return new DERSequence(v);
178    }
179}