001package org.apache.commons.ssl.org.bouncycastle.asn1.cms; 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.ASN1Object; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier; 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; 012 013/** 014 * <a href="http://tools.ietf.org/html/rfc5652#section-3">RFC 5652</a> ContentInfo, and 015 * <a href="http://tools.ietf.org/html/rfc5652#section-5.2">RFC 5652</a> EncapsulatedContentInfo objects. 016 * 017 * <pre> 018 * ContentInfo ::= SEQUENCE { 019 * contentType ContentType, 020 * content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL 021 * } 022 * 023 * EncapsulatedContentInfo ::= SEQUENCE { 024 * eContentType ContentType, 025 * eContent [0] EXPLICIT OCTET STRING OPTIONAL 026 * } 027 * </pre> 028 */ 029public class ContentInfo 030 extends ASN1Object 031 implements CMSObjectIdentifiers 032{ 033 private ASN1ObjectIdentifier contentType; 034 private ASN1Encodable content; 035 036 /** 037 * Return an ContentInfo object from the given object. 038 * <p> 039 * Accepted inputs: 040 * <ul> 041 * <li> null → null 042 * <li> {@link ContentInfo} object 043 * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats with ContentInfo structure inside 044 * </ul> 045 * 046 * @param obj the object we want converted. 047 * @exception IllegalArgumentException if the object cannot be converted. 048 */ 049 public static ContentInfo getInstance( 050 Object obj) 051 { 052 if (obj instanceof ContentInfo) 053 { 054 return (ContentInfo)obj; 055 } 056 else if (obj != null) 057 { 058 return new ContentInfo(ASN1Sequence.getInstance(obj)); 059 } 060 061 return null; 062 } 063 064 public static ContentInfo getInstance( 065 ASN1TaggedObject obj, 066 boolean explicit) 067 { 068 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 069 } 070 071 /** 072 * @deprecated use getInstance() 073 */ 074 public ContentInfo( 075 ASN1Sequence seq) 076 { 077 if (seq.size() < 1 || seq.size() > 2) 078 { 079 throw new IllegalArgumentException("Bad sequence size: " + seq.size()); 080 } 081 082 contentType = (ASN1ObjectIdentifier)seq.getObjectAt(0); 083 084 if (seq.size() > 1) 085 { 086 ASN1TaggedObject tagged = (ASN1TaggedObject)seq.getObjectAt(1); 087 if (!tagged.isExplicit() || tagged.getTagNo() != 0) 088 { 089 throw new IllegalArgumentException("Bad tag for 'content'"); 090 } 091 092 content = tagged.getObject(); 093 } 094 } 095 096 public ContentInfo( 097 ASN1ObjectIdentifier contentType, 098 ASN1Encodable content) 099 { 100 this.contentType = contentType; 101 this.content = content; 102 } 103 104 public ASN1ObjectIdentifier getContentType() 105 { 106 return contentType; 107 } 108 109 public ASN1Encodable getContent() 110 { 111 return content; 112 } 113 114 /** 115 * Produce an object suitable for an ASN1OutputStream. 116 */ 117 public ASN1Primitive toASN1Primitive() 118 { 119 ASN1EncodableVector v = new ASN1EncodableVector(); 120 121 v.add(contentType); 122 123 if (content != null) 124 { 125 v.add(new BERTaggedObject(0, content)); 126 } 127 128 return new BERSequence(v); 129 } 130}