import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.ObjectOutputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.PrivateKey;
import java.security.interfaces.DSAKey;
import java.security.interfaces.DSAPrivateKey;
import java.security.interfaces.DSAPublicKey;
import java.security.interfaces.DSAParams;
import java.security.spec.DSAPublicKeySpec;
import java.math.BigInteger;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import java.security.KeyFactory;
import java.io.BufferedReader;
import java.io.FileReader;

public class GenerateDSASigningKeyPair {
    
    public GenerateDSASigningKeyPair() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
        SecureRandom secRnd = new SecureRandom();
        keyGen.initialize(512,secRnd);
        KeyPair keys = keyGen.generateKeyPair();
        PrivateKey privKey = keys.getPrivate();
        PublicKey pubKey = keys.getPublic();
        DSAParams params = ((DSAKey)privKey).getParams();
        PrintWriter DSAparamsOut = new PrintWriter(new FileWriter("DSAParameters"));
        DSAparamsOut.println(params.getP());
        DSAparamsOut.println(params.getQ());
        DSAparamsOut.println(params.getG());
        DSAparamsOut.close();
        BigInteger p = params.getP();
        BigInteger q = params.getQ();
        BigInteger g = params.getG();
        String out = "\nGlobal Parameters";
        out += "\n\n p = " + p;
        out += "\n\n q = " + q;
        out += "\n\n g = " + g + "\n";
        ObjectOutputStream privOut = new ObjectOutputStream(new FileOutputStream("BillsPrivateSigningKey"));
        privOut.writeObject(privKey);
        ObjectOutputStream pubOut = new ObjectOutputStream(new FileOutputStream("BillsPublicSigningKey"));
        pubOut.writeObject(pubKey);
        
        // get the parameters
        BigInteger x = ((DSAPrivateKey)privKey).getX();
        BigInteger y = ((DSAPublicKey)pubKey).getY();
        PrintWriter yOut = new PrintWriter(new FileWriter("BillsDSAPublicKey"));
        yOut.println(y);
        yOut.close();
        out += "\n\n Private signing Key x = " + x;
        out += "\n\n Public signing Key y = " + y;
        privOut.close();
        pubOut.close();
        
        // the recipient gets the global keys
        BufferedReader paramsIn = new BufferedReader(new FileReader("DSAParameters"));
        BigInteger pIn = new BigInteger(paramsIn.readLine());
        BigInteger qIn = new BigInteger(paramsIn.readLine());
        BigInteger gIn = new BigInteger(paramsIn.readLine());
        out += "\n\n\nRecieved Global Parameters";
        out += "\n\n p = " + pIn;
        out += "\n\n q = " + qIn;
        out += "\n\n g = " + gIn + "\n\n";
        // we now have p,q and q
        
        // the recipient gets my public key
        BufferedReader yInFile = new BufferedReader(new FileReader("BillsDSAPublicKey"));
        BigInteger yIn = new BigInteger(yInFile.readLine());
        out += "\n\n Public signing Key y = " + yIn;
        JTextArea outArea = new JTextArea(out,30,60);
        JOptionPane.showMessageDialog(null,new JScrollPane(outArea));
        // we now have y
        
        // generate the public key for use in signing
        DSAPublicKeySpec pubKeySpec = new DSAPublicKeySpec(yIn,pIn,qIn,gIn);
        PublicKey pubKey1 = KeyFactory.getInstance("DSA").generatePublic(pubKeySpec);
        System.out.println(pubKey1.equals(pubKey));
    } // end GenerateDSASigningKeyPair
    
    public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
        new GenerateDSASigningKeyPair();
        System.exit(0);
    } // end main
    
} // end GenerateDSASigningKeyPair
