1db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root/*
2db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root * Copyright (C) 2012 The Android Open Source Project
3db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root *
4db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root * you may not use this file except in compliance with the License.
6db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root * You may obtain a copy of the License at
7db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root *
8db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root *
10db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root * Unless required by applicable law or agreed to in writing, software
11db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root * See the License for the specific language governing permissions and
14db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root * limitations under the License.
15db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root */
16db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
17db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootpackage android.security;
18db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
19db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport android.test.AndroidTestCase;
20db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
21db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport java.io.ByteArrayInputStream;
22db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport java.math.BigInteger;
23db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport java.security.KeyPair;
24db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport java.security.PrivateKey;
25db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport java.security.PublicKey;
26db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport java.security.SecureRandom;
27db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport java.security.cert.Certificate;
28db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport java.security.cert.CertificateFactory;
29db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport java.security.cert.X509Certificate;
30a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Rootimport java.security.interfaces.DSAParams;
31a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Rootimport java.security.interfaces.DSAPublicKey;
32a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Rootimport java.security.interfaces.ECPublicKey;
33a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Rootimport java.security.interfaces.RSAPublicKey;
34a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Rootimport java.security.spec.AlgorithmParameterSpec;
35a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Rootimport java.security.spec.DSAParameterSpec;
36a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Rootimport java.security.spec.RSAKeyGenParameterSpec;
372eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Rootimport java.text.SimpleDateFormat;
38db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport java.util.Date;
39db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
40db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport javax.security.auth.x500.X500Principal;
41db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
42db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootpublic class AndroidKeyPairGeneratorTest extends AndroidTestCase {
43db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private android.security.KeyStore mAndroidKeyStore;
44db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
45db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private java.security.KeyPairGenerator mGenerator;
46db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
47db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final String TEST_ALIAS_1 = "test1";
48db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
49db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final String TEST_ALIAS_2 = "test2";
50db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
51db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final X500Principal TEST_DN_1 = new X500Principal("CN=test1");
52db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
53db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final X500Principal TEST_DN_2 = new X500Principal("CN=test2");
54db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
55db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final BigInteger TEST_SERIAL_1 = BigInteger.ONE;
56db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
57db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final BigInteger TEST_SERIAL_2 = BigInteger.valueOf(2L);
58db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
59db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final long NOW_MILLIS = System.currentTimeMillis();
60db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
61db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    /* We have to round this off because X509v3 doesn't store milliseconds. */
62db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final Date NOW = new Date(NOW_MILLIS - (NOW_MILLIS % 1000L));
63db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
64db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    @SuppressWarnings("deprecation")
65db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final Date NOW_PLUS_10_YEARS = new Date(NOW.getYear() + 10, 0, 1);
66db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
67db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    @Override
68db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    protected void setUp() throws Exception {
69db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        mAndroidKeyStore = android.security.KeyStore.getInstance();
70db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
71db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertTrue(mAndroidKeyStore.reset());
72db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
73b9594ce9ebb3f5f303a280f04312ae5754ce3560Kenny Root        assertFalse(mAndroidKeyStore.isUnlocked());
74db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
751c219f619291ba818bc2542390a2988539d94ed0Kenny Root        mGenerator = java.security.KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
762eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
772eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
782eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    private void setupPassword() {
79db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertTrue(mAndroidKeyStore.password("1111"));
80b9594ce9ebb3f5f303a280f04312ae5754ce3560Kenny Root        assertTrue(mAndroidKeyStore.isUnlocked());
81db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
8278ad849163a7b01073b46fbd7d818392720005d1Kenny Root        String[] aliases = mAndroidKeyStore.saw("");
8378ad849163a7b01073b46fbd7d818392720005d1Kenny Root        assertNotNull(aliases);
8478ad849163a7b01073b46fbd7d818392720005d1Kenny Root        assertEquals(0, aliases.length);
85db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
86db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
872eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyPairGenerator_Initialize_Params_Encrypted_Success() throws Exception {
882eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
892eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
901c219f619291ba818bc2542390a2988539d94ed0Kenny Root        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
912eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setAlias(TEST_ALIAS_1)
922eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setSubject(TEST_DN_1)
932eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setSerialNumber(TEST_SERIAL_1)
942eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setStartDate(NOW)
952eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setEndDate(NOW_PLUS_10_YEARS)
962eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setEncryptionRequired()
972eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .build());
98db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
99db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
1002eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyPairGenerator_Initialize_KeySize_Encrypted_Failure() throws Exception {
1012eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1022eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
103db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
104db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            mGenerator.initialize(1024);
105db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("KeyPairGenerator should not support setting the key size");
106db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
107db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
108db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
109db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
1102eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyPairGenerator_Initialize_KeySizeAndSecureRandom_Encrypted_Failure()
1112eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            throws Exception {
1122eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1132eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
114db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
115db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            mGenerator.initialize(1024, new SecureRandom());
116db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("KeyPairGenerator should not support setting the key size");
117db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
118db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
119db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
120db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
1212eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyPairGenerator_Initialize_ParamsAndSecureRandom_Encrypted_Failure()
1222eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            throws Exception {
1232eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1242eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1252eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        mGenerator.initialize(
1261c219f619291ba818bc2542390a2988539d94ed0Kenny Root                new KeyPairGeneratorSpec.Builder(getContext())
1272eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                        .setAlias(TEST_ALIAS_1)
128a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                        .setKeyType("RSA")
129a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                        .setKeySize(1024)
1302eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                        .setSubject(TEST_DN_1)
1312eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                        .setSerialNumber(TEST_SERIAL_1)
1322eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                        .setStartDate(NOW)
1332eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                        .setEndDate(NOW_PLUS_10_YEARS)
1342eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                        .setEncryptionRequired()
1352eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                        .build(),
1362eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                new SecureRandom());
137db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
138db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
1392eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyPairGenerator_GenerateKeyPair_Encrypted_Success() throws Exception {
1402eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1412eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1421c219f619291ba818bc2542390a2988539d94ed0Kenny Root        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
1432eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setAlias(TEST_ALIAS_1)
1442eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setSubject(TEST_DN_1)
1452eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setSerialNumber(TEST_SERIAL_1)
1462eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setStartDate(NOW)
1472eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setEndDate(NOW_PLUS_10_YEARS)
1482eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setEncryptionRequired()
1492eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .build());
1502eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1512eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        final KeyPair pair = mGenerator.generateKeyPair();
1522eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertNotNull("The KeyPair returned should not be null", pair);
1532eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
154a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
155a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                NOW_PLUS_10_YEARS);
1562eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
1572eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
158a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    public void testKeyPairGenerator_GenerateKeyPair_DSA_Unencrypted_Success() throws Exception {
1591c219f619291ba818bc2542390a2988539d94ed0Kenny Root        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
1602eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setAlias(TEST_ALIAS_1)
161a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setKeyType("DSA")
1622eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setSubject(TEST_DN_1)
1632eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setSerialNumber(TEST_SERIAL_1)
1642eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setStartDate(NOW)
1652eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setEndDate(NOW_PLUS_10_YEARS)
1662eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .build());
167db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
168db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        final KeyPair pair = mGenerator.generateKeyPair();
169db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertNotNull("The KeyPair returned should not be null", pair);
170db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
171a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertKeyPairCorrect(pair, TEST_ALIAS_1, "DSA", 1024, null, TEST_DN_1, TEST_SERIAL_1, NOW,
172a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                NOW_PLUS_10_YEARS);
173a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    }
174a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
175a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    public void testKeyPairGenerator_GenerateKeyPair_DSA_2048_Unencrypted_Success()
176a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            throws Exception {
177a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
178a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setAlias(TEST_ALIAS_1)
179a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setKeyType("DSA")
180a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setKeySize(2048)
181a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setSubject(TEST_DN_1)
182a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setSerialNumber(TEST_SERIAL_1)
183a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setStartDate(NOW)
184a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setEndDate(NOW_PLUS_10_YEARS)
185a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .build());
186a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
187a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        final KeyPair pair = mGenerator.generateKeyPair();
188a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertNotNull("The KeyPair returned should not be null", pair);
189a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
190a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertKeyPairCorrect(pair, TEST_ALIAS_1, "DSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
191a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                NOW_PLUS_10_YEARS);
192a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    }
193a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
194a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    public void testKeyPairGenerator_GenerateKeyPair_DSA_SpecifiedParams_Unencrypted_Success()
195a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            throws Exception {
196a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        /*
197a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root         * generated using: openssl dsaparam -C 2048
198a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root         */
199a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        BigInteger p = new BigInteger(1, new byte[] {
200a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xC0, (byte) 0x3D, (byte) 0x86, (byte) 0x09, (byte) 0xCA, (byte) 0x8C,
201a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x37, (byte) 0xCA, (byte) 0xCC, (byte) 0x4A, (byte) 0x81, (byte) 0xBD,
202a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xD8, (byte) 0x50, (byte) 0x77, (byte) 0xCD, (byte) 0xDD, (byte) 0x32,
203a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x0B, (byte) 0x43, (byte) 0xBF, (byte) 0x42, (byte) 0x06, (byte) 0x5A,
204a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x3D, (byte) 0x18, (byte) 0x50, (byte) 0x47, (byte) 0x79, (byte) 0xE1,
205a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x5B, (byte) 0x86, (byte) 0x03, (byte) 0xB9, (byte) 0x28, (byte) 0x9C,
206a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x18, (byte) 0xA9, (byte) 0xF5, (byte) 0xD6, (byte) 0xF4, (byte) 0x94,
207a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x5B, (byte) 0x87, (byte) 0x58, (byte) 0xCA, (byte) 0xB2, (byte) 0x1E,
208a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xFC, (byte) 0xED, (byte) 0x37, (byte) 0xC3, (byte) 0x49, (byte) 0xAC,
209a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xFA, (byte) 0x46, (byte) 0xDB, (byte) 0x7A, (byte) 0x50, (byte) 0x96,
210a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xCF, (byte) 0x52, (byte) 0xD7, (byte) 0x4E, (byte) 0xEB, (byte) 0x26,
211a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x41, (byte) 0xA2, (byte) 0x6F, (byte) 0x99, (byte) 0x80, (byte) 0x9F,
212a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x0F, (byte) 0x0A, (byte) 0xA8, (byte) 0x0D, (byte) 0xAC, (byte) 0xAB,
213a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xEF, (byte) 0x7D, (byte) 0xE7, (byte) 0x4C, (byte) 0xF1, (byte) 0x88,
214a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x44, (byte) 0xC9, (byte) 0x17, (byte) 0xD0, (byte) 0xBB, (byte) 0xE2,
215a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x01, (byte) 0x8C, (byte) 0xC1, (byte) 0x02, (byte) 0x1D, (byte) 0x3C,
216a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x15, (byte) 0xB7, (byte) 0x41, (byte) 0x30, (byte) 0xD8, (byte) 0x11,
217a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xBD, (byte) 0x6A, (byte) 0x2A, (byte) 0x0D, (byte) 0x36, (byte) 0x44,
218a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x9C, (byte) 0x3F, (byte) 0x32, (byte) 0xE2, (byte) 0x1C, (byte) 0xFB,
219a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xE3, (byte) 0xFF, (byte) 0xCC, (byte) 0x1A, (byte) 0x72, (byte) 0x38,
220a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x37, (byte) 0x69, (byte) 0x5E, (byte) 0x35, (byte) 0x73, (byte) 0xE1,
221a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x1E, (byte) 0x74, (byte) 0x35, (byte) 0x44, (byte) 0x07, (byte) 0xB5,
222a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x2F, (byte) 0x0B, (byte) 0x60, (byte) 0xF4, (byte) 0xA9, (byte) 0xE0,
223a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x81, (byte) 0xB2, (byte) 0xCD, (byte) 0x8B, (byte) 0x82, (byte) 0x76,
224a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x7F, (byte) 0xD4, (byte) 0x17, (byte) 0x32, (byte) 0x86, (byte) 0x98,
225a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x7C, (byte) 0x85, (byte) 0x66, (byte) 0xF6, (byte) 0x77, (byte) 0xED,
226a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x8B, (byte) 0x1A, (byte) 0x52, (byte) 0x16, (byte) 0xDA, (byte) 0x1C,
227a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xA7, (byte) 0x16, (byte) 0x79, (byte) 0x20, (byte) 0x1C, (byte) 0x99,
228a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x5F, (byte) 0x12, (byte) 0x66, (byte) 0x15, (byte) 0x9F, (byte) 0xE5,
229a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x73, (byte) 0xA9, (byte) 0x61, (byte) 0xBA, (byte) 0xA7, (byte) 0x23,
230a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x93, (byte) 0x77, (byte) 0xB5, (byte) 0xF6, (byte) 0xEC, (byte) 0x13,
231a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xBF, (byte) 0x95, (byte) 0x60, (byte) 0x78, (byte) 0x84, (byte) 0xE3,
232a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x44, (byte) 0xEC, (byte) 0x74, (byte) 0xC2, (byte) 0xCB, (byte) 0xD4,
233a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x70, (byte) 0xC5, (byte) 0x7B, (byte) 0xF8, (byte) 0x07, (byte) 0x3B,
234a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xEB, (byte) 0x9F, (byte) 0xC9, (byte) 0x7D, (byte) 0xE0, (byte) 0xA5,
235a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xBA, (byte) 0x68, (byte) 0x7B, (byte) 0xF4, (byte) 0x70, (byte) 0x40,
236a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xAE, (byte) 0xE9, (byte) 0x65, (byte) 0xEE, (byte) 0x5B, (byte) 0x71,
237a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x36, (byte) 0x0B, (byte) 0xB0, (byte) 0xA2, (byte) 0x98, (byte) 0x7D,
238a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xE3, (byte) 0x24, (byte) 0x95, (byte) 0x2B, (byte) 0xC2, (byte) 0x0A,
239a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x78, (byte) 0x3D, (byte) 0xCC, (byte) 0x3A, (byte) 0xEE, (byte) 0xED,
240a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x48, (byte) 0xEB, (byte) 0xA3, (byte) 0x78, (byte) 0xA8, (byte) 0x9D,
241a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x0A, (byte) 0x8F, (byte) 0x9E, (byte) 0x59, (byte) 0x2C, (byte) 0x44,
242a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xB5, (byte) 0xF9, (byte) 0x53, (byte) 0x43,
243a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        });
244a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
245a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        BigInteger q = new BigInteger(1, new byte[] {
246a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xA1, (byte) 0x9B, (byte) 0x1D, (byte) 0xC0, (byte) 0xE3, (byte) 0xF6,
247a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x4A, (byte) 0x35, (byte) 0xE1, (byte) 0x8A, (byte) 0x43, (byte) 0xC2,
248a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x9C, (byte) 0xF9, (byte) 0x52, (byte) 0x8F, (byte) 0x94, (byte) 0xA1,
249a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x12, (byte) 0x11, (byte) 0xDB, (byte) 0x9A, (byte) 0xB6, (byte) 0x35,
250a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x56, (byte) 0x26, (byte) 0x60, (byte) 0x89, (byte) 0x11, (byte) 0xAC,
251a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xA8, (byte) 0xE5,
252a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        });
253a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
254a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        BigInteger g = new BigInteger(1, new byte[] {
255a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xA1, (byte) 0x5C, (byte) 0x57, (byte) 0x15, (byte) 0xC3, (byte) 0xD9,
256a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xD7, (byte) 0x41, (byte) 0x89, (byte) 0xD6, (byte) 0xB8, (byte) 0x7B,
257a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xF3, (byte) 0xE0, (byte) 0xB3, (byte) 0xC5, (byte) 0xD1, (byte) 0xAA,
258a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xF9, (byte) 0x55, (byte) 0x48, (byte) 0xF1, (byte) 0xDA, (byte) 0xE8,
259a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x6F, (byte) 0x51, (byte) 0x05, (byte) 0xB2, (byte) 0xC9, (byte) 0x64,
260a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xDA, (byte) 0x5F, (byte) 0xD4, (byte) 0xAA, (byte) 0xFD, (byte) 0x67,
261a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xE0, (byte) 0x10, (byte) 0x2C, (byte) 0x1F, (byte) 0x03, (byte) 0x10,
262a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xD4, (byte) 0x4B, (byte) 0x20, (byte) 0x82, (byte) 0x2B, (byte) 0x04,
263a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xF9, (byte) 0x09, (byte) 0xAE, (byte) 0x28, (byte) 0x3D, (byte) 0x9B,
264a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xFF, (byte) 0x87, (byte) 0x76, (byte) 0xCD, (byte) 0xF0, (byte) 0x11,
265a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xB7, (byte) 0xEA, (byte) 0xE6, (byte) 0xCD, (byte) 0x60, (byte) 0xD3,
266a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x8C, (byte) 0x74, (byte) 0xD3, (byte) 0x45, (byte) 0x63, (byte) 0x69,
267a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x3F, (byte) 0x1D, (byte) 0x31, (byte) 0x25, (byte) 0x49, (byte) 0x97,
268a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x4B, (byte) 0x73, (byte) 0x34, (byte) 0x12, (byte) 0x73, (byte) 0x27,
269a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x4C, (byte) 0xDA, (byte) 0xF3, (byte) 0x08, (byte) 0xA8, (byte) 0xA9,
270a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x27, (byte) 0xE4, (byte) 0xB8, (byte) 0xD6, (byte) 0xB5, (byte) 0xC4,
271a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x18, (byte) 0xED, (byte) 0xBD, (byte) 0x6F, (byte) 0xA2, (byte) 0x36,
272a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xA2, (byte) 0x9C, (byte) 0x27, (byte) 0x62, (byte) 0x7F, (byte) 0x93,
273a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xD7, (byte) 0x52, (byte) 0xA9, (byte) 0x76, (byte) 0x55, (byte) 0x99,
274a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x00, (byte) 0x5B, (byte) 0xC2, (byte) 0xB9, (byte) 0x18, (byte) 0xAC,
275a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x6B, (byte) 0x83, (byte) 0x0D, (byte) 0xA1, (byte) 0xC5, (byte) 0x01,
276a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x1A, (byte) 0xE5, (byte) 0x4D, (byte) 0x2F, (byte) 0xCF, (byte) 0x5D,
277a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xB2, (byte) 0xE7, (byte) 0xC7, (byte) 0xCB, (byte) 0x2C, (byte) 0xFF,
278a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x51, (byte) 0x1B, (byte) 0x9D, (byte) 0xA4, (byte) 0x05, (byte) 0xEB,
279a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x17, (byte) 0xD8, (byte) 0x97, (byte) 0x9D, (byte) 0x0C, (byte) 0x59,
280a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x92, (byte) 0x8A, (byte) 0x03, (byte) 0x34, (byte) 0xFD, (byte) 0x16,
281a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x0F, (byte) 0x2A, (byte) 0xF9, (byte) 0x7D, (byte) 0xC3, (byte) 0x41,
282a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x0D, (byte) 0x06, (byte) 0x5A, (byte) 0x4B, (byte) 0x34, (byte) 0xD5,
283a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xF5, (byte) 0x09, (byte) 0x1C, (byte) 0xCE, (byte) 0xA7, (byte) 0x19,
284a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x6D, (byte) 0x04, (byte) 0x53, (byte) 0x71, (byte) 0xCC, (byte) 0x84,
285a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xA0, (byte) 0xB2, (byte) 0xA0, (byte) 0x68, (byte) 0xA3, (byte) 0x40,
286a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xC0, (byte) 0x67, (byte) 0x38, (byte) 0x96, (byte) 0x73, (byte) 0x2E,
287a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x8E, (byte) 0x2A, (byte) 0x9D, (byte) 0x56, (byte) 0xE9, (byte) 0xAC,
288a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xC7, (byte) 0xEC, (byte) 0x84, (byte) 0x7F, (byte) 0xFC, (byte) 0xE0,
289a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x69, (byte) 0x03, (byte) 0x8B, (byte) 0x48, (byte) 0x64, (byte) 0x76,
290a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x85, (byte) 0xA5, (byte) 0x10, (byte) 0xD9, (byte) 0x31, (byte) 0xC3,
291a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x8B, (byte) 0x07, (byte) 0x48, (byte) 0x62, (byte) 0xF6, (byte) 0x68,
292a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xF2, (byte) 0x96, (byte) 0xB2, (byte) 0x18, (byte) 0x5B, (byte) 0xFF,
293a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x6D, (byte) 0xD1, (byte) 0x6B, (byte) 0xF5, (byte) 0xFD, (byte) 0x81,
294a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xF1, (byte) 0xFD, (byte) 0x04, (byte) 0xF0, (byte) 0x9F, (byte) 0xB7,
295a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x08, (byte) 0x95, (byte) 0x57, (byte) 0x48, (byte) 0x07, (byte) 0x00,
296a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0x52, (byte) 0xEC, (byte) 0x75, (byte) 0x91, (byte) 0x02, (byte) 0x11,
297a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                (byte) 0xA3, (byte) 0x64, (byte) 0x26, (byte) 0xCA,
298a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        });
299a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
300a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        AlgorithmParameterSpec spec = new DSAParameterSpec(p, q, g);
301a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
302a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setAlias(TEST_ALIAS_1)
303a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setKeyType("DSA")
304a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setKeySize(2048)
305a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setAlgorithmParameterSpec(spec)
306a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setSubject(TEST_DN_1)
307a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setSerialNumber(TEST_SERIAL_1)
308a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setStartDate(NOW)
309a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setEndDate(NOW_PLUS_10_YEARS)
310a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .build());
311a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
312a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        final KeyPair pair = mGenerator.generateKeyPair();
313a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertNotNull("The KeyPair returned should not be null", pair);
314a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
315a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertKeyPairCorrect(pair, TEST_ALIAS_1, "DSA", 2048, spec, TEST_DN_1, TEST_SERIAL_1, NOW,
316a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                NOW_PLUS_10_YEARS);
317a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    }
318a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
319a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    public void testKeyPairGenerator_GenerateKeyPair_EC_Unencrypted_Success() throws Exception {
320a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
321a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setAlias(TEST_ALIAS_1)
322a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setKeyType("EC")
323a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setSubject(TEST_DN_1)
324a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setSerialNumber(TEST_SERIAL_1)
325a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setStartDate(NOW)
326a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setEndDate(NOW_PLUS_10_YEARS)
327a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .build());
328a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
329a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        final KeyPair pair = mGenerator.generateKeyPair();
330a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertNotNull("The KeyPair returned should not be null", pair);
331a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
332a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 256, null, TEST_DN_1, TEST_SERIAL_1, NOW,
333a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                NOW_PLUS_10_YEARS);
334a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    }
335a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
336a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    public void testKeyPairGenerator_GenerateKeyPair_EC_P521_Unencrypted_Success() throws Exception {
337a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
338a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setAlias(TEST_ALIAS_1)
339a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setKeyType("EC")
340a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setKeySize(521)
341a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setSubject(TEST_DN_1)
342a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setSerialNumber(TEST_SERIAL_1)
343a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setStartDate(NOW)
344a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setEndDate(NOW_PLUS_10_YEARS)
345a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .build());
346a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
347a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        final KeyPair pair = mGenerator.generateKeyPair();
348a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertNotNull("The KeyPair returned should not be null", pair);
349a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
350a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 521, null, TEST_DN_1, TEST_SERIAL_1, NOW,
351a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                NOW_PLUS_10_YEARS);
352a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    }
353a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
354a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    public void testKeyPairGenerator_GenerateKeyPair_RSA_Unencrypted_Success() throws Exception {
355a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
356a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setAlias(TEST_ALIAS_1)
357a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setSubject(TEST_DN_1)
358a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setSerialNumber(TEST_SERIAL_1)
359a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setStartDate(NOW)
360a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setEndDate(NOW_PLUS_10_YEARS)
361a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .build());
362a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
363a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        final KeyPair pair = mGenerator.generateKeyPair();
364a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertNotNull("The KeyPair returned should not be null", pair);
365a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
366a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
367a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                NOW_PLUS_10_YEARS);
368a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    }
369a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
370a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    public void testKeyPairGenerator_GenerateKeyPair_RSA_WithParams_Unencrypted_Success()
371a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            throws Exception {
372a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        AlgorithmParameterSpec spec = new RSAKeyGenParameterSpec(1024, BigInteger.valueOf(3L));
373a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
374a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setAlias(TEST_ALIAS_1)
375a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setKeySize(1024)
376a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setAlgorithmParameterSpec(spec)
377a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setSubject(TEST_DN_1)
378a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setSerialNumber(TEST_SERIAL_1)
379a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setStartDate(NOW)
380a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .setEndDate(NOW_PLUS_10_YEARS)
381a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                .build());
382a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
383a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        final KeyPair pair = mGenerator.generateKeyPair();
384a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertNotNull("The KeyPair returned should not be null", pair);
385a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
386a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 1024, spec, TEST_DN_1, TEST_SERIAL_1, NOW,
387a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                NOW_PLUS_10_YEARS);
388db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
389db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
390db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testKeyPairGenerator_GenerateKeyPair_Replaced_Success() throws Exception {
391db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        // Generate the first key
392db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        {
3931c219f619291ba818bc2542390a2988539d94ed0Kenny Root            mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
3942eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setAlias(TEST_ALIAS_1)
3952eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setSubject(TEST_DN_1)
3962eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setSerialNumber(TEST_SERIAL_1)
3972eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setStartDate(NOW)
3982eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setEndDate(NOW_PLUS_10_YEARS)
3992eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .build());
400db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            final KeyPair pair1 = mGenerator.generateKeyPair();
401db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            assertNotNull("The KeyPair returned should not be null", pair1);
402a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1,
403a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                    NOW, NOW_PLUS_10_YEARS);
404db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
405db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
406db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        // Replace the original key
407db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        {
4081c219f619291ba818bc2542390a2988539d94ed0Kenny Root            mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
4092eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setAlias(TEST_ALIAS_2)
4102eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setSubject(TEST_DN_2)
4112eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setSerialNumber(TEST_SERIAL_2)
4122eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setStartDate(NOW)
4132eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setEndDate(NOW_PLUS_10_YEARS)
4142eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .build());
415db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            final KeyPair pair2 = mGenerator.generateKeyPair();
416db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            assertNotNull("The KeyPair returned should not be null", pair2);
417a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            assertKeyPairCorrect(pair2, TEST_ALIAS_2, "RSA", 2048, null, TEST_DN_2, TEST_SERIAL_2,
418a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                    NOW, NOW_PLUS_10_YEARS);
419db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
420db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
421db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
4222eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyPairGenerator_GenerateKeyPair_Replaced_UnencryptedToEncrypted_Success()
4232eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            throws Exception {
4242eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        // Generate the first key
4252eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        {
4261c219f619291ba818bc2542390a2988539d94ed0Kenny Root            mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
4272eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setAlias(TEST_ALIAS_1)
4282eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setSubject(TEST_DN_1)
4292eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setSerialNumber(TEST_SERIAL_1)
4302eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setStartDate(NOW)
4312eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setEndDate(NOW_PLUS_10_YEARS)
4322eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .build());
4332eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            final KeyPair pair1 = mGenerator.generateKeyPair();
4342eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            assertNotNull("The KeyPair returned should not be null", pair1);
435a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1,
436a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                    NOW, NOW_PLUS_10_YEARS);
4372eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        }
4382eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
4392eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        // Attempt to replace previous key
4402eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        {
4411c219f619291ba818bc2542390a2988539d94ed0Kenny Root            mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
4422eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setAlias(TEST_ALIAS_1)
4432eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setSubject(TEST_DN_2)
4442eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setSerialNumber(TEST_SERIAL_2)
4452eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setStartDate(NOW)
4462eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setEndDate(NOW_PLUS_10_YEARS)
4472eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .setEncryptionRequired()
4482eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .build());
4492eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            try {
4502eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                mGenerator.generateKeyPair();
4512eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                fail("Should not be able to generate encrypted key while not initialized");
4522eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            } catch (IllegalStateException expected) {
4532eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            }
4542eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
4552eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            assertTrue(mAndroidKeyStore.password("1111"));
4562eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            assertTrue(mAndroidKeyStore.isUnlocked());
4572eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
4582eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            final KeyPair pair2 = mGenerator.generateKeyPair();
4592eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            assertNotNull("The KeyPair returned should not be null", pair2);
460a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            assertKeyPairCorrect(pair2, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_2, TEST_SERIAL_2,
461a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                    NOW, NOW_PLUS_10_YEARS);
4622eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        }
4632eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
4642eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
465a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root    private void assertKeyPairCorrect(KeyPair pair, String alias, String keyType, int keySize,
466a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            AlgorithmParameterSpec spec, X500Principal dn, BigInteger serial, Date start, Date end)
467a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            throws Exception {
468db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        final PublicKey pubKey = pair.getPublic();
469db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertNotNull("The PublicKey for the KeyPair should be not null", pubKey);
470a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertEquals(keyType, pubKey.getAlgorithm());
471a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root
472a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        if ("DSA".equalsIgnoreCase(keyType)) {
473a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            DSAPublicKey dsaPubKey = (DSAPublicKey) pubKey;
474a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            DSAParams actualParams = dsaPubKey.getParams();
475a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            assertEquals(keySize, (actualParams.getP().bitLength() + 7) & ~7);
476a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            if (spec != null) {
477a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                DSAParameterSpec expectedParams = (DSAParameterSpec) spec;
478a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                assertEquals(expectedParams.getP(), actualParams.getP());
479a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                assertEquals(expectedParams.getQ(), actualParams.getQ());
480a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                assertEquals(expectedParams.getG(), actualParams.getG());
481a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            }
482a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        } else if ("EC".equalsIgnoreCase(keyType)) {
483a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            assertEquals("Curve should be what was specified during initialization", keySize,
484a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                    ((ECPublicKey) pubKey).getParams().getCurve().getField().getFieldSize());
485a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        } else if ("RSA".equalsIgnoreCase(keyType)) {
486a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            RSAPublicKey rsaPubKey = (RSAPublicKey) pubKey;
487a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            assertEquals("Modulus size should be what is specified during initialization",
488a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                    (keySize + 7) & ~7, (rsaPubKey.getModulus().bitLength() + 7) & ~7);
489a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            if (spec != null) {
490a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                RSAKeyGenParameterSpec params = (RSAKeyGenParameterSpec) spec;
491a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                assertEquals((keySize + 7) & ~7, (params.getKeysize() + 7) & ~7);
492a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root                assertEquals(params.getPublicExponent(), rsaPubKey.getPublicExponent());
493a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root            }
494a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        }
495db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
496db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        final PrivateKey privKey = pair.getPrivate();
497db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertNotNull("The PrivateKey for the KeyPair should be not null", privKey);
498a39859889b7de0ad3190386cc732fa4bdcbe5504Kenny Root        assertEquals(keyType, privKey.getAlgorithm());
499db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
500db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        final byte[] userCertBytes = mAndroidKeyStore.get(Credentials.USER_CERTIFICATE + alias);
501db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertNotNull("The user certificate should exist for the generated entry", userCertBytes);
502db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
503db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        final CertificateFactory cf = CertificateFactory.getInstance("X.509");
504db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        final Certificate userCert = cf
505db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root                .generateCertificate(new ByteArrayInputStream(userCertBytes));
506db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
507db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertTrue("Certificate should be in X.509 format", userCert instanceof X509Certificate);
508db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
509db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        final X509Certificate x509userCert = (X509Certificate) userCert;
510db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
511db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("PublicKey used to sign certificate should match one returned in KeyPair",
512db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root                pubKey, x509userCert.getPublicKey());
513db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
514db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("The Subject DN should be the one passed into the params", dn,
515db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root                x509userCert.getSubjectDN());
516db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
517db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("The Issuer DN should be the same as the Subject DN", dn,
518db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root                x509userCert.getIssuerDN());
519db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
520db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("The Serial should be the one passed into the params", serial,
521db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root                x509userCert.getSerialNumber());
522db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
5232eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertDateEquals("The notBefore date should be the one passed into the params", start,
524db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root                x509userCert.getNotBefore());
525db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
5262eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertDateEquals("The notAfter date should be the one passed into the params", end,
527db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root                x509userCert.getNotAfter());
528db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
529db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        x509userCert.verify(pubKey);
530db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
531db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        final byte[] caCerts = mAndroidKeyStore.get(Credentials.CA_CERTIFICATE + alias);
532db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertNull("A list of CA certificates should not exist for the generated entry", caCerts);
533db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
534db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        final byte[] pubKeyBytes = mAndroidKeyStore.getPubkey(Credentials.USER_PRIVATE_KEY + alias);
535db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertNotNull("The keystore should return the public key for the generated key",
536db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root                pubKeyBytes);
537db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
5382eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
5392eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    private static void assertDateEquals(String message, Date date1, Date date2) throws Exception {
5402eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss");
5412eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
5422eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        String result1 = formatter.format(date1);
5432eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        String result2 = formatter.format(date2);
5442eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
5452eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertEquals(message, result1, result2);
5462eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
547db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root}
548