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.ASN1TaggedObject;
010import org.apache.commons.ssl.org.bouncycastle.asn1.BERSequence;
011import org.apache.commons.ssl.org.bouncycastle.asn1.DEROctetString;
012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
013
014/** 
015 * <a href="http://tools.ietf.org/html/rfc5652#section-7">RFC 5652</a> DigestedData object.
016 * <pre>
017 * DigestedData ::= SEQUENCE {
018 *       version CMSVersion,
019 *       digestAlgorithm DigestAlgorithmIdentifier,
020 *       encapContentInfo EncapsulatedContentInfo,
021 *       digest Digest }
022 * </pre>
023 */
024public class DigestedData
025    extends ASN1Object
026{
027    private ASN1Integer           version;
028    private AlgorithmIdentifier  digestAlgorithm;
029    private ContentInfo          encapContentInfo;
030    private ASN1OctetString      digest;
031
032    public DigestedData(
033        AlgorithmIdentifier digestAlgorithm,
034        ContentInfo encapContentInfo,
035        byte[]      digest)
036    {
037        this.version = new ASN1Integer(0);
038        this.digestAlgorithm = digestAlgorithm;
039        this.encapContentInfo = encapContentInfo;
040        this.digest = new DEROctetString(digest);
041    }
042
043    private DigestedData(
044        ASN1Sequence seq)
045    {
046        this.version = (ASN1Integer)seq.getObjectAt(0);
047        this.digestAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(1));
048        this.encapContentInfo = ContentInfo.getInstance(seq.getObjectAt(2));
049        this.digest = ASN1OctetString.getInstance(seq.getObjectAt(3));
050    }
051
052    /**
053     * Return a DigestedData object from a tagged object.
054     *
055     * @param ato the tagged object holding the object we want.
056     * @param isExplicit true if the object is meant to be explicitly
057     *              tagged false otherwise.
058     * @exception IllegalArgumentException if the object held by the
059     *          tagged object cannot be converted.
060     */
061    public static DigestedData getInstance(
062        ASN1TaggedObject ato,
063        boolean isExplicit)
064    {
065        return getInstance(ASN1Sequence.getInstance(ato, isExplicit));
066    }
067    
068    /**
069     * Return a DigestedData object from the given object.
070     * <p>
071     * Accepted inputs:
072     * <ul>
073     * <li> null &rarr; null
074     * <li> {@link DigestedData} object
075     * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats
076     * </ul>
077     *
078     * @param obj the object we want converted.
079     * @exception IllegalArgumentException if the object cannot be converted.
080     */
081    public static DigestedData getInstance(
082        Object obj)
083    {
084        if (obj instanceof DigestedData)
085        {
086            return (DigestedData)obj;
087        }
088        
089        if (obj != null)
090        {
091            return new DigestedData(ASN1Sequence.getInstance(obj));
092        }
093        
094        return null;
095    }
096
097    public ASN1Integer getVersion()
098    {
099        return version;
100    }
101
102    public AlgorithmIdentifier getDigestAlgorithm()
103    {
104        return digestAlgorithm;
105    }
106
107    public ContentInfo getEncapContentInfo()
108    {
109        return encapContentInfo;
110    }
111
112    public ASN1Primitive toASN1Primitive()
113    {
114        ASN1EncodableVector v = new ASN1EncodableVector();
115
116        v.add(version);
117        v.add(digestAlgorithm);
118        v.add(encapContentInfo);
119        v.add(digest);
120
121        return new BERSequence(v);
122    }
123
124    public byte[] getDigest()
125    {
126        return digest.getOctets();
127    }
128}