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/04/04 14:03:02 UTC
svn commit: r1584624 - in /cayenne/main/trunk/cayenne-crypto/src:
main/java/org/apache/cayenne/crypto/transformer/bytes/
test/java/org/apache/cayenne/crypto/transformer/bytes/
Author: aadamchik
Date: Fri Apr 4 12:03:01 2014
New Revision: 1584624
URL: http://svn.apache.org/r1584624
Log:
CAY-1916 cayenne-crypto module that enables data encryption for certain model attributes
BytesEncryptor/BytesDecryptor to encapsulate crypto protocol .. IN PROGRESS
Added:
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesDecryptor.java
- copied, changed from r1584623, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesEncryptor.java
- copied, changed from r1584623, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcDecryptor.java
- copied, changed from r1584623, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcEncryptor.java
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/DecryptorWithKeyName.java
- copied, changed from r1584623, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyName.java
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/CbcDecryptorTest.java
- copied, changed from r1584623, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformerFactory.java
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/DecryptorWithKeyNameTest.java
- copied, changed from r1584623, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java
Removed:
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java
Modified:
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformerFactory.java
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/CbcEncryptor.java
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/DefaultBytesTransformerFactory.java
cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyName.java
cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyNameTest.java
Copied: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesDecryptor.java (from r1584623, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesDecryptor.java?p2=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesDecryptor.java&p1=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java&r1=1584623&r2=1584624&rev=1584624&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesDecryptor.java Fri Apr 4 12:03:01 2014
@@ -18,10 +18,12 @@
****************************************************************/
package org.apache.cayenne.crypto.transformer.bytes;
+import java.security.Key;
+
/**
* @since 3.2
*/
-public interface BytesTransformer {
+public interface BytesDecryptor {
/**
* Returns the size of the transformed data in bytes. This information
@@ -29,5 +31,10 @@ public interface BytesTransformer {
*/
int getOutputSize(int inputLength);
- void transform(byte[] input, byte[] output, int outputOffset);
+ /**
+ * Transform input bytes using provided encryption key. Note that some
+ * implementations may ignore the provided key and e.g. derive the key from
+ * the record.
+ */
+ void decrypt(byte[] input, byte[] output, int inputOffset, Key key);
}
Copied: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesEncryptor.java (from r1584623, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesEncryptor.java?p2=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesEncryptor.java&p1=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java&r1=1584623&r2=1584624&rev=1584624&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesEncryptor.java Fri Apr 4 12:03:01 2014
@@ -21,7 +21,7 @@ package org.apache.cayenne.crypto.transf
/**
* @since 3.2
*/
-public interface BytesTransformer {
+public interface BytesEncryptor {
/**
* Returns the size of the transformed data in bytes. This information
@@ -29,5 +29,9 @@ public interface BytesTransformer {
*/
int getOutputSize(int inputLength);
- void transform(byte[] input, byte[] output, int outputOffset);
+ /**
+ * Transform input bytes using default encryption key.
+ */
+ void encrypt(byte[] input, byte[] output, int outputOffset);
+
}
Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformerFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformerFactory.java?rev=1584624&r1=1584623&r2=1584624&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformerFactory.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformerFactory.java Fri Apr 4 12:03:01 2014
@@ -26,7 +26,7 @@ package org.apache.cayenne.crypto.transf
*/
public interface BytesTransformerFactory {
- BytesTransformer encryptor();
+ BytesEncryptor encryptor();
- BytesTransformer decryptor();
+ BytesDecryptor decryptor();
}
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=1584624&r1=1584623&r2=1584624&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 Fri Apr 4 12:03:01 2014
@@ -41,11 +41,13 @@ class CbcBytesTransformerFactory impleme
private Key key;
private byte[] keyName;
private int blockSize;
+ private KeySource keySource;
private Queue<SecureRandom> randoms;
public CbcBytesTransformerFactory(CipherFactory cipherFactory, KeySource keySource, String keyName) {
this.randoms = new ConcurrentLinkedQueue<SecureRandom>();
+ this.keySource = keySource;
this.cipherFactory = cipherFactory;
this.blockSize = cipherFactory.blockSize();
@@ -100,18 +102,22 @@ class CbcBytesTransformerFactory impleme
}
@Override
- public BytesTransformer encryptor() {
+ public BytesEncryptor encryptor() {
Cipher cipher = cipherFactory.cipher();
- BytesTransformer cbcEncryptor = new CbcEncryptor(cipher, key, generateSeedIv());
+ BytesEncryptor cbcEncryptor = new CbcEncryptor(cipher, key, generateSeedIv());
// TODO: make adding key name for versioning an optional property
return new EncryptorWithKeyName(cbcEncryptor, keyName, blockSize);
}
@Override
- public BytesTransformer decryptor() {
- throw new UnsupportedOperationException("TODO");
+ public BytesDecryptor decryptor() {
+ Cipher cipher = cipherFactory.cipher();
+ BytesDecryptor cbcDecryptor = new CbcDecryptor(cipher);
+
+ // TODO: make checking for key name an optional property
+ return new DecryptorWithKeyName(cbcDecryptor, keySource, blockSize);
}
}
Copied: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcDecryptor.java (from r1584623, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcEncryptor.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcDecryptor.java?p2=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcDecryptor.java&p1=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcEncryptor.java&r1=1584623&r2=1584624&rev=1584624&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcEncryptor.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcDecryptor.java Fri Apr 4 12:03:01 2014
@@ -31,59 +31,45 @@ import javax.crypto.spec.IvParameterSpec
import org.apache.cayenne.crypto.CayenneCryptoException;
/**
- * A {@link BytesTransformer} that encrypts the provided bytes. The first block
- * in the encrypted bytes is the value of IV used to seed the CBC
- * transformation. It will be needed for decryption. The object is stateful and
- * is not thread-safe.
- *
* @since 3.2
*/
-class CbcEncryptor implements BytesTransformer {
+class CbcDecryptor implements BytesDecryptor {
private Cipher cipher;
- private byte[] iv;
- private Key key;
private int blockSize;
- public CbcEncryptor(Cipher cipher, Key key, byte[] seedIv) {
- this.key = key;
+ CbcDecryptor(Cipher cipher) {
this.cipher = cipher;
- this.iv = seedIv;
this.blockSize = cipher.getBlockSize();
-
- if (iv.length != blockSize) {
- throw new CayenneCryptoException("IV size is expected to be the same as block size. Was " + iv.length
- + "; block size was: " + blockSize);
- }
}
@Override
public int getOutputSize(int inputLength) {
- // add one block for IV storage
- return blockSize + cipher.getOutputSize(inputLength);
+ // strip the IV block size from total size...
+ return cipher.getOutputSize(inputLength) - blockSize;
}
@Override
- public void transform(byte[] input, byte[] output, int outputOffset) {
+ public void decrypt(byte[] input, byte[] output, int inputOffset, Key key) {
try {
- encrypt(input, output, outputOffset);
+ doDecrypt(input, output, inputOffset, key);
} catch (Exception e) {
- throw new CayenneCryptoException("Error on encryption", e);
+ throw new CayenneCryptoException("Error on decryption", e);
}
}
- protected void encrypt(byte[] plain, byte[] encrypted, int outputOffset) throws InvalidKeyException,
+ private void doDecrypt(byte[] input, byte[] output, int inputOffset, Key key) throws InvalidKeyException,
InvalidAlgorithmParameterException, ShortBufferException, IllegalBlockSizeException, BadPaddingException {
- // copy IV in the first block
- System.arraycopy(iv, 0, encrypted, outputOffset, blockSize);
+ IvParameterSpec iv = iv(input, inputOffset);
- cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
- int encBytes = cipher.doFinal(plain, 0, plain.length, encrypted, outputOffset + blockSize);
+ cipher.init(Cipher.DECRYPT_MODE, key, iv);
- // store the last block of ciphertext to use as an IV for the next round
- // of encryption...
- System.arraycopy(encrypted, outputOffset + encBytes, iv, 0, blockSize);
+ int offset = inputOffset + blockSize;
+ cipher.doFinal(input, offset, input.length - offset, output, 0);
}
+ IvParameterSpec iv(byte[] input, int inputOffset) {
+ return new IvParameterSpec(input, inputOffset, blockSize);
+ }
}
Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcEncryptor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcEncryptor.java?rev=1584624&r1=1584623&r2=1584624&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcEncryptor.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/CbcEncryptor.java Fri Apr 4 12:03:01 2014
@@ -31,14 +31,14 @@ import javax.crypto.spec.IvParameterSpec
import org.apache.cayenne.crypto.CayenneCryptoException;
/**
- * A {@link BytesTransformer} that encrypts the provided bytes. The first block
- * in the encrypted bytes is the value of IV used to seed the CBC
- * transformation. It will be needed for decryption. The object is stateful and
- * is not thread-safe.
+ * A {@link BytesEncryptor} that encrypts the provided bytes. The first block in
+ * the encrypted bytes is the value of IV used to seed the CBC transformation.
+ * It will be needed for decryption. The object is stateful and is not
+ * thread-safe.
*
* @since 3.2
*/
-class CbcEncryptor implements BytesTransformer {
+class CbcEncryptor implements BytesEncryptor {
private Cipher cipher;
private byte[] iv;
@@ -64,15 +64,15 @@ class CbcEncryptor implements BytesTrans
}
@Override
- public void transform(byte[] input, byte[] output, int outputOffset) {
+ public void encrypt(byte[] input, byte[] output, int outputOffset) {
try {
- encrypt(input, output, outputOffset);
+ doEncrypt(input, output, outputOffset);
} catch (Exception e) {
throw new CayenneCryptoException("Error on encryption", e);
}
}
- protected void encrypt(byte[] plain, byte[] encrypted, int outputOffset) throws InvalidKeyException,
+ protected void doEncrypt(byte[] plain, byte[] encrypted, int outputOffset) throws InvalidKeyException,
InvalidAlgorithmParameterException, ShortBufferException, IllegalBlockSizeException, BadPaddingException {
// copy IV in the first block
Copied: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/DecryptorWithKeyName.java (from r1584623, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyName.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/DecryptorWithKeyName.java?p2=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/DecryptorWithKeyName.java&p1=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyName.java&r1=1584623&r2=1584624&rev=1584624&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyName.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/DecryptorWithKeyName.java Fri Apr 4 12:03:01 2014
@@ -18,35 +18,52 @@
****************************************************************/
package org.apache.cayenne.crypto.transformer.bytes;
+import java.io.UnsupportedEncodingException;
+import java.security.Key;
+
import org.apache.cayenne.crypto.CayenneCryptoException;
+import org.apache.cayenne.crypto.key.KeySource;
+
+/**
+ * @since 3.2
+ */
+class DecryptorWithKeyName implements BytesDecryptor {
-class EncryptorWithKeyName implements BytesTransformer {
+ private static final String KEY_NAME_CHARSET = "UTF-8";
- private BytesTransformer delegate;
+ private KeySource keySource;
+ private BytesDecryptor delegate;
private int blockSize;
- private byte[] keyName;
- EncryptorWithKeyName(BytesTransformer delegate, byte[] keyName, int blockSize) {
+ public DecryptorWithKeyName(BytesDecryptor delegate, KeySource keySource, int blockSize) {
this.delegate = delegate;
this.blockSize = blockSize;
- this.keyName = keyName;
-
- if (blockSize != keyName.length) {
- throw new CayenneCryptoException("keyName size is expected to be the same as block size. Was "
- + keyName.length + "; block size was: " + blockSize);
- }
+ this.keySource = keySource;
}
@Override
public int getOutputSize(int inputLength) {
- // add one block for key name storage
- return blockSize + delegate.getOutputSize(inputLength);
+ // strip one block that stores the key name
+ return delegate.getOutputSize(inputLength) - blockSize;
}
@Override
- public void transform(byte[] input, byte[] output, int outputOffset) {
- System.arraycopy(keyName, 0, output, outputOffset, blockSize);
- delegate.transform(input, output, outputOffset + blockSize);
+ public void decrypt(byte[] input, byte[] output, int inputOffset, Key key) {
+
+ // ignoring the parameter key... using the key from the first block
+
+ String keyName = keyName(input, inputOffset);
+ Key inRecordKey = keySource.getKey(keyName);
+ delegate.decrypt(input, output, inputOffset + blockSize, inRecordKey);
+ }
+
+ String keyName(byte[] input, int inputOffset) {
+ try {
+ // 'trim' is to get rid of 0 padding
+ return new String(input, inputOffset, blockSize, KEY_NAME_CHARSET).trim();
+ } catch (UnsupportedEncodingException e) {
+ throw new CayenneCryptoException("Can't decode with " + KEY_NAME_CHARSET, e);
+ }
}
}
Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/DefaultBytesTransformerFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/DefaultBytesTransformerFactory.java?rev=1584624&r1=1584623&r2=1584624&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/DefaultBytesTransformerFactory.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/DefaultBytesTransformerFactory.java Fri Apr 4 12:03:01 2014
@@ -60,11 +60,11 @@ public class DefaultBytesTransformerFact
}
}
- public BytesTransformer encryptor() {
+ public BytesEncryptor encryptor() {
return delegate.encryptor();
}
- public BytesTransformer decryptor() {
+ public BytesDecryptor decryptor() {
return delegate.decryptor();
}
}
Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyName.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyName.java?rev=1584624&r1=1584623&r2=1584624&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyName.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyName.java Fri Apr 4 12:03:01 2014
@@ -20,13 +20,13 @@ package org.apache.cayenne.crypto.transf
import org.apache.cayenne.crypto.CayenneCryptoException;
-class EncryptorWithKeyName implements BytesTransformer {
+class EncryptorWithKeyName implements BytesEncryptor {
- private BytesTransformer delegate;
+ private BytesEncryptor delegate;
private int blockSize;
private byte[] keyName;
- EncryptorWithKeyName(BytesTransformer delegate, byte[] keyName, int blockSize) {
+ EncryptorWithKeyName(BytesEncryptor delegate, byte[] keyName, int blockSize) {
this.delegate = delegate;
this.blockSize = blockSize;
this.keyName = keyName;
@@ -44,9 +44,9 @@ class EncryptorWithKeyName implements By
}
@Override
- public void transform(byte[] input, byte[] output, int outputOffset) {
+ public void encrypt(byte[] input, byte[] output, int outputOffset) {
System.arraycopy(keyName, 0, output, outputOffset, blockSize);
- delegate.transform(input, output, outputOffset + blockSize);
+ delegate.encrypt(input, output, outputOffset + blockSize);
}
}
Copied: cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/CbcDecryptorTest.java (from r1584623, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformerFactory.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/CbcDecryptorTest.java?p2=cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/CbcDecryptorTest.java&p1=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformerFactory.java&r1=1584623&r2=1584624&rev=1584624&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformerFactory.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/CbcDecryptorTest.java Fri Apr 4 12:03:01 2014
@@ -18,15 +18,31 @@
****************************************************************/
package org.apache.cayenne.crypto.transformer.bytes;
-/**
- * A class that encapsulates Cayenne cryptography protocol, which is usually
- * dependent on the encryption mode.
- *
- * @since 3.2
- */
-public interface BytesTransformerFactory {
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
- BytesTransformer encryptor();
+import java.security.NoSuchAlgorithmException;
+
+import javax.crypto.Cipher;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+
+import org.junit.Test;
+
+public class CbcDecryptorTest {
+
+ @Test
+ public void testIv() throws NoSuchAlgorithmException, NoSuchPaddingException {
+ Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+ assertEquals(16, cipher.getBlockSize());
+
+ CbcDecryptor decryptor = new CbcDecryptor(cipher);
+
+ byte[] input = { 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
+ byte[] ivBytes = { 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
+
+ IvParameterSpec iv = decryptor.iv(input, 5);
+ assertArrayEquals(ivBytes, iv.getIV());
+ }
- BytesTransformer decryptor();
}
Copied: cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/DecryptorWithKeyNameTest.java (from r1584623, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/DecryptorWithKeyNameTest.java?p2=cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/DecryptorWithKeyNameTest.java&p1=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java&r1=1584623&r2=1584624&rev=1584624&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/bytes/BytesTransformer.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/DecryptorWithKeyNameTest.java Fri Apr 4 12:03:01 2014
@@ -18,16 +18,26 @@
****************************************************************/
package org.apache.cayenne.crypto.transformer.bytes;
-/**
- * @since 3.2
- */
-public interface BytesTransformer {
-
- /**
- * Returns the size of the transformed data in bytes. This information
- * allows the caller to pre-size the output array.
- */
- int getOutputSize(int inputLength);
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+
+import org.apache.cayenne.crypto.key.KeySource;
+import org.junit.Test;
+
+public class DecryptorWithKeyNameTest {
+
+ @Test
+ public void testKeyName() {
+
+ byte[] input1 = { 'a', 'b', 'c', 'd', 'e' };
+ byte[] input2 = { 'a', 'b', 'c', 0, 'e' };
+ byte[] input3 = { 'a', 'b', 0, 0, 'e' };
+
+ DecryptorWithKeyName decryptor = new DecryptorWithKeyName(mock(BytesDecryptor.class), mock(KeySource.class), 3);
+ assertEquals("bcd", decryptor.keyName(input1, 1));
+ assertEquals("bc", decryptor.keyName(input2, 1));
+ assertEquals("b", decryptor.keyName(input3, 1));
+
+ }
- void transform(byte[] input, byte[] output, int outputOffset);
}
Modified: cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyNameTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyNameTest.java?rev=1584624&r1=1584623&r2=1584624&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyNameTest.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/bytes/EncryptorWithKeyNameTest.java Fri Apr 4 12:03:01 2014
@@ -36,7 +36,7 @@ public class EncryptorWithKeyNameTest {
public void testGetOutputSize() throws UnsupportedEncodingException {
byte[] keyName = "mykey".getBytes("UTF-8");
- BytesTransformer delegate = mock(BytesTransformer.class);
+ BytesEncryptor delegate = mock(BytesEncryptor.class);
when(delegate.getOutputSize(8)).thenReturn(8);
// try with non-standard block size..
@@ -49,7 +49,7 @@ public class EncryptorWithKeyNameTest {
byte[] keyName = "mykey".getBytes("UTF-8");
- BytesTransformer delegate = mock(BytesTransformer.class);
+ BytesEncryptor delegate = mock(BytesEncryptor.class);
when(delegate.getOutputSize(8)).thenReturn(8);
byte[] input = { 1, 2, 3, 4, 5, 6, 7, 8 };
@@ -70,12 +70,12 @@ public class EncryptorWithKeyNameTest {
return null;
}
- }).when(delegate).transform(input, output, 6);
+ }).when(delegate).encrypt(input, output, 6);
// intentionally non-standard block size..
EncryptorWithKeyName encryptor = new EncryptorWithKeyName(delegate, keyName, 5);
- encryptor.transform(input, output, 1);
+ encryptor.encrypt(input, output, 1);
assertArrayEquals(new byte[] { 0, 'm', 'y', 'k', 'e', 'y', 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, output);
}