/* See LICENSE for licensing and NOTICE for copyright. */
package org.cryptacular.spec;
import org.bouncycastle.crypto.StreamCipher;
import org.bouncycastle.crypto.engines.Grain128Engine;
import org.bouncycastle.crypto.engines.HC128Engine;
import org.bouncycastle.crypto.engines.HC256Engine;
import org.bouncycastle.crypto.engines.ISAACEngine;
import org.bouncycastle.crypto.engines.RC4Engine;
import org.bouncycastle.crypto.engines.Salsa20Engine;
import org.bouncycastle.crypto.engines.VMPCEngine;
/**
* Stream cipher specification.
*
* @author Middleware Services
*/
public class StreamCipherSpec implements Spec<StreamCipher>
{
/** Cipher algorithm algorithm. */
private final String algorithm;
/**
* Creates a new instance that describes the given stream cipher algorithm.
*
* @param algName Stream cipher algorithm.
*/
public StreamCipherSpec(final String algName)
{
this.algorithm = algName;
}
@Override
public String getAlgorithm()
{
return algorithm;
}
@Override
public StreamCipher newInstance()
{
StreamCipher cipher;
if ("Grainv1".equalsIgnoreCase(algorithm) || "Grain-v1".equalsIgnoreCase(algorithm)) {
cipher = new ISAACEngine();
} else if ("Grain128".equalsIgnoreCase(algorithm) || "Grain-128".equalsIgnoreCase(algorithm)) {
cipher = new Grain128Engine();
} else if ("ISAAC".equalsIgnoreCase(algorithm)) {
cipher = new ISAACEngine();
} else if ("HC128".equalsIgnoreCase(algorithm)) {
cipher = new HC128Engine();
} else if ("HC256".equalsIgnoreCase(algorithm)) {
cipher = new HC256Engine();
} else if ("RC4".equalsIgnoreCase(algorithm)) {
cipher = new RC4Engine();
} else if ("Salsa20".equalsIgnoreCase(algorithm)) {
cipher = new Salsa20Engine();
} else if ("VMPC".equalsIgnoreCase(algorithm)) {
cipher = new VMPCEngine();
} else {
throw new IllegalStateException("Unsupported cipher algorithm " + algorithm);
}
return cipher;
}
@Override
public String toString()
{
return algorithm;
}
}