/* 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.util.HashMap; import java.util.Map; import org.bouncycastle.crypto.SkippingStreamCipher; import org.bouncycastle.crypto.engines.ChaChaEngine; /** * Stores information about the algorithms used, the version number, and the footer length for a * EncryptedRandomAccessBuffer * @author unixninja92 * */ public enum EncryptedRandomAccessBufferType { ChaCha128(1, 12, CryptByteBufferType.ChaCha128, MACType.HMACSHA256, 32), ChaCha256(2, 12, CryptByteBufferType.ChaCha256, MACType.HMACSHA256, 32); public final int bitmask; public final int headerLen;//bytes public final CryptByteBufferType encryptType; public final KeyType encryptKey; public final MACType macType; public final KeyType macKey; public final int macLen;//bytes /** * Creates the ChaCha enum values. * @param bitmask The version number * @param magAndVerLen Length of magic value and version * @param type Alg to use for encrypting the data * @param macType Alg to use for MAC generation * @param macLen The length of the MAC output in bytes */ private EncryptedRandomAccessBufferType(int bitmask, int magAndVerLen, CryptByteBufferType type, MACType macType, int macLen){ this.bitmask = bitmask; this.encryptType = type; this.encryptKey = type.keyType; this.macType = macType; this.macKey = macType.keyType; this.macLen = macLen; this.headerLen = magAndVerLen + (encryptKey.keySize >> 3)+ (encryptKey.ivSize >>3) + macLen; } /** * Returns an instance of the SkippingStreamCipher the goes with the current enum value. */ public final SkippingStreamCipher get(){ return new ChaChaEngine(); } private static final Map<Integer, EncryptedRandomAccessBufferType> byBitmask; static { byBitmask = new HashMap<Integer, EncryptedRandomAccessBufferType>(); for(EncryptedRandomAccessBufferType type : values()) byBitmask.put(type.bitmask, type); } public static EncryptedRandomAccessBufferType getByBitmask(int val) { return byBitmask.get(val); } }