388 Commits

Author SHA1 Message Date
Alex Klyubin
cb3bb3f03a Harden and clean up KeyProtection.
This ensures that instances of this class are immutable and cleans up
some flawed logic discovered when writing up CTS tests.

Bug: 18088752
Change-Id: If9cc33192ada5a8982a2b200ab24cb18331cf958
2015-06-16 12:31:34 -07:00
Alex Klyubin
1b937eebdd Harden and clean up KeyGenParameterSpec.
This ensures that instances of this class are immutable and cleans up
some flawed logic discovered when writing up CTS tests.

Bug: 18088752
Change-Id: I7a27dbfc3445599bccabbd26e39535ce988a2ab2
2015-06-16 12:11:10 -07:00
Alex Klyubin
a8232452b6 Merge "Fix Android Keystore key gen for keys requiring user auth." into mnc-dev 2015-06-15 22:42:04 +00:00
Alex Klyubin
f78dd677e9 Fix Android Keystore key gen for keys requiring user auth.
When Android Keystore generates an asymmetric key pair, it needs to
create a self-signed certificate for that pair, in order to expose
the key pair in the JCA KeyStore abstraction through which keys are
later retrieved. The self-signed certificate is normally signed with
the private key.

This CL avoids using the private key to sign the certificate if the
private key can be used only once the user has been authenticated.
For such keys, a fake (non-verifying) signature is used on the
certificate, same as for cases where the key is not authorized for
signing.

Bug: 21852844
Change-Id: Id78bc1f51d12950db4e37c1e0da6c60057d4e693
2015-06-15 15:22:19 -07:00
Alex Klyubin
1923da348b Merge "Remove EcIesParameterSpec until it's needed." into mnc-dev 2015-06-15 17:45:48 +00:00
Alex Klyubin
3264599e12 Remove EcIesParameterSpec until it's needed.
This class was added in Android M to enable us to expose ECIES. ECIES
is not going to happen in Android M. I'm thus removing this unused
class until such time when it's needed.

Bug: 18088752
Change-Id: I16ab1bbd0b4334419c9a8f29d64661c150aa8d32
2015-06-15 09:55:36 -07:00
Alex Klyubin
acb7efd0d6 Document when self-signed certs have invalid signature.
This updates the Javadocs of Android Keystore to explain what key
authorizations are needed for the self-signed cert create at key
generation time to have a valid signature.

Bug: 18088752
Bug: 21777596
Change-Id: Id02425133f094a0c5a02e96f4c63aab7175cba5b
2015-06-12 14:29:07 -07:00
Alex Klyubin
6cb8e30bb7 Merge "Fix Android Keystore KeyPairGenerator for RSA PSS keys." into mnc-dev 2015-06-12 19:54:20 +00:00
Alex Klyubin
768695a899 Merge "Update Javadocs to reflect meaning of digest and padding NONE." into mnc-dev 2015-06-12 19:54:19 +00:00
Alex Klyubin
7c475cc7c3 Fix Android Keystore KeyPairGenerator for RSA PSS keys.
This fixes a bug where key pair generation fails for RSA signing keys
which are not authorized for PKCS#1 signature padding, such as keys
authorized only for the RSA PSS signature padding scheme.

The issue was that the KeyPairGenerator was failing when attempting to
sign the self-signed certificate (needed by Android Keystore) using
PKCS#1 padding for which such keys are not authorized. The solution is
to not attempt to sign these certificates and instead use a fake
signature.

Bug: 21809600
Change-Id: I4f04fcf78174937046d2534e0485c6940eae673f
2015-06-12 12:22:58 -07:00
Alex Klyubin
a72b55195c Obtain entropy later in crypto operations, when possible.
This makes Android Keystore crypto operations defer pulling entropy
from provided SecureRandom until KeyStore.finish, where appropriate.
Such as when performing asymmetric encryption or generating
signatures.

Bug: 18088752
Change-Id: I4a897754e9a846214cf0995c5514f98cf0edd76b
2015-06-12 10:35:46 -07:00
Alex Klyubin
dcf3d35f23 Update Javadocs to reflect meaning of digest and padding NONE.
This also adds information about what digests and paddings may need to
be specified for keys used in TLS/SSL for client or server
authentication.

Bug: 21777596
Change-Id: Icd495458c38c4f912b21a64ca7aab2c88d76461c
2015-06-11 17:55:49 -07:00
Alex Klyubin
f7bc24c58b Merge "Update Javadocs: all new features supported for asymmetric crypto." into mnc-dev 2015-06-12 00:26:21 +00:00
Alex Klyubin
bce7efcabf Update Javadocs: all new features supported for asymmetric crypto.
Bug: 20912868
Change-Id: I633d3caa3f40dd0b038b2f7e75825614bed2c0f5
2015-06-11 14:48:06 -07:00
Alex Klyubin
a99b8b5e3f Do not require USE_FINGERPRINT for getAuthenticatorId.
This removes the requirement to hold the USE_FINGERPRINT permission
to successfully invoke FingerprintManager.getAuthenticatorId().

This is needed because Android Keystore classes which run inside app
processes occasionally need to access this authenticator ID. The
access however is not necessarily triggered by the developer using
APIs to do with fingerprints. Thus, if an app does not hold the
USE_FINGERPRINT permission and uses Android Keystore API, it may
unexpectedly encounter a SecurityException.

It's OK to provide access to authenticator ID without requiring
USE_FINGERPRINT permission because there are other ways to access
this ID without holding that permission, such as though hidden
KeyStore API.

Once Android Keystore code is restructured to no longer require
access to authenticator ID, this CL can be reverted.

Bug: 21030147
Change-Id: I9af29830abce34c46e29e5c1682cc3ab88c95c00
2015-06-11 13:41:04 -07:00
Alex Klyubin
4a0ff7ca98 Android Keystore keys are no longer backed by Conscrypt.
This switches Android Keystore asymmetric keys from being backed by
Conscrypt (via keystore-engine which is an OpenSSL/BoringSSL ENGINE
which talks to keystore via the old KeyStore API) to being backed by
the AndroidKeyStore Provider which talks to keystore via the new
KeyStore API. In effect, this switches asymmetric crypto offered by
Android Keystore from old Keystore API to new KeyStore API, enabling
all the new features such as enforcement of authorizations on key use.

Some algorithms offered by Android Keystore, such as RSA with OAEP
or PSS padding schemes, are not supported by other providers. This
complicates matters because Android Keystore only supports public key
operations if the corresponding private key is in the keystore. Thus,
Android Keystore can only offer these operations for its own public
keys only. This requires AndroidKeyStore to use its own subclasses of
PublicKey everywhere. The ugliest place is where it needs to return
its own subclass of X509Certificate only to be able to return its
own subclass of PublicKey from Certificate.getPublicKey().

Bug: 18088752
Bug: 19284418
Bug: 20912868
Change-Id: Id234f9ab9ff72d353ca1ff66768bd3d46da50d64
2015-06-10 14:50:55 -07:00
Alex Klyubin
6a0b8f4d56 Merge "Switch Android Keystore key gen and import to new KeyStore API." into mnc-dev 2015-06-09 20:17:44 +00:00
Alex Klyubin
3ceb1a04b4 Switch Android Keystore key gen and import to new KeyStore API.
This makes Android Keystore's asymmetric key generation and import
use the new KeyStore API (similar to keymaster 1.0 API).

Because the resulting private keys will be used through
Conscrypt/keystore-engine which uses the old Keystore API, this CL
implements a temporary workaround where all generated and imported
keys are authorized for padding NONE and digest NONE, in addition to
padding schemes and digests requested by the user of the Android
Keystore API. This workaround is needed because keystore-engine uses
digest NONE and padding NONE for all its crypto operations.

Bug: 18088752
Bug: 20912868
Change-Id: Idc709039d091294265bd000160b5507f13825849
2015-06-09 13:08:02 -07:00
Alex Klyubin
508e665cea Support for Android Keystore Cipher.wrap and unwrap.
Cipher.wrap and .unwrap are supported by Android Keystore in released
versions of Android. The new Android Keystore provider should thus
continue supporting these for backward compatibility.

Bug: 18088752
Change-Id: I95319b13d5c4e9681f6539016e6449d73f81131d
2015-06-09 10:56:34 -07:00
Alex Klyubin
469cbf5156 Deprecate KeyChain.isBoundKeyAlgorithm.
This is bad API. There was never a guarantee that when this method
returns true for a key algorithm (e.g., RSA or EC), then all keys of
that type will be imported into secure hardware. For example, the
secure hardware may reject a key if it's of unsupported size or uses
an unsupported public exponent or EC curve. In that case, the key
will be imported into keystore/KeyChain without being backed by secure
hardware.

Bug: 18088752
Change-Id: I8daa574a2e703a347d09d93401cd1ea2d0162ed9
2015-06-08 13:22:53 -07:00
Alex Klyubin
266894644a Merge "Remove deprecated android.security.KeyStore methods." into mnc-dev 2015-06-08 18:11:21 +00:00
Alex Klyubin
2c500236f4 Merge "RSA encrypt with private key in Android Keystore." into mnc-dev 2015-06-08 18:10:09 +00:00
Alex Klyubin
4350babc02 Remove deprecated android.security.KeyStore methods.
* delKey -> delete
* getPubkey -> exportKey
* saw -> list.

Bug: 18088752
Change-Id: Ifb794f91a42646d67da1340ee16765cbaf255a49
2015-06-08 10:14:58 -07:00
Alex Klyubin
5552c89fa9 RSA encrypt with private key in Android Keystore.
This adds support for RSA encryption using private key and no padding.
This mode of operation is needed because JCA does not offer an RSA
Signature primitive that does not apply padding.

Bug: 18088752
Bug: 20912868
Change-Id: I0b481b4c19916f601aa270fada5eabfb12987e8d
2015-06-04 17:11:28 -07:00
Alex Klyubin
2c37807801 Merge "Export KeyFactory backed by Android Keystore." into mnc-dev 2015-06-04 22:16:19 +00:00
Alex Klyubin
cb94dd1cee Merge "Expose RSA and ECDSA Signature from Android Keystore Provider." into mnc-dev 2015-06-04 21:19:37 +00:00
Alex Klyubin
df6c67028a Merge "Streamline Android Keystore delete entry operation." into mnc-dev 2015-06-04 21:06:29 +00:00
Alex Klyubin
b070e486c8 Merge "Reliably delete keys if key generation fails." into mnc-dev 2015-06-04 21:05:41 +00:00
Alex Klyubin
ccbe88a505 Expose RSA and ECDSA Signature from Android Keystore Provider.
The RSA Signature supports PKCS#1 and PSS padding.

Bug: 18088752
Bug: 20912868
Change-Id: I03cdc86d1935af36f7c87a0b23d67f813829cfb0
2015-06-04 13:42:43 -07:00
Alex Klyubin
97a27a73e6 Export KeyFactory backed by Android Keystore.
The KeyFactory can be used to obtain information (KeyInfo) about
Android Keystore private keys.

Bug: 18088752
Change-Id: Ied1a69928f391537de6765cef7dc7d7241cf62bb
2015-06-04 13:19:50 -07:00
Chad Brubaker
43e77bf620 Merge "Add optional additional entropy to finish" into mnc-dev 2015-06-04 19:48:29 +00:00
Alex Klyubin
6c03bf523d Streamline Android Keystore delete entry operation.
This ensures that all four entry subtypes are deleted.

Bug: 18088752
Change-Id: Ia020dbede562a123c8c81cc9449ba5ab4aac61dd
2015-06-04 11:36:26 -07:00
Alex Klyubin
4bbfeb4856 Reliably delete keys if key generation fails.
Bug: 18088752
Change-Id: Iea68f3f96fc872d5628f163a1314ebd080c9d39e
2015-06-04 10:42:59 -07:00
Chad Brubaker
8a07701f38 Add optional additional entropy to finish
If provided the extra entropy will be added to the device before calling
finish. If entropy is provided and the device does not support supplying
additional entropy then finish will fail with KM_ERROR_UNIMPLEMENTED.

(cherry-picked from commit 9ce30624a448f439e19960d0dd88103c04676e7d)

Change-Id: If26be118bf382604f6f8e96e833b76e6f9e94d58
2015-06-04 10:06:00 -07:00
Alex Klyubin
4f389fd200 Expose RSA Cipher from Android Keystore Provider.
The RSA Cipher supports OAEPPadding, PKCS1Padding and NoPadding
padding schemes.

Bug: 18088752
Bug: 20912868
Change-Id: Ie050e12705bb553a402760a1d253fdb2247a1d50
2015-06-03 14:00:02 -07:00
Alex Klyubin
5c56f74527 Merge "Remove KM_TAG_CHUNK_LENGTH and add KM_TAG_AEAD_TAG" into mnc-dev 2015-06-03 16:35:21 +00:00
Alex Klyubin
0fe70813e0 Remove KM_TAG_CHUNK_LENGTH and add KM_TAG_AEAD_TAG
Change-Id: I384f3d2fee2f68279c6518d9ac0a79e29bed0e52
2015-06-02 14:38:35 -07:00
Chad Brubaker
966486e134 Track changes to the keystore binder API
Output parameters are gone from begin, instead they will returned in the
OperationResult and begin, update, and finish may return output
parameters.

Change-Id: I072afeb6c65f6c512b40603824c25686ac44e7c8
2015-06-01 15:16:06 -07:00
Alex Klyubin
37c8b411cd No need to specify key size when importing.
The underlying Keymaster implementation no longer requires that.

Bug: 19799085
Change-Id: I6b651bac5d4825b4ed0981a49bb79aedcf79d749
2015-06-01 09:52:16 -07:00
Alex Klyubin
96d7245c00 Cleanup Binder token resetting.
This is a follow-up to 7cbcfd4fc1e538bd391a20cdd00dd1494ace2d0e where
during the review it was pointed out that the code could be
streamlined.

Bug: 18088752
Change-Id: Iecb9fdbc31a0f3cdcb94ddb1b3e7e12a0543a231
2015-05-29 12:41:22 -07:00
Alex Klyubin
614b39f3de Merge "Refactor Android Keystore CipherSpi base class." into mnc-dev 2015-05-29 19:15:18 +00:00
Alex Klyubin
1a23c31752 Merge "Add algorithm aliases for Android Keystore HMACs." into mnc-dev 2015-05-29 18:01:08 +00:00
Alex Klyubin
a8c837f11a Add algorithm aliases for Android Keystore HMACs.
The aliases have been copied from Conscrypt.

Bug: 18088752
Change-Id: I1c66d8c3655f57db41cc0b9cc88d08b44b4a774b
2015-05-29 10:02:31 -07:00
Alex Klyubin
7cbcfd4fc1 Refactor Android Keystore CipherSpi base class.
This makes Android Keystore's CipherSpi base class suitable for
implementing AES and RSA ciphers. Previously, the class was heavily
biased towards only AES.

Bug: 18088752
Change-Id: I6bd1ca54165592d28482e56471dcfe0344337cf4
2015-05-29 09:53:05 -07:00
Alex Klyubin
06c88b60ef Merge "Fix typo in Javadocs of KeyGenParameterSpec." into mnc-dev 2015-05-27 18:46:56 +00:00
Alex Klyubin
fe0609dc9c Fix typo in Javadocs of KeyGenParameterSpec.
Bug: 18088752
Change-Id: I76daca80a8066ab55a0104ae113fd2c3a7993af3
2015-05-26 18:10:57 -07:00
Alex Klyubin
09a3b7f2ac Remove KeyStoreParameter.getContext().
This method isn't there in the released API and we don't need it in
the new API.

Bug: 18088752
Change-Id: Iccd80715bec782ac3a12bea169df4d37264f66f9
2015-05-26 10:44:53 -07:00
Chad Brubaker
e35d49f0d2 Cleanup Keystore API
Rename confusingly named methods, add userID arguments to all methods
that operate on user state and delete methods that have been replaced by
the onUser* methods.

Some of the old methods have been kept in KeyStore.java in order to ease
the transition of various system packages to the new methods.

(cherry-picked from commit d8aacca3a197f65021e9b520807b7315b7a59d68)

Change-Id: Ic271689d62c36d255c5adee26c7abc2e7ed24df5
2015-05-19 13:45:00 -07:00
Alex Klyubin
8ec2bed833 Merge "Use consistent name for KeyPairGeneratorSpi." into mnc-dev 2015-05-19 18:07:22 +00:00
Alex Klyubin
e21f023176 Use consistent name for KeyPairGeneratorSpi.
This renames AndroidKeyPairGeneratorSpi to
AndroidKeyStoreKeyPairGeneratorSpi for consistency with other SPI
implementations of AndroidKeyStore provider.

Bug: 18088752
Change-Id: Iea1c4d35987b3e64f92dd1706273ffb75a6addd6
2015-05-19 09:50:53 -07:00