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