/*
 * DSA_SHA.java
 *
 * Created on 31 August, 2003, 4:01 PM
 */

/**
 *
 * @author  reds
 */


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

class Sign_Digest
{
    
        public long getCurrentTime()
        {                
          long currentTime=Calendar.getInstance().getTimeInMillis();
                System.out.println("Time: "+currentTime);
                
                return currentTime;
        }
        
      public void digest(String dig_type,String msg) throws Exception
        {
            MessageDigest algorithm =  MessageDigest.getInstance (dig_type);
            algorithm.reset();
                  
            
            long start=getCurrentTime();
            System.out.println(dig_type+" Digest Starting time...");
            algorithm.update (msg.getBytes());                    
            byte digest[] = algorithm.digest();
            System.out.println(dig_type+" Digest Starting time...");
            long end=getCurrentTime();
            
            StringBuffer hexString = new StringBuffer();
            for (int i=0;i<digest.length;i++) {
                   hexString.append (Integer.toHexString(0xFF & digest[i]));
                   hexString.append (" ");
                }
             System.out.println (hexString.toString());
             System.out.println(dig_type+" Digest total time to calculate...(milli sec) "+(end-start));
        }


      public void sign_verify(String key_type,String digest_type,int keylength,String sign_type,String message)
        {
            	try{

			/************************* BEGIN Generate a key pair ***************************/
			KeyPairGenerator keygen = KeyPairGenerator.getInstance(key_type);//,"SUN");
			SecureRandom random = SecureRandom.getInstance(digest_type);//,"SUN");

			keygen.initialize(keylength,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 dsa = Signature.getInstance(sign_type);//,"SUN");
			
                        dsa.initSign(privatekey);

			/************************* Update and Sign the data ***************************/
			byte buffer[] =new byte[message.length()];
			int length=buffer.length;
                        
                         long start,end;
                         System.out.println(sign_type+" Signature Starting time...");
                         start=getCurrentTime();
           
                         dsa.update(buffer,0,length);
			 
			/*
			 * 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();
                         System.out.println(sign_type+" Signature end time...");
                         end=getCurrentTime();
                         System.out.println(sign_type+" Signature total time to calculate...(milli sec) "+(end-start));
                         
                        Signature dsa_verify = Signature.getInstance(sign_type);//,"SUN");
                        dsa_verify.initVerify(publickey);
                        
                       
                         System.out.println(sign_type+" Signature verify Starting time...");
                         start=getCurrentTime();
           
                         dsa_verify.update(buffer,0,length);
                        
                         
			 boolean flag = dsa_verify.verify(realsign); 
                         System.out.println(sign_type+" Signature verify end time...");
                         end=getCurrentTime();
                         System.out.println(sign_type+" Signature verify total time to calculate...(milli sec) "+(end-start));
                        
			
                        if( flag ) System.out.println("Yes Valid Signature");
                        else System.out.println("Not a Valid Signature");
                }
                catch(Exception e){
			e.printStackTrace();
		}
                
        }
            
	public static void main(String args[]) throws Exception
	{
		if(args.length!=2){
			System.out.println("Usage: Sign_Digest <name_of_file_to_sign> <keylength>");
			System.exit(0);
		}
                
	        
                Sign_Digest sign = new Sign_Digest();
                
                String message = sign.readFromFile(args[0]);
                
                sign.digest("SHA-1", message); 
                sign.digest("MD5", message);
                
                sign.sign_verify("DSA","SHA1PRNG",Integer.parseInt(args[1]),"SHA1withDSA",message);
                sign.sign_verify("RSA","SHA1PRNG",Integer.parseInt(args[1]),"SHA1withRSA",message);
	
		
	}
     static String readFromFile(String filename)
      {
         String plaintext="";
        try {
            File inputFile = new File(filename);            

            FileInputStream fis = new FileInputStream(inputFile);
            int c;

            while ((c = fis.read()) != -1) {
                plaintext=plaintext+(char)c;
            }

            fis.close();
        } catch (FileNotFoundException e) {
            System.err.println("FileStreamsTest: " + e);
        } catch (IOException e) {
            System.err.println("FileStreamsTest: " + e);
        }
         return plaintext;
    }
}