/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.core.crypto;
import static org.junit.Assert.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* <p>Test cases for {@link CryptoFactory} and carious <code>Encryptor</code>
* and <code>Decryptor</code> implementations. </p>
*/
@SuppressWarnings("nls")
public class TestEncryptDecrypt {
// Some strings for testing...
private static final String ALPHA_U = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; //$NON-NLS-1$
private static final String ALPHA_L = ALPHA_U.toLowerCase();
private static final String NUMBERS = "0123456789"; //$NON-NLS-1$
private static final String MISC_CHAR = "<>,.:;'{}[][]|`~!@#$%^&*()_+-="; //$NON-NLS-1$
/** String to encrypt and decrypt. */
private static final String CLEARTEXT = ALPHA_U + ALPHA_L + NUMBERS + MISC_CHAR;
private static Cryptor cryptor;
@BeforeClass public static void oneTimeSetup() throws CryptoException, IOException {
cryptor = SymmetricCryptor.getSymmectricCryptor(TestEncryptDecrypt.class.getResource("/teiid.keystore")); //$NON-NLS-1$
}
// =========================================================================
// H E L P E R M E T H O D S
// =========================================================================
/**
* Test encryption (and decryption) for specified string.
*/
public void helpTestEncryptDecrypt( String cleartext ) throws CryptoException {
// Encrypt the cleartext into ciphertext
byte[] ciphertext = cryptor.encrypt( cleartext.getBytes(Charset.forName("UTF-8")));
byte[] cleartext2 = cryptor.decrypt( ciphertext );
assertArrayEquals(cleartext.getBytes(Charset.forName("UTF-8")), cleartext2);
}
// =========================================================================
// T E S T C A S E S
// =========================================================================
/**
* Test the {@link Cryptor#encrypt} method.
* @throws CryptoException
*/
@Test public void testPos_EncryptDecryptLongString() throws CryptoException {
helpTestEncryptDecrypt( CLEARTEXT );
}
/**
* Test the {@link Cryptor#encrypt} method.
* @throws CryptoException
*/
@Test public void testPos_EncryptDecryptHalfLongString() throws CryptoException {
helpTestEncryptDecrypt( CLEARTEXT.substring(0,CLEARTEXT.length()/2) );
}
/**
* Test the {@link Cryptor#encrypt} method.
* @throws CryptoException
*/
@Test public void testPos_EncryptDecryptStringsOfVariousLengths() throws CryptoException {
for ( int k = 1; k < CLEARTEXT.length()/4; k++ ) {
// Use substring starting at index k, and 'k' characters long
String cleartext = CLEARTEXT.substring(k,k+k);
helpTestEncryptDecrypt( cleartext );
}
}
/**
* Test the {@link Cryptor#encrypt} method.
* @throws CryptoException
*/
@Test public void testPos_EncryptDecryptStringsOfBlanks() throws CryptoException {
String BLANKS = " "; //$NON-NLS-1$
for ( int k = 1; k < BLANKS.length(); k++ ) {
// Use substring starting at index 0, and 'k' characters long
String cleartext = BLANKS.substring(0,k);
helpTestEncryptDecrypt( cleartext );
}
}
/**
* Test the {@link Cryptor#encrypt} method.
*/
@Test public void testNeg_DecryptNullString() throws Exception {
// Decrypt the Base64 encoded ciphertext back to the original cleartext
try {
cryptor.decrypt( null );
fail("expected exception"); //$NON-NLS-1$
} catch ( CryptoException e ) {
//expected
}
}
@Test public void testLongEncryption() throws Exception {
helpTestEncryptDecrypt(CLEARTEXT + CLEARTEXT + CLEARTEXT);
}
@Test public void testSymmetricEncryptionWithRandomKey() throws Exception {
SymmetricCryptor randomSymCryptor = SymmetricCryptor.getSymmectricCryptor(true);
ArrayList test = new ArrayList(Arrays.asList(new String[] {ALPHA_L, ALPHA_U, CLEARTEXT, NUMBERS}));
Object result = randomSymCryptor.sealObject(test);
//ensure that we can serialize
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(result);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
result = ois.readObject();
ArrayList clearObject = (ArrayList)randomSymCryptor.unsealObject(result);
assertEquals(test, clearObject);
SymmetricCryptor cryptor1 = SymmetricCryptor.getSymmectricCryptor(randomSymCryptor.getEncodedKey(), true);
clearObject = (ArrayList)cryptor1.unsealObject(result);
assertEquals(test, clearObject);
}
}