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();