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.ASN1Object;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier;
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.BERTaggedObject;
012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
013
014/**
015 * <a href="http://tools.ietf.org/html/rfc5652#section-6.1">RFC 5652</a> EncryptedContentInfo object.
016 *
017 * <pre>
018 * EncryptedContentInfo ::= SEQUENCE {
019 *     contentType ContentType,
020 *     contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
021 *     encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL 
022 * }
023 * </pre>
024 */
025public class EncryptedContentInfo
026    extends ASN1Object
027{
028    private ASN1ObjectIdentifier contentType;
029    private AlgorithmIdentifier contentEncryptionAlgorithm;
030    private ASN1OctetString     encryptedContent;
031    
032    public EncryptedContentInfo(
033        ASN1ObjectIdentifier contentType, 
034        AlgorithmIdentifier contentEncryptionAlgorithm,
035        ASN1OctetString     encryptedContent)
036    {
037        this.contentType = contentType;
038        this.contentEncryptionAlgorithm = contentEncryptionAlgorithm;
039        this.encryptedContent = encryptedContent;
040    }
041    
042    private EncryptedContentInfo(
043        ASN1Sequence seq)
044    {
045        if (seq.size() < 2)
046        {
047            throw new IllegalArgumentException("Truncated Sequence Found");
048        }
049
050        contentType = (ASN1ObjectIdentifier)seq.getObjectAt(0);
051        contentEncryptionAlgorithm = AlgorithmIdentifier.getInstance(
052                                                        seq.getObjectAt(1));
053        if (seq.size() > 2)
054        {
055            encryptedContent = ASN1OctetString.getInstance(
056                                (ASN1TaggedObject)seq.getObjectAt(2), false);
057        }
058    }
059
060    /**
061     * Return an EncryptedContentInfo object from the given object.
062     * <p>
063     * Accepted inputs:
064     * <ul>
065     * <li> null &rarr; null
066     * <li> {@link EncryptedContentInfo} object
067     * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats
068     * </ul>
069     *
070     * @param obj the object we want converted.
071     * @exception IllegalArgumentException if the object cannot be converted.
072     */
073    public static EncryptedContentInfo getInstance(
074        Object obj)
075    {
076        if (obj instanceof EncryptedContentInfo)
077        {
078            return (EncryptedContentInfo)obj;
079        }
080        if (obj != null)
081        {
082            return new EncryptedContentInfo(ASN1Sequence.getInstance(obj));
083        }
084        
085        return null;
086    }
087
088    public ASN1ObjectIdentifier getContentType()
089    {
090        return contentType;
091    }
092
093    public AlgorithmIdentifier getContentEncryptionAlgorithm()
094    {
095        return contentEncryptionAlgorithm;
096    }
097
098    public ASN1OctetString getEncryptedContent()
099    {
100        return encryptedContent;
101    }
102
103    /** 
104     * Produce an object suitable for an ASN1OutputStream.
105     */
106    public ASN1Primitive toASN1Primitive()
107    {
108        ASN1EncodableVector  v = new ASN1EncodableVector();
109        
110        v.add(contentType);
111        v.add(contentEncryptionAlgorithm);
112
113        if (encryptedContent != null)
114        {
115            v.add(new BERTaggedObject(false, 0, encryptedContent));
116        }
117        
118        return new BERSequence(v);
119    }
120}