package li.strolch.utils.helper;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import li.strolch.utils.helper.AesCryptoHelper;
import li.strolch.utils.helper.ExceptionHelper;
import li.strolch.utils.helper.FileHelper;
import li.strolch.utils.helper.StringHelper;
public class AesCryptoHelperTest {
private static final Logger logger = LoggerFactory.getLogger(AesCryptoHelperTest.class);
private static final char[] password = "A2589309-17AE-4819-B9E4-E577CFA7778F".toCharArray();
private static final byte[] salt;
static {
try {
salt = "E68761B3-4E8E-4122-9B12-8B89E0AEB233".getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
@Test
public void shouldWrapStreams() throws Exception {
try {
byte[] clearTextBytes = "Some text".getBytes();
// encrypt data
ByteArrayOutputStream encryptedOut = new ByteArrayOutputStream();
try (OutputStream outputStream = AesCryptoHelper.wrapEncrypt(password, salt, encryptedOut)) {
outputStream.write(clearTextBytes);
outputStream.flush();
}
// decrypt data
byte[] encryptedBytes = encryptedOut.toByteArray();
ByteArrayInputStream encryptedIn = new ByteArrayInputStream(encryptedBytes);
try (InputStream inputStream = AesCryptoHelper.wrapDecrypt(password, salt, encryptedIn)) {
ByteArrayOutputStream decryptedOut = new ByteArrayOutputStream();
byte[] readBuffer = new byte[64];
int read = 0;
while ((read = inputStream.read(readBuffer)) != -1) {
decryptedOut.write(readBuffer, 0, read);
}
byte[] decryptedBytes = decryptedOut.toByteArray();
assertArrayEquals(clearTextBytes, decryptedBytes);
}
} catch (RuntimeException e) {
if (ExceptionHelper.getRootCause(e).getMessage().equals("Illegal key size or default parameters"))
logger.warn("YOU ARE MISSING THE UNLIMITED JCE POLICIES and can not do AES encryption!");
else
throw e;
}
}
@Test
public void shouldEncryptBytes() {
try {
byte[] clearTextBytes = "Some text".getBytes();
byte[] encryptedBytes = AesCryptoHelper.encrypt(password, salt, clearTextBytes);
byte[] decryptedBytes = AesCryptoHelper.decrypt(password, salt, encryptedBytes);
assertArrayEquals(clearTextBytes, decryptedBytes);
} catch (RuntimeException e) {
if (ExceptionHelper.getRootCause(e).getMessage().equals("Illegal key size or default parameters"))
logger.warn("YOU ARE MISSING THE UNLIMITED JCE POLICIES and can not do AES encryption!");
else
throw e;
}
}
@Test
public void shouldEncryptShortFile() {
// file to be encrypted
String clearTextFileS = "src/test/resources/crypto_test_short.txt";
// encrypted file
String encryptedFileS = "target/encrypted_short.aes";
// encrypted file
String decryptedFileS = "target/decrypted_short.txt";
testCrypto(clearTextFileS, encryptedFileS, decryptedFileS);
}
@Test
public void shouldEncryptMiddleFile() {
// file to be encrypted
String clearTextFileS = "src/test/resources/crypto_test_middle.txt";
// encrypted file
String encryptedFileS = "target/encrypted_middle.aes";
// encrypted file
String decryptedFileS = "target/decrypted_middle.txt";
testCrypto(clearTextFileS, encryptedFileS, decryptedFileS);
}
@Test
public void shouldEncryptLongFile() {
// file to be encrypted
String clearTextFileS = "src/test/resources/crypto_test_long.txt";
// encrypted file
String encryptedFileS = "target/encrypted_long.aes";
// encrypted file
String decryptedFileS = "target/decrypted_long.txt";
testCrypto(clearTextFileS, encryptedFileS, decryptedFileS);
}
@Test
public void shouldEncryptBinaryFile() {
// file to be encrypted
String clearTextFileS = "src/test/resources/crypto_test_image.ico";
// encrypted file
String encryptedFileS = "target/encrypted_image.aes";
// encrypted file
String decryptedFileS = "target/decrypted_image.ico";
testCrypto(clearTextFileS, encryptedFileS, decryptedFileS);
}
private static void testCrypto(String clearTextFileS, String encryptedFileS, String decryptedFileS) {
try {
AesCryptoHelper.encrypt(password, salt, clearTextFileS, encryptedFileS);
AesCryptoHelper.decrypt(password, salt, encryptedFileS, decryptedFileS);
String inputSha256 = StringHelper.getHexString(FileHelper.hashFileSha256(new File(clearTextFileS)));
String doutputSha256 = StringHelper.getHexString(FileHelper.hashFileSha256(new File(decryptedFileS)));
assertEquals(inputSha256, doutputSha256);
} catch (RuntimeException e) {
if (ExceptionHelper.getRootCause(e).getMessage().equals("Illegal key size or default parameters"))
logger.warn("YOU ARE MISSING THE UNLIMITED JCE POLICIES and can not do AES encryption!");
else
throw e;
}
}
}