/* GnuDSAKeyPairGenerator.java --- Gnu DSA Key Pair Generator
   Copyright (C) 1999 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
 
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package gnu.java.security.provider;

import java.math.BigInteger;
import java.security.AlgorithmParameters;
import java.security.AlgorithmParameterGenerator;
import java.security.KeyPairGeneratorSpi;
import java.security.KeyPair;
import java.security.SecureRandom;
import java.security.InvalidParameterException;
import java.security.InvalidAlgorithmParameterException;
import java.security.interfaces.DSAParams;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.DSAParameterSpec;
import java.util.Random;

import gnu.java.security.util.Prime;

public class DSAKeyPairGenerator extends KeyPairGeneratorSpi 
	implements java.security.interfaces.DSAKeyPairGenerator
{
int keysize;
SecureRandom random;
private BigInteger q = null; // the small prime
private BigInteger p = null; // the big prime
private BigInteger g = null;

DSAKeyPairGenerator()
{
	keysize = 1024;
}

public void initialize(int keysize, SecureRandom random)
{
	//if( ((keysize % 64) != 0) || (keysize < 512) || (keysize > 1024) )
        //        throw new InvalidAlgorithmParameterException("Invalid key size");

	this.keysize = keysize;
	this.random = random;
}

public void initialize(AlgorithmParameterSpec params,
                       SecureRandom random)
                throws InvalidAlgorithmParameterException
{
	if( !( params instanceof DSAParameterSpec ) )
		throw new InvalidAlgorithmParameterException("Must be DSAParameterSpec");

	DSAParameterSpec dsaparameterspec = (DSAParameterSpec)params;
	p = dsaparameterspec.getP();
	q = dsaparameterspec.getQ();
	g = dsaparameterspec.getG();
	this.random = random;
}

public void initialize(DSAParams params, SecureRandom random) 
	throws InvalidParameterException
{
	if(params.getP() != null) 
		p = params.getP();
	else
		throw new InvalidParameterException();

	if(params.getQ() != null) 
		q = params.getQ();
	else
		throw new InvalidParameterException();
	
	if(params.getG() != null) 
		g = params.getG();
	else
		throw new InvalidParameterException();
	
	this.random = random;
}

public void initialize(int modlen, boolean genParams, SecureRandom random) 
	throws InvalidParameterException
{
	if( ((modlen % 64) != 0) || (modlen < 512) || (modlen > 1024) )
                throw new InvalidParameterException();

	if( (genParams == false) && (modlen != 512) && (modlen != 768) && (modlen != 1024)  )
		throw new InvalidParameterException();
	this.keysize = modlen;
	this.random = random;
	p = null;
	q = null;
	g = null;
}

public KeyPair generateKeyPair()
{
	if( getDefaults() == false) {
		try {
			AlgorithmParameterGenerator apgDSA = AlgorithmParameterGenerator.getInstance("DSA");
			AlgorithmParameters apDSA = apgDSA.generateParameters();
			DSAParameterSpec dsaparameterspec = (DSAParameterSpec)apDSA.getParameterSpec( DSAParameterSpec.class );
			p = dsaparameterspec.getP();
			q = dsaparameterspec.getQ();
			g = dsaparameterspec.getG();
		} catch ( Exception e ) {
			return null;
		}
	}

	BigInteger x = new BigInteger( 159, new Random() );

	BigInteger y = g.modPow( x, p );

	return new KeyPair( new GnuDSAPublicKey(y,p,q,g), new GnuDSAPrivateKey(x,p,q,g));
	//return new KeyPair( public, private );
}

//These constants are Sun's Constants copied from the 
//Cryptography Specification
private boolean getDefaults()
{
	if( keysize == 512) {
		p = new BigInteger("fca682ce8e12caba26efccf7110e526db078b05edecbcd1eb4a208f3ae1617ae01f35b91a47e6df63413c5e12ed0899bcd132acd50d99151bdc43ee737592e17", 16);
		q = new BigInteger("962eddcc369cba8ebb260ee6b6a126d9346e38c5", 16);
		g = new BigInteger("678471b27a9cf44ee91a49c5147db1a9aaf244f05a434d6486931d2d14271b9e35030b71fd73da179069b32e2935630e1c2062354d0da20a6c416e50be794ca4", 16);
		return true;
	} else if( keysize == 768) {
		p = new BigInteger("e9e642599d355f37c97ffd3567120b8e25c9cd43e927b3a9670fbec5d890141922d2c3b3ad2480093799869d1e846aab49fab0ad26d2ce6a22219d470bce7d777d4a21fbe9c270b57f607002f3cef8393694cf45ee3688c11a8c56ab127a3daf", 16);
		q = new BigInteger("9cdbd84c9f1ac2f38d0f80f42ab952e7338bf511", 16);
		g = new BigInteger("30470ad5a005fb14ce2d9dcd87e38bc7d1b1c5facbaecbe95f190aa7a31d23c4dbbcbe06174544401a5b2c020965d8c2bd2171d3668445771f74ba084d2029d83c1c158547f3a9f1a2715be23d51ae4d3e5a1f6a7064f316933a346d3f529252", 16);
	} else if( keysize == 512) {
		p = new BigInteger("fd7f53811d75122952df4a9c2eece4e7f611b7523cef4400c31e3f80b6512669455d402251fb593d8d58fabfc5f5ba30f6cb9b556cd7813b801d346ff26660b76b9950a5a49f9fe8047b1022c24fbba9d7feb7c61bf83b57e7c6a8a6150f04fb83f6d3c51ec3023554135a169132f675f3ae2b61d72aeff22203199dd14801c7", 16);
		q = new BigInteger("9760508f15230bccb292b982a2eb840bf0581cf5", 16);
		g = new BigInteger("f7e1a085d69b3ddecbbcab5c36b857b97994afbbfa3aea82f9574c0b3d0782675159578ebad4594fe67107108180b449167123e84c281613b7cf09328cc8a6e13c167a8b547c8d28e0a3ae1e2bb3a675916ea37f0bfa213562f1fb627a01243bcca4f1bea8519089a883dfe15ae59f06928b665e807b552564014c3bfecf492a", 16);
	}
	return false;
}

}
