package org.bouncycastle.cms.jcajce; import java.io.OutputStream; import java.security.Key; import javax.crypto.Mac; import org.bouncycastle.asn1.x509.AlgorithmIdentifier; import org.bouncycastle.cms.CMSException; import org.bouncycastle.cms.RecipientOperator; import org.bouncycastle.jcajce.io.MacOutputStream; import org.bouncycastle.operator.GenericKey; import org.bouncycastle.operator.MacCalculator; public class JcePasswordAuthenticatedRecipient extends JcePasswordRecipient { public JcePasswordAuthenticatedRecipient(char[] password) { super(password); } public RecipientOperator getRecipientOperator(AlgorithmIdentifier keyEncryptionAlgorithm, final AlgorithmIdentifier contentMacAlgorithm, byte[] derivedKey, byte[] encryptedContentEncryptionKey) throws CMSException { final Key secretKey = extractSecretKey(keyEncryptionAlgorithm, contentMacAlgorithm, derivedKey, encryptedContentEncryptionKey); final Mac dataMac = helper.createContentMac(secretKey, contentMacAlgorithm); return new RecipientOperator(new MacCalculator() { public AlgorithmIdentifier getAlgorithmIdentifier() { return contentMacAlgorithm; } public GenericKey getKey() { return new GenericKey(secretKey); } public OutputStream getOutputStream() { return new MacOutputStream(dataMac); } public byte[] getMac() { return dataMac.doFinal(); } }); } }