1package org.bouncycastle.asn1.pkcs;
2
3import org.bouncycastle.asn1.ASN1Encodable;
4import org.bouncycastle.asn1.ASN1EncodableVector;
5import org.bouncycastle.asn1.ASN1OctetString;
6import org.bouncycastle.asn1.ASN1Sequence;
7import org.bouncycastle.asn1.BERSequence;
8import org.bouncycastle.asn1.BERTaggedObject;
9import org.bouncycastle.asn1.DEREncodable;
10import org.bouncycastle.asn1.DERInteger;
11import org.bouncycastle.asn1.DERObject;
12import org.bouncycastle.asn1.DERObjectIdentifier;
13import org.bouncycastle.asn1.DERTaggedObject;
14import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
15
16/**
17 * The EncryptedData object.
18 * <pre>
19 *      EncryptedData ::= SEQUENCE {
20 *           version Version,
21 *           encryptedContentInfo EncryptedContentInfo
22 *      }
23 *
24 *
25 *      EncryptedContentInfo ::= SEQUENCE {
26 *          contentType ContentType,
27 *          contentEncryptionAlgorithm  ContentEncryptionAlgorithmIdentifier,
28 *          encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
29 *    }
30 *
31 *    EncryptedContent ::= OCTET STRING
32 * </pre>
33 */
34public class EncryptedData
35    extends ASN1Encodable
36{
37    ASN1Sequence                data;
38    DERObjectIdentifier         bagId;
39    DERObject                   bagValue;
40
41    public static EncryptedData getInstance(
42         Object  obj)
43    {
44         if (obj instanceof EncryptedData)
45         {
46             return (EncryptedData)obj;
47         }
48         else if (obj instanceof ASN1Sequence)
49         {
50             return new EncryptedData((ASN1Sequence)obj);
51         }
52
53         throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
54    }
55
56    public EncryptedData(
57        ASN1Sequence seq)
58    {
59        int version = ((DERInteger)seq.getObjectAt(0)).getValue().intValue();
60
61        if (version != 0)
62        {
63            throw new IllegalArgumentException("sequence not version 0");
64        }
65
66        this.data = (ASN1Sequence)seq.getObjectAt(1);
67    }
68
69    public EncryptedData(
70        DERObjectIdentifier     contentType,
71        AlgorithmIdentifier     encryptionAlgorithm,
72        DEREncodable            content)
73    {
74        ASN1EncodableVector v = new ASN1EncodableVector();
75
76        v.add(contentType);
77        v.add(encryptionAlgorithm.getDERObject());
78        v.add(new BERTaggedObject(false, 0, content));
79
80        data = new BERSequence(v);
81    }
82
83    public DERObjectIdentifier getContentType()
84    {
85        return (DERObjectIdentifier)data.getObjectAt(0);
86    }
87
88    public AlgorithmIdentifier getEncryptionAlgorithm()
89    {
90        return AlgorithmIdentifier.getInstance(data.getObjectAt(1));
91    }
92
93    public ASN1OctetString getContent()
94    {
95        if (data.size() == 3)
96        {
97            DERTaggedObject o = (DERTaggedObject)data.getObjectAt(2);
98
99            return ASN1OctetString.getInstance(o, false);
100        }
101
102        return null;
103    }
104
105    public DERObject toASN1Object()
106    {
107        ASN1EncodableVector  v = new ASN1EncodableVector();
108
109        v.add(new DERInteger(0));
110        v.add(data);
111
112        return new BERSequence(v);
113    }
114}
115