package freenet.store; import java.io.IOException; import freenet.crypt.DSAPublicKey; import freenet.keys.NodeSSK; import freenet.keys.SSKBlock; import freenet.keys.SSKVerifyException; public class SSKStore extends StoreCallback<SSKBlock> { private final GetPubkey pubkeyCache; public SSKStore(GetPubkey pubkeyCache) { this.pubkeyCache = pubkeyCache; } @Override public SSKBlock construct(byte[] data, byte[] headers, byte[] routingKey, byte[] fullKey, boolean canReadClientCache, boolean canReadSlashdotCache, BlockMetadata meta, DSAPublicKey knownPublicKey) throws SSKVerifyException { if(data == null || headers == null) throw new SSKVerifyException("Need data and headers"); if(fullKey == null) throw new SSKVerifyException("Need full key to reconstruct an SSK"); NodeSSK key; key = NodeSSK.construct(fullKey); if(knownPublicKey != null) key.setPubKey(knownPublicKey); else if(!key.grabPubkey(pubkeyCache, canReadClientCache, canReadSlashdotCache, meta)) throw new SSKVerifyException("No pubkey found"); SSKBlock block = new SSKBlock(data, headers, key, false); return block; } public SSKBlock fetch(NodeSSK chk, boolean dontPromote, boolean canReadClientCache, boolean canReadSlashdotCache, boolean ignoreOldBlocks, BlockMetadata meta) throws IOException { return store.fetch(chk.getRoutingKey(), chk.getFullKey(), dontPromote, canReadClientCache, canReadSlashdotCache, ignoreOldBlocks, meta); } public void put(SSKBlock b, boolean overwrite, boolean isOldBlock) throws IOException, KeyCollisionException { store.put(b, b.getRawData(), b.getRawHeaders(), overwrite, isOldBlock); } @Override public int dataLength() { return SSKBlock.DATA_LENGTH; } @Override public int fullKeyLength() { return NodeSSK.FULL_KEY_LENGTH; } @Override public int headerLength() { return SSKBlock.TOTAL_HEADERS_LENGTH; } @Override public int routingKeyLength() { return NodeSSK.ROUTING_KEY_LENGTH; } @Override public boolean storeFullKeys() { return true; } @Override public boolean collisionPossible() { return true; } @Override public boolean constructNeedsKey() { return true; } @Override public byte[] routingKeyFromFullKey(byte[] keyBuf) { return NodeSSK.routingKeyFromFullKey(keyBuf); } }