1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.security.tests.java.security;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestLevel;
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetClass;
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetNew;
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.framework.TestCase;
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.Constructor;
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.InvocationTargetException;
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.InvalidKeyException;
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Key;
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.KeyFactory;
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.KeyFactorySpi;
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.NoSuchAlgorithmException;
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.NoSuchProviderException;
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.PrivateKey;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Provider;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.PublicKey;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Security;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.DSAPublicKeySpec;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.InvalidKeySpecException;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.KeySpec;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@TestTargetClass(KeyFactory.class)
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class KeyFactoryTest extends TestCase {
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Provider provider;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    boolean exceptionThrown;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Provider existingProvider;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void setUp() throws Exception {
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.setUp();
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        exceptionThrown = false;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Provider[] providers = Security.getProviders();
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (providers.length == 0) {
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("no providers found");
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        existingProvider = providers[0];
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        provider = new TestKeyFactoryProvider();
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Security.addProvider(provider);
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void tearDown() throws Exception {
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.tearDown();
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Security.removeProvider(provider.getName());
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level=TestLevel.COMPLETE,
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method="getInstance",
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args={String.class}
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testGetInstanceString() {
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeyFactory factory = KeyFactory.getInstance(TEST_KEYFACTORY_NAME);
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertNotNull(factory);
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("unexpected exception: " + e);
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String[] parameters = {
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "UnknownKeyFactory",
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                null
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class[] exceptions = {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                NoSuchAlgorithmException.class,
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                NullPointerException.class
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < parameters.length; i++) {
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String algorithm = parameters[i];
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            exceptionThrown = false;
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String message = "getInstance(" + (algorithm == null ? "null" : "\"" + algorithm + "\"") + ")";
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyFactory.getInstance(algorithm);
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (Exception e) {
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkException(message, e, exceptions[i]);
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } finally {
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkException(message, null, exceptions[i]);
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level=TestLevel.COMPLETE,
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method="getInstance",
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args={String.class, String.class}
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testGetInstanceStringString() {
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeyFactory factory = KeyFactory.getInstance(TEST_KEYFACTORY_NAME, TEST_PROVIDER_NAME);
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertNotNull(factory);
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("unexpected exception: " + e);
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchProviderException e) {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("unexpected exception: " + e);
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String[][] combinations = {
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                { "UnknownKeyFactory", TEST_PROVIDER_NAME},
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                { TEST_KEYFACTORY_NAME, "UnknownProvider"},
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                { TEST_KEYFACTORY_NAME, existingProvider.getName() },
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                { null, TEST_PROVIDER_NAME },
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                { TEST_KEYFACTORY_NAME, null },
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                { null, null}
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class[] exceptions = {
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                NoSuchAlgorithmException.class,
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                NoSuchProviderException.class,
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                NoSuchAlgorithmException.class,
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                NullPointerException.class,
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                IllegalArgumentException.class,
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                IllegalArgumentException.class
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < combinations.length; i++) {
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String[] combination = combinations[i];
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String message = "getInstance(\"" + combination[0] + "\", \"" + combination[1] + "\")";
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            exceptionThrown = false;
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyFactory.getInstance(combination[0], combination[1]);
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (Exception e) {
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkException(message, e, exceptions[i]);
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } finally {
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkException(message, null, exceptions[i]);
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level=TestLevel.COMPLETE,
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method="getInstance",
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args={String.class, Provider.class}
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testGetInstanceStringProvider() {
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeyFactory factory = KeyFactory.getInstance(TEST_KEYFACTORY_NAME, provider);
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertNotNull(factory);
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("unexpected exception: " + e);
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String[] algorithms = {
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "UnknownKeyFactory",
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                null,
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TEST_KEYFACTORY_NAME,
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TEST_KEYFACTORY_NAME
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Provider[] providers = {
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                provider,
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                provider,
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                existingProvider,
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                null
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class[] exceptions = {
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                NoSuchAlgorithmException.class,
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                NullPointerException.class,
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                NoSuchAlgorithmException.class,
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                IllegalArgumentException.class
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < algorithms.length; i++) {
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String algorithm = algorithms[i];
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Provider provider = providers[i];
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String message = "getInstance(" +
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                (algorithm == null ? "null" : "\"" + algorithm + "\"") +
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ", " +
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                (provider == null ? "null" : "provider");
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            exceptionThrown = false;
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                KeyFactory.getInstance(algorithm, provider);
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (Exception e) {
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkException(message, e, exceptions[i]);
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } finally {
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkException(message, null, exceptions[i]);
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level=TestLevel.COMPLETE,
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method="generatePublic",
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args={KeySpec.class}
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testGeneratePublic() {
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        KeyFactory factory = null;
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            factory = KeyFactory.getInstance(TEST_KEYFACTORY_NAME);
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("unexpected exception: " + e);
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(factory);
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TestPublicKey key = new TestPublicKey();
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TestPublicKeySpec keySpec = new TestPublicKeySpec(key);
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            PublicKey publicKey = factory.generatePublic(keySpec);
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertNotNull(publicKey);
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertTrue(Arrays.equals(key.encoded, publicKey.getEncoded()));
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidKeySpecException e) {
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("unexpected exception: " + e);
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        KeySpec[] keySpecs = {
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new TestPrivateKeySpec(new TestPrivateKey()),
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                null,
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new DSAPublicKeySpec(null, null, null, null)
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class[] exceptions = {
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                InvalidKeySpecException.class,
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                NullPointerException.class,
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                InvalidKeySpecException.class
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < keySpecs.length; i++) {
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeySpec keySpec = keySpecs[i];
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String message = "generatePublic(" +
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                (keySpec == null ? "null" : keySpec.toString()) + ")";
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                PublicKey generatePublic = factory.generatePublic(keySpec);
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertNotNull(generatePublic);
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (Exception e) {
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkException(message, e, exceptions[i]);
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } finally {
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkException(message, null, exceptions[i]);
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level=TestLevel.COMPLETE,
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method="generatePrivate",
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args={KeySpec.class}
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testGeneratePrivate() {
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        KeyFactory factory = null;
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            factory = KeyFactory.getInstance(TEST_KEYFACTORY_NAME);
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("unexpected exception: " + e);
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(factory);
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TestPrivateKey key = new TestPrivateKey();
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TestPrivateKeySpec keySpec = new TestPrivateKeySpec(key);
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            PrivateKey privateKey = factory.generatePrivate(keySpec);
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertNotNull(privateKey);
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertTrue(Arrays.equals(key.getEncoded(), privateKey.getEncoded()));
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidKeySpecException e) {
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("unexpected exception: " + e);
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        KeySpec[] keySpecs = {
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new TestPublicKeySpec(new TestPublicKey()),
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                null,
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new DSAPublicKeySpec(null, null, null, null)
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class[] exceptions = {
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                InvalidKeySpecException.class,
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                NullPointerException.class,
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                InvalidKeySpecException.class
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < keySpecs.length; i++) {
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeySpec keySpec = keySpecs[i];
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            exceptionThrown = false;
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String message = "generatePrivate(" +
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                (keySpec == null ? "null" : keySpec.toString()) + ")";
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                factory.generatePrivate(keySpec);
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (Exception e) {
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkException(message, e, exceptions[i]);
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } finally {
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkException(message, null, exceptions[i]);
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level=TestLevel.COMPLETE,
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method="getKeySpec",
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args={Key.class, Class.class}
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testGetKeySpec() {
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        KeyFactory factory = null;
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            factory = KeyFactory.getInstance(TEST_KEYFACTORY_NAME);
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("unexpected exception: " + e);
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(factory);
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Key[] keys = {
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    new TestPrivateKey(),
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    new TestPublicKey(),
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    new TestPrivateKey(new byte[] { 42, 41, 40 }),
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    new TestPublicKey(new byte[] { 40, 41, 42 })
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class[] keySpecs = {
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    TestPrivateKeySpec.class,
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    TestPublicKeySpec.class,
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    TestPrivateKeySpec.class,
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    TestPublicKeySpec.class,
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < keys.length; i++) {
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Key key = keys[i];
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Class keySpec = keySpecs[i];
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                String message = "getKeySpec(" + key.toString() + ", " + keySpec.toString() + ")";
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    KeySpec spec = factory.getKeySpec(key, keySpec);
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    assertNotNull(spec);
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    assertTrue(spec.getClass() == keySpec);
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (InvalidKeySpecException e) {
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    fail("unexpected exception: " + e);
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Key[] keys = {
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    new AnotherKey(),
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    null,
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    new TestPrivateKey(),
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    null,
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class[] keySpecs = {
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    KeySpec.class,
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    TestPrivateKeySpec.class,
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    null,
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    null,
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class[] exceptions = {
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    InvalidKeySpecException.class,
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    NullPointerException.class,
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    InvalidKeySpecException.class,
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    NullPointerException.class
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < keys.length; i++) {
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Key key = keys[i];
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Class keySpec = keySpecs[i];
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                exceptionThrown = false;
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                String message = "getKeySpec(" +
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    (key == null ? "null" : key.toString()) +
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    ", " +
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    (keySpec == null ? "null" : keySpec.toString()) + ")";
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    factory.getKeySpec(key, keySpec);
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (Exception e) {
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    checkException(message, e, exceptions[i]);
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } finally {
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    checkException(message, null, exceptions[i]);
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level=TestLevel.COMPLETE,
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method="translateKey",
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args={Key.class}
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testTranslateKey() {
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        KeyFactory factory = null;
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            factory = KeyFactory.getInstance(TEST_KEYFACTORY_NAME);
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("unexpected exception: " + e);
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(factory);
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Key[] keys = {
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    new TestPrivateKey(),
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    new TestPublicKey()
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class[] translated = {
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    TestPublicKey.class,
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    TestPrivateKey.class
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < keys.length; i++) {
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Key key = keys[i];
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Class translate = translated[i];
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Key translateKey = factory.translateKey(key);
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    assertNotNull(translateKey);
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    assertEquals(translate, translateKey.getClass());
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (InvalidKeyException e) {
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    fail("unexpected exception: " + e);
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Key[] keys = {
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    new AnotherKey(),
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    null
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class[] exceptions = {
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    InvalidKeyException.class,
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    NullPointerException.class
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < keys.length; i++) {
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Key key = keys[i];
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                String message = "translateKey(" +
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    (key == null ? "null" : key.toString()) + ")";
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                exceptionThrown = false;
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    factory.translateKey(key);
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (Exception e) {
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    checkException(message, e, exceptions[i]);
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } finally {
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    checkException(message, null, exceptions[i]);
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final String TEST_PROVIDER_NAME = "TestKeyFactoryProvider";
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final String TEST_KEYFACTORY_NAME = "TestKeyFactory";
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class TestKeyFactoryProvider extends Provider {
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected TestKeyFactoryProvider() {
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(TEST_PROVIDER_NAME, 1.1, "Test KeyFactory Provider");
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            put("KeyFactory." + TEST_KEYFACTORY_NAME, TestKeyFactorySpi.class.getName());
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static class TestKeyFactorySpi extends KeyFactorySpi {
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected PrivateKey engineGeneratePrivate(KeySpec keySpec)
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throws InvalidKeySpecException {
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (TestPrivateKeySpec.class == keySpec.getClass()) {
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new TestPrivateKey(((TestPrivateKeySpec)keySpec).encoded);
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new InvalidKeySpecException();
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected PublicKey engineGeneratePublic(KeySpec keySpec)
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throws InvalidKeySpecException {
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (TestPublicKeySpec.class == keySpec.getClass()) {
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new TestPublicKey(((TestPublicKeySpec)keySpec).encoded);
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new InvalidKeySpecException();
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected <T extends KeySpec> T engineGetKeySpec(Key key,
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Class<T> keySpec) throws InvalidKeySpecException {
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (key == null) {
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new NullPointerException();
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Constructor<T> constructor = null;
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (TestPrivateKeySpec.class == keySpec) {
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    constructor = keySpec.getConstructor(TestPrivateKey.class);
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (SecurityException e) {
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new InvalidKeySpecException(e);
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (NoSuchMethodException e) {
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new InvalidKeySpecException(e);
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (TestPublicKeySpec.class == keySpec) {
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    constructor = keySpec.getConstructor(TestPublicKey.class);
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (SecurityException e) {
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new InvalidKeySpecException(e);
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (NoSuchMethodException e) {
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new InvalidKeySpecException(e);
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (constructor == null) {
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new InvalidKeySpecException();
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return constructor.newInstance(key);
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException e) {
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new InvalidKeySpecException(e);
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InstantiationException e) {
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new InvalidKeySpecException(e);
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalAccessException e) {
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new InvalidKeySpecException(e);
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InvocationTargetException e) {
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new InvalidKeySpecException(e);
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected Key engineTranslateKey(Key key) throws InvalidKeyException {
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (TestPrivateKey.class == key.getClass()) {
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new TestPublicKey();
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (TestPublicKey.class == key.getClass()) {
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new TestPrivateKey();
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new InvalidKeyException();
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class TestPrivateKeySpec implements KeySpec {
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @SuppressWarnings("unused")
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final byte[] encoded;
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public TestPrivateKeySpec(TestPrivateKey key) {
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.encoded = key.getEncoded();
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class TestPublicKeySpec implements KeySpec {
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @SuppressWarnings("unused")
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final byte[] encoded;
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public TestPublicKeySpec(TestPublicKey key) {
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.encoded = key.getEncoded();
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class TestPrivateKey implements PrivateKey {
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final byte[] encoded;
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public TestPrivateKey() {
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            encoded = new byte[] {3, 4, 5};
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public TestPrivateKey(byte[] encoded) {
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.encoded = encoded;
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String getAlgorithm() {
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "TestPrivateKey";
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public byte[] getEncoded() {
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return encoded;
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String getFormat() {
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "TestFormat";
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class TestPublicKey implements PublicKey {
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final byte[] encoded;
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public TestPublicKey() {
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            encoded = new byte[] {3, 4, 5};
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public TestPublicKey(byte[] encoded) {
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.encoded = encoded;
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String getAlgorithm() {
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "TestPublicKey";
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public byte[] getEncoded() {
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return encoded;
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String getFormat() {
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "TestFormat";
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class AnotherKey implements Key {
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String getAlgorithm() {
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "AnotherKey";
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public byte[] getEncoded() {
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String getFormat() {
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "AnotherFormat";
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void checkException(String message, Exception thrown, Class<? extends Exception> expected) {
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (thrown == null) {
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!exceptionThrown) {
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail(message + ", expected " + expected.getName());
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (expected == thrown.getClass()) {
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            exceptionThrown = true;
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // ok
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            exceptionThrown = true;
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(message + ", unexpected exception: " + thrown + ", expected: " + expected.getName());
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
645