org.spongycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of pg Show documentation
Show all versions of pg Show documentation
Spongy Castle is a package-rename (org.bouncycastle.* to org.spongycastle.*) of Bouncy Castle
intended for the Android platform. Android unfortunately ships with a stripped-down version of
Bouncy Castle, which prevents easy upgrades - Spongy Castle overcomes this and provides a full,
up-to-date version of the Bouncy Castle cryptographic libs.
The newest version!
package org.spongycastle.openpgp.operator.jcajce;
import java.io.OutputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Provider;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.spec.IvParameterSpec;
import org.spongycastle.bcpg.SymmetricKeyAlgorithmTags;
import org.spongycastle.jcajce.util.DefaultJcaJceHelper;
import org.spongycastle.jcajce.util.NamedJcaJceHelper;
import org.spongycastle.jcajce.util.ProviderJcaJceHelper;
import org.spongycastle.openpgp.PGPException;
import org.spongycastle.openpgp.operator.PGPDataEncryptor;
import org.spongycastle.openpgp.operator.PGPDataEncryptorBuilder;
import org.spongycastle.openpgp.operator.PGPDigestCalculator;
/**
* {@link PGPDataEncryptorBuilder} implementation that sources cryptographic primitives using the
* JCE APIs.
*
* By default, cryptographic primitives will be loaded using the default JCE load order (i.e.
* without specifying a provider).
* A specific provider can be specified using one of the {@link #setProvider(String)} methods.
*
*/
public class JcePGPDataEncryptorBuilder
implements PGPDataEncryptorBuilder
{
private OperatorHelper helper = new OperatorHelper(new DefaultJcaJceHelper());
private SecureRandom random;
private boolean withIntegrityPacket;
private int encAlgorithm;
/**
* Constructs a new data encryptor builder for a specified cipher type.
*
* @param encAlgorithm one of the {@link SymmetricKeyAlgorithmTags supported symmetric cipher
* algorithms}. May not be {@link SymmetricKeyAlgorithmTags#NULL}.
*/
public JcePGPDataEncryptorBuilder(int encAlgorithm)
{
this.encAlgorithm = encAlgorithm;
if (encAlgorithm == 0)
{
throw new IllegalArgumentException("null cipher specified");
}
}
/**
* Sets whether or not the resulting encrypted data will be protected using an integrity packet.
*
* @param withIntegrityPacket true if an integrity packet is to be included, false otherwise.
* @return the current builder.
*/
public JcePGPDataEncryptorBuilder setWithIntegrityPacket(boolean withIntegrityPacket)
{
this.withIntegrityPacket = withIntegrityPacket;
return this;
}
/**
* Sets the JCE provider to source cryptographic primitives from.
*
* @param provider the JCE provider to use.
* @return the current builder.
*/
public JcePGPDataEncryptorBuilder setProvider(Provider provider)
{
this.helper = new OperatorHelper(new ProviderJcaJceHelper(provider));
return this;
}
/**
* Sets the JCE provider to source cryptographic primitives from.
*
* @param providerName the name of the JCE provider to use.
* @return the current builder.
*/
public JcePGPDataEncryptorBuilder setProvider(String providerName)
{
this.helper = new OperatorHelper(new NamedJcaJceHelper(providerName));
return this;
}
/**
* Provide a user defined source of randomness.
*
* If no SecureRandom is configured, a default SecureRandom will be used.
*
* @param random the secure random to be used.
* @return the current builder.
*/
public JcePGPDataEncryptorBuilder setSecureRandom(SecureRandom random)
{
this.random = random;
return this;
}
public int getAlgorithm()
{
return encAlgorithm;
}
public SecureRandom getSecureRandom()
{
if (random == null)
{
random = new SecureRandom();
}
return random;
}
public PGPDataEncryptor build(byte[] keyBytes)
throws PGPException
{
return new MyPGPDataEncryptor(keyBytes);
}
private class MyPGPDataEncryptor
implements PGPDataEncryptor
{
private final Cipher c;
MyPGPDataEncryptor(byte[] keyBytes)
throws PGPException
{
c = helper.createStreamCipher(encAlgorithm, withIntegrityPacket);
try
{
if (withIntegrityPacket)
{
byte[] iv = new byte[c.getBlockSize()];
c.init(Cipher.ENCRYPT_MODE, PGPUtil.makeSymmetricKey(encAlgorithm, keyBytes), new IvParameterSpec(iv));
}
else
{
c.init(Cipher.ENCRYPT_MODE, PGPUtil.makeSymmetricKey(encAlgorithm, keyBytes));
}
}
catch (InvalidKeyException e)
{
throw new PGPException("invalid key: " + e.getMessage(), e);
}
catch (InvalidAlgorithmParameterException e)
{
throw new PGPException("imvalid algorithm parameter: " + e.getMessage(), e);
}
}
public OutputStream getOutputStream(OutputStream out)
{
return new CipherOutputStream(out, c);
}
public PGPDigestCalculator getIntegrityCalculator()
{
if (withIntegrityPacket)
{
return new SHA1PGPDigestCalculator();
}
return null;
}
public int getBlockSize()
{
return c.getBlockSize();
}
}
}