1 package org.bouncycastle.asn1.cms;
2 
3 import org.bouncycastle.asn1.ASN1Encodable;
4 import org.bouncycastle.asn1.ASN1EncodableVector;
5 import org.bouncycastle.asn1.ASN1Object;
6 import org.bouncycastle.asn1.ASN1ObjectIdentifier;
7 import org.bouncycastle.asn1.ASN1Primitive;
8 import org.bouncycastle.asn1.ASN1Sequence;
9 import org.bouncycastle.asn1.ASN1TaggedObject;
10 import org.bouncycastle.asn1.BERSequence;
11 import org.bouncycastle.asn1.BERTaggedObject;
12 
13 /**
14  * <a href="http://tools.ietf.org/html/rfc5652#section-3">RFC 5652</a> ContentInfo, and
15  * <a href="http://tools.ietf.org/html/rfc5652#section-5.2">RFC 5652</a> EncapsulatedContentInfo objects.
16  *
17  * <pre>
18  * ContentInfo ::= SEQUENCE {
19  *     contentType ContentType,
20  *     content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL
21  * }
22  *
23  * EncapsulatedContentInfo ::= SEQUENCE {
24  *     eContentType ContentType,
25  *     eContent [0] EXPLICIT OCTET STRING OPTIONAL
26  * }
27  * </pre>
28  */
29 public class ContentInfo
30     extends ASN1Object
31     // BEGIN android-removed
32     // implements CMSObjectIdentifiers
33     // END android-removed
34 {
35     private ASN1ObjectIdentifier contentType;
36     private ASN1Encodable        content;
37 
38     /**
39      * Return an ContentInfo object from the given object.
40      * <p>
41      * Accepted inputs:
42      * <ul>
43      * <li> null &rarr; null
44      * <li> {@link ContentInfo} object
45      * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats with ContentInfo structure inside
46      * </ul>
47      *
48      * @param obj the object we want converted.
49      * @exception IllegalArgumentException if the object cannot be converted.
50      */
getInstance( Object obj)51     public static ContentInfo getInstance(
52         Object  obj)
53     {
54         if (obj instanceof ContentInfo)
55         {
56             return (ContentInfo)obj;
57         }
58         else if (obj != null)
59         {
60             return new ContentInfo(ASN1Sequence.getInstance(obj));
61         }
62 
63         return null;
64     }
65 
getInstance( ASN1TaggedObject obj, boolean explicit)66     public static ContentInfo getInstance(
67         ASN1TaggedObject obj,
68         boolean explicit)
69     {
70         return getInstance(ASN1Sequence.getInstance(obj, explicit));
71     }
72 
73     /**
74      * @deprecated use getInstance()
75      */
ContentInfo( ASN1Sequence seq)76     public ContentInfo(
77         ASN1Sequence  seq)
78     {
79         if (seq.size() < 1 || seq.size() > 2)
80         {
81             throw new IllegalArgumentException("Bad sequence size: " + seq.size());
82         }
83 
84         contentType = (ASN1ObjectIdentifier)seq.getObjectAt(0);
85 
86         if (seq.size() > 1)
87         {
88             ASN1TaggedObject tagged = (ASN1TaggedObject)seq.getObjectAt(1);
89             if (!tagged.isExplicit() || tagged.getTagNo() != 0)
90             {
91                 throw new IllegalArgumentException("Bad tag for 'content'");
92             }
93 
94             content = tagged.getObject();
95         }
96     }
97 
ContentInfo( ASN1ObjectIdentifier contentType, ASN1Encodable content)98     public ContentInfo(
99         ASN1ObjectIdentifier contentType,
100         ASN1Encodable        content)
101     {
102         this.contentType = contentType;
103         this.content = content;
104     }
105 
getContentType()106     public ASN1ObjectIdentifier getContentType()
107     {
108         return contentType;
109     }
110 
getContent()111     public ASN1Encodable getContent()
112     {
113         return content;
114     }
115 
116     /**
117      * Produce an object suitable for an ASN1OutputStream.
118      */
toASN1Primitive()119     public ASN1Primitive toASN1Primitive()
120     {
121         ASN1EncodableVector  v = new ASN1EncodableVector();
122 
123         v.add(contentType);
124 
125         if (content != null)
126         {
127             v.add(new BERTaggedObject(0, content));
128         }
129 
130         return new BERSequence(v);
131     }
132 }
133