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


Reply via email to