diff options
Diffstat (limited to 'pkix/src/main/java/org/spongycastle/cms/CMSEncryptedDataGenerator.java')
-rw-r--r-- | pkix/src/main/java/org/spongycastle/cms/CMSEncryptedDataGenerator.java | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/pkix/src/main/java/org/spongycastle/cms/CMSEncryptedDataGenerator.java b/pkix/src/main/java/org/spongycastle/cms/CMSEncryptedDataGenerator.java new file mode 100644 index 00000000..b2a75087 --- /dev/null +++ b/pkix/src/main/java/org/spongycastle/cms/CMSEncryptedDataGenerator.java @@ -0,0 +1,109 @@ +package org.spongycastle.cms; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.HashMap; + +import org.spongycastle.asn1.ASN1OctetString; +import org.spongycastle.asn1.ASN1Set; +import org.spongycastle.asn1.BEROctetString; +import org.spongycastle.asn1.BERSet; +import org.spongycastle.asn1.cms.AttributeTable; +import org.spongycastle.asn1.cms.CMSObjectIdentifiers; +import org.spongycastle.asn1.cms.ContentInfo; +import org.spongycastle.asn1.cms.EncryptedContentInfo; +import org.spongycastle.asn1.cms.EncryptedData; +import org.spongycastle.asn1.x509.AlgorithmIdentifier; +import org.spongycastle.operator.OutputEncryptor; + +/** + * General class for generating a CMS enveloped-data message. + * + * A simple example of usage. + * + * <pre> + * CMSTypedData msg = new CMSProcessableByteArray("Hello World!".getBytes()); + * + * CMSEncryptedDataGenerator edGen = new CMSEnvelopedDataGenerator(); + * + * CMSEncryptedData ed = edGen.generate( + * msg, + * new JceCMSContentEncryptorBuilder(CMSAlgorithm.DES_EDE3_CBC) + * .setProvider("SC").build()); + * + * </pre> + */ +public class CMSEncryptedDataGenerator + extends CMSEncryptedGenerator +{ + /** + * base constructor + */ + public CMSEncryptedDataGenerator() + { + } + + private CMSEncryptedData doGenerate( + CMSTypedData content, + OutputEncryptor contentEncryptor) + throws CMSException + { + AlgorithmIdentifier encAlgId; + ASN1OctetString encContent; + + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + + try + { + OutputStream cOut = contentEncryptor.getOutputStream(bOut); + + content.write(cOut); + + cOut.close(); + } + catch (IOException e) + { + throw new CMSException(""); + } + + byte[] encryptedContent = bOut.toByteArray(); + + encAlgId = contentEncryptor.getAlgorithmIdentifier(); + + encContent = new BEROctetString(encryptedContent); + + EncryptedContentInfo eci = new EncryptedContentInfo( + content.getContentType(), + encAlgId, + encContent); + + ASN1Set unprotectedAttrSet = null; + if (unprotectedAttributeGenerator != null) + { + AttributeTable attrTable = unprotectedAttributeGenerator.getAttributes(new HashMap()); + + unprotectedAttrSet = new BERSet(attrTable.toASN1EncodableVector()); + } + + ContentInfo contentInfo = new ContentInfo( + CMSObjectIdentifiers.encryptedData, + new EncryptedData(eci, unprotectedAttrSet)); + + return new CMSEncryptedData(contentInfo); + } + + /** + * generate an encrypted object that contains an CMS Encrypted Data structure. + * + * @param content the content to be encrypted + * @param contentEncryptor the symmetric key based encryptor to encrypt the content with. + */ + public CMSEncryptedData generate( + CMSTypedData content, + OutputEncryptor contentEncryptor) + throws CMSException + { + return doGenerate(content, contentEncryptor); + } +} |