package eu.dnetlib.enabling.aas.utils;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import eu.dnetlib.enabling.aas.utils.SecurityUtils;

public class SecurityUtilsTest {

	SecurityUtils secUtils;
	
	@Before
	public void setUp() throws Exception {
		secUtils = new SecurityUtils();
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testGenerateKeyPair() {
		
		KeyPair keyPair = null;
		try {
			keyPair = secUtils.generateKeyPair();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		assertNotNull(keyPair);
		PrivateKey privKey = keyPair.getPrivate();
		PublicKey pubKey = keyPair.getPublic();
		assertNotNull(privKey);
		assertNotNull(pubKey);
		
		System.out.println("Private key: " + privKey);
		System.out.println("Private key format: " + privKey.getFormat());
		System.out.println("Private key encoded: " + privKey.getEncoded());
		System.out.println("Public key: " + pubKey);
		System.out.println("Public key format: " + pubKey.getFormat());
		System.out.println("Public key encoded: " + pubKey.getEncoded());
	}

	@Test
	public void testEncryptionAndDecryption() {
		KeyPair keyPair = null;
		try {
			keyPair = secUtils.generateKeyPair();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		assertNotNull(keyPair);
		PrivateKey privKey = keyPair.getPrivate();
		PublicKey pubKey = keyPair.getPublic();
		
		String information = "This is crucial information!";
		byte[] bytesInformation = information.getBytes();
		
		byte[] encBytes = null;
		byte[] decBytes = null;
		try {
			encBytes = secUtils.encrypt(bytesInformation, pubKey);
			assertNotNull(encBytes);
			decBytes = secUtils.decrypt(encBytes, privKey);
			assertNotNull(decBytes);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(new String(decBytes));
		assertTrue(java.util.Arrays.equals(bytesInformation, decBytes));
	}


}
