package aalgTest;

import java.util.Arrays;

import org.junit.Assert;
import org.junit.Test;

import aalg.crypto.ByteArraySymmetricKey;
import aalg.crypto.TDESDecryptor;
import aalg.crypto.TDESEncryptor;

public class TDESTest {
	
	@Test
	public void Test_encryption (){
		
		TDESEncryptor encryptor = new TDESEncryptor(null);
		
			final byte[] input = {(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01};
			final byte[] key1 = {(byte)0x87,(byte)0x25,(byte)0xDD,(byte)0xD9,(byte)0x43,(byte)0xC7,(byte)0x24,(byte)0xDD};
			final byte[] key2 = {(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01};
			final byte[] key3 = {(byte)0x11,(byte)0x11,(byte)0x11,(byte)0x11,(byte)0x11,(byte)0x11,(byte)0x11,(byte)0x11};
			final byte[] expectedOutput = {(byte)0x91 ,(byte)0xA8 ,(byte)0xAB ,(byte)0xAE ,(byte)0x45 ,(byte)0xC7 ,(byte)0xD5 ,(byte)0x91};
			final byte[] output = new byte[expectedOutput.length];
			
			ByteArraySymmetricKey SymKey1 = new ByteArraySymmetricKey(key1);
			ByteArraySymmetricKey SymKey2 = new ByteArraySymmetricKey(key2);
			ByteArraySymmetricKey SymKey3 = new ByteArraySymmetricKey(key3);
			
			encryptor.setKeys(SymKey1, SymKey2, SymKey3);
			encryptor.transformBlock(input, 0, output, 0);
			
			Assert.assertTrue(Arrays.equals(expectedOutput, output));
						
	}
	
	@Test
	public void Test_decryption (){
		
		TDESDecryptor decryptor = new TDESDecryptor(null);
		
			final byte[] input = {(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01};
			final byte[] key1 = {(byte)0x11,(byte)0x11,(byte)0x11,(byte)0x11,(byte)0x11,(byte)0x11,(byte)0x11,(byte)0x11};
			final byte[] key2 = {(byte)0x87,(byte)0x25,(byte)0xDD,(byte)0xD9,(byte)0x43,(byte)0xC7,(byte)0x24,(byte)0xDD};
			final byte[] key3 = {(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01};
			final byte[] expectedOutput = {(byte)0x54,(byte)0x97 ,(byte)0xDF ,(byte)0x39 ,(byte)0x5D ,(byte)0x62 ,(byte)0x95,(byte)0xC3};
			final byte[] output = new byte[expectedOutput.length];
			
			ByteArraySymmetricKey SymKey1 = new ByteArraySymmetricKey(key1);
			ByteArraySymmetricKey SymKey2 = new ByteArraySymmetricKey(key2);
			ByteArraySymmetricKey SymKey3 = new ByteArraySymmetricKey(key3);
			
			decryptor.setKeys(SymKey1, SymKey2, SymKey3);
			decryptor.transformBlock(input, 0, output, 0);
			
			Assert.assertTrue(Arrays.equals(expectedOutput, output));

	}

}