/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.crypt;
import java.io.Serializable;
/**
* Keeps track of properties of different symmetric cipher algorithms
* available to Freenet including key type, name of the algorithm,
* block size used, and iv length if required.
* @author unixninja92
*
*/
public enum CryptByteBufferType implements Serializable{
@Deprecated
RijndaelECB(1, KeyType.Rijndael256),
@Deprecated
RijndaelECB128(2, KeyType.Rijndael256, 128),
@Deprecated
RijndaelPCFB(8, 32, KeyType.Rijndael256),
AESCTR(16, 16, "AES/CTR/NOPADDING", KeyType.AES256),
ChaCha128(32, 8, "CHACHA", KeyType.ChaCha128),
ChaCha256(64, 8, "CHACHA", KeyType.ChaCha256);
/** Bitmask for aggregation. */
public final int bitmask;
public final int blockSize;
public final Integer ivSize; // in bytes
public final String algName;
public final String cipherName;
public final KeyType keyType;
public final boolean isStreamCipher;
/**
* Creates the RijndaelECB enum value. iv is null.
* @param bitmask
* @param keyType The type of key the alg requires
*/
private CryptByteBufferType(int bitmask, KeyType keyType){
this.bitmask = bitmask;
this.keyType = keyType;
this.cipherName = keyType.alg;
this.blockSize = keyType.keySize;
this.ivSize = null;
algName = name();
isStreamCipher = false;
}
/**
* Creates the RijndaelECB128 enum value. iv is null.
* and sets the non-standard blocksize.
* @param bitmask
* @param keyType The type of key the alg requires
* @param blockSize The blocksize the alg uses
*/
private CryptByteBufferType(int bitmask, KeyType keyType, int blockSize){
this.bitmask = bitmask;
this.ivSize = null;
this.keyType = keyType;
this.cipherName = keyType.alg;
this.blockSize = blockSize;
algName = name();
isStreamCipher = false;
}
/**
* Creates the RijndaelPCFB enum value.
* @param bitmask
* @param ivSize Size of the iv
* @param keyType The type of key the alg requires
*/
private CryptByteBufferType(int bitmask, int ivSize, KeyType keyType){
this.bitmask = bitmask;
this.keyType = keyType;
this.cipherName = keyType.alg;
this.blockSize = keyType.keySize;
this.ivSize = ivSize;
algName = name();
isStreamCipher = true;
}
/**
* Creates an enum value for the specified algorithm, keytype, and iv size.
* Also stores the name of the alg that java recognizes
* @param bitmask
* @param ivSize Size of the iv
* @param algName The name the java provider uses for the alg
* @param keyType The type of key the alg requires
*/
private CryptByteBufferType(int bitmask, int ivSize, String algName, KeyType keyType){
this.bitmask = bitmask;
this.ivSize = ivSize;
this.cipherName = keyType.alg;
this.blockSize = keyType.keySize;
this.algName = algName;
this.keyType = keyType;
isStreamCipher = true;
}
/**
* Returns true if the algorithm supports/requires an IV, otherwise returns false.
*/
public boolean hasIV(){
return ivSize != null;
}
}