001package org.apache.commons.ssl.org.bouncycastle.asn1.cms;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
009import org.apache.commons.ssl.org.bouncycastle.asn1.BERSequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERIA5String;
011
012/**
013 * <a href="http://tools.ietf.org/html/rfc5544">RFC 5544</a>:
014 * Binding Documents with Time-Stamps; TimeStampedData object.
015 * <p>
016 * <pre>
017 * TimeStampedData ::= SEQUENCE {
018 *   version              INTEGER { v1(1) },
019 *   dataUri              IA5String OPTIONAL,
020 *   metaData             MetaData OPTIONAL,
021 *   content              OCTET STRING OPTIONAL,
022 *   temporalEvidence     Evidence
023 * }
024 * </pre>
025 */
026public class TimeStampedData
027    extends ASN1Object
028{
029    private ASN1Integer version;
030    private DERIA5String dataUri;
031    private MetaData metaData;
032    private ASN1OctetString content;
033    private Evidence temporalEvidence;
034
035    public TimeStampedData(DERIA5String dataUri, MetaData metaData, ASN1OctetString content, Evidence temporalEvidence)
036    {
037        this.version = new ASN1Integer(1);
038        this.dataUri = dataUri;
039        this.metaData = metaData;
040        this.content = content;
041        this.temporalEvidence = temporalEvidence;
042    }
043
044    private TimeStampedData(ASN1Sequence seq)
045    {
046        this.version = ASN1Integer.getInstance(seq.getObjectAt(0));
047
048        int index = 1;
049        if (seq.getObjectAt(index) instanceof DERIA5String)
050        {
051            this.dataUri = DERIA5String.getInstance(seq.getObjectAt(index++));
052        }
053        if (seq.getObjectAt(index) instanceof MetaData || seq.getObjectAt(index) instanceof ASN1Sequence)
054        {
055            this.metaData = MetaData.getInstance(seq.getObjectAt(index++));
056        }
057        if (seq.getObjectAt(index) instanceof ASN1OctetString)
058        {
059            this.content = ASN1OctetString.getInstance(seq.getObjectAt(index++));
060        }
061        this.temporalEvidence = Evidence.getInstance(seq.getObjectAt(index));
062    }
063
064    /**
065     * Return a TimeStampedData object from the given object.
066     * <p>
067     * Accepted inputs:
068     * <ul>
069     * <li> null &rarr; null
070     * <li> {@link RecipientKeyIdentifier} object
071     * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats with TimeStampedData structure inside
072     * </ul>
073     *
074     * @param obj the object we want converted.
075     * @exception IllegalArgumentException if the object cannot be converted.
076     */
077    public static TimeStampedData getInstance(Object obj)
078    {
079        if (obj == null || obj instanceof TimeStampedData)
080        {
081            return (TimeStampedData)obj;
082        }
083        return new TimeStampedData(ASN1Sequence.getInstance(obj));
084    }
085
086    public DERIA5String getDataUri()
087    {
088        return dataUri;
089    }
090
091    public MetaData getMetaData()
092    {
093        return metaData;
094    }
095
096    public ASN1OctetString getContent()
097    {
098        return content;
099    }
100
101    public Evidence getTemporalEvidence()
102    {
103        return temporalEvidence;
104    }
105
106    public ASN1Primitive toASN1Primitive()
107    {
108        ASN1EncodableVector v = new ASN1EncodableVector();
109
110        v.add(version);
111
112        if (dataUri != null)
113        {
114            v.add(dataUri);
115        }
116
117        if (metaData != null)
118        {
119            v.add(metaData);
120        }
121
122        if (content != null)
123        {
124            v.add(content);
125        }
126
127        v.add(temporalEvidence);
128
129        return new BERSequence(v);
130    }
131}