package aalgTest;

import java.util.Arrays;

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

import aalg.crypto.BlowfishDecryptor;
import aalg.crypto.BlowfishEncryptor;
import aalg.crypto.ByteArraySymmetricKey;
import aalg.crypto.DESEncryptor;

public class BlowfishTest {

	
	@Test
	public void function_f (){
		
		BlowfishEncryptor encryptor = new BlowfishEncryptor(null);
		
		int result = encryptor.function_f(0x886a3f24);
		Assert.assertEquals(0x4e9c2fdb, result);
	
	}	
	
	
	@Test
	public void Test_encryption (){
		
		BlowfishEncryptor encryptor = new BlowfishEncryptor(null);
			
		
			final byte[] input = {(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00,(byte)0x00,(byte)0x00};
			final byte[] key = {(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00,(byte)0x00,(byte)0x00};
			final byte[] expectedOutput = {(byte)0x4E,(byte)0xF9,(byte)0x97,(byte)0x45,(byte)0x61,(byte)0x98,(byte)0xDD,(byte)0x78};
			final byte[] output = new byte[expectedOutput.length];
			
			ByteArraySymmetricKey SymKey = new ByteArraySymmetricKey(key);
			
			encryptor.setKey(SymKey);
			encryptor.transformBlock(input, 0, output, 0);
			
			for (int i = 0; i < output.length; i++){
				
				System.out.println("output[" + i + "]");
				System.out.println(Integer.toHexString(output[i] & 0xFF));
			}
			
			Assert.assertTrue(Arrays.equals(expectedOutput, output));
		
			
	}
	
	@Test
	public void Testt_decryption (){
		
		BlowfishDecryptor decryptor = new BlowfishDecryptor(null);
					
		
			final byte[] input = {(byte)0x4E,(byte)0xF9,(byte)0x97,(byte)0x45,(byte)0x61,(byte)0x98,(byte)0xDD,(byte)0x78};
			final byte[] key = {(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00,(byte)0x00,(byte)0x00};
			final byte[] expectedOutput = {(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00,(byte)0x00,(byte)0x00};
			final byte[] output = new byte[expectedOutput.length];
	
			ByteArraySymmetricKey SymKey = new ByteArraySymmetricKey(key);
			
			decryptor.setKey(SymKey);
			decryptor.transformBlock(input, 0, output, 0);
					
			Assert.assertTrue(Arrays.equals(expectedOutput, output));
		
			
	}
	
}
