Author: toad
Date: 2008-01-04 19:42:11 +0000 (Fri, 04 Jan 2008)
New Revision: 16890
Modified:
trunk/freenet/src/freenet/keys/NodeSSK.java
trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
Log:
Reconstruct SSKs too. Hopefully.
Modified: trunk/freenet/src/freenet/keys/NodeSSK.java
===================================================================
--- trunk/freenet/src/freenet/keys/NodeSSK.java 2008-01-04 19:31:35 UTC (rev
16889)
+++ trunk/freenet/src/freenet/keys/NodeSSK.java 2008-01-04 19:42:11 UTC (rev
16890)
@@ -12,6 +12,7 @@
import freenet.crypt.DSAPublicKey;
import freenet.crypt.SHA256;
+import freenet.node.GetPubkey;
import freenet.support.Fields;
import freenet.support.HexUtil;
import freenet.support.Logger;
@@ -168,9 +169,28 @@
short type = getType();
buf[0] = (byte) (type >> 8);
buf[1] = (byte) (type & 0xFF);
- System.arraycopy(encryptedHashedDocname, 0, buf, 2,
encryptedHashedDocname.length);
- System.arraycopy(pubKeyHash, 0, buf, 2+encryptedHashedDocname.length,
pubKeyHash.length);
+ System.arraycopy(encryptedHashedDocname, 0, buf, 2, E_H_DOCNAME_SIZE);
+ System.arraycopy(pubKeyHash, 0, buf, 2+E_H_DOCNAME_SIZE,
PUBKEY_HASH_SIZE);
return buf;
}
+
+ public static NodeSSK construct(byte[] buf) throws SSKVerifyException {
+ if(buf[0] != 2)
+ throw new SSKVerifyException("Unknown type byte
"+buf[0]);
+ byte cryptoAlgorithm = buf[1];
+ if(cryptoAlgorithm != Key.ALGO_AES_PCFB_256_SHA256)
+ throw new SSKVerifyException("Unknown crypto algorithm
"+buf[1]);
+ byte[] encryptedHashedDocname = new byte[E_H_DOCNAME_SIZE];
+ System.arraycopy(buf, 2, encryptedHashedDocname, 0,
E_H_DOCNAME_SIZE);
+ byte[] pubkeyHash = new byte[PUBKEY_HASH_SIZE];
+ System.arraycopy(buf, 2 + E_H_DOCNAME_SIZE, pubkeyHash, 0,
PUBKEY_HASH_SIZE);
+ return new NodeSSK(pubkeyHash, encryptedHashedDocname, null,
cryptoAlgorithm);
+ }
+
+ public boolean grabPubkey(GetPubkey pubkeyCache) {
+ if(pubKey != null) return false;
+ pubKey = pubkeyCache.getKey(pubKeyHash);
+ return pubKey != null;
+ }
}
Modified: trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-01-04
19:31:35 UTC (rev 16889)
+++ trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-01-04
19:42:11 UTC (rev 16890)
@@ -1199,8 +1199,28 @@
DSAPublicKey key =
DSAPublicKey.create(data);
routingkey = key.asBytesHash();
} else if(type == TYPE_SSK && readKey) {
- // FIXME
- continue;
+ try {
+ NodeSSK ssk =
NodeSSK.construct(keyBuf);
+
if(ssk.grabPubkey(pubkeyCache)) {
+ SSKBlock block
= new SSKBlock(data, header, ssk, false);
+ routingkey =
block.getKey().getRoutingKey();
+ } else {
+ String err =
"No pubkey for SSK at slot "+l;
+
Logger.error(this, err);
+
System.err.println(err);
+ addFreeBlock(l,
true, "no pubkey");
+ routingkey =
null;
+ continue;
+ }
+ } catch (SSKVerifyException e) {
+ String err = "Bogus SSK
at slot "+l+" : "+e+" - lost block "+l;
+ Logger.error(this, err,
e);
+ System.err.println(err);
+ e.printStackTrace();
+ addFreeBlock(l, true,
"bogus SSK");
+ routingkey = null;
+ continue;
+ }
} else {
continue;
}