
org.spongycastle.crypto.engines.DESedeEngine Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of core Show documentation
Show all versions of core 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.
package org.spongycastle.crypto.engines;
import org.spongycastle.crypto.CipherParameters;
import org.spongycastle.crypto.DataLengthException;
import org.spongycastle.crypto.OutputLengthException;
import org.spongycastle.crypto.params.KeyParameter;
/**
* a class that provides a basic DESede (or Triple DES) engine.
*/
public class DESedeEngine
extends DESEngine
{
protected static final int BLOCK_SIZE = 8;
private int[] workingKey1 = null;
private int[] workingKey2 = null;
private int[] workingKey3 = null;
private boolean forEncryption;
/**
* standard constructor.
*/
public DESedeEngine()
{
}
/**
* initialise a DESede cipher.
*
* @param encrypting whether or not we are for encryption.
* @param params the parameters required to set up the cipher.
* @exception IllegalArgumentException if the params argument is
* inappropriate.
*/
public void init(
boolean encrypting,
CipherParameters params)
{
if (!(params instanceof KeyParameter))
{
throw new IllegalArgumentException("invalid parameter passed to DESede init - " + params.getClass().getName());
}
byte[] keyMaster = ((KeyParameter)params).getKey();
if (keyMaster.length != 24 && keyMaster.length != 16)
{
throw new IllegalArgumentException("key size must be 16 or 24 bytes.");
}
this.forEncryption = encrypting;
byte[] key1 = new byte[8];
System.arraycopy(keyMaster, 0, key1, 0, key1.length);
workingKey1 = generateWorkingKey(encrypting, key1);
byte[] key2 = new byte[8];
System.arraycopy(keyMaster, 8, key2, 0, key2.length);
workingKey2 = generateWorkingKey(!encrypting, key2);
if (keyMaster.length == 24)
{
byte[] key3 = new byte[8];
System.arraycopy(keyMaster, 16, key3, 0, key3.length);
workingKey3 = generateWorkingKey(encrypting, key3);
}
else // 16 byte key
{
workingKey3 = workingKey1;
}
}
public String getAlgorithmName()
{
return "DESede";
}
public int getBlockSize()
{
return BLOCK_SIZE;
}
public int processBlock(
byte[] in,
int inOff,
byte[] out,
int outOff)
{
if (workingKey1 == null)
{
throw new IllegalStateException("DESede engine not initialised");
}
if ((inOff + BLOCK_SIZE) > in.length)
{
throw new DataLengthException("input buffer too short");
}
if ((outOff + BLOCK_SIZE) > out.length)
{
throw new OutputLengthException("output buffer too short");
}
byte[] temp = new byte[BLOCK_SIZE];
if (forEncryption)
{
desFunc(workingKey1, in, inOff, temp, 0);
desFunc(workingKey2, temp, 0, temp, 0);
desFunc(workingKey3, temp, 0, out, outOff);
}
else
{
desFunc(workingKey3, in, inOff, temp, 0);
desFunc(workingKey2, temp, 0, temp, 0);
desFunc(workingKey1, temp, 0, out, outOff);
}
return BLOCK_SIZE;
}
public void reset()
{
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy