Credentials.java revision 9d7faa91be6661eccf73494f1ab96ae9a28d42d7
19b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh/* 29b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * Copyright (C) 2009 The Android Open Source Project 39b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * 49b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * Licensed under the Apache License, Version 2.0 (the "License"); 59b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * you may not use this file except in compliance with the License. 69b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * You may obtain a copy of the License at 79b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * 89b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * http://www.apache.org/licenses/LICENSE-2.0 99b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * 109b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * Unless required by applicable law or agreed to in writing, software 119b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * distributed under the License is distributed on an "AS IS" BASIS, 129b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * See the License for the specific language governing permissions and 149b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * limitations under the License. 159b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh */ 169b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 179b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yehpackage android.security; 189b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 199b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yehimport android.content.ActivityNotFoundException; 209b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yehimport android.content.Context; 219b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yehimport android.content.Intent; 229b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yehimport android.util.Log; 239d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstromimport com.android.org.bouncycastle.openssl.PEMReader; 249d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstromimport com.android.org.bouncycastle.openssl.PEMWriter; 259d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstromimport java.io.ByteArrayInputStream; 269d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstromimport java.io.ByteArrayOutputStream; 279d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstromimport java.io.IOException; 289d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstromimport java.io.InputStreamReader; 299d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstromimport java.io.OutputStreamWriter; 309d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstromimport java.io.Reader; 319d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstromimport java.io.Writer; 329d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstromimport java.nio.charset.Charsets; 339b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yehimport java.security.KeyPair; 349d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstromimport java.util.ArrayList; 359d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstromimport java.util.List; 369b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 379b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh/** 389b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh * {@hide} 399b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh */ 409b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yehpublic class Credentials { 419b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh private static final String LOGTAG = "Credentials"; 4244039172627d1c15737ea73836ad375559d76211Chia-chi Yeh 4344039172627d1c15737ea73836ad375559d76211Chia-chi Yeh public static final String INSTALL_ACTION = "android.credentials.INSTALL"; 4444039172627d1c15737ea73836ad375559d76211Chia-chi Yeh 454a9e1a2494f2e48b157506d7c731187907b7fd4eBrian Carlstrom public static final String UNLOCK_ACTION = "com.android.credentials.UNLOCK"; 464a9e1a2494f2e48b157506d7c731187907b7fd4eBrian Carlstrom 479b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh /** Key prefix for CA certificates. */ 489b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public static final String CA_CERTIFICATE = "CACERT_"; 499b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 509b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh /** Key prefix for user certificates. */ 519b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public static final String USER_CERTIFICATE = "USRCERT_"; 529b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 539b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh /** Key prefix for user private keys. */ 549b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public static final String USER_PRIVATE_KEY = "USRPKEY_"; 559b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 569b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh /** Key prefix for VPN. */ 579b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public static final String VPN = "VPN_"; 589b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 599b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh /** Key prefix for WIFI. */ 609b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public static final String WIFI = "WIFI_"; 619b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 629b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh /** Data type for public keys. */ 639b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public static final String PUBLIC_KEY = "KEY"; 649b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 659b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh /** Data type for private keys. */ 669b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public static final String PRIVATE_KEY = "PKEY"; 679b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 689b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh /** Data type for certificates. */ 699b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public static final String CERTIFICATE = "CERT"; 709b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 719b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh /** Data type for PKCS12. */ 729b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public static final String PKCS12 = "PKCS12"; 739b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 749d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom /** 759d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom * Convert objects to a PEM format, which is used for 769d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom * CA_CERTIFICATE, USER_CERTIFICATE, and USER_PRIVATE_KEY 779d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom * entries. 789d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom */ 799d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom public static byte[] convertToPem(Object... objects) throws IOException { 809d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom ByteArrayOutputStream bao = new ByteArrayOutputStream(); 819d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom Writer writer = new OutputStreamWriter(bao, Charsets.US_ASCII); 829d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom PEMWriter pw = new PEMWriter(writer); 839d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom for (Object o : objects) { 849d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom pw.writeObject(o); 859d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom } 869d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom pw.close(); 879d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom return bao.toByteArray(); 889d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom } 899d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom /** 909d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom * Convert objects from PEM format, which is used for 919d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom * CA_CERTIFICATE, USER_CERTIFICATE, and USER_PRIVATE_KEY 929d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom * entries. 939d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom */ 949d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom public static List<Object> convertFromPem(byte[] bytes) throws IOException { 959d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom ByteArrayInputStream bai = new ByteArrayInputStream(bytes); 969d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom Reader reader = new InputStreamReader(bai, Charsets.US_ASCII); 979d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom PEMReader pr = new PEMReader(reader); 989d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom 999d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom List<Object> result = new ArrayList<Object>(); 1009d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom Object o; 1019d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom while ((o = pr.readObject()) != null) { 1029d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom result.add(o); 1039d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom } 1049d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom pr.close(); 1059d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom return result; 1069d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom } 1079d7faa91be6661eccf73494f1ab96ae9a28d42d7Brian Carlstrom 10844039172627d1c15737ea73836ad375559d76211Chia-chi Yeh private static Credentials singleton; 10944039172627d1c15737ea73836ad375559d76211Chia-chi Yeh 1109b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public static Credentials getInstance() { 1119b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh if (singleton == null) { 1129b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh singleton = new Credentials(); 1139b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh } 1149b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh return singleton; 1159b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh } 1169b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 1179b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public void unlock(Context context) { 1189b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh try { 1194a9e1a2494f2e48b157506d7c731187907b7fd4eBrian Carlstrom Intent intent = new Intent(UNLOCK_ACTION); 1209b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh context.startActivity(intent); 1219b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh } catch (ActivityNotFoundException e) { 1229b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh Log.w(LOGTAG, e.toString()); 1239b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh } 1249b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh } 1259b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 126c5e630a004d144ba1d4cd1d37dd98eb70a7ec1d8Hung-ying Tyan private Intent createInstallIntent() { 127c5e630a004d144ba1d4cd1d37dd98eb70a7ec1d8Hung-ying Tyan Intent intent = new Intent(INSTALL_ACTION); 128c5e630a004d144ba1d4cd1d37dd98eb70a7ec1d8Hung-ying Tyan intent.setClassName("com.android.certinstaller", 129c5e630a004d144ba1d4cd1d37dd98eb70a7ec1d8Hung-ying Tyan "com.android.certinstaller.CertInstallerMain"); 130c5e630a004d144ba1d4cd1d37dd98eb70a7ec1d8Hung-ying Tyan return intent; 131c5e630a004d144ba1d4cd1d37dd98eb70a7ec1d8Hung-ying Tyan } 132c5e630a004d144ba1d4cd1d37dd98eb70a7ec1d8Hung-ying Tyan 1339b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public void install(Context context, KeyPair pair) { 1349b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh try { 135c5e630a004d144ba1d4cd1d37dd98eb70a7ec1d8Hung-ying Tyan Intent intent = createInstallIntent(); 1369b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh intent.putExtra(PRIVATE_KEY, pair.getPrivate().getEncoded()); 1379b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh intent.putExtra(PUBLIC_KEY, pair.getPublic().getEncoded()); 1389b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh context.startActivity(intent); 1399b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh } catch (ActivityNotFoundException e) { 1409b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh Log.w(LOGTAG, e.toString()); 1419b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh } 1429b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh } 1439b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh 1449b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh public void install(Context context, String type, byte[] value) { 1459b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh try { 146c5e630a004d144ba1d4cd1d37dd98eb70a7ec1d8Hung-ying Tyan Intent intent = createInstallIntent(); 1479b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh intent.putExtra(type, value); 1489b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh context.startActivity(intent); 1499b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh } catch (ActivityNotFoundException e) { 1509b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh Log.w(LOGTAG, e.toString()); 1519b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh } 1529b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh } 1539b7a3f1a6437605022568cad0b92d5006a2ab391Chia-chi Yeh} 154