1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.cms;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Encodable;
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1EncodableVector;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
66e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Sequence;
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1TaggedObject;
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.BERSequence;
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.BERTaggedObject;
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
135db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root/**
145db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <a href="http://tools.ietf.org/html/rfc5652#section-3">RFC 5652</a> ContentInfo, and
155db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <a href="http://tools.ietf.org/html/rfc5652#section-5.2">RFC 5652</a> EncapsulatedContentInfo objects.
165db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root *
175db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <pre>
185db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * ContentInfo ::= SEQUENCE {
195db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root *     contentType ContentType,
205db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root *     content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL
215db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * }
225db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root *
235db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * EncapsulatedContentInfo ::= SEQUENCE {
245db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root *     eContentType ContentType,
255db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root *     eContent [0] EXPLICIT OCTET STRING OPTIONAL
265db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * }
275db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * </pre>
285db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root */
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class ContentInfo
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    // BEGIN android-removed
326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    // implements CMSObjectIdentifiers
336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    // END android-removed
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private ASN1ObjectIdentifier contentType;
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private ASN1Encodable        content;
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
385db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    /**
395db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * Return an ContentInfo object from the given object.
405db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * <p>
415db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * Accepted inputs:
425db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * <ul>
435db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * <li> null &rarr; null
445db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * <li> {@link ContentInfo} object
455db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats with ContentInfo structure inside
465db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * </ul>
475db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     *
485db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * @param obj the object we want converted.
495db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * @exception IllegalArgumentException if the object cannot be converted.
505db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     */
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static ContentInfo getInstance(
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Object  obj)
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (obj instanceof ContentInfo)
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return (ContentInfo)obj;
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (obj != null)
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new ContentInfo(ASN1Sequence.getInstance(obj));
61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return null;
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
66a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    public static ContentInfo getInstance(
67a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        ASN1TaggedObject obj,
68a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        boolean explicit)
69a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    {
70a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        return getInstance(ASN1Sequence.getInstance(obj, explicit));
71a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    }
72a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
73a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    /**
74a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom     * @deprecated use getInstance()
75a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom     */
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public ContentInfo(
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Sequence  seq)
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
796e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (seq.size() < 1 || seq.size() > 2)
806e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
816e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            throw new IllegalArgumentException("Bad sequence size: " + seq.size());
826e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
846e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        contentType = (ASN1ObjectIdentifier)seq.getObjectAt(0);
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
866e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (seq.size() > 1)
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
886e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            ASN1TaggedObject tagged = (ASN1TaggedObject)seq.getObjectAt(1);
896e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            if (!tagged.isExplicit() || tagged.getTagNo() != 0)
906e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
916e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                throw new IllegalArgumentException("Bad tag for 'content'");
926e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
936e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
946e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            content = tagged.getObject();
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public ContentInfo(
996e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        ASN1ObjectIdentifier contentType,
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Encodable        content)
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.contentType = contentType;
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.content = content;
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1066e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public ASN1ObjectIdentifier getContentType()
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return contentType;
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Encodable getContent()
112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return content;
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Produce an object suitable for an ASN1OutputStream.
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1EncodableVector  v = new ASN1EncodableVector();
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        v.add(contentType);
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (content != null)
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            v.add(new BERTaggedObject(0, content));
128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return new BERSequence(v);
131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
133