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

class DSASignGen
{
	public static void main(String args[])
	{
		if(args.length!=1){
			System.out.println("Usage: DSASignGen <name_of_file_to_sign>");
			System.exit(0);
		}
		try{
			/************************* BEGIN Generate a key pair ***************************/
			KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA","SUN");
			SecureRandom random = SecureRandom.getInstance("SHA1PRNG","SUN");

			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 dsa = Signature.getInstance("SHA1withDSA","SUN");
			dsa.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);
				dsa.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 = dsa.sign();

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

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

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

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

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