package freenet.store; import java.io.IOException; import freenet.crypt.CryptFormatException; import freenet.crypt.DSAPublicKey; import freenet.keys.KeyVerifyException; import freenet.keys.PubkeyVerifyException; import freenet.support.Logger; public class PubkeyStore extends StoreCallback<DSAPublicKey> { @Override public boolean collisionPossible() { return false; } @Override public DSAPublicKey construct(byte[] data, byte[] headers, byte[] routingKey, byte[] fullKey, boolean canReadClientCache, boolean canReadSlashdotCache, BlockMetadata meta, DSAPublicKey ignored) throws KeyVerifyException { if(data == null) throw new PubkeyVerifyException("Need data to construct pubkey"); try { return DSAPublicKey.create(data); } catch (CryptFormatException e) { throw new PubkeyVerifyException(e); } } public DSAPublicKey fetch(byte[] hash, boolean dontPromote, boolean ignoreOldBlocks, BlockMetadata meta) throws IOException { return store.fetch(hash, null, dontPromote, false, false, ignoreOldBlocks, meta); } final private static byte[] empty = new byte[0]; public void put(byte[] hash, DSAPublicKey key, boolean isOldBlock) throws IOException { try { store.put(key, key.asPaddedBytes(), empty, false, isOldBlock); } catch (KeyCollisionException e) { Logger.error(this, "Impossible for PubkeyStore: "+e, e); } } @Override public int dataLength() { return DSAPublicKey.PADDED_SIZE; } @Override public int fullKeyLength() { return DSAPublicKey.HASH_LENGTH; } @Override public int headerLength() { return 0; } @Override public int routingKeyLength() { return DSAPublicKey.HASH_LENGTH; } @Override public boolean storeFullKeys() { return false; } @Override public boolean constructNeedsKey() { return false; } @Override public byte[] routingKeyFromFullKey(byte[] keyBuf) { return keyBuf; } }