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 =
43f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1,
44f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                        SERIAL_1, 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
50f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertEquals("Key algorithm should be the one specified", "RSA", spec.getKeyType());
51f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
52f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertEquals("Key size should be the one specified", 1024, spec.getKeySize());
53f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
54acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root        assertEquals("subjectDN should be the one specified", TEST_DN_1, spec.getSubjectDN());
55acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root
56acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root        assertEquals("startDate should be the one specified", NOW, spec.getStartDate());
57acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root
58acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root        assertEquals("endDate should be the one specified", NOW_PLUS_10_YEARS, spec.getEndDate());
59acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root    }
60acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root
61acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root    public void testBuilder_Success() throws Exception {
621c219f619291ba818bc2542390a2988539d94ed0Kenny Root        KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(getContext())
63acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root                .setAlias(TEST_ALIAS_1)
64f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                .setKeyType("RSA")
65f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                .setKeySize(1024)
66acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root                .setSubject(TEST_DN_1)
67acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root                .setSerialNumber(SERIAL_1)
68acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root                .setStartDate(NOW)
69acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root                .setEndDate(NOW_PLUS_10_YEARS)
702eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                .setEncryptionRequired()
71acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root                .build();
72acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root
73acb0b5b220b2cb15f5a800a356bb25f47252a6eaKenny Root        assertEquals("Context should be the one specified", getContext(), spec.getContext());
74db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
75db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("Alias should be the one specified", TEST_ALIAS_1, spec.getKeystoreAlias());
76db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
77f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertEquals("Key algorithm should be the one specified", "RSA", spec.getKeyType());
78f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
79f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertEquals("Key size should be the one specified", 1024, spec.getKeySize());
80f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
81db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("subjectDN should be the one specified", TEST_DN_1, spec.getSubjectDN());
82db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
83db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("startDate should be the one specified", NOW, spec.getStartDate());
84db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
85db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        assertEquals("endDate should be the one specified", NOW_PLUS_10_YEARS, spec.getEndDate());
862eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
872eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertEquals("encryption flag should be on", KeyStore.FLAG_ENCRYPTED, spec.getFlags());
88db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
89db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
90db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_NullContext_Failure() throws Exception {
91db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
92f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            new KeyPairGeneratorSpec(null, TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1, NOW,
932eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    NOW_PLUS_10_YEARS, 0);
94db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when context is null");
95db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
96db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
97db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
98db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
99db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_NullKeystoreAlias_Failure() throws Exception {
100db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
101f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            new KeyPairGeneratorSpec(getContext(), null, "RSA", 1024, null, TEST_DN_1, SERIAL_1, NOW,
1022eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    NOW_PLUS_10_YEARS, 0);
103db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when keystoreAlias is null");
104db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
105db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
106db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
107db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
108db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_NullSubjectDN_Failure() throws Exception {
109db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
110f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, null, SERIAL_1, NOW,
1112eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    NOW_PLUS_10_YEARS, 0);
112db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when subjectDN is null");
113db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
114db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
115db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
116db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
117db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_NullSerial_Failure() throws Exception {
118db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
119f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, null, NOW,
1202eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    NOW_PLUS_10_YEARS, 0);
121db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when startDate is null");
122db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
123db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
124db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
125db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
126db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_NullStartDate_Failure() throws Exception {
127db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
128f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1,
129f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    null, NOW_PLUS_10_YEARS, 0);
130db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when startDate is null");
131db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
132db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
133db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
134db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
135db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_NullEndDate_Failure() throws Exception {
136db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
137f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1,
138f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    NOW, null, 0);
139db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when keystoreAlias is null");
140db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
141db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
142db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
143db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root
144db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    public void testConstructor_EndBeforeStart_Failure() throws Exception {
145db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        try {
146f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1,
1472eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    NOW_PLUS_10_YEARS, NOW, 0);
148db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root            fail("Should throw IllegalArgumentException when end is before start");
149db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        } catch (IllegalArgumentException success) {
150db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root        }
151db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root    }
152db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root}
153