package net.i2p.crypto; import java.io.Serializable; import java.util.concurrent.LinkedBlockingQueue; /** * Cache the objects used in CryptixRijndael_Algorithm.makeKey to reduce * memory churn. The KeyCacheEntry should be held onto as long as the * data referenced in it is needed (which often is only one or two lines * of code) * * Unused as a class, as the keys are cached in the SessionKey objects, * but the static methods are used in FortunaStandalone. */ public final class CryptixAESKeyCache { private final LinkedBlockingQueue<KeyCacheEntry> _availableKeys; private static final int KEYSIZE = 32; // 256bit AES private static final int BLOCKSIZE = 16; private static final int ROUNDS = CryptixRijndael_Algorithm.getRounds(KEYSIZE, BLOCKSIZE); private static final int BC = BLOCKSIZE / 4; private static final int KC = KEYSIZE / 4; private static final int MAX_KEYS = 64; /* * @deprecated unused, keys are now cached in the SessionKey objects */ @Deprecated public CryptixAESKeyCache() { _availableKeys = new LinkedBlockingQueue<KeyCacheEntry>(MAX_KEYS); } /** * Get the next available structure, either from the cache or a brand new one * * @deprecated unused, keys are now cached in the SessionKey objects */ @Deprecated public final KeyCacheEntry acquireKey() { KeyCacheEntry rv = _availableKeys.poll(); if (rv != null) return rv; return createNew(); } /** * Put this structure back onto the available cache for reuse * * @deprecated unused, keys are now cached in the SessionKey objects */ @Deprecated public final void releaseKey(KeyCacheEntry key) { _availableKeys.offer(key); } public static final KeyCacheEntry createNew() { KeyCacheEntry e = new KeyCacheEntry(); return e; } /** * all the data alloc'ed in a makeKey call */ public static class KeyCacheEntry implements Serializable { /** encryption round keys */ final int[][] Ke; /** decryption round keys */ final int[][] Kd; final int[] tk; /** Ke, Kd */ final Object[] key; public KeyCacheEntry() { Ke = new int[ROUNDS + 1][BC]; Kd = new int[ROUNDS + 1][BC]; tk = new int[KC]; key = new Object[] { Ke, Kd }; } } }