diff options
Diffstat (limited to 'pkix/src/main/java/org/spongycastle/cms/bc/BcPasswordEnvelopedRecipient.java')
-rw-r--r-- | pkix/src/main/java/org/spongycastle/cms/bc/BcPasswordEnvelopedRecipient.java | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/pkix/src/main/java/org/spongycastle/cms/bc/BcPasswordEnvelopedRecipient.java b/pkix/src/main/java/org/spongycastle/cms/bc/BcPasswordEnvelopedRecipient.java new file mode 100644 index 00000000..0b9a529f --- /dev/null +++ b/pkix/src/main/java/org/spongycastle/cms/bc/BcPasswordEnvelopedRecipient.java @@ -0,0 +1,49 @@ +package org.spongycastle.cms.bc; + +import java.io.InputStream; + +import org.spongycastle.asn1.x509.AlgorithmIdentifier; +import org.spongycastle.cms.CMSException; +import org.spongycastle.cms.RecipientOperator; +import org.spongycastle.crypto.BufferedBlockCipher; +import org.spongycastle.crypto.StreamCipher; +import org.spongycastle.crypto.io.CipherInputStream; +import org.spongycastle.crypto.params.KeyParameter; +import org.spongycastle.operator.InputDecryptor; + +public class BcPasswordEnvelopedRecipient + extends BcPasswordRecipient +{ + public BcPasswordEnvelopedRecipient(char[] password) + { + super(password); + } + + public RecipientOperator getRecipientOperator(AlgorithmIdentifier keyEncryptionAlgorithm, final AlgorithmIdentifier contentEncryptionAlgorithm, byte[] derivedKey, byte[] encryptedContentEncryptionKey) + throws CMSException + { + KeyParameter secretKey = extractSecretKey(keyEncryptionAlgorithm, contentEncryptionAlgorithm, derivedKey, encryptedContentEncryptionKey); + + final Object dataCipher = EnvelopedDataHelper.createContentCipher(false, secretKey, contentEncryptionAlgorithm); + + return new RecipientOperator(new InputDecryptor() + { + public AlgorithmIdentifier getAlgorithmIdentifier() + { + return contentEncryptionAlgorithm; + } + + public InputStream getInputStream(InputStream dataOut) + { + if (dataCipher instanceof BufferedBlockCipher) + { + return new CipherInputStream(dataOut, (BufferedBlockCipher)dataCipher); + } + else + { + return new CipherInputStream(dataOut, (StreamCipher)dataCipher); + } + } + }); + } +} |