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