home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / security / provider / DSAKeyPairGenerator.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  7.8 KB  |  255 lines

  1. package sun.security.provider;
  2.  
  3. import java.math.BigInteger;
  4. import java.security.InvalidKeyException;
  5. import java.security.InvalidParameterException;
  6. import java.security.KeyPair;
  7. import java.security.KeyPairGenerator;
  8. import java.security.ProviderException;
  9. import java.security.SecureRandom;
  10. import java.security.interfaces.DSAParams;
  11. import java.util.Hashtable;
  12. import java.util.Random;
  13. import sun.security.x509.AlgIdDSA;
  14.  
  15. public class DSAKeyPairGenerator extends KeyPairGenerator implements java.security.interfaces.DSAKeyPairGenerator {
  16.    private static Hashtable precomputedParams = new Hashtable();
  17.    private int modlen;
  18.    boolean generateNewParameters = false;
  19.    private BigInteger presetP;
  20.    private BigInteger presetQ;
  21.    private BigInteger presetG;
  22.    SecureRandom random;
  23.    private SHA sha = new SHA();
  24.    private static final BigInteger ONE;
  25.    private static final BigInteger TWO;
  26.    private static final BigInteger ZERO;
  27.    private static int[] testXSeed;
  28.    private int[] x_t = new int[]{1732584193, -271733879, -1732584194, 271733878, -1009589776};
  29.  
  30.    public DSAKeyPairGenerator() {
  31.       super("DSA");
  32.    }
  33.  
  34.    public void initialize(int var1, SecureRandom var2) {
  35.       this.random = var2;
  36.       this.modlen = var1;
  37.       DSAParams var3 = null;
  38.       if (!this.generateNewParameters) {
  39.          Integer var4 = new Integer(var1);
  40.          var3 = (DSAParams)precomputedParams.get(var4);
  41.       }
  42.  
  43.       if (var3 != null) {
  44.          this.setParams(var3);
  45.       }
  46.  
  47.       if (var2 == null) {
  48.          new SecureRandom();
  49.       }
  50.  
  51.    }
  52.  
  53.    public void initialize(int var1, boolean var2, SecureRandom var3) throws InvalidParameterException {
  54.       this.initialize(var1, var3);
  55.       this.generateNewParameters = var2;
  56.    }
  57.  
  58.    public void initialize(DSAParams var1, SecureRandom var2) throws InvalidParameterException {
  59.       this.initialize(var1.getP().bitLength() * 8, var2);
  60.       this.setParams(var1);
  61.    }
  62.  
  63.    public KeyPair generateKeyPair() {
  64.       if (this.presetP == null || this.presetQ == null || this.presetG == null || this.generateNewParameters) {
  65.          BigInteger[] var1 = this.generatePandQ(this.random, this.modlen);
  66.          this.presetP = var1[0];
  67.          this.presetQ = var1[1];
  68.          this.presetG = this.generateG(this.presetP, this.presetQ);
  69.       }
  70.  
  71.       return this.generateKeyPair(this.presetP, this.presetQ, this.presetG, this.random);
  72.    }
  73.  
  74.    public KeyPair generateKeyPair(BigInteger var1, BigInteger var2, BigInteger var3, SecureRandom var4) {
  75.       BigInteger var5 = this.generateX(var4, var2);
  76.       BigInteger var6 = this.generateY(var5, var1, var3);
  77.  
  78.       try {
  79.          DSAPublicKey var7 = new DSAPublicKey(var6, var1, var2, var3);
  80.          DSAPrivateKey var8 = new DSAPrivateKey(var5, var1, var2, var3);
  81.          KeyPair var9 = new KeyPair(var7, var8);
  82.          return var9;
  83.       } catch (InvalidKeyException var10) {
  84.          throw new ProviderException(((Throwable)var10).getMessage());
  85.       }
  86.    }
  87.  
  88.    BigInteger[] generatePandQ(SecureRandom var1, int var2) {
  89.       BigInteger[] var3 = null;
  90.  
  91.       for(byte[] var4 = new byte[20]; var3 == null; var3 = this.generatePandQ(var4, var2)) {
  92.          for(int var5 = 0; var5 < 20; ++var5) {
  93.             var4[var5] = (byte)((Random)var1).nextInt();
  94.          }
  95.       }
  96.  
  97.       return var3;
  98.    }
  99.  
  100.    private void xor(byte[] var1, byte[] var2) {
  101.       for(int var3 = 0; var3 < var1.length; ++var3) {
  102.          var1[var3] ^= var2[var3];
  103.       }
  104.  
  105.    }
  106.  
  107.    private byte[] SHA(byte[] var1) {
  108.       this.sha.reset();
  109.       return this.sha.digest(var1);
  110.    }
  111.  
  112.    private byte[] toByteArray(BigInteger var1) {
  113.       byte[] var2 = var1.toByteArray();
  114.       if (var2[0] == 0) {
  115.          byte[] var3 = new byte[var2.length - 1];
  116.          System.arraycopy(var2, 1, var3, 0, var3.length);
  117.          var2 = var3;
  118.       }
  119.  
  120.       return var2;
  121.    }
  122.  
  123.    BigInteger[] generatePandQ(byte[] var1, int var2) {
  124.       int var3 = var1.length * 8;
  125.       int var4 = (var2 - 1) / 160;
  126.       int var5 = (var2 - 1) % 160;
  127.       BigInteger var6 = new BigInteger(1, var1);
  128.       BigInteger var7 = TWO.pow(2 * var3);
  129.       byte[] var8 = this.SHA(var1);
  130.       byte[] var9 = this.SHA(this.toByteArray(var6.add(ONE).mod(var7)));
  131.       this.xor(var8, var9);
  132.       var8[0] = (byte)(var8[0] | 128);
  133.       var8[19] = (byte)(var8[19] | 1);
  134.       BigInteger var11 = new BigInteger(1, var8);
  135.       if (!var11.isProbablePrime(40)) {
  136.          return null;
  137.       } else {
  138.          BigInteger[] var12 = new BigInteger[var4 + 1];
  139.          BigInteger var13 = TWO;
  140.  
  141.          for(int var14 = 0; var14 < 4096; ++var14) {
  142.             for(int var15 = 0; var15 <= var4; ++var15) {
  143.                BigInteger var16 = BigInteger.valueOf((long)var15);
  144.                BigInteger var17 = var6.add(var13).add(var16).mod(var7);
  145.                var12[var15] = new BigInteger(1, this.SHA(this.toByteArray(var17)));
  146.             }
  147.  
  148.             BigInteger var23 = var12[0];
  149.  
  150.             for(int var25 = 1; var25 < var4; ++var25) {
  151.                var23 = var23.add(var12[var25].multiply(TWO.pow(var25 * 160)));
  152.             }
  153.  
  154.             var23 = var23.add(var12[var4].mod(TWO.pow(var5)).multiply(TWO.pow(var4 * 160)));
  155.             BigInteger var18 = TWO.pow(var2 - 1);
  156.             BigInteger var19 = var23.add(var18);
  157.             BigInteger var20 = var19.mod(var11.multiply(TWO));
  158.             BigInteger var21 = var19.subtract(var20.subtract(ONE));
  159.             if (var21.compareTo(var18) > -1 && var21.isProbablePrime(15)) {
  160.                BigInteger[] var22 = new BigInteger[]{var21, var11, var6, BigInteger.valueOf((long)var14)};
  161.                return var22;
  162.             }
  163.  
  164.             var13 = var13.add(BigInteger.valueOf((long)var4)).add(ONE);
  165.          }
  166.  
  167.          return null;
  168.       }
  169.    }
  170.  
  171.    BigInteger generateG(BigInteger var1, BigInteger var2) {
  172.       BigInteger var3 = ONE;
  173.       BigInteger var4 = var1.subtract(ONE).divide(var2);
  174.  
  175.       BigInteger var5;
  176.       for(var5 = ONE; var5.compareTo(TWO) < 0; var3 = var3.add(ONE)) {
  177.          var5 = var3.modPow(var4, var1);
  178.       }
  179.  
  180.       return var5;
  181.    }
  182.  
  183.    private BigInteger generateX(SecureRandom var1, BigInteger var2) {
  184.       Object var3 = null;
  185.  
  186.       do {
  187.          int[] var4 = new int[5];
  188.  
  189.          for(int var5 = 0; var5 < 5; ++var5) {
  190.             var4[var5] = ((Random)var1).nextInt();
  191.          }
  192.  
  193.          var6 = this.generateX(var4, var2);
  194.       } while(var6.signum() <= 0 || var6.compareTo(var2) >= 0);
  195.  
  196.       return var6;
  197.    }
  198.  
  199.    BigInteger generateX(int[] var1, BigInteger var2) {
  200.       int[] var3 = new int[]{1732584193, -271733879, -1732584194, 271733878, -1009589776};
  201.       int[] var4 = DSA.SHA_7(var1, var3);
  202.       byte[] var5 = new byte[var4.length * 4];
  203.  
  204.       for(int var6 = 0; var6 < var4.length; ++var6) {
  205.          int var7 = var4[var6];
  206.  
  207.          for(int var8 = 0; var8 < 4; ++var8) {
  208.             var5[var6 * 4 + var8] = (byte)(var7 >>> 24 - var8 * 8);
  209.          }
  210.       }
  211.  
  212.       BigInteger var9 = (new BigInteger(1, var5)).mod(var2);
  213.       return var9;
  214.    }
  215.  
  216.    BigInteger generateY(BigInteger var1, BigInteger var2, BigInteger var3) {
  217.       BigInteger var4 = var3.modPow(var1, var2);
  218.       return var4;
  219.    }
  220.  
  221.    private void setParams(DSAParams var1) {
  222.       this.presetP = var1.getP();
  223.       this.presetQ = var1.getQ();
  224.       this.presetG = var1.getG();
  225.    }
  226.  
  227.    static {
  228.       BigInteger var0 = new BigInteger("fca682ce8e12caba26efccf7110e526db078b05edecbcd1eb4a208f3ae1617ae01f35b91a47e6df63413c5e12ed0899bcd132acd50d99151bdc43ee737592e17", 16);
  229.       BigInteger var1 = new BigInteger("962eddcc369cba8ebb260ee6b6a126d9346e38c5", 16);
  230.       BigInteger var2 = new BigInteger("678471b27a9cf44ee91a49c5147db1a9aaf244f05a434d6486931d2d14271b9e35030b71fd73da179069b32e2935630e1c2062354d0da20a6c416e50be794ca4", 16);
  231.       BigInteger var3 = new BigInteger("e9e642599d355f37c97ffd3567120b8e25c9cd43e927b3a9670fbec5d890141922d2c3b3ad2480093799869d1e846aab49fab0ad26d2ce6a22219d470bce7d777d4a21fbe9c270b57f607002f3cef8393694cf45ee3688c11a8c56ab127a3daf", 16);
  232.       BigInteger var4 = new BigInteger("9cdbd84c9f1ac2f38d0f80f42ab952e7338bf511", 16);
  233.       BigInteger var5 = new BigInteger("30470ad5a005fb14ce2d9dcd87e38bc7d1b1c5facbaecbe95f190aa7a31d23c4dbbcbe06174544401a5b2c020965d8c2bd2171d3668445771f74ba084d2029d83c1c158547f3a9f1a2715be23d51ae4d3e5a1f6a7064f316933a346d3f529252", 16);
  234.       BigInteger var6 = new BigInteger("fd7f53811d75122952df4a9c2eece4e7f611b7523cef4400c31e3f80b6512669455d402251fb593d8d58fabfc5f5ba30f6cb9b556cd7813b801d346ff26660b76b9950a5a49f9fe8047b1022c24fbba9d7feb7c61bf83b57e7c6a8a6150f04fb83f6d3c51ec3023554135a169132f675f3ae2b61d72aeff22203199dd14801c7", 16);
  235.       BigInteger var7 = new BigInteger("9760508f15230bccb292b982a2eb840bf0581cf5", 16);
  236.       BigInteger var8 = new BigInteger("f7e1a085d69b3ddecbbcab5c36b857b97994afbbfa3aea82f9574c0b3d0782675159578ebad4594fe67107108180b449167123e84c281613b7cf09328cc8a6e13c167a8b547c8d28e0a3ae1e2bb3a675916ea37f0bfa213562f1fb627a01243bcca4f1bea8519089a883dfe15ae59f06928b665e807b552564014c3bfecf492a", 16);
  237.  
  238.       try {
  239.          AlgIdDSA var9 = new AlgIdDSA(var0, var1, var2);
  240.          AlgIdDSA var10 = new AlgIdDSA(var3, var4, var5);
  241.          AlgIdDSA var11 = new AlgIdDSA(var6, var7, var8);
  242.          precomputedParams.put(new Integer(512), var9);
  243.          precomputedParams.put(new Integer(768), var10);
  244.          precomputedParams.put(new Integer(1024), var11);
  245.       } catch (Exception var12) {
  246.          throw new InternalError("initializing precomputed algorithm parameters for Sun DSA");
  247.       }
  248.  
  249.       ONE = BigInteger.valueOf(1L);
  250.       TWO = BigInteger.valueOf(2L);
  251.       ZERO = BigInteger.valueOf(0L);
  252.       testXSeed = new int[]{-1123902530, 2136053259, -811672789, 1643147023, -346408778};
  253.    }
  254. }
  255.