home *** CD-ROM | disk | FTP | other *** search
- package sun.security.provider;
-
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.PrintStream;
- import java.math.BigInteger;
- import java.security.InvalidKeyException;
- import java.security.InvalidParameterException;
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import java.security.PrivateKey;
- import java.security.PublicKey;
- import java.security.SecureRandom;
- import java.security.Signature;
- import java.security.SignatureException;
- import java.security.interfaces.DSAParams;
- import java.security.interfaces.DSAPrivateKey;
- import java.security.interfaces.DSAPublicKey;
- import java.util.Hashtable;
- import java.util.Random;
- import sun.security.util.BigInt;
- import sun.security.util.DerInputStream;
- import sun.security.util.DerOutputStream;
- import sun.security.util.DerValue;
-
- public final class DSA extends Signature {
- private static boolean debug;
- private DSAParams params;
- private static Hashtable keyGenParams;
- private BigInteger presetP;
- private BigInteger presetQ;
- private BigInteger presetG;
- private BigInteger presetY;
- private BigInteger presetX;
- private MessageDigest dataSHA = MessageDigest.getInstance("SHA");
- private byte[] kseed;
- int strength;
- private int[] k_t = new int[]{-271733879, -1732584194, 271733878, -1009589776, 1732584193};
- private static SecureRandom signingRandom;
- private static final int round1_kt = 1518500249;
- private static final int round2_kt = 1859775393;
- private static final int round3_kt = -1894007588;
- private static final int round4_kt = -899497514;
- static BigInteger p512 = new BigInteger("fca682ce8e12caba26efccf7110e526db078b05edecbcd1eb4a208f3ae1617ae01f35b91a47e6df63413c5e12ed0899bcd132acd50d99151bdc43ee737592e17", 16);
- static BigInteger q512 = new BigInteger("962eddcc369cba8ebb260ee6b6a126d9346e38c5", 16);
- static BigInteger g512 = new BigInteger("678471b27a9cf44ee91a49c5147db1a9aaf244f05a434d6486931d2d14271b9e35030b71fd73da179069b32e2935630e1c2062354d0da20a6c416e50be794ca4", 16);
- static BigInteger x512 = new BigInteger("3406c2d71b04b5fc0db62afcad58a6607d3de688", 16);
- static BigInteger y512 = new BigInteger("2d335d76b8ec9d610aa8f2cbb4b149fd96fdd3a9a6e62bd6c2e01d406be4d1d72718a2fe08bea6d12f5e452474461f70f4dea60508e9fe2eaec23d2ec5d1a866", 16);
- static String pString = "8df2a494492276aa3d25759bb06869cbeac0d83afb8d0cf7cbb8324f0d7882e5d0762fc5b7210eafc2e9adac32ab7aac49693dfbf83724c2ec0736ee31c80291";
- static BigInteger testP;
- static String gString;
- static BigInteger testG;
- static BigInteger testQ;
- static BigInteger testX;
- static String yString;
- static BigInteger testY;
-
- public DSA() throws NoSuchAlgorithmException {
- super("SHAwithDSA");
- }
-
- protected void engineInitSign(PrivateKey var1) throws InvalidKeyException {
- if (!(var1 instanceof DSAPrivateKey)) {
- throw new InvalidKeyException("not a DSA private key: " + var1);
- } else {
- DSAPrivateKey var2 = (DSAPrivateKey)var1;
- this.presetX = var2.getX();
- this.initialize(var2.getParams());
- }
- }
-
- protected void engineInitVerify(PublicKey var1) throws InvalidKeyException {
- if (!(var1 instanceof DSAPublicKey)) {
- throw new InvalidKeyException("not a DSA public key: " + var1);
- } else {
- DSAPublicKey var2 = (DSAPublicKey)var1;
- this.presetY = var2.getY();
- this.initialize(var2.getParams());
- }
- }
-
- private void initialize(DSAParams var1) {
- this.dataSHA.reset();
- this.setParams(var1);
- }
-
- protected byte[] engineSign() throws SignatureException {
- BigInteger var1 = this.generateK(this.presetQ);
- BigInteger var2 = this.generateR(this.presetP, this.presetQ, this.presetG, var1);
- BigInteger var3 = this.generateS(this.presetX, this.presetQ, var2, var1);
- BigInt var4 = new BigInt(var2.toByteArray());
- BigInt var5 = new BigInt(var3.toByteArray());
-
- try {
- DerOutputStream var6 = new DerOutputStream(100);
- var6.putInteger(var4);
- var6.putInteger(var5);
- DerValue var7 = new DerValue((byte)48, ((ByteArrayOutputStream)var6).toByteArray());
- this.reset();
- return var7.toByteArray();
- } catch (IOException var8) {
- throw new SignatureException("error encoding signature");
- }
- }
-
- protected boolean engineVerify(byte[] var1) throws SignatureException {
- Object var2 = null;
- Object var3 = null;
-
- try {
- DerInputStream var4 = new DerInputStream(var1);
- DerValue[] var5 = var4.getSequence(2);
- var7 = var5[0].getInteger().toBigInteger();
- var8 = var5[1].getInteger().toBigInteger();
- } catch (IOException var6) {
- throw new SignatureException("invalid encoding for signature");
- }
-
- BigInteger var9 = this.generateW(this.presetP, this.presetQ, this.presetG, var8);
- BigInteger var10 = this.generateV(this.presetY, this.presetP, this.presetQ, this.presetG, var9, var7);
- this.reset();
- return var10.equals(var7);
- }
-
- private void reset() {
- this.dataSHA.reset();
- }
-
- BigInteger generateR(BigInteger var1, BigInteger var2, BigInteger var3, BigInteger var4) {
- BigInteger var5 = var3.modPow(var4, var1);
- return var5.remainder(var2);
- }
-
- BigInteger generateS(BigInteger var1, BigInteger var2, BigInteger var3, BigInteger var4) {
- byte[] var5 = this.dataSHA.digest();
- BigInteger var6 = new BigInteger(1, var5);
- BigInteger var7 = var4.modInverse(var2);
- BigInteger var8 = var1.multiply(var3);
- var8 = var6.add(var8);
- var8 = var7.multiply(var8);
- return var8.remainder(var2);
- }
-
- BigInteger generateW(BigInteger var1, BigInteger var2, BigInteger var3, BigInteger var4) {
- return var4.modInverse(var2);
- }
-
- BigInteger generateV(BigInteger var1, BigInteger var2, BigInteger var3, BigInteger var4, BigInteger var5, BigInteger var6) {
- byte[] var7 = this.dataSHA.digest();
- BigInteger var8 = new BigInteger(1, var7);
- var8 = var8.multiply(var5);
- BigInteger var9 = var8.remainder(var3);
- BigInteger var10 = var6.multiply(var5).remainder(var3);
- BigInteger var11 = var4.modPow(var9, var2);
- BigInteger var12 = var1.modPow(var10, var2);
- BigInteger var13 = var11.multiply(var12);
- BigInteger var14 = var13.remainder(var2);
- return var14.remainder(var3);
- }
-
- BigInteger generateK(BigInteger var1) {
- Object var2 = null;
- if (this.kseed != null) {
- BigInteger var7 = new BigInteger(1, this.kseed);
- return var7.signum() > 0 && var7.compareTo(var1) < 0 ? var7 : null;
- } else {
- SecureRandom var3 = this.getSigningRandom();
-
- do {
- int[] var4 = new int[5];
-
- for(int var5 = 0; var5 < 5; ++var5) {
- var4[var5] = ((Random)var3).nextInt();
- }
-
- var6 = this.generateK(var4, var1);
- } while(var6.signum() <= 0 || var6.compareTo(var1) >= 0);
-
- return var6;
- }
- }
-
- private SecureRandom getSigningRandom() {
- if (signingRandom == null) {
- signingRandom = new SecureRandom();
- }
-
- return signingRandom;
- }
-
- BigInteger generateK(int[] var1, BigInteger var2) {
- int[] var3 = new int[]{-271733879, -1732584194, 271733878, -1009589776, 1732584193};
- int[] var4 = 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;
- }
-
- static int[] SHA_7(int[] var0, int[] var1) {
- int[] var2 = new int[80];
- System.arraycopy(var0, 0, var2, 0, var0.length);
- int var3 = 0;
-
- for(int var4 = 16; var4 <= 79; ++var4) {
- var3 = var2[var4 - 3] ^ var2[var4 - 8] ^ var2[var4 - 14] ^ var2[var4 - 16];
- var2[var4] = var3 << 1 | var3 >>> 31;
- }
-
- int var5 = var1[0];
- int var6 = var1[1];
- int var7 = var1[2];
- int var8 = var1[3];
- int var9 = var1[4];
-
- for(int var10 = 0; var10 < 20; ++var10) {
- var3 = (var5 << 5 | var5 >>> 27) + (var6 & var7 | ~var6 & var8) + var9 + var2[var10] + 1518500249;
- var9 = var8;
- var8 = var7;
- var7 = var6 << 30 | var6 >>> 2;
- var6 = var5;
- var5 = var3;
- }
-
- for(int var11 = 20; var11 < 40; ++var11) {
- var3 = (var5 << 5 | var5 >>> 27) + (var6 ^ var7 ^ var8) + var9 + var2[var11] + 1859775393;
- var9 = var8;
- var8 = var7;
- var7 = var6 << 30 | var6 >>> 2;
- var6 = var5;
- var5 = var3;
- }
-
- for(int var12 = 40; var12 < 60; ++var12) {
- var3 = (var5 << 5 | var5 >>> 27) + (var6 & var7 | var6 & var8 | var7 & var8) + var9 + var2[var12] + -1894007588;
- var9 = var8;
- var8 = var7;
- var7 = var6 << 30 | var6 >>> 2;
- var6 = var5;
- var5 = var3;
- }
-
- for(int var13 = 60; var13 < 80; ++var13) {
- var3 = (var5 << 5 | var5 >>> 27) + (var6 ^ var7 ^ var8) + var9 + var2[var13] + -899497514;
- var9 = var8;
- var8 = var7;
- var7 = var6 << 30 | var6 >>> 2;
- var6 = var5;
- var5 = var3;
- }
-
- int[] var14 = new int[]{var1[0] + var5, var1[1] + var6, var1[2] + var7, var1[3] + var8, var1[4] + var9};
- return var14;
- }
-
- protected void engineSetParameter(String var1, Object var2) {
- if (var1.equals("KSEED")) {
- if (var2 instanceof byte[]) {
- this.kseed = (byte[])var2;
- } else {
- debug("unrecognized param: " + var1);
- throw new InvalidParameterException("kseed not a byte array");
- }
- } else {
- throw new InvalidParameterException("invalid parameter");
- }
- }
-
- protected Object engineGetParameter(String var1) {
- return var1.equals("kseed") ? this.kseed : null;
- }
-
- private void setParams(DSAParams var1) {
- this.params = var1;
- this.presetP = var1.getP();
- this.presetQ = var1.getQ();
- this.presetG = var1.getG();
- }
-
- protected void engineUpdate(byte var1) {
- this.dataSHA.update(var1);
- }
-
- protected void engineUpdate(byte[] var1, int var2, int var3) {
- this.dataSHA.update(var1, var2, var3);
- }
-
- public String toString() {
- String var1 = "DSA Signature";
- if (this.presetP != null && this.presetQ != null && this.presetG != null) {
- var1 = var1 + "\n\tp: " + this.presetP.toString(16);
- var1 = var1 + "\n\tq: " + this.presetQ.toString(16);
- var1 = var1 + "\n\tg: " + this.presetG.toString(16);
- } else {
- var1 = var1 + "\n\t P, Q or G not initialized.";
- }
-
- if (this.presetY != null) {
- var1 = var1 + "\n\ty: " + this.presetY.toString(16);
- }
-
- if (this.presetY == null && this.presetX == null) {
- var1 = var1 + "\n\tUNINIIALIZED";
- }
-
- return var1;
- }
-
- static void testDSA() throws Exception {
- PrintStream var0 = System.out;
- DSA var1 = new DSA();
- int[] var2 = new int[]{1752852185, 105445779, -2038558177, 1306500571, 18896260};
- BigInteger var3 = var1.generateK(var2, q512);
- var0.println("k: " + var3.toString(16));
- BigInteger var4 = var1.generateR(p512, q512, g512, var3);
- var0.println("r: " + var4.toString(16));
- byte[] var5 = new byte[]{97, 98, 99};
- var1.dataSHA.update(var5);
- BigInteger var6 = var1.generateS(x512, q512, var4, var3);
- var0.println("s: " + var6.toString(16));
- var1.dataSHA.update(var5);
- BigInteger var7 = var1.generateW(p512, q512, g512, var6);
- var0.println("w: " + var7.toString(16));
- BigInteger var8 = var1.generateV(y512, p512, q512, g512, var7, var4);
- var0.println("v: " + var8.toString(16));
- if (var8.equals(var4)) {
- var0.println("signature verifies.");
- } else {
- var0.println("signature does not verify.");
- }
- }
-
- private static void debug(Exception var0) {
- if (debug) {
- ((Throwable)var0).printStackTrace();
- }
-
- }
-
- private static void debug(String var0) {
- if (debug) {
- System.err.println(var0);
- }
-
- }
-
- static {
- testP = new BigInteger(pString, 16);
- gString = "626d027839ea0a13413163a55b4cb500299d5522956cefcb3bff10f399ce2c2e71cb9de5fa24babf58e5b79521925c9cc42e9f6f464b088cc572af53e6d78802";
- testG = new BigInteger(gString, 16);
- testQ = new BigInteger("c773218c737ec8ee993b4f2ded30f48edace915f", 16);
- testX = new BigInteger("2070b3223dba372fde1c0ffc7b2e3b498b260614", 16);
- yString = "19131871d75b1612a819f29d78d1b0d7346f7aa77bb62a859bfd6c5675da9d212d3a36ef1672ef660b8c7c255cc0ec74858fba33f44c06699630a76b030ee333";
- testY = new BigInteger(yString, 16);
- }
- }
-