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.math.BigInteger;
22db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport java.util.Date;
23db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
24db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Rootimport javax.security.auth.x500.X500Principal;
25db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
261c219f619291ba818bc2542390a2988539d94ed0Kenny Rootpublic class KeyPairGeneratorSpecTest extends AndroidTestCase {
27db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final String TEST_ALIAS_1 = "test1";
28db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
29db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final X500Principal TEST_DN_1 = new X500Principal("CN=test1");
30db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
31db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final long NOW_MILLIS = System.currentTimeMillis();
32db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
33db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final BigInteger SERIAL_1 = BigInteger.ONE;
34db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
35db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    /* We have to round this off because X509v3 doesn't store milliseconds. */
36db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final Date NOW = new Date(NOW_MILLIS - (NOW_MILLIS % 1000L));
37db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
38db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    @SuppressWarnings("deprecation")
39db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    private static final Date NOW_PLUS_10_YEARS = new Date(NOW.getYear() + 10, 0, 1);
40db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
41db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_Success() throws Exception {
421c219f619291ba818bc2542390a2988539d94ed0Kenny Root        KeyPairGeneratorSpec spec =
431c219f619291ba818bc2542390a2988539d94ed0Kenny Root                new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1,
442eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                        NOW, NOW_PLUS_10_YEARS, 0);
45db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
46db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("Context should be the one specified", getContext(), spec.getContext());
47acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root
48acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root        assertEquals("Alias should be the one specified", TEST_ALIAS_1, spec.getKeystoreAlias());
49acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root
50acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root        assertEquals("subjectDN should be the one specified", TEST_DN_1, spec.getSubjectDN());
51acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root
52acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root        assertEquals("startDate should be the one specified", NOW, spec.getStartDate());
53acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root
54acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root        assertEquals("endDate should be the one specified", NOW_PLUS_10_YEARS, spec.getEndDate());
55acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root    }
56acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root
57acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root    public void testBuilder_Success() throws Exception {
581c219f619291ba818bc2542390a2988539d94ed0Kenny Root        KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(getContext())
59acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root                .setAlias(TEST_ALIAS_1)
60acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root                .setSubject(TEST_DN_1)
61acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root                .setSerialNumber(SERIAL_1)
62acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root                .setStartDate(NOW)
63acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root                .setEndDate(NOW_PLUS_10_YEARS)
642eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setEncryptionRequired()
65acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root                .build();
66acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root
67acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root        assertEquals("Context should be the one specified", getContext(), spec.getContext());
68db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
69db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("Alias should be the one specified", TEST_ALIAS_1, spec.getKeystoreAlias());
70db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
71db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("subjectDN should be the one specified", TEST_DN_1, spec.getSubjectDN());
72db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
73db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("startDate should be the one specified", NOW, spec.getStartDate());
74db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
75db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("endDate should be the one specified", NOW_PLUS_10_YEARS, spec.getEndDate());
762eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
772eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertEquals("encryption flag should be on", KeyStore.FLAG_ENCRYPTED, spec.getFlags());
78db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
79db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
80db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_NullContext_Failure() throws Exception {
81db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
821c219f619291ba818bc2542390a2988539d94ed0Kenny Root            new KeyPairGeneratorSpec(null, TEST_ALIAS_1, TEST_DN_1, SERIAL_1, NOW,
832eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    NOW_PLUS_10_YEARS, 0);
84db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when context is null");
85db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
86db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
87db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
88db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
89db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_NullKeystoreAlias_Failure() throws Exception {
90db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
911c219f619291ba818bc2542390a2988539d94ed0Kenny Root            new KeyPairGeneratorSpec(getContext(), null, TEST_DN_1, SERIAL_1, NOW,
922eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    NOW_PLUS_10_YEARS, 0);
93db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when keystoreAlias is null");
94db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
95db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
96db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
97db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
98db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_NullSubjectDN_Failure() throws Exception {
99db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
1001c219f619291ba818bc2542390a2988539d94ed0Kenny Root            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, null, SERIAL_1, NOW,
1012eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    NOW_PLUS_10_YEARS, 0);
102db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when subjectDN is null");
103db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
104db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
105db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
106db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
107db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_NullSerial_Failure() throws Exception {
108db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
1091c219f619291ba818bc2542390a2988539d94ed0Kenny Root            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, null, NOW,
1102eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    NOW_PLUS_10_YEARS, 0);
111db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when startDate is null");
112db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
113db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
114db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
115db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
116db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_NullStartDate_Failure() throws Exception {
117db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
1181c219f619291ba818bc2542390a2988539d94ed0Kenny Root            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1, null,
1192eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    NOW_PLUS_10_YEARS, 0);
120db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when startDate is null");
121db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
122db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
123db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
124db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
125db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_NullEndDate_Failure() throws Exception {
126db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
1271c219f619291ba818bc2542390a2988539d94ed0Kenny Root            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1, NOW,
1282eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    null, 0);
129db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when keystoreAlias is null");
130db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
131db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
132db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
133db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
134db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_EndBeforeStart_Failure() throws Exception {
135db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
1361c219f619291ba818bc2542390a2988539d94ed0Kenny Root            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, TEST_DN_1, SERIAL_1,
1372eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    NOW_PLUS_10_YEARS, NOW, 0);
138db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when end is before start");
139db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
140db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
141db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
142db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root}
143