blob: a12c66b3ffb79ec58b2bf4cff25ec922418bfc8d [file] [log] [blame]
package org.bouncycastle.cms.bc;
import java.io.OutputStream;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Map;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.cms.CMSAlgorithm;
import org.bouncycastle.cms.CMSException;
import org.bouncycastle.crypto.BufferedBlockCipher;
import org.bouncycastle.crypto.CipherKeyGenerator;
import org.bouncycastle.crypto.StreamCipher;
import org.bouncycastle.crypto.io.CipherOutputStream;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.operator.GenericKey;
import org.bouncycastle.operator.OutputEncryptor;
import org.bouncycastle.util.Integers;
public class BcCMSContentEncryptorBuilder
{
private static Map keySizes = new HashMap();
static
{
keySizes.put(CMSAlgorithm.AES128_CBC, Integers.valueOf(128));
keySizes.put(CMSAlgorithm.AES192_CBC, Integers.valueOf(192));
keySizes.put(CMSAlgorithm.AES256_CBC, Integers.valueOf(256));
keySizes.put(CMSAlgorithm.CAMELLIA128_CBC, Integers.valueOf(128));
keySizes.put(CMSAlgorithm.CAMELLIA192_CBC, Integers.valueOf(192));
keySizes.put(CMSAlgorithm.CAMELLIA256_CBC, Integers.valueOf(256));
}
private static int getKeySize(ASN1ObjectIdentifier oid)
{
Integer size = (Integer)keySizes.get(oid);
if (size != null)
{
return size.intValue();
}
return -1;
}
private final ASN1ObjectIdentifier encryptionOID;
private final int keySize;
private EnvelopedDataHelper helper = new EnvelopedDataHelper();
private SecureRandom random;
public BcCMSContentEncryptorBuilder(ASN1ObjectIdentifier encryptionOID)
{
this(encryptionOID, getKeySize(encryptionOID));
}
public BcCMSContentEncryptorBuilder(ASN1ObjectIdentifier encryptionOID, int keySize)
{
this.encryptionOID = encryptionOID;
this.keySize = keySize;
}
public BcCMSContentEncryptorBuilder setSecureRandom(SecureRandom random)
{
this.random = random;
return this;
}
public OutputEncryptor build()
throws CMSException
{
return new CMSOutputEncryptor(encryptionOID, keySize, random);
}
private class CMSOutputEncryptor
implements OutputEncryptor
{
private KeyParameter encKey;
private AlgorithmIdentifier algorithmIdentifier;
private Object cipher;
CMSOutputEncryptor(ASN1ObjectIdentifier encryptionOID, int keySize, SecureRandom random)
throws CMSException
{
if (random == null)
{
random = new SecureRandom();
}
CipherKeyGenerator keyGen = helper.createKeyGenerator(encryptionOID, random);
encKey = new KeyParameter(keyGen.generateKey());
algorithmIdentifier = helper.generateAlgorithmIdentifier(encryptionOID, encKey, random);
cipher = helper.createContentCipher(true, encKey, algorithmIdentifier);
}
public AlgorithmIdentifier getAlgorithmIdentifier()
{
return algorithmIdentifier;
}
public OutputStream getOutputStream(OutputStream dOut)
{
if (cipher instanceof BufferedBlockCipher)
{
return new CipherOutputStream(dOut, (BufferedBlockCipher)cipher);
}
else
{
return new CipherOutputStream(dOut, (StreamCipher)cipher);
}
}
public GenericKey getKey()
{
return new GenericKey(algorithmIdentifier, encKey.getKey());
}
}
}