import java.io.*;

import java.security.*;

import java.security.spec.*;


class VerificaFirmaLRYS {

	public static void main(String [] args) {

		if(args.length != 3) {

			System.out.println("Sintaxis del programa es: java VerificaFirmaLRYS ClavePublicaLRYS.bin FirmaLRYS.bin DocumentoLRYS.txt");

		}

		else

			try {

				FileInputStream clavepublica = new FileInputStream(args[0]);

				byte[] clave = new byte[clavepublica.available()];

				clavepublica.read(clave);

				clavepublica.close();

				X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(clave);

				KeyFactory keyFactory = KeyFactory.getInstance("RSA");

				PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);

				FileInputStream archivoFirmado = new FileInputStream(args[1]);

				byte[] firmaVerificada = new byte[archivoFirmado.available()];

				archivoFirmado.read(firmaVerificada);

				archivoFirmado.close();

				Signature firma = Signature.getInstance("MD5withRSA");

				firma.initVerify(pubKey);

				FileInputStream datos = new FileInputStream(args[2]);

				BufferedInputStream buferEntrada = new BufferedInputStream(datos);

				byte[] buffer = new byte[1024];

				int longitud;

				while(buferEntrada.available() != 0) {

					longitud = buferEntrada.read(buffer);

					firma.update(buffer, 0, longitud);

				}

				buferEntrada.close();

				boolean verifica = firma.verify(firmaVerificada);

				System.out.println("Verificacion de la firma: " + verifica);

			}

			catch(Exception e) {

				System.err.println("El error es de " + e.toString());

			}

	}

}