Author: j16sdiz
Date: 2008-05-06 07:39:43 +0000 (Tue, 06 May 2008)
New Revision: 19789

Modified:
   
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
Log:
option for saving plain key (for migration)


Modified: 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
    2008-05-06 07:39:23 UTC (rev 19788)
+++ 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
    2008-05-06 07:39:43 UTC (rev 19789)
@@ -35,6 +35,8 @@
  * @author sdiz
  */
 public class SaltedHashFreenetStore implements FreenetStore {
+       private static final boolean OPTION_SAVE_PLAINKEY = true;
+       
        private static boolean logMINOR;
        private static boolean logDEBUG;

@@ -182,6 +184,8 @@

        /** Flag for occupied space */
        private final long ENTRY_FLAG_OCCUPIED = 0x00000001L;
+       /** Flag for plain key available */
+       private final long ENTRY_FLAG_PLAINKEY = 0x00000002L;

        private static final long ENTRY_HEADER_LENGTH = 0x70L;
        private final long entryPaddingLength;
@@ -202,8 +206,9 @@
         *  +----+---------------+---------------+
         *  |0030|     Flag      |  Store Size   |
         *  +----+---------------+---------------+
-        *  |0040|            Reserved           |
-        *  |0050|            Reserved           |
+        *  |0040|       Plain Routing Key       |
+        *  |0050| (Only if ENTRY_FLAG_PLAINKEY) |
+        *  +----+-------------------------------+
         *  |0060|            Reserved           |
         *  +----+-------------------------------+
         *  |0070|       Encrypted Header        |
@@ -218,7 +223,8 @@
         * written, ignored on read.
         */
        private class Entry {
-               private byte[] routingKey;
+               private byte[] plainRoutingKey;
+               private byte[] encryptedRoutingKey;
                private byte[] dataEncryptIV;
                private long flag;
                private long storeSize;
@@ -230,12 +236,13 @@
                /**
                 * Create a new entry
                 * 
-                * @param routingKey
+                * @param plainRoutingKey
                 * @param header
                 * @param data
                 */
-               public Entry(byte[] routingKey, byte[] header, byte[] data) {
-                       this.routingKey = routingKey;
+               public Entry(byte[] plainRoutingKey, byte[] header, byte[] 
data) {
+                       this.plainRoutingKey = plainRoutingKey;
+
                        flag = ENTRY_FLAG_OCCUPIED;
                        storeSize = SaltedHashFreenetStore.this.storeSize;

@@ -245,6 +252,10 @@
                        System.arraycopy(header, 0, this.header, 0, 
headerBlockLength);
                        this.data = new byte[dataBlockLength];
                        System.arraycopy(data, 0, this.data, 0, 
dataBlockLength);
+                       
+                       if (OPTION_SAVE_PLAINKEY) {
+                               flag |= ENTRY_FLAG_PLAINKEY;
+                       }

                        isEncrypted = false;
                }
@@ -252,8 +263,8 @@
                public Entry(ByteBuffer in) {
                        assert in.remaining() == entryTotalLength;

-                       routingKey = new byte[0x20];
-                       in.get(routingKey);
+                       encryptedRoutingKey = new byte[0x20];
+                       in.get(encryptedRoutingKey);

                        dataEncryptIV = new byte[0x10];
                        in.get(dataEncryptIV);
@@ -261,6 +272,11 @@
                        flag = in.getLong();
                        storeSize = in.getLong();

+                       if ((flag & ENTRY_FLAG_PLAINKEY) != 0) {
+                               plainRoutingKey = new byte[0x20];
+                               in.get(plainRoutingKey);
+                       }
+                       
                        // reserved bytes
                        in.position((int) ENTRY_HEADER_LENGTH);

@@ -278,12 +294,16 @@
                public ByteBuffer toByteBuffer() {
                        ByteBuffer out = ByteBuffer.allocate((int) 
entryTotalLength);
                        encrypt();
-                       out.put(routingKey);
+                       out.put(encryptedRoutingKey);
                        out.put(dataEncryptIV);

                        out.putLong(flag);
                        out.putLong(storeSize);

+                       if ((flag & ENTRY_FLAG_PLAINKEY) != 0) {
+                               out.put(plainRoutingKey);
+                       }
+                       
                        // reserved bytes
                        out.position((int) ENTRY_HEADER_LENGTH);

@@ -316,9 +336,9 @@

                public long getOffset() {
                        if (isEncrypted)
-                               return getOffsetFromDigestedKey(routingKey, 
storeSize);
+                               return 
getOffsetFromDigestedKey(encryptedRoutingKey, storeSize);
                        else
-                               return getOffsetFromPlainKey(routingKey, 
storeSize);
+                               return getOffsetFromPlainKey(plainRoutingKey, 
storeSize);
                }

                /**
@@ -331,21 +351,22 @@
                private boolean decrypt(byte[] routingKey) {
                        if (!isEncrypted) {
                                // Already decrypted
-                               if (Arrays.equals(this.routingKey, routingKey))
+                               if (Arrays.equals(this.plainRoutingKey, 
routingKey))
                                        return true;
                                else
                                        return false;
                        }

                        // Does the digested routing key match?
-                       if (!Arrays.equals(this.routingKey, 
getDigestedRoutingKey(routingKey)))
+                       if (!Arrays.equals(this.encryptedRoutingKey, 
getDigestedRoutingKey(routingKey)))
                                return false;

-                       PCFBMode cipher = makeCipher(routingKey);
+                       this.plainRoutingKey = routingKey;
+
+                       PCFBMode cipher = makeCipher(plainRoutingKey);
                        header = cipher.blockDecipher(header, 0, header.length);
                        data = cipher.blockDecipher(data, 0, data.length);

-                       this.routingKey = routingKey;
                        isEncrypted = false;

                        return true;
@@ -361,11 +382,11 @@
                        dataEncryptIV = new byte[16];
                        random.nextBytes(dataEncryptIV);

-                       PCFBMode cipher = makeCipher(routingKey);
+                       PCFBMode cipher = makeCipher(plainRoutingKey);
                        header = cipher.blockEncipher(header, 0, header.length);
                        data = cipher.blockEncipher(data, 0, data.length);

-                       routingKey = getDigestedRoutingKey(routingKey);
+                       encryptedRoutingKey = 
getDigestedRoutingKey(plainRoutingKey);
                        isEncrypted = true;
                }



Reply via email to