home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / rt.jar / sun / security / provider / DSA.class (.txt) next >
Encoding:
Java Class File  |  1998-04-23  |  10.0 KB  |  365 lines

  1. package sun.security.provider;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.PrintStream;
  6. import java.math.BigInteger;
  7. import java.security.InvalidKeyException;
  8. import java.security.InvalidParameterException;
  9. import java.security.MessageDigest;
  10. import java.security.NoSuchAlgorithmException;
  11. import java.security.PrivateKey;
  12. import java.security.PublicKey;
  13. import java.security.SecureRandom;
  14. import java.security.Signature;
  15. import java.security.SignatureException;
  16. import java.security.interfaces.DSAParams;
  17. import java.security.interfaces.DSAPrivateKey;
  18. import java.security.interfaces.DSAPublicKey;
  19. import java.util.Hashtable;
  20. import java.util.Random;
  21. import sun.security.util.BigInt;
  22. import sun.security.util.DerInputStream;
  23. import sun.security.util.DerOutputStream;
  24. import sun.security.util.DerValue;
  25.  
  26. public final class DSA extends Signature {
  27.    private static boolean debug;
  28.    private DSAParams params;
  29.    private static Hashtable keyGenParams;
  30.    private BigInteger presetP;
  31.    private BigInteger presetQ;
  32.    private BigInteger presetG;
  33.    private BigInteger presetY;
  34.    private BigInteger presetX;
  35.    private MessageDigest dataSHA = MessageDigest.getInstance("SHA");
  36.    private byte[] kseed;
  37.    int strength;
  38.    private int[] k_t = new int[]{-271733879, -1732584194, 271733878, -1009589776, 1732584193};
  39.    private static SecureRandom signingRandom;
  40.    private static final int round1_kt = 1518500249;
  41.    private static final int round2_kt = 1859775393;
  42.    private static final int round3_kt = -1894007588;
  43.    private static final int round4_kt = -899497514;
  44.    static BigInteger p512 = new BigInteger("fca682ce8e12caba26efccf7110e526db078b05edecbcd1eb4a208f3ae1617ae01f35b91a47e6df63413c5e12ed0899bcd132acd50d99151bdc43ee737592e17", 16);
  45.    static BigInteger q512 = new BigInteger("962eddcc369cba8ebb260ee6b6a126d9346e38c5", 16);
  46.    static BigInteger g512 = new BigInteger("678471b27a9cf44ee91a49c5147db1a9aaf244f05a434d6486931d2d14271b9e35030b71fd73da179069b32e2935630e1c2062354d0da20a6c416e50be794ca4", 16);
  47.    static BigInteger x512 = new BigInteger("3406c2d71b04b5fc0db62afcad58a6607d3de688", 16);
  48.    static BigInteger y512 = new BigInteger("2d335d76b8ec9d610aa8f2cbb4b149fd96fdd3a9a6e62bd6c2e01d406be4d1d72718a2fe08bea6d12f5e452474461f70f4dea60508e9fe2eaec23d2ec5d1a866", 16);
  49.    static String pString = "8df2a494492276aa3d25759bb06869cbeac0d83afb8d0cf7cbb8324f0d7882e5d0762fc5b7210eafc2e9adac32ab7aac49693dfbf83724c2ec0736ee31c80291";
  50.    static BigInteger testP;
  51.    static String gString;
  52.    static BigInteger testG;
  53.    static BigInteger testQ;
  54.    static BigInteger testX;
  55.    static String yString;
  56.    static BigInteger testY;
  57.  
  58.    public DSA() throws NoSuchAlgorithmException {
  59.       super("SHAwithDSA");
  60.    }
  61.  
  62.    protected void engineInitSign(PrivateKey var1) throws InvalidKeyException {
  63.       if (!(var1 instanceof DSAPrivateKey)) {
  64.          throw new InvalidKeyException("not a DSA private key: " + var1);
  65.       } else {
  66.          DSAPrivateKey var2 = (DSAPrivateKey)var1;
  67.          this.presetX = var2.getX();
  68.          this.initialize(var2.getParams());
  69.       }
  70.    }
  71.  
  72.    protected void engineInitVerify(PublicKey var1) throws InvalidKeyException {
  73.       if (!(var1 instanceof DSAPublicKey)) {
  74.          throw new InvalidKeyException("not a DSA public key: " + var1);
  75.       } else {
  76.          DSAPublicKey var2 = (DSAPublicKey)var1;
  77.          this.presetY = var2.getY();
  78.          this.initialize(var2.getParams());
  79.       }
  80.    }
  81.  
  82.    private void initialize(DSAParams var1) {
  83.       this.dataSHA.reset();
  84.       this.setParams(var1);
  85.    }
  86.  
  87.    protected byte[] engineSign() throws SignatureException {
  88.       BigInteger var1 = this.generateK(this.presetQ);
  89.       BigInteger var2 = this.generateR(this.presetP, this.presetQ, this.presetG, var1);
  90.       BigInteger var3 = this.generateS(this.presetX, this.presetQ, var2, var1);
  91.       BigInt var4 = new BigInt(var2.toByteArray());
  92.       BigInt var5 = new BigInt(var3.toByteArray());
  93.  
  94.       try {
  95.          DerOutputStream var6 = new DerOutputStream(100);
  96.          var6.putInteger(var4);
  97.          var6.putInteger(var5);
  98.          DerValue var7 = new DerValue((byte)48, ((ByteArrayOutputStream)var6).toByteArray());
  99.          this.reset();
  100.          return var7.toByteArray();
  101.       } catch (IOException var8) {
  102.          throw new SignatureException("error encoding signature");
  103.       }
  104.    }
  105.  
  106.    protected boolean engineVerify(byte[] var1) throws SignatureException {
  107.       Object var2 = null;
  108.       Object var3 = null;
  109.  
  110.       try {
  111.          DerInputStream var4 = new DerInputStream(var1);
  112.          DerValue[] var5 = var4.getSequence(2);
  113.          var7 = var5[0].getInteger().toBigInteger();
  114.          var8 = var5[1].getInteger().toBigInteger();
  115.       } catch (IOException var6) {
  116.          throw new SignatureException("invalid encoding for signature");
  117.       }
  118.  
  119.       BigInteger var9 = this.generateW(this.presetP, this.presetQ, this.presetG, var8);
  120.       BigInteger var10 = this.generateV(this.presetY, this.presetP, this.presetQ, this.presetG, var9, var7);
  121.       this.reset();
  122.       return var10.equals(var7);
  123.    }
  124.  
  125.    private void reset() {
  126.       this.dataSHA.reset();
  127.    }
  128.  
  129.    BigInteger generateR(BigInteger var1, BigInteger var2, BigInteger var3, BigInteger var4) {
  130.       BigInteger var5 = var3.modPow(var4, var1);
  131.       return var5.remainder(var2);
  132.    }
  133.  
  134.    BigInteger generateS(BigInteger var1, BigInteger var2, BigInteger var3, BigInteger var4) {
  135.       byte[] var5 = this.dataSHA.digest();
  136.       BigInteger var6 = new BigInteger(1, var5);
  137.       BigInteger var7 = var4.modInverse(var2);
  138.       BigInteger var8 = var1.multiply(var3);
  139.       var8 = var6.add(var8);
  140.       var8 = var7.multiply(var8);
  141.       return var8.remainder(var2);
  142.    }
  143.  
  144.    BigInteger generateW(BigInteger var1, BigInteger var2, BigInteger var3, BigInteger var4) {
  145.       return var4.modInverse(var2);
  146.    }
  147.  
  148.    BigInteger generateV(BigInteger var1, BigInteger var2, BigInteger var3, BigInteger var4, BigInteger var5, BigInteger var6) {
  149.       byte[] var7 = this.dataSHA.digest();
  150.       BigInteger var8 = new BigInteger(1, var7);
  151.       var8 = var8.multiply(var5);
  152.       BigInteger var9 = var8.remainder(var3);
  153.       BigInteger var10 = var6.multiply(var5).remainder(var3);
  154.       BigInteger var11 = var4.modPow(var9, var2);
  155.       BigInteger var12 = var1.modPow(var10, var2);
  156.       BigInteger var13 = var11.multiply(var12);
  157.       BigInteger var14 = var13.remainder(var2);
  158.       return var14.remainder(var3);
  159.    }
  160.  
  161.    BigInteger generateK(BigInteger var1) {
  162.       Object var2 = null;
  163.       if (this.kseed != null) {
  164.          BigInteger var7 = new BigInteger(1, this.kseed);
  165.          return var7.signum() > 0 && var7.compareTo(var1) < 0 ? var7 : null;
  166.       } else {
  167.          SecureRandom var3 = this.getSigningRandom();
  168.  
  169.          do {
  170.             int[] var4 = new int[5];
  171.  
  172.             for(int var5 = 0; var5 < 5; ++var5) {
  173.                var4[var5] = ((Random)var3).nextInt();
  174.             }
  175.  
  176.             var6 = this.generateK(var4, var1);
  177.          } while(var6.signum() <= 0 || var6.compareTo(var1) >= 0);
  178.  
  179.          return var6;
  180.       }
  181.    }
  182.  
  183.    private SecureRandom getSigningRandom() {
  184.       if (signingRandom == null) {
  185.          signingRandom = new SecureRandom();
  186.       }
  187.  
  188.       return signingRandom;
  189.    }
  190.  
  191.    BigInteger generateK(int[] var1, BigInteger var2) {
  192.       int[] var3 = new int[]{-271733879, -1732584194, 271733878, -1009589776, 1732584193};
  193.       int[] var4 = SHA_7(var1, var3);
  194.       byte[] var5 = new byte[var4.length * 4];
  195.  
  196.       for(int var6 = 0; var6 < var4.length; ++var6) {
  197.          int var7 = var4[var6];
  198.  
  199.          for(int var8 = 0; var8 < 4; ++var8) {
  200.             var5[var6 * 4 + var8] = (byte)(var7 >>> 24 - var8 * 8);
  201.          }
  202.       }
  203.  
  204.       BigInteger var9 = (new BigInteger(1, var5)).mod(var2);
  205.       return var9;
  206.    }
  207.  
  208.    static int[] SHA_7(int[] var0, int[] var1) {
  209.       int[] var2 = new int[80];
  210.       System.arraycopy(var0, 0, var2, 0, var0.length);
  211.       int var3 = 0;
  212.  
  213.       for(int var4 = 16; var4 <= 79; ++var4) {
  214.          var3 = var2[var4 - 3] ^ var2[var4 - 8] ^ var2[var4 - 14] ^ var2[var4 - 16];
  215.          var2[var4] = var3 << 1 | var3 >>> 31;
  216.       }
  217.  
  218.       int var5 = var1[0];
  219.       int var6 = var1[1];
  220.       int var7 = var1[2];
  221.       int var8 = var1[3];
  222.       int var9 = var1[4];
  223.  
  224.       for(int var10 = 0; var10 < 20; ++var10) {
  225.          var3 = (var5 << 5 | var5 >>> 27) + (var6 & var7 | ~var6 & var8) + var9 + var2[var10] + 1518500249;
  226.          var9 = var8;
  227.          var8 = var7;
  228.          var7 = var6 << 30 | var6 >>> 2;
  229.          var6 = var5;
  230.          var5 = var3;
  231.       }
  232.  
  233.       for(int var11 = 20; var11 < 40; ++var11) {
  234.          var3 = (var5 << 5 | var5 >>> 27) + (var6 ^ var7 ^ var8) + var9 + var2[var11] + 1859775393;
  235.          var9 = var8;
  236.          var8 = var7;
  237.          var7 = var6 << 30 | var6 >>> 2;
  238.          var6 = var5;
  239.          var5 = var3;
  240.       }
  241.  
  242.       for(int var12 = 40; var12 < 60; ++var12) {
  243.          var3 = (var5 << 5 | var5 >>> 27) + (var6 & var7 | var6 & var8 | var7 & var8) + var9 + var2[var12] + -1894007588;
  244.          var9 = var8;
  245.          var8 = var7;
  246.          var7 = var6 << 30 | var6 >>> 2;
  247.          var6 = var5;
  248.          var5 = var3;
  249.       }
  250.  
  251.       for(int var13 = 60; var13 < 80; ++var13) {
  252.          var3 = (var5 << 5 | var5 >>> 27) + (var6 ^ var7 ^ var8) + var9 + var2[var13] + -899497514;
  253.          var9 = var8;
  254.          var8 = var7;
  255.          var7 = var6 << 30 | var6 >>> 2;
  256.          var6 = var5;
  257.          var5 = var3;
  258.       }
  259.  
  260.       int[] var14 = new int[]{var1[0] + var5, var1[1] + var6, var1[2] + var7, var1[3] + var8, var1[4] + var9};
  261.       return var14;
  262.    }
  263.  
  264.    protected void engineSetParameter(String var1, Object var2) {
  265.       if (var1.equals("KSEED")) {
  266.          if (var2 instanceof byte[]) {
  267.             this.kseed = (byte[])var2;
  268.          } else {
  269.             debug("unrecognized param: " + var1);
  270.             throw new InvalidParameterException("kseed not a byte array");
  271.          }
  272.       } else {
  273.          throw new InvalidParameterException("invalid parameter");
  274.       }
  275.    }
  276.  
  277.    protected Object engineGetParameter(String var1) {
  278.       return var1.equals("kseed") ? this.kseed : null;
  279.    }
  280.  
  281.    private void setParams(DSAParams var1) {
  282.       this.params = var1;
  283.       this.presetP = var1.getP();
  284.       this.presetQ = var1.getQ();
  285.       this.presetG = var1.getG();
  286.    }
  287.  
  288.    protected void engineUpdate(byte var1) {
  289.       this.dataSHA.update(var1);
  290.    }
  291.  
  292.    protected void engineUpdate(byte[] var1, int var2, int var3) {
  293.       this.dataSHA.update(var1, var2, var3);
  294.    }
  295.  
  296.    public String toString() {
  297.       String var1 = "DSA Signature";
  298.       if (this.presetP != null && this.presetQ != null && this.presetG != null) {
  299.          var1 = var1 + "\n\tp: " + this.presetP.toString(16);
  300.          var1 = var1 + "\n\tq: " + this.presetQ.toString(16);
  301.          var1 = var1 + "\n\tg: " + this.presetG.toString(16);
  302.       } else {
  303.          var1 = var1 + "\n\t P, Q or G not initialized.";
  304.       }
  305.  
  306.       if (this.presetY != null) {
  307.          var1 = var1 + "\n\ty: " + this.presetY.toString(16);
  308.       }
  309.  
  310.       if (this.presetY == null && this.presetX == null) {
  311.          var1 = var1 + "\n\tUNINIIALIZED";
  312.       }
  313.  
  314.       return var1;
  315.    }
  316.  
  317.    static void testDSA() throws Exception {
  318.       PrintStream var0 = System.out;
  319.       DSA var1 = new DSA();
  320.       int[] var2 = new int[]{1752852185, 105445779, -2038558177, 1306500571, 18896260};
  321.       BigInteger var3 = var1.generateK(var2, q512);
  322.       var0.println("k: " + var3.toString(16));
  323.       BigInteger var4 = var1.generateR(p512, q512, g512, var3);
  324.       var0.println("r: " + var4.toString(16));
  325.       byte[] var5 = new byte[]{97, 98, 99};
  326.       var1.dataSHA.update(var5);
  327.       BigInteger var6 = var1.generateS(x512, q512, var4, var3);
  328.       var0.println("s: " + var6.toString(16));
  329.       var1.dataSHA.update(var5);
  330.       BigInteger var7 = var1.generateW(p512, q512, g512, var6);
  331.       var0.println("w: " + var7.toString(16));
  332.       BigInteger var8 = var1.generateV(y512, p512, q512, g512, var7, var4);
  333.       var0.println("v: " + var8.toString(16));
  334.       if (var8.equals(var4)) {
  335.          var0.println("signature verifies.");
  336.       } else {
  337.          var0.println("signature does not verify.");
  338.       }
  339.    }
  340.  
  341.    private static void debug(Exception var0) {
  342.       if (debug) {
  343.          ((Throwable)var0).printStackTrace();
  344.       }
  345.  
  346.    }
  347.  
  348.    private static void debug(String var0) {
  349.       if (debug) {
  350.          System.err.println(var0);
  351.       }
  352.  
  353.    }
  354.  
  355.    static {
  356.       testP = new BigInteger(pString, 16);
  357.       gString = "626d027839ea0a13413163a55b4cb500299d5522956cefcb3bff10f399ce2c2e71cb9de5fa24babf58e5b79521925c9cc42e9f6f464b088cc572af53e6d78802";
  358.       testG = new BigInteger(gString, 16);
  359.       testQ = new BigInteger("c773218c737ec8ee993b4f2ded30f48edace915f", 16);
  360.       testX = new BigInteger("2070b3223dba372fde1c0ffc7b2e3b498b260614", 16);
  361.       yString = "19131871d75b1612a819f29d78d1b0d7346f7aa77bb62a859bfd6c5675da9d212d3a36ef1672ef660b8c7c255cc0ec74858fba33f44c06699630a76b030ee333";
  362.       testY = new BigInteger(yString, 16);
  363.    }
  364. }
  365.