/**
 * Autores: Computer Security Lab. Universidad Carlos III de Madrid
*/

package p2;

import java.util.Scanner;

import org.bouncycastle.util.encoders.Hex;

public class Demos {

	public static void main(String[] args) {
		Demos instance = new Demos();
		instance.doMenu();
	}

	/**
	 * Menu opciones
	 */
	protected final int MENU_OPTION_CREATE_FILE = 0;
	protected final int MENU_OPTION_GENERATE_DES_KEY = 1;
	protected final int MENU_OPTION_ENCRYPT_DES = 2;
	protected final int MENU_OPTION_DECRYPT_DES = 3;
	protected final int MENU_OPTION_GENERATE_AES_KEY = 4;
	protected final int MENU_OPTION_ENCRYPT_AES = 5;
	protected final int MENU_OPTION_DECRYPT_AES = 6;
	protected final int MENU_OPTION_CREATE_MD5 = 7;
	protected final int MENU_OPTION_CREATE_SHA1 = 8;
	protected final int MENU_OPTION_GENERATE_RSA_KEYS = 9;
	protected final int MENU_OPTION_ENCRYPT_RSA = 10;
	protected final int MENU_OPTION_DECRYPT_RSA = 11;
	
	/**
	 * Muestra el menú y gestiona las solicitudes de cada una de sus opciones
	 */
	private void doMenu() {
		System.out
				.println("\n\nPruebas de algoritmos criptográficos con Java y BouncyCastle");
		System.out
				.println("----------------------------------------------------------------");
		System.out.println("\t  0. Crear un archivo de texto");
		System.out.println("DES");
		System.out
				.println("\t  1. Generar clave para algoritmo de cifrado DES");
		System.out.println("\t  2. Cifrar archivo con DES");
		System.out.println("\t  3. Descifrar archivo con DES");
		System.out.println("AES");
		System.out
				.println("\t  4. Generar clave para algoritmo de cifrado AES");
		System.out.println("\t  5. Cifrar archivo con AES");
		System.out.println("\t  6. Descifrar archivo con AES");
		System.out.println("FUNCIONES RESUMEN");
		System.out.println("\t  7. Generar resumen MD5 de un archivo");
		System.out.println("\t  8. Generar resumen SHA1 de un archivo");
		System.out.println("RSA");
		System.out.println("\t  9. Generar par de claves RSA");
		System.out.println("\t 10. Cifrar archivo con RSA");
		System.out.println("\t 11. Descifrar archivo con RSA");
		System.out.println("\n q. Terminar ejecución");
		System.out.print("\n\nSeleccione una opción y pulse ENTER:");
		Scanner scanner = new Scanner(System.in);
		String selectedOption = scanner.nextLine();

		if (!selectedOption.matches("-?\\d+?") && !selectedOption.equals("q")) {
			System.out.println("Opción incorrecta");
		} else {
			if(selectedOption.equals("q")){
				System.exit(0);
			}
			switch (Integer.parseInt(selectedOption)) {
			case MENU_OPTION_CREATE_FILE:
				Utils.instance().saveConsoleToFile();
				break;
			case MENU_OPTION_GENERATE_DES_KEY:
				new DES().doGenerateKey();
				break;
			case MENU_OPTION_ENCRYPT_DES:
				new DES().doEncrypt();
				break;
			case MENU_OPTION_DECRYPT_DES:
				new DES().doDecrypt();
				break;
			case MENU_OPTION_GENERATE_AES_KEY:
				new AES().doGenerateKey();
				break;
			case MENU_OPTION_ENCRYPT_AES:
				new AES().doEncrypt();
				break;
			case MENU_OPTION_DECRYPT_AES:
				new AES().doDecrypt();
				break;
			case MENU_OPTION_CREATE_MD5:
				new Hash().doMD5();
				break;
			case MENU_OPTION_CREATE_SHA1:
				new Hash().doSHA1();
				break;
			case MENU_OPTION_GENERATE_RSA_KEYS:
				new RSA().doGenerateKeys();
				break;
				case MENU_OPTION_ENCRYPT_RSA:
				new RSA().doEncrypt();
				break;
			case MENU_OPTION_DECRYPT_RSA:
				new RSA().doDecrypt();
				break;
			default:
				System.out.println("Opción incorrecta");
				break;
			}
		}
		Utils.instance().clearConsole();
		doMenu();
	}
}
