1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @author Vera Y. Petrashkova
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.security.tests.java.security;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.KeyStore;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.KeyStoreException;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Provider;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Security;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.SignatureException;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Principal;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.PublicKey;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidKeyException;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchProviderException;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertificateException;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertificateEncodingException;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertificateExpiredException;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertificateNotYetValidException;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.X509Certificate;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Date;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Set;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger;
452f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughesimport javax.crypto.KeyGenerator;
462f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughesimport javax.crypto.SecretKey;
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.tests.support.KeyStoreTestSupport;
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.tests.support.MyLoadStoreParams;
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.tests.support.SpiEngUtils;
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase;
53229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Tests for <code>KeyStore</code> constructor and methods
56f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class KeyStoreTest extends TestCase {
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final String KeyStoreProviderClass = "org.apache.harmony.security.tests.support.MyKeyStore";
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final String defaultType = "KeyStore";
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean KSSupported = false;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String defaultProviderName = null;
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Provider defaultProvider = null;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static String NotSupportMsg = "Default KeyStore type is not supported";
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Provider mProv;
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public KeyStore[] createKS() throws Exception {
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(NotSupportMsg, KSSupported);
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        KeyStore[] kpg = new KeyStore[3];
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        kpg[0] = KeyStore.getInstance(defaultType);
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        kpg[1] = KeyStore.getInstance(defaultType, defaultProvider);
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        kpg[2] = KeyStore.getInstance(defaultType, defaultProviderName);
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return kpg;
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void setUp() throws Exception {
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.setUp();
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mProv = (new SpiEngUtils()).new MyProvider("MyKSProvider",
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                "Testing provider", KeyStoreTestSupport.srvKeyStore.concat(".")
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        .concat(defaultType), KeyStoreProviderClass);
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Security.insertProviderAt(mProv, 2);
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        defaultProvider = SpiEngUtils.isSupport(defaultType,
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                KeyStoreTestSupport.srvKeyStore);
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        KSSupported = (defaultProvider != null);
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        defaultProviderName = (KSSupported ? defaultProvider.getName() : null);
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see TestCase#tearDown()
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void tearDown() throws Exception {
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.tearDown();
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Security.removeProvider(mProv.getName());
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
105f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Test for <code>load(LoadStoreParameter param)</code>
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>store(LoadStoreParameter param)</code>
107f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * methods
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Assertions: throw IllegalArgumentException if param is null;
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testLoadStore02() throws Exception {
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(NotSupportMsg, KSSupported);
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        KeyStore[] kss = createKS();
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotNull("KeyStore objects were not created", kss);
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < kss.length; i++) {
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                kss[i].load(null);
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("IOException or IllegalArgumentException should be thrown for null parameter");
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IllegalArgumentException e) {
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            kss[i].load(null, null);
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                kss[i].store(null);
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("IOException or IllegalArgumentException should be thrown for null parameter");
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IllegalArgumentException e) {
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        KeyStore.LoadStoreParameter lParam = new MyLoadStoreParams(
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                new KeyStore.PasswordProtection(new char[0]));
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < kss.length; i++) {
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            kss[i].load(lParam);
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals("Incorrect result", kss[i].size(), 0);
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            kss[i].store(lParam);
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
140f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
142f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Test for <code>setKeyEntry(String alias, byte[] key, Certificate[] chain)</code>
143f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * method
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Assertion: stores KeyEntry.
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testSetKeyEntry() throws Exception {
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(NotSupportMsg, KSSupported);
148f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        KeyStore[] kss = createKS();
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotNull("KeyStore objects were not created", kss);
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] kk = { (byte) 1, (byte) 2, (byte) 127, (byte) 77 };
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String alias = "keyEntry";
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        char[] pwd = new char[0];
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] res;
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Certificate certs[] = {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                new KeyStoreTestSupport.MCertificate(alias, kk),
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                new KeyStoreTestSupport.MCertificate(alias, kk) };
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < kss.length; i++) {
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            kss[i].load(null, null);
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                kss[i].setKeyEntry("proba", null, null);
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("KeyStoreException must be thrown");
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (KeyStoreException e) {
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            kss[i].setKeyEntry(alias, kk, certs);
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            res = kss[i].getKey(alias, pwd).getEncoded();
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals(kk.length, res.length);
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int j = 0; j < res.length; j++) {
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                assertEquals(res[j], kk[j]);
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals(kss[i].getCertificateChain(alias).length, certs.length);
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            kss[i].setKeyEntry(alias, kk, null);
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            res = kss[i].getKey(alias, pwd).getEncoded();
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals(kk.length, res.length);
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int j = 0; j < res.length; j++) {
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                assertEquals(res[j], kk[j]);
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNull(kss[i].getCertificateChain(alias));
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Test for <code>getDefaultType()</code> method Assertion: returns
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * default security key store type or "jks" string
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testKeyStore01() {
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String propName = "keystore.type";
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String defKSType = Security.getProperty(propName);
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String dType = KeyStore.getDefaultType();
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String resType = defKSType;
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (resType == null) {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            resType = defaultType;
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotNull("Default type have not be null", dType);
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Incorrect default type", dType, resType);
196f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (defKSType == null) {
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Security.setProperty(propName, defaultType);
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            dType = KeyStore.getDefaultType();
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            resType = Security.getProperty(propName);
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNotNull("Incorrect default type", resType);
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNotNull("Default type have not be null", dType);
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals("Incorrect default type", dType, resType);
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
208f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Test for <code>getInstance(String type)</code> method
209f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Assertion:
210f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * throws NullPointerException when type is null
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * throws KeyStoreException when type is not available
212f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testKeyStore02() throws KeyStoreException {
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String[] invalidValues =  SpiEngUtils.invalidValues;
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            KeyStore.getInstance(null);
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("NullPointerException must be thrown when type is null");
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NullPointerException e) {
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < invalidValues.length; i++) {
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                KeyStore.getInstance(invalidValues[i]);
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("KeyStoreException must be thrown (type: ".concat(
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        invalidValues[i]).concat(" )"));
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (KeyStoreException e) {
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @test java.security.KeyStore.PasswordProtection.getPassword()
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testKeyStorePPGetPassword() {
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Regression for HARMONY-1539
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // no exception expected
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNull(new KeyStore.PasswordProtection(null).getPassword());
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        char[] password = new char[] {'a', 'b', 'c'};
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        KeyStore.PasswordProtection pp = new KeyStore.PasswordProtection(password);
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotSame(pp.getPassword(), password);
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertSame(pp.getPassword(), pp.getPassword());
242f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2452f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes
2462f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    /*
247229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.security.KeyStoreSpi.engineEntryInstanceOf(String, Class<? extends Entry>)
2482f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     */
2492f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    public void testEngineEntryInstanceOf() throws Exception {
2502f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        //Regression for HARMONY-615
2512f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes
252f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // create a KeyStore
2532f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
2542f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        keyStore.load(null, "pwd".toCharArray());
2552f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes
256f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // generate a key
2572f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        KeyGenerator keyGen = KeyGenerator.getInstance("DES");
2582f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        keyGen.init(56);
2592f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        SecretKey secretKey = keyGen.generateKey();
2602f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes
261f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // put the key into keystore
2622f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        String alias = "alias";
2632f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        keyStore.setKeyEntry(alias, secretKey, "pwd".toCharArray(), null);
2642f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes
265f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // check if it is a secret key
2662f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        assertTrue(keyStore.entryInstanceOf(alias,
2672f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes                KeyStore.SecretKeyEntry.class));
2682f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes
269f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // check if it is NOT a private key
2702f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        assertFalse(keyStore.entryInstanceOf(alias,
2712f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes                KeyStore.PrivateKeyEntry.class));
2722f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    }
2732f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
275229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.security.KeyStore.TrustedCertificateEntry.toString()
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testKeyStoreTCToString() {
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project           // Regression for HARMONY-1542
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project           // no exception expected
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        class TestX509Certificate extends X509Certificate {
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            private static final long serialVersionUID = 1L;
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public void checkValidity() throws CertificateExpiredException,CertificateNotYetValidException {}
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public void checkValidity(Date p) throws CertificateExpiredException, CertificateNotYetValidException {}
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public int getVersion() {
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return 0;
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public BigInteger getSerialNumber() {
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Principal getIssuerDN() {
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Principal getSubjectDN() {
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Date getNotBefore() {
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Date getNotAfter() {
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public byte[] getTBSCertificate() throws CertificateEncodingException {
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public byte[] getSignature() {
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public String getSigAlgName() {
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public String getSigAlgOID() {
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public byte[] getSigAlgParams() {
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public boolean[] getIssuerUniqueID() {
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public boolean[] getSubjectUniqueID() {
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public boolean[] getKeyUsage() {
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public int getBasicConstraints() {
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return 0;
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public byte[] getEncoded() throws CertificateEncodingException {
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public void verify(PublicKey p)
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throws CertificateException,
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    NoSuchAlgorithmException,
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    InvalidKeyException,
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    NoSuchProviderException,
337f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                    SignatureException
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            {}
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public void verify(PublicKey p0, String p1)
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throws CertificateException,
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    NoSuchAlgorithmException,
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    InvalidKeyException,
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    NoSuchProviderException,
344f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                    SignatureException
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            {}
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public String toString() {
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public PublicKey getPublicKey() {
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public boolean hasUnsupportedCriticalExtension() {
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return false;
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Set getCriticalExtensionOIDs() {
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Set getNonCriticalExtensionOIDs() {
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public byte[] getExtensionValue(String p) {
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return null;
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotNull(new KeyStore.TrustedCertificateEntry(new TestX509Certificate()).toString());
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
368