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"));
+    }
+}