001package org.apache.commons.ssl.org.bouncycastle.asn1.pkcs;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
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.ASN1OctetString;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
011import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
012import org.apache.commons.ssl.org.bouncycastle.asn1.BERSequence;
013import org.apache.commons.ssl.org.bouncycastle.asn1.BERTaggedObject;
014import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
015
016/**
017 * The EncryptedData object.
018 * <pre>
019 *      EncryptedData ::= SEQUENCE {
020 *           version Version,
021 *           encryptedContentInfo EncryptedContentInfo
022 *      }
023 *
024 *
025 *      EncryptedContentInfo ::= SEQUENCE {
026 *          contentType ContentType,
027 *          contentEncryptionAlgorithm  ContentEncryptionAlgorithmIdentifier,
028 *          encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
029 *    }
030 *
031 *    EncryptedContent ::= OCTET STRING
032 * </pre>
033 */
034public class EncryptedData
035    extends ASN1Object
036{
037    ASN1Sequence                data;
038    ASN1ObjectIdentifier bagId;
039    ASN1Primitive bagValue;
040
041    public static EncryptedData getInstance(
042         Object  obj)
043    {
044         if (obj instanceof EncryptedData)
045         {
046             return (EncryptedData)obj;
047         }
048
049         if (obj != null)
050         {
051             return new EncryptedData(ASN1Sequence.getInstance(obj));
052         }
053
054         return null;
055    }
056     
057    private EncryptedData(
058        ASN1Sequence seq)
059    {
060        int version = ((ASN1Integer)seq.getObjectAt(0)).getValue().intValue();
061
062        if (version != 0)
063        {
064            throw new IllegalArgumentException("sequence not version 0");
065        }
066
067        this.data = ASN1Sequence.getInstance(seq.getObjectAt(1));
068    }
069
070    public EncryptedData(
071        ASN1ObjectIdentifier contentType,
072        AlgorithmIdentifier     encryptionAlgorithm,
073        ASN1Encodable content)
074    {
075        ASN1EncodableVector v = new ASN1EncodableVector();
076
077        v.add(contentType);
078        v.add(encryptionAlgorithm.toASN1Primitive());
079        v.add(new BERTaggedObject(false, 0, content));
080
081        data = new BERSequence(v);
082    }
083        
084    public ASN1ObjectIdentifier getContentType()
085    {
086        return ASN1ObjectIdentifier.getInstance(data.getObjectAt(0));
087    }
088
089    public AlgorithmIdentifier getEncryptionAlgorithm()
090    {
091        return AlgorithmIdentifier.getInstance(data.getObjectAt(1));
092    }
093
094    public ASN1OctetString getContent()
095    {
096        if (data.size() == 3)
097        {
098            ASN1TaggedObject o = ASN1TaggedObject.getInstance(data.getObjectAt(2));
099
100            return ASN1OctetString.getInstance(o, false);
101        }
102
103        return null;
104    }
105
106    public ASN1Primitive toASN1Primitive()
107    {
108        ASN1EncodableVector v = new ASN1EncodableVector();
109
110        v.add(new ASN1Integer(0));
111        v.add(data);
112
113        return new BERSequence(v);
114    }
115}