home *** CD-ROM | disk | FTP | other *** search
- package sun.security.provider;
-
- import java.math.BigInteger;
- import java.security.InvalidKeyException;
- import java.security.InvalidParameterException;
- import java.security.KeyPair;
- import java.security.KeyPairGenerator;
- import java.security.ProviderException;
- import java.security.SecureRandom;
- import java.security.interfaces.DSAParams;
- import java.util.Hashtable;
- import java.util.Random;
- import sun.security.x509.AlgIdDSA;
-
- public class DSAKeyPairGenerator extends KeyPairGenerator implements java.security.interfaces.DSAKeyPairGenerator {
- private static Hashtable precomputedParams = new Hashtable();
- private int modlen;
- boolean generateNewParameters = false;
- private BigInteger presetP;
- private BigInteger presetQ;
- private BigInteger presetG;
- SecureRandom random;
- private SHA sha = new SHA();
- private static final BigInteger ONE;
- private static final BigInteger TWO;
- private static final BigInteger ZERO;
- private static int[] testXSeed;
- private int[] x_t = new int[]{1732584193, -271733879, -1732584194, 271733878, -1009589776};
-
- public DSAKeyPairGenerator() {
- super("DSA");
- }
-
- public void initialize(int var1, SecureRandom var2) {
- this.random = var2;
- this.modlen = var1;
- DSAParams var3 = null;
- if (!this.generateNewParameters) {
- Integer var4 = new Integer(var1);
- var3 = (DSAParams)precomputedParams.get(var4);
- }
-
- if (var3 != null) {
- this.setParams(var3);
- }
-
- if (var2 == null) {
- new SecureRandom();
- }
-
- }
-
- public void initialize(int var1, boolean var2, SecureRandom var3) throws InvalidParameterException {
- this.initialize(var1, var3);
- this.generateNewParameters = var2;
- }
-
- public void initialize(DSAParams var1, SecureRandom var2) throws InvalidParameterException {
- this.initialize(var1.getP().bitLength() * 8, var2);
- this.setParams(var1);
- }
-
- public KeyPair generateKeyPair() {
- if (this.presetP == null || this.presetQ == null || this.presetG == null || this.generateNewParameters) {
- BigInteger[] var1 = this.generatePandQ(this.random, this.modlen);
- this.presetP = var1[0];
- this.presetQ = var1[1];
- this.presetG = this.generateG(this.presetP, this.presetQ);
- }
-
- return this.generateKeyPair(this.presetP, this.presetQ, this.presetG, this.random);
- }
-
- public KeyPair generateKeyPair(BigInteger var1, BigInteger var2, BigInteger var3, SecureRandom var4) {
- BigInteger var5 = this.generateX(var4, var2);
- BigInteger var6 = this.generateY(var5, var1, var3);
-
- try {
- DSAPublicKey var7 = new DSAPublicKey(var6, var1, var2, var3);
- DSAPrivateKey var8 = new DSAPrivateKey(var5, var1, var2, var3);
- KeyPair var9 = new KeyPair(var7, var8);
- return var9;
- } catch (InvalidKeyException var10) {
- throw new ProviderException(((Throwable)var10).getMessage());
- }
- }
-
- BigInteger[] generatePandQ(SecureRandom var1, int var2) {
- BigInteger[] var3 = null;
-
- for(byte[] var4 = new byte[20]; var3 == null; var3 = this.generatePandQ(var4, var2)) {
- for(int var5 = 0; var5 < 20; ++var5) {
- var4[var5] = (byte)((Random)var1).nextInt();
- }
- }
-
- return var3;
- }
-
- private void xor(byte[] var1, byte[] var2) {
- for(int var3 = 0; var3 < var1.length; ++var3) {
- var1[var3] ^= var2[var3];
- }
-
- }
-
- private byte[] SHA(byte[] var1) {
- this.sha.reset();
- return this.sha.digest(var1);
- }
-
- private byte[] toByteArray(BigInteger var1) {
- byte[] var2 = var1.toByteArray();
- if (var2[0] == 0) {
- byte[] var3 = new byte[var2.length - 1];
- System.arraycopy(var2, 1, var3, 0, var3.length);
- var2 = var3;
- }
-
- return var2;
- }
-
- BigInteger[] generatePandQ(byte[] var1, int var2) {
- int var3 = var1.length * 8;
- int var4 = (var2 - 1) / 160;
- int var5 = (var2 - 1) % 160;
- BigInteger var6 = new BigInteger(1, var1);
- BigInteger var7 = TWO.pow(2 * var3);
- byte[] var8 = this.SHA(var1);
- byte[] var9 = this.SHA(this.toByteArray(var6.add(ONE).mod(var7)));
- this.xor(var8, var9);
- var8[0] = (byte)(var8[0] | 128);
- var8[19] = (byte)(var8[19] | 1);
- BigInteger var11 = new BigInteger(1, var8);
- if (!var11.isProbablePrime(40)) {
- return null;
- } else {
- BigInteger[] var12 = new BigInteger[var4 + 1];
- BigInteger var13 = TWO;
-
- for(int var14 = 0; var14 < 4096; ++var14) {
- for(int var15 = 0; var15 <= var4; ++var15) {
- BigInteger var16 = BigInteger.valueOf((long)var15);
- BigInteger var17 = var6.add(var13).add(var16).mod(var7);
- var12[var15] = new BigInteger(1, this.SHA(this.toByteArray(var17)));
- }
-
- BigInteger var23 = var12[0];
-
- for(int var25 = 1; var25 < var4; ++var25) {
- var23 = var23.add(var12[var25].multiply(TWO.pow(var25 * 160)));
- }
-
- var23 = var23.add(var12[var4].mod(TWO.pow(var5)).multiply(TWO.pow(var4 * 160)));
- BigInteger var18 = TWO.pow(var2 - 1);
- BigInteger var19 = var23.add(var18);
- BigInteger var20 = var19.mod(var11.multiply(TWO));
- BigInteger var21 = var19.subtract(var20.subtract(ONE));
- if (var21.compareTo(var18) > -1 && var21.isProbablePrime(15)) {
- BigInteger[] var22 = new BigInteger[]{var21, var11, var6, BigInteger.valueOf((long)var14)};
- return var22;
- }
-
- var13 = var13.add(BigInteger.valueOf((long)var4)).add(ONE);
- }
-
- return null;
- }
- }
-
- BigInteger generateG(BigInteger var1, BigInteger var2) {
- BigInteger var3 = ONE;
- BigInteger var4 = var1.subtract(ONE).divide(var2);
-
- BigInteger var5;
- for(var5 = ONE; var5.compareTo(TWO) < 0; var3 = var3.add(ONE)) {
- var5 = var3.modPow(var4, var1);
- }
-
- return var5;
- }
-
- private BigInteger generateX(SecureRandom var1, BigInteger var2) {
- Object var3 = null;
-
- do {
- int[] var4 = new int[5];
-
- for(int var5 = 0; var5 < 5; ++var5) {
- var4[var5] = ((Random)var1).nextInt();
- }
-
- var6 = this.generateX(var4, var2);
- } while(var6.signum() <= 0 || var6.compareTo(var2) >= 0);
-
- return var6;
- }
-
- BigInteger generateX(int[] var1, BigInteger var2) {
- int[] var3 = new int[]{1732584193, -271733879, -1732584194, 271733878, -1009589776};
- int[] var4 = DSA.SHA_7(var1, var3);
- byte[] var5 = new byte[var4.length * 4];
-
- for(int var6 = 0; var6 < var4.length; ++var6) {
- int var7 = var4[var6];
-
- for(int var8 = 0; var8 < 4; ++var8) {
- var5[var6 * 4 + var8] = (byte)(var7 >>> 24 - var8 * 8);
- }
- }
-
- BigInteger var9 = (new BigInteger(1, var5)).mod(var2);
- return var9;
- }
-
- BigInteger generateY(BigInteger var1, BigInteger var2, BigInteger var3) {
- BigInteger var4 = var3.modPow(var1, var2);
- return var4;
- }
-
- private void setParams(DSAParams var1) {
- this.presetP = var1.getP();
- this.presetQ = var1.getQ();
- this.presetG = var1.getG();
- }
-
- static {
- BigInteger var0 = new BigInteger("fca682ce8e12caba26efccf7110e526db078b05edecbcd1eb4a208f3ae1617ae01f35b91a47e6df63413c5e12ed0899bcd132acd50d99151bdc43ee737592e17", 16);
- BigInteger var1 = new BigInteger("962eddcc369cba8ebb260ee6b6a126d9346e38c5", 16);
- BigInteger var2 = new BigInteger("678471b27a9cf44ee91a49c5147db1a9aaf244f05a434d6486931d2d14271b9e35030b71fd73da179069b32e2935630e1c2062354d0da20a6c416e50be794ca4", 16);
- BigInteger var3 = new BigInteger("e9e642599d355f37c97ffd3567120b8e25c9cd43e927b3a9670fbec5d890141922d2c3b3ad2480093799869d1e846aab49fab0ad26d2ce6a22219d470bce7d777d4a21fbe9c270b57f607002f3cef8393694cf45ee3688c11a8c56ab127a3daf", 16);
- BigInteger var4 = new BigInteger("9cdbd84c9f1ac2f38d0f80f42ab952e7338bf511", 16);
- BigInteger var5 = new BigInteger("30470ad5a005fb14ce2d9dcd87e38bc7d1b1c5facbaecbe95f190aa7a31d23c4dbbcbe06174544401a5b2c020965d8c2bd2171d3668445771f74ba084d2029d83c1c158547f3a9f1a2715be23d51ae4d3e5a1f6a7064f316933a346d3f529252", 16);
- BigInteger var6 = new BigInteger("fd7f53811d75122952df4a9c2eece4e7f611b7523cef4400c31e3f80b6512669455d402251fb593d8d58fabfc5f5ba30f6cb9b556cd7813b801d346ff26660b76b9950a5a49f9fe8047b1022c24fbba9d7feb7c61bf83b57e7c6a8a6150f04fb83f6d3c51ec3023554135a169132f675f3ae2b61d72aeff22203199dd14801c7", 16);
- BigInteger var7 = new BigInteger("9760508f15230bccb292b982a2eb840bf0581cf5", 16);
- BigInteger var8 = new BigInteger("f7e1a085d69b3ddecbbcab5c36b857b97994afbbfa3aea82f9574c0b3d0782675159578ebad4594fe67107108180b449167123e84c281613b7cf09328cc8a6e13c167a8b547c8d28e0a3ae1e2bb3a675916ea37f0bfa213562f1fb627a01243bcca4f1bea8519089a883dfe15ae59f06928b665e807b552564014c3bfecf492a", 16);
-
- try {
- AlgIdDSA var9 = new AlgIdDSA(var0, var1, var2);
- AlgIdDSA var10 = new AlgIdDSA(var3, var4, var5);
- AlgIdDSA var11 = new AlgIdDSA(var6, var7, var8);
- precomputedParams.put(new Integer(512), var9);
- precomputedParams.put(new Integer(768), var10);
- precomputedParams.put(new Integer(1024), var11);
- } catch (Exception var12) {
- throw new InternalError("initializing precomputed algorithm parameters for Sun DSA");
- }
-
- ONE = BigInteger.valueOf(1L);
- TWO = BigInteger.valueOf(2L);
- ZERO = BigInteger.valueOf(0L);
- testXSeed = new int[]{-1123902530, 2136053259, -811672789, 1643147023, -346408778};
- }
- }
-