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 1083f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin public void testConstructor_NullSubjectDN_Failure() throws Exception { 1093f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin try { 1103f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, null, SERIAL_1, NOW, 1113f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin NOW_PLUS_10_YEARS, 0); 1123f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin fail("Should throw IllegalArgumentException when subjectDN is null"); 1133f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin } catch (IllegalArgumentException success) { 1143f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin } 115db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root } 116db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root 1173f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin public void testConstructor_NullSerial_Failure() throws Exception { 1183f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin try { 1193f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, null, NOW, 1203f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin NOW_PLUS_10_YEARS, 0); 1213f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin fail("Should throw IllegalArgumentException when startDate is null"); 1223f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin } catch (IllegalArgumentException success) { 1233f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin } 124db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root } 125db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root 1263f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin public void testConstructor_NullStartDate_Failure() throws Exception { 1273f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin try { 1283f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1, 1293f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin null, NOW_PLUS_10_YEARS, 0); 1303f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin fail("Should throw IllegalArgumentException when startDate is null"); 1313f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin } catch (IllegalArgumentException success) { 1323f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin } 133db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root } 134db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root 1353f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin public void testConstructor_NullEndDate_Failure() throws Exception { 1363f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin try { 1373f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1, 1383f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin NOW, null, 0); 1393f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin fail("Should throw IllegalArgumentException when keystoreAlias is null"); 1403f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin } catch (IllegalArgumentException success) { 1413f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin } 142db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root } 143db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root 144db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root public void testConstructor_EndBeforeStart_Failure() throws Exception { 145db026710ec0adcf7f72dfb24c65d38a882ee26d8Kenny Root try { 1463f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1, 1473f8d4d840894468f2be8a5b56ff266cef2d71c50Alex Klyubin 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