diff --git a/pom.xml b/pom.xml
index bfe90aa..e53200b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,6 +12,8 @@
UTF-8
+ 11
+ 11
diff --git a/src/main/java/cz/muni/fi/xklinec/whiteboxAES/AES.java b/src/main/java/cz/muni/fi/xklinec/whiteboxAES/AES.java
index 6e297cf..76ef846 100644
--- a/src/main/java/cz/muni/fi/xklinec/whiteboxAES/AES.java
+++ b/src/main/java/cz/muni/fi/xklinec/whiteboxAES/AES.java
@@ -28,6 +28,7 @@
*/
package cz.muni.fi.xklinec.whiteboxAES;
+import java.io.Serializable;
import java.util.Arrays;
/**
@@ -35,7 +36,10 @@
*
* @author ph4r05
*/
-public class AES {
+public class AES implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
public static final int BYTES = State.BYTES;
public static final int ROUNDS = 10;
public static final int T1BOXES = 2;
diff --git a/src/test/java/cz/muni/fi/xklinec/whiteboxAES/generator/StringEncryptionWithSerializedTablesTest.java b/src/test/java/cz/muni/fi/xklinec/whiteboxAES/generator/StringEncryptionWithSerializedTablesTest.java
new file mode 100644
index 0000000..f853c3b
--- /dev/null
+++ b/src/test/java/cz/muni/fi/xklinec/whiteboxAES/generator/StringEncryptionWithSerializedTablesTest.java
@@ -0,0 +1,102 @@
+package cz.muni.fi.xklinec.whiteboxAES.generator;
+
+import cz.muni.fi.xklinec.whiteboxAES.AES;
+import cz.muni.fi.xklinec.whiteboxAES.State;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+
+import junit.framework.TestCase;
+
+public class StringEncryptionWithSerializedTablesTest extends TestCase {
+ private final static String TEST_STRING = "testString123";
+ private String encryptorTableFileName = "AESenc.ser";
+ private String decryptorTableFileName = "AESdec.ser";
+
+ public void testGenerate() {
+ Generator gEnc = new Generator();
+ Generator gDec = new Generator();
+
+ // External encoding is needed, at least some, generate identities
+ ExternalBijections extc = new ExternalBijections();
+ gEnc.generateExtEncoding(extc, 0);
+
+ // at first generate pure table AES implementation
+ gEnc.setUseIO04x04Identity(false);
+ gEnc.setUseIO08x08Identity(false);
+ gEnc.setUseMB08x08Identity(false);
+ gEnc.setUseMB32x32Identity(false);
+
+ gDec.setUseIO04x04Identity(false);
+ gDec.setUseIO08x08Identity(false);
+ gDec.setUseMB08x08Identity(false);
+ gDec.setUseMB32x32Identity(false);
+
+ // Generate AES for encryption
+ gEnc.generate(true, AEShelper.testVect128_key, 16, extc);
+ AES AESenc = gEnc.getAESi();
+ // Generate AES for decryption
+ gDec.generate(false, AEShelper.testVect128_key, 16, extc);
+ AES AESdec = gDec.getAESi();
+
+ serialize(encryptorTableFileName, AESenc);
+ serialize(decryptorTableFileName, AESdec);
+
+ byte[] fileContent = TEST_STRING.getBytes();
+
+ State plain = new State(fileContent, true, false);
+ State state = new State(fileContent, true, false);
+
+ // Encrypt
+ state.transpose();
+ gEnc.applyExternalEnc(state, extc, true);
+ AESenc.crypt(state);
+ gEnc.applyExternalEnc(state, extc, false);
+
+ AES AESencDeser = deserialize(encryptorTableFileName);
+ AES AESdecDeser = deserialize(decryptorTableFileName);
+
+ gEnc.setAESi(AESencDeser);
+ gDec.setAESi(AESdecDeser);
+
+
+ byte[] fileEncContent = state.getStateCopy();
+ State cipher = new State(fileEncContent, true, false);
+
+ // Decrypt
+ cipher.transpose();
+ gDec.applyExternalEnc(cipher, extc, true);
+ AESdecDeser.crypt(cipher);
+ gDec.applyExternalEnc(cipher, extc, false);
+ assertEquals("Cipher bytes mismatch", true, plain.equals(cipher));
+ assertEquals("Cipher string mismatch", TEST_STRING, new String(cipher.getStateCopy(), StandardCharsets.UTF_8).replaceAll("\u0000.*", ""));
+ }
+
+ private static AES deserialize(String tableFileName) {
+ AES aes = null;
+ try {
+ FileInputStream fileIn = new FileInputStream(tableFileName);
+ ObjectInputStream in = new ObjectInputStream(fileIn);
+ aes = (AES) in.readObject();
+ in.close();
+ fileIn.close();
+ } catch (IOException | ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ return aes;
+ }
+
+
+ private void serialize(String encryptorTableFileName, AES AESenc) {
+ try {
+ FileOutputStream fileOut = new FileOutputStream(encryptorTableFileName);
+ ObjectOutputStream out = new ObjectOutputStream(fileOut);
+ out.writeObject(AESenc);
+ out.close();
+ fileOut.close();
+ System.out.println("Serialized data is saved in " + encryptorTableFileName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}