/** * Initializes this parameter generator with a set of * algorithm-specific parameter generation values. * * @param genParamSpec the set of algorithm-specific parameter generation values * @param random the source of randomness * * @exception InvalidAlgorithmParameterException if the given parameter * generation values are inappropriate for this parameter generator */ protected void engineInit(AlgorithmParameterSpec genParamSpec, SecureRandom random) throws InvalidAlgorithmParameterException { if (!(genParamSpec instanceof DSAGenParameterSpec)) { throw new InvalidAlgorithmParameterException("Invalid parameter"); } DSAGenParameterSpec dsaGenParams = (DSAGenParameterSpec) genParamSpec; int primePLen = dsaGenParams.getPrimePLength(); if (primePLen > 2048) { throw new InvalidParameterException ("No support for prime size " + primePLen); } // directly initialize using the already validated values this.valueL = primePLen; this.valueN = dsaGenParams.getSubprimeQLength(); this.seedLen = dsaGenParams.getSeedLength(); this.random = random; }
/** * Initializes this parameter generator with a set of * algorithm-specific parameter generation values. * * @param genParamSpec the set of algorithm-specific parameter * generation values * @param random the source of randomness * * @exception InvalidAlgorithmParameterException if the given parameter * generation values are inappropriate for this parameter generator */ @Override protected void engineInit(AlgorithmParameterSpec genParamSpec, SecureRandom random) throws InvalidAlgorithmParameterException { if (!(genParamSpec instanceof DSAGenParameterSpec)) { throw new InvalidAlgorithmParameterException("Invalid parameter"); } DSAGenParameterSpec dsaGenParams = (DSAGenParameterSpec)genParamSpec; // directly initialize using the already validated values this.valueL = dsaGenParams.getPrimePLength(); this.valueN = dsaGenParams.getSubprimeQLength(); this.seedLen = dsaGenParams.getSeedLength(); this.random = random; }
private static void testDSAGenParameterSpec(DataTuple dataTuple) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidParameterSpecException, InvalidAlgorithmParameterException { System.out.printf("Test case: primePLen=%d, " + "subprimeQLen=%d%n", dataTuple.primePLen, dataTuple.subprimeQLen); AlgorithmParameterGenerator apg = AlgorithmParameterGenerator.getInstance(ALGORITHM_NAME, PROVIDER_NAME); DSAGenParameterSpec genParamSpec = createGenParameterSpec(dataTuple); // genParamSpec will be null if IllegalAE is thrown when expected. if (genParamSpec == null) { return; } try { apg.init(genParamSpec, null); AlgorithmParameters param = apg.generateParameters(); checkParam(param, genParamSpec); System.out.println("Test case passed"); } catch (InvalidParameterException ipe) { throw new RuntimeException("Test case failed.", ipe); } }
private static void checkParamStrength(AlgorithmParameters param, DSAGenParameterSpec genParam) throws Exception { String algo = param.getAlgorithm(); if (!algo.equalsIgnoreCase("DSA")) { throw new RuntimeException("Unexpected type of parameters: " + algo); } DSAParameterSpec spec = param.getParameterSpec(DSAParameterSpec.class); int valueL = spec.getP().bitLength(); int strength = genParam.getPrimePLength(); if (strength != valueL) { System.out.println("P: Expected " + strength + " but actual " + valueL); throw new RuntimeException("Wrong P strength"); } int valueN = spec.getQ().bitLength(); strength = genParam.getSubprimeQLength(); if (strength != valueN) { System.out.println("Q: Expected " + strength + " but actual " + valueN); throw new RuntimeException("Wrong Q strength"); } }
/** * Initializes this parameter generator with a set of * algorithm-specific parameter generation values. * * @param genParamSpec the set of algorithm-specific parameter * generation values * @param random the source of randomness * * @exception InvalidAlgorithmParameterException if the given parameter * generation values are inappropriate for this parameter generator */ @Override protected void engineInit(AlgorithmParameterSpec genParamSpec, SecureRandom random) throws InvalidAlgorithmParameterException { if (!(genParamSpec instanceof DSAGenParameterSpec)) { throw new InvalidAlgorithmParameterException("Invalid parameter"); } DSAGenParameterSpec dsaGenParams = (DSAGenParameterSpec)genParamSpec; int primePLen = dsaGenParams.getPrimePLength(); if (primePLen > 2048) { throw new InvalidParameterException ("No support for prime size " + primePLen); } // directly initialize using the already validated values this.valueL = primePLen; this.valueN = dsaGenParams.getSubprimeQLength(); this.seedLen = dsaGenParams.getSeedLength(); this.random = random; }
private static void testDSAGenParameterSpec(DataTuple dataTuple) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidParameterSpecException, InvalidAlgorithmParameterException { System.out.printf("Test case: primePLen=%d, " + "subprimeQLen=%d%n", dataTuple.primePLen, dataTuple.subprimeQLen); AlgorithmParameterGenerator apg = AlgorithmParameterGenerator.getInstance(ALGORITHM_NAME, PROVIDER_NAME); DSAGenParameterSpec genParamSpec = createGenParameterSpec(dataTuple); // genParamSpec will be null if IllegalAE is thrown when expected. if (genParamSpec == null) { return; } try { apg.init(genParamSpec, null); AlgorithmParameters param = apg.generateParameters(); checkParam(param, genParamSpec); System.out.println("Test case passed"); } catch (InvalidParameterException ipe) { // The DSAGenParameterSpec API support this, but the real // implementation in SUN doesn't if (!dataTuple.isSunProviderSupported) { System.out.println("Test case passed: expected " + "InvalidParameterException is caught"); } else { throw new RuntimeException("Test case failed.", ipe); } } }
private static void checkParam(AlgorithmParameters param, DSAGenParameterSpec genParam) throws InvalidParameterSpecException, NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException { String algorithm = param.getAlgorithm(); if (!algorithm.equalsIgnoreCase(ALGORITHM_NAME)) { throw new RuntimeException( "Unexpected type of parameters: " + algorithm); } DSAParameterSpec spec = param.getParameterSpec(DSAParameterSpec.class); int valueL = spec.getP().bitLength(); int strengthP = genParam.getPrimePLength(); if (strengthP != valueL) { System.out.printf("P: Expected %d but actual %d%n", strengthP, valueL); throw new RuntimeException("Wrong P strength"); } int valueN = spec.getQ().bitLength(); int strengthQ = genParam.getSubprimeQLength(); if (strengthQ != valueN) { System.out.printf("Q: Expected %d but actual %d%n", strengthQ, valueN); throw new RuntimeException("Wrong Q strength"); } if (genParam.getSubprimeQLength() != genParam.getSeedLength()) { System.out.println("Defaut seed length should be the same as Q."); throw new RuntimeException("Wrong seed length"); } // use the parameters to generate real DSA keys KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM_NAME, PROVIDER_NAME); keyGen.initialize(spec); keyGen.generateKeyPair(); }
private static void checkParam(AlgorithmParameters param, DSAGenParameterSpec genParam) throws InvalidParameterSpecException, NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException { String algorithm = param.getAlgorithm(); if (!algorithm.equalsIgnoreCase(ALGORITHM_NAME)) { throw new RuntimeException( "Unexpected type of parameters: " + algorithm); } DSAParameterSpec spec = param.getParameterSpec(DSAParameterSpec.class); int valueL = spec.getP().bitLength(); int strengthP = genParam.getPrimePLength(); if (strengthP != valueL) { System.out.printf("P: Expected %d but actual %d%n", strengthP, valueL); throw new RuntimeException("Wrong P strength"); } int valueN = spec.getQ().bitLength(); int strengthQ = genParam.getSubprimeQLength(); if (strengthQ != valueN) { System.out.printf("Q: Expected %d but actual %d%n", strengthQ, valueN); throw new RuntimeException("Wrong Q strength"); } if (genParam.getSubprimeQLength() != genParam.getSeedLength()) { System.out.println("Defaut seed length should be the same as Q."); throw new RuntimeException("Wrong seed length"); } KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM_NAME, PROVIDER_NAME); keyGen.initialize(spec); }
public static void main(String[] args) throws Exception { AlgorithmParameterGenerator apg = AlgorithmParameterGenerator.getInstance("DSA", "SUN"); long start, stop; // make sure no-init still works start = System.currentTimeMillis(); AlgorithmParameters param = apg.generateParameters(); stop = System.currentTimeMillis(); System.out.println("Time: " + (stop - start) + " ms."); checkParamStrength(param, 1024); // make sure the old model works int[] strengths = {512, 768, 1024}; for (int sizeP : strengths) { System.out.println("Generating " + sizeP + "-bit DSA Parameters"); start = System.currentTimeMillis(); apg.init(sizeP); param = apg.generateParameters(); stop = System.currentTimeMillis(); System.out.println("Time: " + (stop - start) + " ms."); checkParamStrength(param, sizeP); } // now the newer model DSAGenParameterSpec[] specSet = { new DSAGenParameterSpec(1024, 160), new DSAGenParameterSpec(2048, 224), new DSAGenParameterSpec(2048, 256) // no support for prime size 3072 // ,new DSAGenParameterSpec(3072, 256) }; for (DSAGenParameterSpec genParam : specSet) { System.out.println("Generating (" + genParam.getPrimePLength() + ", " + genParam.getSubprimeQLength() + ") DSA Parameters"); start = System.currentTimeMillis(); apg.init(genParam, null); param = apg.generateParameters(); stop = System.currentTimeMillis(); System.out.println("Time: " + (stop - start) + " ms."); checkParamStrength(param, genParam); } }