001package org.apache.commons.ssl.org.bouncycastle.asn1.dvcs;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Choice;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DEROctetString;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
011import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.DigestInfo;
013
014/**
015 * <pre>
016 * Data ::= CHOICE {
017 *   message           OCTET STRING ,
018 *   messageImprint    DigestInfo,
019 *   certs             [0] SEQUENCE SIZE (1..MAX) OF
020 *                         TargetEtcChain
021 * }
022 * </pre>
023 */
024
025public class Data
026    extends ASN1Object
027    implements ASN1Choice
028{
029    private ASN1OctetString message;
030    private DigestInfo messageImprint;
031    private ASN1Sequence certs;
032
033    public Data(byte[] messageBytes)
034    {
035        this.message = new DEROctetString(messageBytes);
036    }
037
038    public Data(ASN1OctetString message)
039    {
040        this.message = message;
041    }
042
043    public Data(DigestInfo messageImprint)
044    {
045        this.messageImprint = messageImprint;
046    }
047
048    public Data(TargetEtcChain cert)
049    {
050        this.certs = new DERSequence(cert);
051    }
052
053    public Data(TargetEtcChain[] certs)
054    {
055        this.certs = new DERSequence(certs);
056    }
057
058    private Data(ASN1Sequence certs)
059    {
060        this.certs = certs;
061    }
062
063    public static Data getInstance(Object obj)
064    {
065        if (obj instanceof Data)
066        {
067            return (Data)obj;
068        }
069        else if (obj instanceof ASN1OctetString)
070        {
071            return new Data((ASN1OctetString)obj);
072        }
073        else if (obj instanceof ASN1Sequence)
074        {
075            return new Data(DigestInfo.getInstance(obj));
076        }
077        else if (obj instanceof ASN1TaggedObject)
078        {
079            return new Data(ASN1Sequence.getInstance((ASN1TaggedObject)obj, false));
080        }
081        throw new IllegalArgumentException("Unknown object submitted to getInstance: " + obj.getClass().getName());
082    }
083
084    public static Data getInstance(
085        ASN1TaggedObject obj,
086        boolean explicit)
087    {
088        return getInstance(obj.getObject());
089    }
090
091    public ASN1Primitive toASN1Primitive()
092    {
093        if (message != null)
094        {
095            return message.toASN1Primitive();
096        }
097        if (messageImprint != null)
098        {
099            return messageImprint.toASN1Primitive();
100        }
101        else
102        {
103            return new DERTaggedObject(false, 0, certs);
104        }
105    }
106
107    public String toString()
108    {
109        if (message != null)
110        {
111            return "Data {\n" + message + "}\n";
112        }
113        if (messageImprint != null)
114        {
115            return "Data {\n" + messageImprint + "}\n";
116        }
117        else
118        {
119            return "Data {\n" + certs + "}\n";
120        }
121    }
122
123    public ASN1OctetString getMessage()
124    {
125        return message;
126    }
127
128    public DigestInfo getMessageImprint()
129    {
130        return messageImprint;
131    }
132
133    public TargetEtcChain[] getCerts()
134    {
135        if (certs == null)
136        {
137            return null;
138        }
139
140        TargetEtcChain[] tmp = new TargetEtcChain[certs.size()];
141
142        for (int i = 0; i != tmp.length; i++)
143        {
144            tmp[i] = TargetEtcChain.getInstance(certs.getObjectAt(i));
145        }
146
147        return tmp;
148    }
149}