1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.security.tests.java.security;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetClass;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestLevel;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetNew;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.InvalidKeyException;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Key;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.KeyFactory;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.KeyFactorySpi;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.KeyPair;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.KeyPairGenerator;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.NoSuchAlgorithmException;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.NoSuchProviderException;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.PrivateKey;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Provider;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.PublicKey;
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.SecureRandom;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Security;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.InvalidKeySpecException;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.KeySpec;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.PKCS8EncodedKeySpec;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.X509EncodedKeySpec;
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Enumeration;
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Vector;
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@TestTargetClass(KeyFactory.class)
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class KeyFactory2Test extends junit.framework.TestCase {
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final String KEYFACTORY_ID = "KeyFactory.";
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private String[] keyfactAlgs = null;
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private String providerName = null;
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class KeepAlive extends Thread {
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int sleepTime, iterations;
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public KeepAlive(int sleepTime, int iterations) {
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.sleepTime = sleepTime;
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.iterations = iterations;
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void run() {
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (this) {
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                this.notify();
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < iterations; i++) {
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Thread.sleep(sleepTime);
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (InterruptedException e) {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private KeepAlive createKeepAlive(String alg) {
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (alg.equals("RSA")) {
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // 32 minutes
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeepAlive keepalive = new KeepAlive(240000, 8);
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (keepalive) {
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                keepalive.start();
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    keepalive.wait();
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (InterruptedException e) {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // ignore
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return keepalive;
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.KeyFactory#KeyFactory(java.security.KeyFactorySpi,
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        java.security.Provider, java.lang.String)
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "KeyFactory",
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.security.KeyFactorySpi.class, java.security.Provider.class, java.lang.String.class}
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_constructor() {
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        KeyFactorySpi kfs = new KeyFactorySpiStub();
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new KeyFactoryStub(null, null, null);
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Unexpected exception " + e.getMessage());
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Provider[] providers = Security.getProviders("KeyFactory.DSA");
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (providers != null) {
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < providers.length; i++) {
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyFactoryStub kf = new KeyFactoryStub(kfs, providers[i],
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "algorithm name");
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals("algorithm name", kf.getAlgorithm());
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals(providers[i], kf.getProvider());
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No providers support KeyFactory.DSA");
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.KeyFactory#generatePrivate(java.security.spec.KeySpec)
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "generatePrivate",
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.security.spec.KeySpec.class}
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_generatePrivateLjava_security_spec_KeySpec() {
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Test for method java.security.PrivateKey
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.security.KeyFactory.generatePrivate(java.security.spec.KeySpec)
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < keyfactAlgs.length; i++) {
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyFactory fact = KeyFactory.getInstance(keyfactAlgs[i],
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        providerName);
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyPairGenerator keyGen = KeyPairGenerator
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getInstance(keyfactAlgs[i]);
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                SecureRandom random = new SecureRandom(); // We don't use
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // getInstance
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                keyGen.initialize(1024, random);
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeepAlive keepalive = createKeepAlive(keyfactAlgs[i]);
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyPair keys = keyGen.generateKeyPair();
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (keepalive != null) {
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    keepalive.interrupt();
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeySpec privateKeySpec = fact.getKeySpec(keys.getPrivate(),
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        getPrivateKeySpecClass(keyfactAlgs[i]));
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                PrivateKey privateKey = fact.generatePrivate(privateKeySpec);
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                boolean samePrivate = Arrays.equals(keys.getPrivate()
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getEncoded(), privateKey.getEncoded());
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue(
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "generatePrivate generated different key for algorithm "
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                + keyfactAlgs[i], samePrivate);
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fact.generatePrivate(new PKCS8EncodedKeySpec(keys.getPrivate()
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getEncoded()));
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InvalidKeySpecException e) {
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("invalid key spec for algorithm " + keyfactAlgs[i]);
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchAlgorithmException e) {
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("getInstance did not find algorithm " + keyfactAlgs[i]);
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchProviderException e) {
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("getInstance did not find provider " + providerName);
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.KeyFactory#generatePublic(java.security.spec.KeySpec)
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL,
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "InvalidKeySpecException checking missed",
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "generatePublic",
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.security.spec.KeySpec.class}
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_generatePublicLjava_security_spec_KeySpec() {
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Test for method java.security.PublicKey
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.security.KeyFactory.generatePublic(java.security.spec.KeySpec)
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < keyfactAlgs.length; i++) {
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyFactory fact = KeyFactory.getInstance(keyfactAlgs[i],
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        providerName);
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyPairGenerator keyGen = KeyPairGenerator
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getInstance(keyfactAlgs[i]);
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // We don't use getInstance
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                SecureRandom random = new SecureRandom();
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                keyGen.initialize(1024, random);
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeepAlive keepalive = createKeepAlive(keyfactAlgs[i]);
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyPair keys = keyGen.generateKeyPair();
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (keepalive != null) {
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    keepalive.interrupt();
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeySpec publicKeySpec = fact.getKeySpec(keys.getPublic(),
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        getPublicKeySpecClass(keyfactAlgs[i]));
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                PublicKey publicKey = fact.generatePublic(publicKeySpec);
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                boolean samePublic = Arrays.equals(keys.getPublic()
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getEncoded(), publicKey.getEncoded());
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue(
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "generatePublic generated different key for algorithm "
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                + keyfactAlgs[i], samePublic);
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchAlgorithmException e) {
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("getInstance did not find algorithm " + keyfactAlgs[i]);
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchProviderException e) {
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("getInstance did not find provider " + providerName);
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InvalidKeySpecException e) {
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("invalid key spec for algorithm " + keyfactAlgs[i]);
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.KeyFactory#getAlgorithm()
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getAlgorithm",
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getAlgorithm() {
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Test for method java.lang.String
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.security.KeyFactory.getAlgorithm()
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < keyfactAlgs.length; i++) {
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyFactory fact = KeyFactory.getInstance(keyfactAlgs[i],
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        providerName);
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue("getAlgorithm ok for algorithm " + keyfactAlgs[i],
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        fact.getAlgorithm().equals(keyfactAlgs[i]));
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchAlgorithmException e) {
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("getInstance did not find algorithm " + keyfactAlgs[i]);
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchProviderException e) {
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("getInstance did not find provider " + providerName);
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }// end for
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.KeyFactory#getInstance(java.lang.String)
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL,
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "NoSuchAlgorithmException checking missed",
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getInstance",
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class}
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getInstanceLjava_lang_String() {
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Test for method java.security.KeyFactory
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.security.KeyFactory.getInstance(java.lang.String)
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < keyfactAlgs.length; i++) {
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertNotNull(KeyFactory.getInstance(keyfactAlgs[i]));
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchAlgorithmException e) {
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("getInstance did not find algorithm " + keyfactAlgs[i]);
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }// end for
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.KeyFactory#getInstance(java.lang.String,
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        java.lang.String)
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL,
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "NoSuchAlgorithmException, NoSuchProviderException checking missed",
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getInstance",
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class, java.lang.String.class}
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getInstanceLjava_lang_StringLjava_lang_String() {
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Test1: Test for method java.security.KeyFactory
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.security.KeyFactory.getInstance(java.lang.String,
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.lang.String)
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Provider[] providers = Security.getProviders("KeyFactory.DSA");
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (providers != null) {
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (int i = 0; i < providers.length; i++) {
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    KeyFactory.getInstance("DSA", providers[i].getName());
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }// end for
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("No providers support KeyFactory.DSA");
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("getInstance did not find algorithm");
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchProviderException e) {
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("getInstance did not find the provider");
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Test2: Test with null provider name
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeyFactory.getInstance("DSA", (String) null);
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Expected IllegalArgumentException");
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalArgumentException e) {
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Expected
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Expected IllegalArgumentException, got " + e);
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.KeyFactory#getInstance(java.lang.String, Provider)
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL,
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "NoSuchAlgorithmException checking missed",
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getInstance",
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class, java.security.Provider.class}
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getInstanceLjava_lang_StringLjava_security_Provider() {
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Test1: Test for method java.security.KeyFactory
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.security.KeyFactory.getInstance(java.lang.String,
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.security.Provider)
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Provider[] providers = Security.getProviders("KeyFactory.DSA");
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (providers != null) {
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (int i = 0; i < providers.length; i++) {
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    KeyFactory.getInstance("DSA", providers[i]);
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }// end for
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("No providers support KeyFactory.DSA");
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("getInstance did not find algorithm");
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("unexpected exception " + e.getMessage());
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Test2: Test with null provider name
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeyFactory.getInstance("DSA", (Provider) null);
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Expected IllegalArgumentException");
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalArgumentException e) {
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Expected
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Expected IllegalArgumentException, got " + e);
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.KeyFactory#getKeySpec(java.security.Key,
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        java.lang.Class)
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL,
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "InvalidKeySpecException checking missed",
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getKeySpec",
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.security.Key.class, java.lang.Class.class}
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getKeySpecLjava_security_KeyLjava_lang_Class() {
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Test for method java.security.spec.KeySpec
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.security.KeyFactory.getKeySpec(java.security.Key,
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.lang.Class)
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < keyfactAlgs.length; i++) {
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyFactory fact = KeyFactory.getInstance(keyfactAlgs[i],
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        providerName);
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyPairGenerator keyGen = KeyPairGenerator
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getInstance(keyfactAlgs[i]);
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // We don't use getInstance
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                SecureRandom random = new SecureRandom();
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                keyGen.initialize(1024, random);
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeepAlive keepalive = createKeepAlive(keyfactAlgs[i]);
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyPair keys = keyGen.generateKeyPair();
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (keepalive != null) {
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    keepalive.interrupt();
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeySpec privateKeySpec = fact.getKeySpec(keys.getPrivate(),
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        getPrivateKeySpecClass(keyfactAlgs[i]));
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeySpec publicKeySpec = fact.getKeySpec(keys.getPublic(),
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        getPublicKeySpecClass(keyfactAlgs[i]));
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                PrivateKey privateKey = fact.generatePrivate(privateKeySpec);
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                PublicKey publicKey = fact.generatePublic(publicKeySpec);
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                boolean samePublic = Arrays.equals(keys.getPublic()
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getEncoded(), publicKey.getEncoded());
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                boolean samePrivate = Arrays.equals(keys.getPrivate()
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getEncoded(), privateKey.getEncoded());
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue(
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "generatePrivate generated different key for algorithm "
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                + keyfactAlgs[i], samePrivate);
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue(
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "generatePublic generated different key for algorithm "
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                + keyfactAlgs[i], samePublic);
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeySpec encodedSpec = fact.getKeySpec(keys.getPublic(),
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        X509EncodedKeySpec.class);
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue("improper key spec for encoded public key",
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        encodedSpec.getClass().equals(X509EncodedKeySpec.class));
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                encodedSpec = fact.getKeySpec(keys.getPrivate(),
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        PKCS8EncodedKeySpec.class);
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue("improper key spec for encoded private key",
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        encodedSpec.getClass()
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                .equals(PKCS8EncodedKeySpec.class));
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchAlgorithmException e) {
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("getInstance did not find algorithm " + keyfactAlgs[i]);
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchProviderException e) {
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("getInstance did not find provider " + providerName);
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InvalidKeySpecException e) {
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("invalid key spec for algorithm " + keyfactAlgs[i]);
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.KeyFactory#getProvider()
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getProvider",
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getProvider() {
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Test for method java.security.Provider
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.security.KeyFactory.getProvider()
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < keyfactAlgs.length; i++) {
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyFactory fact = KeyFactory.getInstance(keyfactAlgs[i]);
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Provider p = fact.getProvider();
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertNotNull("provider is null for algorithm "
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        + keyfactAlgs[i], p);
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchAlgorithmException e) {
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("getInstance did not find algorithm " + keyfactAlgs[i]);
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }// end for
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests java.security.KeyFactory#translateKey(java.security.Key)
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL,
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "InvalidKeyException checking missed",
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "translateKey",
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.security.Key.class}
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_translateKeyLjava_security_Key() {
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Test for method java.security.Key
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // java.security.KeyFactory.translateKey(java.security.Key)
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < keyfactAlgs.length; i++) {
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyFactory fact = KeyFactory.getInstance(keyfactAlgs[i],
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        providerName);
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyPairGenerator keyGen = KeyPairGenerator
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getInstance(keyfactAlgs[i]);
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // We don't use getInstance
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                SecureRandom random = new SecureRandom();
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                keyGen.initialize(1024, random);
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeepAlive keepalive = createKeepAlive(keyfactAlgs[i]);
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyPair keys = keyGen.generateKeyPair();
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (keepalive != null) {
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    keepalive.interrupt();
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fact.translateKey(keys.getPrivate());
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchAlgorithmException e) {
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("getInstance did not find algorithm " + keyfactAlgs[i]);
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchProviderException e) {
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("getInstance did not find provider " + providerName);
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InvalidKeyException e) {
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("generatePublic did not generate right spec for algorithm "
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        + keyfactAlgs[i]);
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void setUp() {
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (keyfactAlgs == null) {
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Provider[] providers = Security.getProviders();
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Arbitrarily use the first provider that supports
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // KeyFactory algorithms
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (Provider provider : providers) {
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                providerName = provider.getName();
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                keyfactAlgs = getKeyFactoryAlgorithms(providerName);
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (keyfactAlgs.length != 0) {
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    break;
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the key algorithms that the given provider supports.
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private String[] getKeyFactoryAlgorithms(String providerName) {
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Vector<String> algs = new Vector<String>();
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Provider provider = Security.getProvider(providerName);
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (provider == null)
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new String[0];
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Enumeration<Object> e = provider.keys();
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (e.hasMoreElements()) {
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String algorithm = (String) e.nextElement();
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (algorithm.startsWith(KEYFACTORY_ID) && !algorithm.contains(" ")) {
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                algs.addElement(algorithm.substring(KEYFACTORY_ID.length()));
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return algs.toArray(new String[algs.size()]);
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the public key spec class for a given algorithm, or null if it is
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * not known.
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private Class<? extends KeySpec> getPrivateKeySpecClass(String algName) {
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (algName.equals("RSA")) {
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return java.security.spec.RSAPrivateCrtKeySpec.class;
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (algName.equals("DSA")) {
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return java.security.spec.DSAPrivateKeySpec.class;
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the private key spec class for a given algorithm, or null if it
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is not known.
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private Class<? extends KeySpec> getPublicKeySpecClass(String algName) {
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (algName.equals("RSA")) {
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return java.security.spec.RSAPublicKeySpec.class;
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (algName.equals("DSA")) {
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return java.security.spec.DSAPublicKeySpec.class;
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public class KeyFactoryStub extends KeyFactory {
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public KeyFactoryStub(KeyFactorySpi keyFacSpi, Provider provider,
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                String algorithm) {
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(keyFacSpi, provider, algorithm);
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public class KeyFactorySpiStub extends KeyFactorySpi {
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public KeyFactorySpiStub() {
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super();
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public PrivateKey engineGeneratePrivate(KeySpec keySpec) {
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public PublicKey engineGeneratePublic(KeySpec keySpec) {
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public <T extends KeySpec> T engineGetKeySpec(Key key, Class<T> keySpec) {
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Key engineTranslateKey(Key key) {
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
564