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