package org.spongycastle.openpgp.operator.bc;
import java.security.SecureRandom;
import org.spongycastle.crypto.BlockCipher;
import org.spongycastle.crypto.BufferedBlockCipher;
import org.spongycastle.crypto.InvalidCipherTextException;
import org.spongycastle.openpgp.PGPException;
import org.spongycastle.openpgp.operator.PBEKeyEncryptionMethodGenerator;
import org.spongycastle.openpgp.operator.PGPDigestCalculator;
/**
* A BC lightweight method generator for supporting PBE based encryption operations.
*/
public class BcPBEKeyEncryptionMethodGenerator
extends PBEKeyEncryptionMethodGenerator
{
/**
* Create a PBE encryption method generator using the provided calculator for key calculation.
*
* @param passPhrase the passphrase to use as the primary source of key material.
* @param s2kDigestCalculator the digest calculator to use for key calculation.
*/
public BcPBEKeyEncryptionMethodGenerator(char[] passPhrase, PGPDigestCalculator s2kDigestCalculator)
{
super(passPhrase, s2kDigestCalculator);
}
/**
* Create a PBE encryption method generator using the default SHA-1 digest calculator for key calculation.
*
* @param passPhrase the passphrase to use as the primary source of key material.
*/
public BcPBEKeyEncryptionMethodGenerator(char[] passPhrase)
{
this(passPhrase, new SHA1PGPDigestCalculator());
}
/**
* Provide a user defined source of randomness.
*
* @param random the secure random to be used.
* @return the current generator.
*/
public PBEKeyEncryptionMethodGenerator setSecureRandom(SecureRandom random)
{
super.setSecureRandom(random);
return this;
}
protected byte[] encryptSessionInfo(int encAlgorithm, byte[] key, byte[] sessionInfo)
throws PGPException
{
try
{
BlockCipher engine = BcImplProvider.createBlockCipher(encAlgorithm);
BufferedBlockCipher cipher = BcUtil.createSymmetricKeyWrapper(true, engine, key, new byte[engine.getBlockSize()]);
byte[] out = new byte[sessionInfo.length];
int len = cipher.processBytes(sessionInfo, 0, sessionInfo.length, out, 0);
len += cipher.doFinal(out, len);
return out;
}
catch (InvalidCipherTextException e)
{
throw new PGPException("encryption failed: " + e.getMessage(), e);
}
}
}