[freenet-cvs] r16890 - in trunk/freenet/src/freenet: keys store

toad at freenetproject.org toad at freenetproject.org
Fri Jan 4 19:42:11 UTC 2008


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;
 					}




More information about the cvs mailing list