1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/* 2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more 3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * contributor license agreements. See the NOTICE file distributed with 4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * this work for additional information regarding copyright ownership. 5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0 6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * (the "License"); you may not use this file except in compliance with 7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * the License. You may obtain a copy of the License at 8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Unless required by applicable law or agreed to in writing, software 12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * See the License for the specific language governing permissions and 15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * limitations under the License. 16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.security.tests.java.security; 19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.InvalidKeyException; 21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.KeyFactory; 22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.KeyPair; 23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.KeyPairGenerator; 24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.NoSuchAlgorithmException; 25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.NoSuchProviderException; 26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.PrivateKey; 27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.Provider; 28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.PublicKey; 29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.SecureRandom; 30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.Security; 31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.spec.InvalidKeySpecException; 32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.spec.KeySpec; 33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.spec.PKCS8EncodedKeySpec; 34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.spec.X509EncodedKeySpec; 35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Arrays; 36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Enumeration; 37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Vector; 38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class KeyFactory2Test extends junit.framework.TestCase { 40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private static final String KEYFACTORY_ID = "KeyFactory."; 42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private String[] keyfactAlgs = null; 44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private String providerName = null; 46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath static class KeepAlive extends Thread { 488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath int sleepTime, iterations; 49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public KeepAlive(int sleepTime, int iterations) { 518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath this.sleepTime = sleepTime; 528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath this.iterations = iterations; 538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void run() { 568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath synchronized (this) { 578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath this.notify(); 588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < iterations; i++) { 608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Thread.sleep(sleepTime); 628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath System.out.print("[KA]"); 638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (InterruptedException e) { 648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath System.out.print("[I]"); 658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath break; 668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private KeepAlive createKeepAlive(String alg) { 728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (alg.equals("RSA")) { 738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // 32 minutes 748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeepAlive keepalive = new KeepAlive(240000, 8); 758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath synchronized (keepalive) { 768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath keepalive.start(); 778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath keepalive.wait(); 798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (InterruptedException e) { 808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // ignore 818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return keepalive; 848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return null; 868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @tests java.security.KeyFactory#generatePrivate(java.security.spec.KeySpec) 908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void test_generatePrivateLjava_security_spec_KeySpec() { 928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // Test for method java.security.PrivateKey 938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // java.security.KeyFactory.generatePrivate(java.security.spec.KeySpec) 948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < keyfactAlgs.length; i++) { 958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyFactory fact = KeyFactory.getInstance(keyfactAlgs[i], 978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath providerName); 988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyPairGenerator keyGen = KeyPairGenerator 998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .getInstance(keyfactAlgs[i]); 1008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath SecureRandom random = new SecureRandom(); // We don't use 1018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // getInstance 1028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath keyGen.initialize(1024, random); 1038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeepAlive keepalive = createKeepAlive(keyfactAlgs[i]); 1048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyPair keys = keyGen.generateKeyPair(); 1058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (keepalive != null) { 1068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath keepalive.interrupt(); 1078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 1098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeySpec privateKeySpec = fact.getKeySpec(keys.getPrivate(), 1108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath getPrivateKeySpecClass(keyfactAlgs[i])); 1118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath PrivateKey privateKey = fact.generatePrivate(privateKeySpec); 1128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath boolean samePrivate = Arrays.equals(keys.getPrivate() 1138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .getEncoded(), privateKey.getEncoded()); 1148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath assertTrue( 1158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath "generatePrivate generated different key for algorithm " 1168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath + keyfactAlgs[i], samePrivate); 1178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fact.generatePrivate(new PKCS8EncodedKeySpec(keys.getPrivate() 1188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .getEncoded())); 1198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (InvalidKeySpecException e) { 1208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("invalid key spec for algorithm " + keyfactAlgs[i]); 1218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchAlgorithmException e) { 1228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find algorithm " + keyfactAlgs[i]); 1238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchProviderException e) { 1248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find provider " + providerName); 1258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 1298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 1308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @tests java.security.KeyFactory#generatePublic(java.security.spec.KeySpec) 1318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 1328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void test_generatePublicLjava_security_spec_KeySpec() { 1338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // Test for method java.security.PublicKey 1348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // java.security.KeyFactory.generatePublic(java.security.spec.KeySpec) 1358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < keyfactAlgs.length; i++) { 1368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 1378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyFactory fact = KeyFactory.getInstance(keyfactAlgs[i], 1388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath providerName); 1398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyPairGenerator keyGen = KeyPairGenerator 1408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .getInstance(keyfactAlgs[i]); 1418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // We don't use getInstance 1428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath SecureRandom random = new SecureRandom(); 1438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath keyGen.initialize(1024, random); 1448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeepAlive keepalive = createKeepAlive(keyfactAlgs[i]); 1458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyPair keys = keyGen.generateKeyPair(); 1468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (keepalive != null) { 1478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath keepalive.interrupt(); 1488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeySpec publicKeySpec = fact.getKeySpec(keys.getPublic(), 1508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath getPublicKeySpecClass(keyfactAlgs[i])); 1518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath PublicKey publicKey = fact.generatePublic(publicKeySpec); 1528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath boolean samePublic = Arrays.equals(keys.getPublic() 1538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .getEncoded(), publicKey.getEncoded()); 1548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath assertTrue( 1558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath "generatePublic generated different key for algorithm " 1568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath + keyfactAlgs[i], samePublic); 1578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchAlgorithmException e) { 1588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find algorithm " + keyfactAlgs[i]); 1598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchProviderException e) { 1608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find provider " + providerName); 1618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (InvalidKeySpecException e) { 1628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("invalid key spec for algorithm " + keyfactAlgs[i]); 1638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 1678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 1688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @tests java.security.KeyFactory#getAlgorithm() 1698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 1708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void test_getAlgorithm() { 1718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // Test for method java.lang.String 1728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // java.security.KeyFactory.getAlgorithm() 1738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < keyfactAlgs.length; i++) { 1748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 1758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyFactory fact = KeyFactory.getInstance(keyfactAlgs[i], 1768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath providerName); 1778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath assertTrue("getAlgorithm ok for algorithm " + keyfactAlgs[i], 1788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fact.getAlgorithm().equals(keyfactAlgs[i])); 1798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchAlgorithmException e) { 1808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find algorithm " + keyfactAlgs[i]); 1818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchProviderException e) { 1828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find provider " + providerName); 1838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath }// end for 1858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 1878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 1888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @tests java.security.KeyFactory#getInstance(java.lang.String) 1898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 1908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void test_getInstanceLjava_lang_String() { 1918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // Test for method java.security.KeyFactory 1928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // java.security.KeyFactory.getInstance(java.lang.String) 1938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < keyfactAlgs.length; i++) { 1948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 1958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath assertNotNull(KeyFactory.getInstance(keyfactAlgs[i])); 1968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchAlgorithmException e) { 1978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find algorithm " + keyfactAlgs[i]); 1988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath }// end for 2008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 2028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 2038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @tests java.security.KeyFactory#getInstance(java.lang.String, 2048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath *java.lang.String) 2058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 2068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void test_getInstanceLjava_lang_StringLjava_lang_String() throws Exception { 207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 2088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // Test1: Test for method java.security.KeyFactory 2098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // java.security.KeyFactory.getInstance(java.lang.String, 2108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // java.lang.String) 2118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 2128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Provider[] providers = Security.getProviders("KeyFactory.DSA"); 2138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (providers != null) { 2148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < providers.length; i++) { 2158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyFactory.getInstance("DSA", providers[i].getName()); 2168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath }// end for 2178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } else { 2188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("No providers support KeyFactory.DSA"); 2198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchAlgorithmException e) { 2218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find algorithm"); 2228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchProviderException e) { 2238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find the provider"); 2248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 2268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // Test2: Test with null provider name 2278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 2288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyFactory.getInstance("DSA", (String) null); 229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("Expected IllegalArgumentException"); 2308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IllegalArgumentException e) { 2318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // Expected 2328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 2358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 2368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @tests java.security.KeyFactory#getKeySpec(java.security.Key, 2378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath *java.lang.Class) 2388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 2398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void test_getKeySpecLjava_security_KeyLjava_lang_Class() { 2408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // Test for method java.security.spec.KeySpec 2418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // java.security.KeyFactory.getKeySpec(java.security.Key, 2428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // java.lang.Class) 2438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < keyfactAlgs.length; i++) { 2448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 2458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyFactory fact = KeyFactory.getInstance(keyfactAlgs[i], 2468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath providerName); 2478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyPairGenerator keyGen = KeyPairGenerator 2488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .getInstance(keyfactAlgs[i]); 249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 2508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // We don't use getInstance 2518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath SecureRandom random = new SecureRandom(); 2528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath keyGen.initialize(1024, random); 2538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeepAlive keepalive = createKeepAlive(keyfactAlgs[i]); 2548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyPair keys = keyGen.generateKeyPair(); 2558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (keepalive != null) { 2568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath keepalive.interrupt(); 2578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeySpec privateKeySpec = fact.getKeySpec(keys.getPrivate(), 2598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath getPrivateKeySpecClass(keyfactAlgs[i])); 2608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeySpec publicKeySpec = fact.getKeySpec(keys.getPublic(), 2618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath getPublicKeySpecClass(keyfactAlgs[i])); 2628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath PrivateKey privateKey = fact.generatePrivate(privateKeySpec); 2638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath PublicKey publicKey = fact.generatePublic(publicKeySpec); 2648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath boolean samePublic = Arrays.equals(keys.getPublic() 2658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .getEncoded(), publicKey.getEncoded()); 2668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath boolean samePrivate = Arrays.equals(keys.getPrivate() 2678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .getEncoded(), privateKey.getEncoded()); 2688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath assertTrue( 2698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath "generatePrivate generated different key for algorithm " 2708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath + keyfactAlgs[i], samePrivate); 2718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath assertTrue( 2728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath "generatePublic generated different key for algorithm " 2738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath + keyfactAlgs[i], samePublic); 2748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeySpec encodedSpec = fact.getKeySpec(keys.getPublic(), 2758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath X509EncodedKeySpec.class); 2768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath assertTrue("improper key spec for encoded public key", 2778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath encodedSpec.getClass().equals(X509EncodedKeySpec.class)); 2788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath encodedSpec = fact.getKeySpec(keys.getPrivate(), 2798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath PKCS8EncodedKeySpec.class); 2808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath assertTrue("improper key spec for encoded private key", 2818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath encodedSpec.getClass() 2828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .equals(PKCS8EncodedKeySpec.class)); 2838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchAlgorithmException e) { 2848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find algorithm " + keyfactAlgs[i]); 2858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchProviderException e) { 2868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find provider " + providerName); 2878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (InvalidKeySpecException e) { 2888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("invalid key spec for algorithm " + keyfactAlgs[i]); 2898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 2938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 2948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @tests java.security.KeyFactory#getProvider() 2958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 2968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void test_getProvider() { 2978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // Test for method java.security.Provider 2988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // java.security.KeyFactory.getProvider() 2998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < keyfactAlgs.length; i++) { 3008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 3018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyFactory fact = KeyFactory.getInstance(keyfactAlgs[i]); 3028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Provider p = fact.getProvider(); 3038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath assertNotNull("provider is null for algorithm " 3048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath + keyfactAlgs[i], p); 3058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchAlgorithmException e) { 3068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find algorithm " + keyfactAlgs[i]); 3078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath }// end for 3098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 3118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 3128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @tests java.security.KeyFactory#translateKey(java.security.Key) 3138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 3148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void test_translateKeyLjava_security_Key() { 3158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // Test for method java.security.Key 3168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // java.security.KeyFactory.translateKey(java.security.Key) 3178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < keyfactAlgs.length; i++) { 3188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 3198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyFactory fact = KeyFactory.getInstance(keyfactAlgs[i], 3208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath providerName); 3218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyPairGenerator keyGen = KeyPairGenerator 3228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .getInstance(keyfactAlgs[i]); 323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 3248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // We don't use getInstance 3258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath SecureRandom random = new SecureRandom(); 3268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath keyGen.initialize(1024, random); 3278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeepAlive keepalive = createKeepAlive(keyfactAlgs[i]); 3288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath KeyPair keys = keyGen.generateKeyPair(); 3298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (keepalive != null) { 3308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath keepalive.interrupt(); 3318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fact.translateKey(keys.getPrivate()); 3338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchAlgorithmException e) { 3348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find algorithm " + keyfactAlgs[i]); 3358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (NoSuchProviderException e) { 3368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("getInstance did not find provider " + providerName); 3378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (InvalidKeyException e) { 3388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath fail("generatePublic did not generate right spec for algorithm " 3398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath + keyfactAlgs[i]); 3408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 3448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath protected void setUp() { 3458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (keyfactAlgs == null) { 346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Provider[] providers = Security.getProviders(); 347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // Arbitrarily use the first provider that supports 348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // KeyFactory algorithms 349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (Provider provider : providers) { 350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes providerName = provider.getName(); 351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes keyfactAlgs = getKeyFactoryAlgorithms(providerName); 352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (keyfactAlgs.length != 0) { 353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes break; 354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 3578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 3598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /* 3608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Returns the key algorithms that the given provider supports. 3618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 3628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private String[] getKeyFactoryAlgorithms(String providerName) { 3638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Vector algs = new Vector(); 364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 3658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Provider provider = Security.getProvider(providerName); 3668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (provider == null) 3678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return new String[0]; 3688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Enumeration e = provider.keys(); 3698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath while (e.hasMoreElements()) { 3708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath String algorithm = (String) e.nextElement(); 3718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (algorithm.startsWith(KEYFACTORY_ID) && !algorithm.contains(" ")) { 3728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath algs.addElement(algorithm.substring(KEYFACTORY_ID.length())); 3738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 3768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return (String[]) algs.toArray(new String[algs.size()]); 3778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 3798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 3808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Returns the public key spec class for a given algorithm, or null if it is 3818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * not known. 3828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 3838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private Class getPrivateKeySpecClass(String algName) { 3848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (algName.equals("RSA")) { 3858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return java.security.spec.RSAPrivateCrtKeySpec.class; 3868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (algName.equals("DSA")) { 3888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return java.security.spec.DSAPrivateKeySpec.class; 3898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return null; 3918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 3938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 3948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Returns the private key spec class for a given algorithm, or null if it 3958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * is not known. 3968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 3978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private Class getPublicKeySpecClass(String algName) { 3988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (algName.equals("RSA")) { 3998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return java.security.spec.RSAPublicKeySpec.class; 4008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (algName.equals("DSA")) { 4028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return java.security.spec.DSAPublicKeySpec.class; 4038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return null; 4058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 407