import java.io.*;
import java.util.*;
import java.security.*;
import java .sql.*;

public class RSADSA {
    

String algotype;
String hashtype;
String scheme;
int currentkeysize;
String filename;
FileWriter output;
public RSADSA(String algotype,String scheme, int currentkeysize, String filename) {
    try{
        //initialize the file for writing the output
        
        output = new FileWriter("/home/ashish/testfiles/outputfile",true);

        this.currentkeysize=currentkeysize;
        output.write("**********************************************\n\n");
output.write("keysize is :"+currentkeysize+"\n\n");
        this.algotype = algotype;
        output.write("algotype is :"+algotype+"\n\n");
this.scheme = scheme;
output.write("Scheme is :"+scheme+"\n\n");
this.filename = filename;
output.write("filename is :"+filename+"\n\n");
output.write("filesize is :"+new File(filename).length()+"bytes\n\n");
/************************* BEGIN Generate a key pair ***************************/
			 long start = GetCurrentTime();
KeyPairGenerator keygen = KeyPairGenerator.getInstance(algotype);
			SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

			keygen.initialize(currentkeysize,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 **************/
			Signature sig = Signature.getInstance(scheme);
                        
			sig.initSign(privatekey);
                        
                        FileInputStream fis = new FileInputStream(filename);
			BufferedInputStream bis = new BufferedInputStream(fis);
			byte buffer[] = new byte[(int)new File(filename).length()];
			int length;
			while(bis.available() != 0){
				length = bis.read(buffer);
				sig.update(buffer,0,length);
			}
			bis.close();
                        long end = GetCurrentTime();
                        start = end - start;
                        output.write("timetaken for signing is :"+start+" milliseconds\n\n");
                        
                        /*
			 * Now, that all the data t obe signed is read in,
			 * and hash generated ( using update method )
			 * generate a signature for it
			 */
			byte[] realsign = sig.sign();
                        
                        /*********** Save signature in a file *************/
			FileOutputStream sigfos = new FileOutputStream(filename+"."+scheme+"_sign"+currentkeysize);
			sigfos.write(realsign);
			sigfos.close();

			/*********** Save Public key in a file *************/
			FileOutputStream pubkeyfos = new FileOutputStream(filename+"."+scheme+"sign_public_key"+currentkeysize);
			pubkeyfos.write(publickey.getEncoded());
			pubkeyfos.close();

			/*********** Save Private key in a file *************/
			FileOutputStream prikeyfos = new FileOutputStream(filename+"."+scheme+"sign_private_key"+currentkeysize);
			prikeyfos.write(privatekey.getEncoded());
			prikeyfos.close();
                        /************verification of signature******************/
                        System.out.println("signatures generated for :"+filename+"\n");
                        
                        {
				System.out.print("Verifying message signature... ");
				
				// Initializing dsa with public key to do verification
				sig.initVerify(publickey);
			
				// Regenerating hash value which i don't ehink require
				FileInputStream fis1 = new FileInputStream(filename);
				BufferedInputStream bufin1 = new BufferedInputStream(fis1);
				
				
				while (bufin1.available() != 0) {
				    length = bufin1.read(buffer);
				    sig.update(buffer, 0, length);
				};
				
				bufin1.close();
			
				start= GetCurrentTime();
				boolean verifies = sig.verify(realsign);
				end= GetCurrentTime();
			output.write("Time taken for verification is :"+(end-start)+" milliseconds\n\n");
				System.out.println("verification is "+verifies);
                                output.close();
			    }
}catch(Exception e){}
}
public static long GetCurrentTime()
    {
	java.util.Date date=Calendar.getInstance().getTime();
	Timestamp a=new Timestamp(date.getTime()); 
	long currentTime=Calendar.getInstance().getTimeInMillis();
	return currentTime;
    }
public static void main(String a[])throws Exception{
int[] keySize={512, 1024};
String filenames[]= {"/home/ashish/testfiles/Digest.java","/home/ashish/testfiles/store.t","/home/ashish/testfiles/amsn.png","/home/ashish/testfiles/opera"};

for (int j=0;j<4;j++){
for (int i=0;i < 2; i++){
   
   new RSADSA("RSA", "MD5withRSA", keySize[i],filenames[j]);
   new RSADSA ("RSA", "SHA1withRSA",keySize[i],filenames[j]);
   new RSADSA("DSA", "SHA1withDSA",keySize[i], filenames[j] );
}
}

}
}