import java.io.*;
import java.security.*;

public class RSASignGen
{
	public static void main(String args[])
	{
		if(args.length!=1){
			System.out.println("Usage: RSASignGen <name_of_file_to_sign>");
			System.exit(0);
		}
		try{
			

			/************************* BEGIN Generate a key pair ***************************/
			KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
			SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

			keygen.initialize(1024,random);

			KeyPair keypair = keygen.generateKeyPair();
			PrivateKey privatekey = keypair.getPrivate();
			PublicKey publickey = keypair.getPublic();
			/************************* END Generate a key pair ***************************/

			/************* Create a Signature object and initialize it with private key **************/
			long start = System.currentTimeMillis();

			Signature rsa = Signature.getInstance("SHA1withRSA");
			rsa.initSign(privatekey);

			/************************* Update and Sign the data ***************************/
			FileInputStream fis = new FileInputStream(args[0]);
			BufferedInputStream bis = new BufferedInputStream(fis);
			byte buffer[] = new byte[1024];
			int length;
			while(bis.available() != 0){
				length = bis.read(buffer);
				rsa.update(buffer,0,length);
			}
			bis.close();

			/*
			 * Now, that all the data to be signed is read in,
			 * and hash generated ( using update method )
			 * generate a signature for it
			 */
			byte[] realsign = rsa.sign();

			long end= System.currentTimeMillis();
			System.out.println("Total elapsed time= "+ (end-start) );

			/*********** Save signature in a file *************/
			FileOutputStream sigfos = new FileOutputStream(args[0]+".rsa_sign");
			sigfos.write(realsign);
			sigfos.close();

			/*********** Save Public key in a file *************/
			FileOutputStream pubkeyfos = new FileOutputStream(args[0]+".rsa_sign_public_key");
			pubkeyfos.write(publickey.getEncoded());
			pubkeyfos.close();

			/*********** Save Private key in a file *************/
			FileOutputStream prikeyfos = new FileOutputStream(args[0]+".rsa_sign_private_key");
			prikeyfos.write(privatekey.getEncoded());
			prikeyfos.close();

		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
