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