Author: aadamchik
Date: Sun Apr 13 19:48:58 2014
New Revision: 1587085

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

decryptor

Added:
    
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/GzipDecryptor.java
    
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/GzipDecryptorTest.java
    
cayenne/main/trunk/cayenne-crypto/src/test/resources/org/apache/cayenne/crypto/transformer/
    
cayenne/main/trunk/cayenne-crypto/src/test/resources/org/apache/cayenne/crypto/transformer/bytes/
    
cayenne/main/trunk/cayenne-crypto/src/test/resources/org/apache/cayenne/crypto/transformer/bytes/plain.txt
    
cayenne/main/trunk/cayenne-crypto/src/test/resources/org/apache/cayenne/crypto/transformer/bytes/plain.txt.gz
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/HeaderDecryptor.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=1587085&r1=1587084&r2=1587085&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:48:58 2014
@@ -101,9 +101,8 @@ class CbcBytesTransformerFactory impleme
     public BytesDecryptor decryptor() {
         Cipher cipher = cipherFactory.cipher();
         BytesDecryptor cbcDecryptor = new CbcDecryptor(cipher);
-
-        // TODO: make checking for key name an optional property
-        return new HeaderDecryptor(cbcDecryptor, keySource);
+        BytesDecryptor gzipDecryptor = new GzipDecryptor(cbcDecryptor);
+        return new HeaderDecryptor(cbcDecryptor, gzipDecryptor, keySource);
     }
 
 }

Added: 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/GzipDecryptor.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/GzipDecryptor.java?rev=1587085&view=auto
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/GzipDecryptor.java
 (added)
+++ 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/GzipDecryptor.java
 Sun Apr 13 19:48:58 2014
@@ -0,0 +1,80 @@
+/*****************************************************************
+ *   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.transformer.bytes;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.security.Key;
+import java.util.Arrays;
+import java.util.zip.GZIPInputStream;
+
+import org.apache.cayenne.crypto.CayenneCryptoException;
+
+/**
+ * @since 3.2
+ */
+class GzipDecryptor implements BytesDecryptor {
+
+    private BytesDecryptor delegate;
+
+    public GzipDecryptor(BytesDecryptor delegate) {
+        this.delegate = delegate;
+    }
+
+    @Override
+    public byte[] decrypt(byte[] input, int inputOffset, Key key) {
+
+        byte[] decrypted = delegate.decrypt(input, inputOffset, key);
+        try {
+            return gunzip(decrypted);
+        } catch (IOException e) {
+            // really not expecting an error here...
+            throw new CayenneCryptoException("Error uncompressing input", e);
+        }
+    }
+
+    static byte[] gunzip(byte[] input) throws IOException {
+
+        ByteArrayInputStream zipBytes = new ByteArrayInputStream(input);
+        GZIPInputStream in = new GZIPInputStream(zipBytes);
+
+        // duplicating ByteArrayOutputStream logic here... too much overhead 
and
+        // inefficiency using ByteArrayOutputStream directly
+
+        byte[] out = new byte[input.length * 2];
+
+        int totalRead = 0;
+        int read;
+        int resizeBy = input.length;
+
+        while ((read = in.read(out, totalRead, out.length - totalRead - 1)) > 
0) {
+
+            totalRead += read;
+            if (totalRead + 1 == out.length) {
+                out = Arrays.copyOf(out, out.length + resizeBy);
+            }
+        }
+
+        if (totalRead < out.length) {
+            out = Arrays.copyOf(out, totalRead);
+        }
+
+        return out;
+    }
+}

Modified: 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/HeaderDecryptor.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/HeaderDecryptor.java?rev=1587085&r1=1587084&r2=1587085&view=diff
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/HeaderDecryptor.java
 (original)
+++ 
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/HeaderDecryptor.java
 Sun Apr 13 19:48:58 2014
@@ -29,24 +29,26 @@ class HeaderDecryptor implements BytesDe
 
     private KeySource keySource;
     private BytesDecryptor delegate;
+    private BytesDecryptor decompressDelegate;
 
-    public HeaderDecryptor(BytesDecryptor delegate, KeySource keySource) {
+    HeaderDecryptor(BytesDecryptor delegate, BytesDecryptor 
decompressDelegate, KeySource keySource) {
         this.delegate = delegate;
         this.keySource = keySource;
+        this.decompressDelegate = decompressDelegate;
     }
 
     @Override
     public byte[] decrypt(byte[] input, int inputOffset, Key key) {
 
-        // ignoring the parameter key... using the key from the first block
+        Header header = Header.create(input, inputOffset);
 
-        Header header = header(input, inputOffset);
+        // ignoring the parameter key... using the key from the first block
         Key inRecordKey = keySource.getKey(header.getKeyName());
-        return delegate.decrypt(input, inputOffset + header.size(), 
inRecordKey);
-    }
 
-    Header header(byte[] input, int inputOffset) {
-        return Header.create(input, inputOffset);
-    }
+        // if compression was used to create a record, filter through
+        // GzipDecryptor...
+        BytesDecryptor worker = header.isCompressed() ? decompressDelegate : 
delegate;
 
+        return worker.decrypt(input, inputOffset + header.size(), inRecordKey);
+    }
 }

Added: 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/GzipDecryptorTest.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/GzipDecryptorTest.java?rev=1587085&view=auto
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/GzipDecryptorTest.java
 (added)
+++ 
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/GzipDecryptorTest.java
 Sun Apr 13 19:48:58 2014
@@ -0,0 +1,74 @@
+/*****************************************************************
+ *   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.transformer.bytes;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.cayenne.crypto.unit.CryptoUnitUtils;
+import org.junit.Test;
+
+public class GzipDecryptorTest {
+
+    @Test
+    public void testGunzip() throws IOException {
+
+        byte[] input1 = 
CryptoUnitUtils.hexToBytes("1f8b0800000000000000f348cdc9c957f0409000a91a078c11000000");
+        byte[] output1 = GzipDecryptor.gunzip(input1);
+        byte[] expectedOutput1 = "Hello Hello Hello".getBytes("UTF8");
+
+        assertArrayEquals(expectedOutput1, output1);
+    }
+
+    @Test
+    public void testGunzip_Large() throws IOException {
+
+        byte[] input1 = readResource("plain.txt.gz");
+        byte[] output1 = GzipDecryptor.gunzip(input1);
+        byte[] expectedOutput1 = readResource("plain.txt");
+
+        assertArrayEquals(expectedOutput1, output1);
+    }
+
+    private byte[] readResource(String name) throws IOException {
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+        InputStream in = getClass().getResourceAsStream(name);
+        assertNotNull(in);
+
+        try {
+
+            int read;
+            byte[] buffer = new byte[1024];
+            while ((read = in.read(buffer)) > 0) {
+                out.write(buffer, 0, read);
+            }
+
+        } finally {
+            in.close();
+        }
+
+        return out.toByteArray();
+    }
+}

Added: 
cayenne/main/trunk/cayenne-crypto/src/test/resources/org/apache/cayenne/crypto/transformer/bytes/plain.txt
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/resources/org/apache/cayenne/crypto/transformer/bytes/plain.txt?rev=1587085&view=auto
==============================================================================
--- 
cayenne/main/trunk/cayenne-crypto/src/test/resources/org/apache/cayenne/crypto/transformer/bytes/plain.txt
 (added)
+++ 
cayenne/main/trunk/cayenne-crypto/src/test/resources/org/apache/cayenne/crypto/transformer/bytes/plain.txt
 Sun Apr 13 19:48:58 2014
@@ -0,0 +1,19 @@
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
+Ut aliquet suscipit placerat. Proin rhoncus nibh a quam 
+egestas, sed facilisis eros gravida. Mauris in venenatis ante, 
+vel tincidunt metus. Donec eu suscipit metus. Sed pulvinar erat 
+eget commodo tincidunt. Nulla ornare facilisis vulputate. Sed mollis erat 
+eu ullamcorper consequat. Duis volutpat interdum eros, et pulvinar sem 
ullamcorper ac. 
+Vivamus eleifend diam nec tortor hendrerit varius. Quisque eget auctor nunc. 
+Quisque mattis porta erat, quis fermentum eros consequat feugiat. Nam dictum 
sed 
+nulla nec aliquet. 
+
+Nam malesuada eget sem at sollicitudin. Integer nec massa ut mi laoreet 
gravida ac 
+laoreet erat. Aenean vulputate ultrices ipsum, vitae dignissim mi ullamcorper 
+condimentum. Donec molestie quam dui, sit amet euismod arcu placerat vitae. 
+Curabitur eget elit et ipsum malesuada auctor. Quisque sed dui vitae tellus 
+dignissim vulputate. Morbi vitae mollis lacus. Etiam urna sapien, porttitor 
+eget pellentesque quis, dapibus sit amet magna. Sed non purus non leo rhoncus 
mattis. 
+Pellentesque fringilla ac libero pretium venenatis. Vivamus a purus vehicula, 
viverra 
+est in, egestas ante. In luctus, augue at ultrices iaculis, urna nibh 
scelerisque 
+neque, non facilisis quam erat vulputate massa. 
\ No newline at end of file

Added: 
cayenne/main/trunk/cayenne-crypto/src/test/resources/org/apache/cayenne/crypto/transformer/bytes/plain.txt.gz
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/resources/org/apache/cayenne/crypto/transformer/bytes/plain.txt.gz?rev=1587085&view=auto
==============================================================================
Files 
cayenne/main/trunk/cayenne-crypto/src/test/resources/org/apache/cayenne/crypto/transformer/bytes/plain.txt.gz
 (added) and 
cayenne/main/trunk/cayenne-crypto/src/test/resources/org/apache/cayenne/crypto/transformer/bytes/plain.txt.gz
 Sun Apr 13 19:48:58 2014 differ


Reply via email to