Author: aadamchik
Date: Sun Apr 13 19:49:12 2014
New Revision: 1587086

URL: http://svn.apache.org/r1587086
Log:
CAY-1925 cayenne-crypto: add optional compression to the encryption pipeline

integration tests, fixing bugs

Added:
    
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Base.java
    
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_GZIP_Test.java
      - copied, changed from r1587085, 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Test.java
Modified:
    
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcBytesTransformerFactory.java
    
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/GzipEncryptor.java
    
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Test.java
    
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/GzipEncryptorTest.java
    
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/CryptoUnitUtils.java

Modified: 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcBytesTransformerFactory.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcBytesTransformerFactory.java?rev=1587086&r1=1587085&r2=1587086&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcBytesTransformerFactory.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcBytesTransformerFactory.java
 Sun Apr 13 19:49:12 2014
@@ -91,7 +91,7 @@ class CbcBytesTransformerFactory impleme
         BytesEncryptor delegate = new CbcEncryptor(cipher, key, 
generateSeedIv());
 
         if (encryptionHeader.isCompressed()) {
-            delegate = new GzipEncryptor(delegate, encryptionHeader);
+            delegate = new GzipEncryptor(delegate);
         }
 
         return new HeaderEncryptor(delegate, encryptionHeader);

Modified: 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/GzipEncryptor.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/GzipEncryptor.java?rev=1587086&r1=1587085&r2=1587086&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/GzipEncryptor.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/GzipEncryptor.java
 Sun Apr 13 19:49:12 2014
@@ -30,11 +30,9 @@ import org.apache.cayenne.crypto.Cayenne
 class GzipEncryptor implements BytesEncryptor {
 
     private BytesEncryptor delegate;
-    private Header header;
 
-    public GzipEncryptor(BytesEncryptor delegate, Header header) {
+    public GzipEncryptor(BytesEncryptor delegate) {
         this.delegate = delegate;
-        this.header = header;
     }
 
     @Override
@@ -51,7 +49,7 @@ class GzipEncryptor implements BytesEncr
             throw new CayenneCryptoException("Error compressing input", e);
         }
 
-        return delegate.encrypt(compressedIn, outputOffset + header.size());
+        return delegate.encrypt(compressedIn, outputOffset);
     }
 
     static byte[] gzip(byte[] input) throws IOException {

Added: 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Base.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Base.java?rev=1587086&view=auto
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Base.java
 (added)
+++ 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Base.java
 Sun Apr 13 19:49:12 2014
@@ -0,0 +1,55 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.crypto;
+
+import java.net.URL;
+
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.crypto.key.JceksKeySourceTest;
+import org.apache.cayenne.di.Module;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+
+public class Runtime_AES128_Base {
+
+    protected ServerRuntime runtime;
+    protected TableHelper table2;
+
+    protected void setUp(boolean compress) throws Exception {
+
+        URL keyStoreUrl = 
JceksKeySourceTest.class.getResource(JceksKeySourceTest.KS1_JCEKS);
+
+        CryptoModuleBuilder builder = new 
CryptoModuleBuilder().keyStore(keyStoreUrl, JceksKeySourceTest.TEST_KEY_PASS,
+                "k3");
+
+        if (compress) {
+            builder.compress();
+        }
+
+        Module crypto = builder.build();
+
+        this.runtime = new ServerRuntime("cayenne-crypto.xml", crypto);
+
+        DBHelper dbHelper = new DBHelper(runtime.getDataSource(null));
+
+        this.table2 = new TableHelper(dbHelper, "TABLE2").setColumns("ID", 
"PLAIN_BYTES", "CRYPTO_BYTES");
+        table2.deleteAll();
+    }
+
+}

Copied: 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_GZIP_Test.java
 (from r1587085, 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Test.java)
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_GZIP_Test.java?p2=cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_GZIP_Test.java&p1=cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Test.java&r1=1587085&r2=1587086&rev=1587086&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Test.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_GZIP_Test.java
 Sun Apr 13 19:49:12 2014
@@ -22,42 +22,23 @@ import static org.junit.Assert.assertArr
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
-import java.net.URL;
 import java.sql.SQLException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.crypto.db.Table2;
-import org.apache.cayenne.crypto.key.JceksKeySourceTest;
 import org.apache.cayenne.crypto.unit.CryptoUnitUtils;
-import org.apache.cayenne.di.Module;
 import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
 import org.junit.Before;
 import org.junit.Test;
 
-public class Runtime_AES128_Test {
-
-    private ServerRuntime runtime;
-
-    private TableHelper table2;
+public class Runtime_AES128_GZIP_Test extends Runtime_AES128_Base {
 
     @Before
     public void setUp() throws Exception {
-
-        URL keyStoreUrl = 
JceksKeySourceTest.class.getResource(JceksKeySourceTest.KS1_JCEKS);
-        Module crypto = new CryptoModuleBuilder().keyStore(keyStoreUrl, 
JceksKeySourceTest.TEST_KEY_PASS, "k3").build();
-
-        this.runtime = new ServerRuntime("cayenne-crypto.xml", crypto);
-
-        DBHelper dbHelper = new DBHelper(runtime.getDataSource(null));
-
-        this.table2 = new TableHelper(dbHelper, "TABLE2").setColumns("ID", 
"PLAIN_BYTES", "CRYPTO_BYTES");
-        table2.deleteAll();
+        super.setUp(true);
     }
 
     @Test
@@ -73,7 +54,8 @@ public class Runtime_AES128_Test {
 
         Object[] data = table2.select();
         assertArrayEquals("plain_1".getBytes(), (byte[]) data[1]);
-        assertArrayEquals("crypto_1".getBytes(), 
CryptoUnitUtils.decrypt_AES_CBC((byte[]) data[2], runtime));
+        assertArrayEquals("crypto_1".getBytes(),
+                
CryptoUnitUtils.gunzip(CryptoUnitUtils.decrypt_AES_CBC((byte[]) data[2], 
runtime)));
     }
 
     @Test
@@ -88,7 +70,7 @@ public class Runtime_AES128_Test {
         Table2 t2 = context.newObject(Table2.class);
         t2.setPlainBytes("b".getBytes());
         t2.setCryptoBytes("crypto_2".getBytes());
-        
+
         Table2 t3 = context.newObject(Table2.class);
         t3.setPlainBytes("c".getBytes());
         t3.setCryptoBytes(null);
@@ -103,8 +85,10 @@ public class Runtime_AES128_Test {
             cipherByPlain.put(new String((byte[]) r[1]), (byte[]) r[2]);
         }
 
-        assertArrayEquals("crypto_1".getBytes(), 
CryptoUnitUtils.decrypt_AES_CBC(cipherByPlain.get("a"), runtime));
-        assertArrayEquals("crypto_2".getBytes(), 
CryptoUnitUtils.decrypt_AES_CBC(cipherByPlain.get("b"), runtime));
+        assertArrayEquals("crypto_1".getBytes(),
+                
CryptoUnitUtils.gunzip(CryptoUnitUtils.decrypt_AES_CBC(cipherByPlain.get("a"), 
runtime)));
+        assertArrayEquals("crypto_2".getBytes(),
+                
CryptoUnitUtils.gunzip(CryptoUnitUtils.decrypt_AES_CBC(cipherByPlain.get("b"), 
runtime)));
         assertNull(cipherByPlain.get("c"));
     }
 

Modified: 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Test.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Test.java?rev=1587086&r1=1587085&r2=1587086&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Test.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Test.java
 Sun Apr 13 19:49:12 2014
@@ -22,42 +22,23 @@ import static org.junit.Assert.assertArr
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
-import java.net.URL;
 import java.sql.SQLException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.crypto.db.Table2;
-import org.apache.cayenne.crypto.key.JceksKeySourceTest;
 import org.apache.cayenne.crypto.unit.CryptoUnitUtils;
-import org.apache.cayenne.di.Module;
 import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
 import org.junit.Before;
 import org.junit.Test;
 
-public class Runtime_AES128_Test {
-
-    private ServerRuntime runtime;
-
-    private TableHelper table2;
+public class Runtime_AES128_Test extends Runtime_AES128_Base {
 
     @Before
     public void setUp() throws Exception {
-
-        URL keyStoreUrl = 
JceksKeySourceTest.class.getResource(JceksKeySourceTest.KS1_JCEKS);
-        Module crypto = new CryptoModuleBuilder().keyStore(keyStoreUrl, 
JceksKeySourceTest.TEST_KEY_PASS, "k3").build();
-
-        this.runtime = new ServerRuntime("cayenne-crypto.xml", crypto);
-
-        DBHelper dbHelper = new DBHelper(runtime.getDataSource(null));
-
-        this.table2 = new TableHelper(dbHelper, "TABLE2").setColumns("ID", 
"PLAIN_BYTES", "CRYPTO_BYTES");
-        table2.deleteAll();
+        super.setUp(false);
     }
 
     @Test
@@ -88,7 +69,7 @@ public class Runtime_AES128_Test {
         Table2 t2 = context.newObject(Table2.class);
         t2.setPlainBytes("b".getBytes());
         t2.setCryptoBytes("crypto_2".getBytes());
-        
+
         Table2 t3 = context.newObject(Table2.class);
         t3.setPlainBytes("c".getBytes());
         t3.setCryptoBytes(null);

Modified: 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/GzipEncryptorTest.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/GzipEncryptorTest.java?rev=1587086&r1=1587085&r2=1587086&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/GzipEncryptorTest.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/GzipEncryptorTest.java
 Sun Apr 13 19:49:12 2014
@@ -47,7 +47,6 @@ public class GzipEncryptorTest {
     @Test
     public void testEncrypt() throws UnsupportedEncodingException {
 
-        final Header header = Header.create("kk", true);
         BytesEncryptor delegate = mock(BytesEncryptor.class);
         when(delegate.encrypt(any(byte[].class), anyInt())).thenAnswer(new 
Answer<byte[]>() {
             @Override
@@ -57,17 +56,17 @@ public class GzipEncryptorTest {
                 byte[] answer = (byte[]) args[0];
                 int offset = (Integer) args[1];
                 
-                assertEquals(header.size(), offset);
+                assertEquals(1, offset);
                 
                 return answer;
             }
         });
 
      
-        GzipEncryptor e = new GzipEncryptor(delegate, header);
+        GzipEncryptor e = new GzipEncryptor(delegate);
 
         byte[] input1 = "Hello Hello Hello".getBytes("UTF8");
-        byte[] output1 = e.encrypt(input1, 0);
+        byte[] output1 = e.encrypt(input1, 1);
         byte[] expectedOutput1 = 
CryptoUnitUtils.hexToBytes("1f8b0800000000000000f348cdc9c957f0409000a91a078c11000000");
 
         assertArrayEquals(expectedOutput1, output1);

Modified: 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/CryptoUnitUtils.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/CryptoUnitUtils.java?rev=1587086&r1=1587085&r2=1587086&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/CryptoUnitUtils.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/CryptoUnitUtils.java
 Sun Apr 13 19:49:12 2014
@@ -18,9 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.crypto.unit;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.math.BigInteger;
 import java.security.Key;
 import java.util.Arrays;
+import java.util.zip.GZIPInputStream;
 
 import javax.crypto.Cipher;
 import javax.crypto.spec.IvParameterSpec;
@@ -42,12 +46,33 @@ public class CryptoUnitUtils {
         }
     }
 
+    public static byte[] gunzip(byte[] source) {
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+        try {
+
+            GZIPInputStream gunzip = new GZIPInputStream(new 
ByteArrayInputStream(source));
+
+            int read;
+            byte[] buffer = new byte[1024];
+            while ((read = gunzip.read(buffer)) > 0) {
+                out.write(buffer, 0, read);
+            }
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        return out.toByteArray();
+    }
+
     public static byte[] decrypt_AES_CBC(byte[] source, ServerRuntime runtime) 
{
 
         try {
 
             Cipher decCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
-            
+
             Header header = Header.create(source, 0);
 
             int blockSize = decCipher.getBlockSize();


Reply via email to