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 → 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}