blob: d4541fb9e06669103c43b8d55366d39236cc4d75 [file] [log] [blame]
package org.bouncycastle.cms;
import java.io.IOException;
import java.io.InputStream;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1Set;
import org.bouncycastle.asn1.cms.AttributeTable;
import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.asn1.cms.EncryptedContentInfo;
import org.bouncycastle.asn1.cms.EnvelopedData;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.util.Encodable;
/**
* containing class for an CMS Enveloped Data object
* <p>
* Example of use - assuming the first recipient matches the private key we have.
* <pre>
* CMSEnvelopedData ed = new CMSEnvelopedData(inputStream);
*
* RecipientInformationStore recipients = ed.getRecipientInfos();
*
* Collection c = recipients.getRecipients();
* Iterator it = c.iterator();
*
* if (it.hasNext())
* {
* RecipientInformation recipient = (RecipientInformation)it.next();
*
* byte[] recData = recipient.getContent(new JceKeyTransEnvelopedRecipient(privateKey).setProvider("BC"));
*
* processData(recData);
* }
* </pre>
*/
public class CMSEnvelopedData
implements Encodable
{
RecipientInformationStore recipientInfoStore;
ContentInfo contentInfo;
private AlgorithmIdentifier encAlg;
private ASN1Set unprotectedAttributes;
private OriginatorInformation originatorInfo;
public CMSEnvelopedData(
byte[] envelopedData)
throws CMSException
{
this(CMSUtils.readContentInfo(envelopedData));
}
public CMSEnvelopedData(
InputStream envelopedData)
throws CMSException
{
this(CMSUtils.readContentInfo(envelopedData));
}
/**
* Construct a CMSEnvelopedData object from a content info object.
*
* @param contentInfo the contentInfo containing the CMS EnvelopedData object.
* @throws CMSException in the case where malformed content is encountered.
*/
public CMSEnvelopedData(
ContentInfo contentInfo)
throws CMSException
{
this.contentInfo = contentInfo;
try
{
EnvelopedData envData = EnvelopedData.getInstance(contentInfo.getContent());
if (envData.getOriginatorInfo() != null)
{
originatorInfo = new OriginatorInformation(envData.getOriginatorInfo());
}
//
// read the recipients
//
ASN1Set recipientInfos = envData.getRecipientInfos();
//
// read the encrypted content info
//
EncryptedContentInfo encInfo = envData.getEncryptedContentInfo();
this.encAlg = encInfo.getContentEncryptionAlgorithm();
CMSReadable readable = new CMSProcessableByteArray(encInfo.getEncryptedContent().getOctets());
CMSSecureReadable secureReadable = new CMSEnvelopedHelper.CMSEnvelopedSecureReadable(
this.encAlg, readable);
//
// build the RecipientInformationStore
//
this.recipientInfoStore = CMSEnvelopedHelper.buildRecipientInformationStore(
recipientInfos, this.encAlg, secureReadable);
this.unprotectedAttributes = envData.getUnprotectedAttrs();
}
catch (ClassCastException e)
{
throw new CMSException("Malformed content.", e);
}
catch (IllegalArgumentException e)
{
throw new CMSException("Malformed content.", e);
}
}
private byte[] encodeObj(
ASN1Encodable obj)
throws IOException
{
if (obj != null)
{
return obj.toASN1Primitive().getEncoded();
}
return null;
}
/**
* Return the originator information associated with this message if present.
*
* @return OriginatorInformation, null if not present.
*/
public OriginatorInformation getOriginatorInfo()
{
return originatorInfo;
}
/**
* Return the content encryption algorithm details for the data in this object.
*
* @return AlgorithmIdentifier representing the content encryption algorithm.
*/
public AlgorithmIdentifier getContentEncryptionAlgorithm()
{
return encAlg;
}
/**
* return the object identifier for the content encryption algorithm.
*/
public String getEncryptionAlgOID()
{
return encAlg.getAlgorithm().getId();
}
/**
* return the ASN.1 encoded encryption algorithm parameters, or null if
* there aren't any.
*/
public byte[] getEncryptionAlgParams()
{
try
{
return encodeObj(encAlg.getParameters());
}
catch (Exception e)
{
throw new RuntimeException("exception getting encryption parameters " + e);
}
}
/**
* return a store of the intended recipients for this message
*/
public RecipientInformationStore getRecipientInfos()
{
return recipientInfoStore;
}
/**
* return the ContentInfo
*/
public ContentInfo toASN1Structure()
{
return contentInfo;
}
/**
* return a table of the unprotected attributes indexed by
* the OID of the attribute.
*/
public AttributeTable getUnprotectedAttributes()
{
if (unprotectedAttributes == null)
{
return null;
}
return new AttributeTable(unprotectedAttributes);
}
/**
* return the ASN.1 encoded representation of this object.
*/
public byte[] getEncoded()
throws IOException
{
return contentInfo.getEncoded();
}
}