diff options
author | Brian Carlstrom <bdc@google.com> | 2011-06-29 10:42:35 -0700 |
---|---|---|
committer | Brian Carlstrom <bdc@google.com> | 2011-06-29 18:46:56 -0700 |
commit | a00a2b33ccc6bc079c3ee57a938f62947b48a001 (patch) | |
tree | 5e057ff17cca7fb2ab224ac1abd81bfc34e4325b /keystore/java | |
parent | afb60c36b7879c4ed195fb19cc4334175be28c92 (diff) | |
download | frameworks_base-a00a2b33ccc6bc079c3ee57a938f62947b48a001.zip frameworks_base-a00a2b33ccc6bc079c3ee57a938f62947b48a001.tar.gz frameworks_base-a00a2b33ccc6bc079c3ee57a938f62947b48a001.tar.bz2 |
KeyChain API for credential installation
Bug: 3497064
Change-Id: I4ac4d8b5559496b1632d63c2129e2bafd240893f
Diffstat (limited to 'keystore/java')
-rw-r--r-- | keystore/java/android/security/Credentials.java | 27 | ||||
-rw-r--r-- | keystore/java/android/security/KeyChain.java | 88 |
2 files changed, 94 insertions, 21 deletions
diff --git a/keystore/java/android/security/Credentials.java b/keystore/java/android/security/Credentials.java index ab4b9e0..f75208d 100644 --- a/keystore/java/android/security/Credentials.java +++ b/keystore/java/android/security/Credentials.java @@ -60,16 +60,10 @@ public class Credentials { public static final String WIFI = "WIFI_"; /** Data type for public keys. */ - public static final String PUBLIC_KEY = "KEY"; + public static final String EXTRA_PUBLIC_KEY = "KEY"; /** Data type for private keys. */ - public static final String PRIVATE_KEY = "PKEY"; - - /** Data type for certificates. */ - public static final String CERTIFICATE = "CERT"; - - /** Data type for PKCS12. */ - public static final String PKCS12 = "PKCS12"; + public static final String EXTRA_PRIVATE_KEY = "PKEY"; // historically used by Android public static final String EXTENSION_CRT = ".crt"; @@ -130,16 +124,9 @@ public class Credentials { } } - private Intent createInstallIntent() { - Intent intent = new Intent(INSTALL_ACTION); - intent.setClassName("com.android.certinstaller", - "com.android.certinstaller.CertInstallerMain"); - return intent; - } - public void install(Context context) { try { - Intent intent = createInstallIntent(); + Intent intent = KeyChain.createInstallIntent(); context.startActivity(intent); } catch (ActivityNotFoundException e) { Log.w(LOGTAG, e.toString()); @@ -148,9 +135,9 @@ public class Credentials { public void install(Context context, KeyPair pair) { try { - Intent intent = createInstallIntent(); - intent.putExtra(PRIVATE_KEY, pair.getPrivate().getEncoded()); - intent.putExtra(PUBLIC_KEY, pair.getPublic().getEncoded()); + Intent intent = KeyChain.createInstallIntent(); + intent.putExtra(EXTRA_PRIVATE_KEY, pair.getPrivate().getEncoded()); + intent.putExtra(EXTRA_PUBLIC_KEY, pair.getPublic().getEncoded()); context.startActivity(intent); } catch (ActivityNotFoundException e) { Log.w(LOGTAG, e.toString()); @@ -159,7 +146,7 @@ public class Credentials { public void install(Context context, String type, byte[] value) { try { - Intent intent = createInstallIntent(); + Intent intent = KeyChain.createInstallIntent(); intent.putExtra(type, value); context.startActivity(intent); } catch (ActivityNotFoundException e) { diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java index 18011e6..b567207 100644 --- a/keystore/java/android/security/KeyChain.java +++ b/keystore/java/android/security/KeyChain.java @@ -89,31 +89,117 @@ public final class KeyChain { public static final String ACCOUNT_TYPE = "com.android.keychain"; /** + * Action to bring up the KeyChainActivity + */ + private static final String ACTION_CHOOSER = "com.android.keychain.CHOOSER"; + + /** + * Extra for use with {@link #ACTION_CHOOSER} * @hide Also used by KeyChainActivity implementation */ public static final String EXTRA_RESPONSE = "response"; /** + * Extra for use with {@link #ACTION_CHOOSER} * @hide Also used by KeyChainActivity implementation */ public static final String EXTRA_HOST = "host"; /** + * Extra for use with {@link #ACTION_CHOOSER} * @hide Also used by KeyChainActivity implementation */ public static final String EXTRA_PORT = "port"; /** + * Extra for use with {@link #ACTION_CHOOSER} * @hide Also used by KeyChainActivity implementation */ public static final String EXTRA_ALIAS = "alias"; /** + * Extra for use with {@link #ACTION_CHOOSER} * @hide Also used by KeyChainActivity implementation */ public static final String EXTRA_SENDER = "sender"; /** + * Action to bring up the CertInstaller + */ + private static final String ACTION_INSTALL = "android.credentials.INSTALL"; + + /** + * Optional extra to specify a {@code String} credential name on + * the {@code Intent} returned by {@link #createInstallIntent}. + * + * @hide TODO make public + */ + // Compatible with old com.android.certinstaller.CredentialHelper.CERT_NAME_KEY + public static final String EXTRA_NAME = "name"; + + /** + * Optional extra to specify an X.509 certificate to install on + * the {@code Intent} returned by {@link #createInstallIntent}. + * The extra value should be a PEM or ASN.1 DER encoded {@code + * byte[]}. An {@link X509Certificate} can be converted to DER + * encoded bytes with {@link X509Certificate#getEncoded}. + * + * <p>{@link #EXTRA_NAME} may be used to provide a default alias + * name for the installed certificate. + * + * @hide TODO make public + */ + // Compatible with old android.security.Credentials.CERTIFICATE + public static final String EXTRA_CERTIFICATE = "CERT"; + + /** + * Optional extra for use with the {@code Intent} returned by + * {@link #createInstallIntent} to specify a PKCS#12 key store to + * install. The extra value should be a {@code byte[]}. The bytes + * may come from an external source or be generated with {@link + * KeyStore#store} on a "PKCS12" instance. + * + * <p>The user will be prompted for the password to load the key store. + * + * <p>The key store will be scanned for {@link + * java.security.KeyStore.PrivateKeyEntry} entries and both the + * private key and associated certificate chain will be installed. + * + * <p>{@link #EXTRA_NAME} may be used to provide a default alias + * name for the installed credentials. + * + * @hide TODO make public + */ + // Compatible with old android.security.Credentials.PKCS12 + public static final String EXTRA_PKCS12 = "PKCS12"; + + /** + * Returns an {@code Intent} that can be used for credential + * installation. The intent may be used without any extras, in + * which case the user will be able to install credentials from + * their own source. + * + * <p>Alternatively, {@link #EXTRA_CERTIFICATE} or {@link + * #EXTRA_PKCS12} maybe used to specify the bytes of an X.509 + * certificate or a PKCS#12 key store for installation. These + * extras may be combined with {@link EXTRA_NAME} to provide a + * default alias name for credentials being installed. + * + * <p>When used with {@link Activity#startActivityForResult}, + * {@link Activity#RESULT_OK} will be returned if a credential was + * successfully installed, otherwise {@link + * Activity#RESULT_CANCELED} will be returned. + * + * @hide TODO make public with createInstallIntent, EXTRA_NAME, EXTRA_CERTIFICATE, EXTRA_PKCS12 + */ + public static Intent createInstallIntent() { + Intent intent = new Intent(ACTION_INSTALL); + intent.setClassName("com.android.certinstaller", + "com.android.certinstaller.CertInstallerMain"); + return intent; + } + + /** * Launches an {@code Activity} for the user to select the alias * for a private key and certificate pair for authentication. The * selected alias or null will be returned via the @@ -176,7 +262,7 @@ public final class KeyChain { if (response == null) { throw new NullPointerException("response == null"); } - Intent intent = new Intent("com.android.keychain.CHOOSER"); + Intent intent = new Intent(ACTION_CHOOSER); intent.putExtra(EXTRA_RESPONSE, new AliasResponse(activity, response)); intent.putExtra(EXTRA_HOST, host); intent.putExtra(EXTRA_PORT, port); |