You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2014/03/29 16:44:52 UTC
svn commit: r1583009 - in /cayenne/main/trunk/cayenne-crypto/src:
main/java/org/apache/cayenne/crypto/transformer/value/
test/java/org/apache/cayenne/crypto/transformer/value/
Author: aadamchik
Date: Sat Mar 29 15:44:52 2014
New Revision: 1583009
URL: http://svn.apache.org/r1583009
Log:
CAY-1916 cayenne-crypto module that enables data encryption for certain model attributes
* JceTransformer/JceTransformerFactory - in progress
Added:
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptorTest.java
Modified:
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/StringToBytesConverter.java
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java
Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java?rev=1583009&r1=1583008&r2=1583009&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java Sat Mar 29 15:44:52 2014
@@ -18,7 +18,11 @@
****************************************************************/
package org.apache.cayenne.crypto.transformer.value;
+import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+
+import org.apache.cayenne.crypto.CayenneCryptoException;
/**
* @since 3.2
@@ -33,7 +37,19 @@ public class JceValueEncryptor implement
@Override
public Object transform(Cipher cipher, Object value) {
- throw new UnsupportedOperationException("TODO");
+
+ byte[] bytes = toBytes.toBytes(value);
+ byte[] transformed;
+
+ try {
+ transformed = cipher.doFinal(bytes);
+ } catch (IllegalBlockSizeException e) {
+ throw new CayenneCryptoException("Illegal block size", e);
+ } catch (BadPaddingException e) {
+ throw new CayenneCryptoException("Bad padding", e);
+ }
+
+ return transformed;
}
}
Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/StringToBytesConverter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/StringToBytesConverter.java?rev=1583009&r1=1583008&r2=1583009&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/StringToBytesConverter.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/StringToBytesConverter.java Sat Mar 29 15:44:52 2014
@@ -25,12 +25,14 @@ import java.nio.charset.Charset;
*/
final class StringToBytesConverter implements ToBytesConverter {
+ private static final String DEFAULT_CHARSET = "UTF-8";
+
static final ToBytesConverter INSTANCE = new StringToBytesConverter();
private Charset utf8;
StringToBytesConverter() {
- this.utf8 = Charset.forName("UTF-8");
+ this.utf8 = Charset.forName(DEFAULT_CHARSET);
}
@Override
Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java?rev=1583009&r1=1583008&r2=1583009&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java Sat Mar 29 15:44:52 2014
@@ -29,7 +29,8 @@ public interface ValueTransformer {
/**
* Transforms a value using the provided Cipher. Cipher is assumed to be
- * fully initialized and its state reset from any previous operations.
+ * fully initialized for the right operation (encryption or decryption) and
+ * its state reset from any previous operations.
*/
Object transform(Cipher cipher, Object value);
}
Added: cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptorTest.java?rev=1583009&view=auto
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptorTest.java (added)
+++ cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptorTest.java Sat Mar 29 15:44:52 2014
@@ -0,0 +1,139 @@
+/*****************************************************************
+ * 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.value;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.KeyGenerator;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class JceValueEncryptorTest {
+
+ private Cipher encCipher;
+ private Cipher decCipher;
+ private SecretKey key;
+
+ @Before
+ public void before() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
+
+ KeyGenerator keyGen = KeyGenerator.getInstance("AES");
+ keyGen.init(128);
+
+ this.key = keyGen.generateKey();
+
+ this.encCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+ this.encCipher.init(Cipher.ENCRYPT_MODE, key);
+
+ this.decCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+ this.decCipher.init(Cipher.DECRYPT_MODE, key);
+ }
+
+ @Test
+ public void testTransform_BytesToBytes() throws IllegalBlockSizeException, BadPaddingException {
+
+ JceValueEncryptor e = new JceValueEncryptor(BytesToBytesConverter.INSTANCE);
+
+ byte[] b1 = new byte[] { 1, 2 };
+ byte[] b2 = new byte[] { 2, 3 };
+
+ byte[] b1_t = (byte[]) e.transform(encCipher, b1);
+
+ assertNotNull(b1_t);
+ assertEquals(encCipher.getBlockSize(), b1_t.length);
+ assertArrayEquals(b1, decCipher.doFinal(b1_t));
+
+ byte[] b2_t = (byte[]) e.transform(encCipher, b2);
+
+ assertNotNull(b2_t);
+ assertEquals(encCipher.getBlockSize(), b2_t.length);
+ assertArrayEquals(b2, decCipher.doFinal(b2_t));
+ }
+
+ @Test
+ public void testTransform_BytesToBytes_DifferentSizes() {
+
+ JceValueEncryptor e = new JceValueEncryptor(BytesToBytesConverter.INSTANCE);
+
+ int blockSize = encCipher.getBlockSize();
+
+ byte[] b1 = new byte[] {};
+ byte[] b2 = new byte[] { 1 };
+ byte[] b3 = new byte[] { 1, 2 };
+
+ byte[] b4 = new byte[blockSize];
+ for (int i = 0; i < blockSize; i++) {
+ b4[i] = (byte) i;
+ }
+
+ byte[] b5 = new byte[blockSize + 5];
+ for (int i = 0; i < blockSize + 5; i++) {
+ b5[i] = (byte) i;
+ }
+
+ byte[] b1_t = (byte[]) e.transform(encCipher, b1);
+ assertEquals(encCipher.getBlockSize(), b1_t.length);
+
+ byte[] b2_t = (byte[]) e.transform(encCipher, b2);
+ assertEquals(encCipher.getBlockSize(), b2_t.length);
+
+ byte[] b3_t = (byte[]) e.transform(encCipher, b3);
+ assertEquals(encCipher.getBlockSize(), b3_t.length);
+
+ byte[] b4_t = (byte[]) e.transform(encCipher, b4);
+ assertEquals(encCipher.getBlockSize() * 2, b4_t.length);
+
+ byte[] b5_t = (byte[]) e.transform(encCipher, b5);
+ assertEquals(encCipher.getBlockSize() * 2, b5_t.length);
+ }
+
+ @Test
+ public void testTransform_StringToBytes() throws UnsupportedEncodingException, IllegalBlockSizeException,
+ BadPaddingException {
+
+ JceValueEncryptor e = new JceValueEncryptor(StringToBytesConverter.INSTANCE);
+
+ String s1 = "ab";
+ String s2 = "cd";
+
+ byte[] b1_t = (byte[]) e.transform(encCipher, s1);
+
+ assertNotNull(b1_t);
+ assertEquals(encCipher.getBlockSize(), b1_t.length);
+ assertEquals(s1, new String(decCipher.doFinal(b1_t), "UTF-8"));
+
+ byte[] b2_t = (byte[]) e.transform(encCipher, s2);
+
+ assertNotNull(b2_t);
+ assertEquals(encCipher.getBlockSize(), b2_t.length);
+ assertEquals(s2, new String(decCipher.doFinal(b2_t), "UTF-8"));
+ }
+}