History log of /system/keymaster/asymmetric_key.cpp
Revision Date Author Comments (<<< Hide modified files) (Show modified files >>>)
0f906ec40f6ade7955c6b967ea522aade54ea2e4 20-Jun-2015 Shawn Willden <swillden@google.com> Add buffer wrap checks and disable throwing of std::bad_alloc.

Android is built with exceptions disabled, but "operator new" and
"operator new[]" still throw std::bad_alloc on failure rather than
returning new. In general this is a good thing, because it will cause
an immediate crash of the process rather than assigning a null pointer
which is probably not checked. But most memory allocations in Keymaster
are checked, because it's written to run in an environment where new
does *not* throw. This CL updates the code to explicitly use the
non-throwing new.

A handful of throwing news remain, but only in places where a crash on
failure is appropriate.

In addition, this CL also inserts buffer wrap checks in key locations
and changes the development-machine Makefile to build in 32-bit mode, to
make memory problems more apparent.

Bug: 21888473
Change-Id: I8ebc5ec12053e4f5274f6f57ce312abc10611cef
/system/keymaster/asymmetric_key.cpp
398c158a0206217025f327c2d26bb6c86659f5a0 28-May-2015 Shawn Willden <swillden@google.com> Move assymetric key factory declarations to includes.

This exposes EcKeyFactory and RsaKeyFactory so they can be used for
constructing the Trusty KeymasterContext. Note that there are no code
changes, just reorganization.

Change-Id: I8e8e068fb875f9d9c5c35320a545347dc33bc507
/system/keymaster/asymmetric_key.cpp
0629810b145187575bc26c910dded0d24c64569d 26-May-2015 Shawn Willden <swillden@google.com> Another refactor, deleting AbstractFactoryRegistry.

I should have known better than to make these singletons to begin
with. Globals create problems. This undoes that mistake.

Change-Id: Idf61d5f72e3c34b5c4ddb27cc94b05f506561743
/system/keymaster/asymmetric_key.cpp
0cb6942d3efb6c056f96321c82a4b3d86af601d6 26-May-2015 Shawn Willden <swillden@google.com> Revert "Revert "Large refactor to move context out of AndroidKeymaster.""

This reverts commit 13fbe3e93247943c26e7ca2ed27b6d650282b8bf.

Bug: 20912868, 19799085
Change-Id: Iadd6ce5cbe94956c2a2fe277f1bf5b108e4bcf57
/system/keymaster/asymmetric_key.cpp
13fbe3e93247943c26e7ca2ed27b6d650282b8bf 23-May-2015 Shawn Willden <swillden@google.com> Revert "Large refactor to move context out of AndroidKeymaster."

This reverts commit 8ba2a043f0d44ad3f58d4af518f9391c03eca9c3.

I need to update the Volantis non-secure code in sync. Reverting while I get that done.

Change-Id: I0fb9f928e7e624ad678050a04bb873b43b1c9a48
/system/keymaster/asymmetric_key.cpp
8ba2a043f0d44ad3f58d4af518f9391c03eca9c3 18-May-2015 Shawn Willden <swillden@google.com> Large refactor to move context out of AndroidKeymaster.

AndroidKeymaster made a number of assumptions about its context that are
really only valid for TEE-based usage. In addition, KeyFactory made
some similarly TEE-focused assumptions about key blob creation and
parsing.

Both concerns have been moved to a new KeymasterContext class, which is
responsible for building and parsing key blobs in a manner appropriate
for the context in which AndroidKeymaster is running, as well as
providing other context-specific services, such as random number
generation.

In addition, the refactor reduces the need for the KeyBlob and
UnencryptedKeyBlob classes, which encode too many assumptions about blob
formatting and encryption, to the point that they can be removed and
replaced by a handful of utility functions which are much cleaner and
more flexible.

How to review this CL:

I looked hard at breaking this up into smaller CLs, but it's mostly not
feasible. However, it's probably easier to approach it by starting with
the fundamental changes, and then looking at the cascade effects.

1. Look at keymaster_context.h. The core of the change was pulling this
set of features out of AndroidKeymaster. Note that the revised approach
to key blob creation does not involve the KeyBlob and UnencryptedKeyBlob
classes, but instead goes directly from raw key material plus ancillary
data (e.g. auth sets) to a serialized buffer ready to return to
keystore. The same is true in reverse direction for parsing key blobs.

2. Look at key.h. The revised KeyFactory GenerateKey, ImportKey and
LoadKey methods are essential. GenerateKey and ImportKey no longer
produce a Key object, because all that's needed is a returnable blob.
LoadKey produces a Key object, but it starts with raw key material,
rather than an UnencryptedKeyBlob. Also note the change to the Key
class; because Key objects are only created by LoadKey, when there's a
need to use a key, there's only one constructor.

3. Look at asymmetric_key.h, rsa_key.h and rsa_key.cpp. rsa_key.cpp
provides a good example of how the new structure works. GenerateKey and
ImportKey do all of the work necessary to produce an OpenSSL RSA key and
extract the internal representation (using EvpToKeyMaterial; defined in
asymmetric_key.h because it's the same for EC keys). Then, with the raw
key data in hand, they call KeymasterContext::CreateKeyBlob to wrap the
key data in a key blob that can be returned to the caller -- whatever
that wrapping means in the current context. There's a subtlety not
apparent here which is crucial to the rationale for the refactoring:
RsaKeyFactory uses KeymasterContext::get_instance to retrieve the
context, but key factories which depend on operating in a particular
context can use a different way to get their context object, which may
have a larger interface. RsaKeymaster0KeyFactory will do this.

4. Look at soft_keymaster_context. In
particular, SoftKeymasterContext::CreateKeyBlob and ParseKeyBlob.
CreateKeyBlob allocates authorization tags from key_description to
hw_enforced and sw_enforced, then encrypts the key material and
serializes it to a blob. This approach is compatible with the keys
softkeymaster has been producing, but I'm going to change it (post M),
because there's no reason to bother encrypting SW keys with a SW key.
ParseKeyBlob reverses the process to recover the unencrypted key
material and the auth lists. One debatable point was the decision to
implement BuildHiddenAuthorizations and SetAuthorizations here, since
all contexts will need something similar, and they really should all do
it the same. I may refactor later to pull that functionality up to
KeymasterContext; it will depend on what I learn implementing
TrustyKeymasterContext and HybridKeymasterContext (used for the
keymaster0 adapter).

5. Look at ocb_utils and auth_encrypted_key_blob. These contain the key
encryption and key blob serialization code which was formerly split
between AndroidKeymaster::SerializeKeyBlob, UnencryptedKeyBlob and
KeyBlob, now divided into separate encryption and serialization
utilities. Note the refactored key_blob_test.cpp, updated to use the
new utilities rather than UnencryptedKeyBlob.

6. Look at soft_keymaster_device.cpp. Since KeyBlob no longer exists to
provide a nice way to peer into a blob to extract the algorithm, for use
in determining how to parse the keymaster0 signing key params (which
come in as a void*, yuck), we now have to use get_key_characteristics to
recover the params. This was the right way all along; the device layer
should not depend on being able to parse key blobs.

7. The rest.

Bug: 20912868, 19799085
Change-Id: Ieb74b8da39974f674eb8baa959bde75011fdd2e8
/system/keymaster/asymmetric_key.cpp
f01329d8692edde9a9ffb88f29f5d684eab481e2 12-Mar-2015 Shawn Willden <swillden@google.com> Improve error reporting and logging.

Bug: 19603049
Bug: 19509317
Change-Id: I041c973802e6c567adc5b1f280fc5bac27ba28d6
/system/keymaster/asymmetric_key.cpp
f862a764e4d20495d484664de852e4d6de26f08b 18-Mar-2015 Thai Duong <thaidn@google.com> ECIES: refactoring EC code by moving common interfaces to EcKey

Change-Id: I6a0c5dfa8072c6f82f77316a2e8b2252d976ae0f
/system/keymaster/asymmetric_key.cpp
4d306ec792b4348253aa77dff965bff5def1dccb 04-Mar-2015 Shawn Willden <swillden@google.com> Factor PKCS8 to EVP conversion out of AsymmetricKey.

Bug: 19508876
Change-Id: I7d5a7363a43c47dc33b0de53040b593de096e1c3
/system/keymaster/asymmetric_key.cpp
567a4a04f43d35b785d50508e6459b01f2ab4d14 31-Dec-2014 Shawn Willden <swillden@google.com> Switch to using global logger

Change-Id: I7af02342320a9a431cd9845baaf5dbcf61d460c2
/system/keymaster/asymmetric_key.cpp
a278f6156b9e57e1de8ca380b14fef113ad10be8 23-Dec-2014 Shawn Willden <swillden@google.com> Refactor key creation to use a registry of key factories.

Change-Id: I6ebab7b44e4a5dbea282397ab8aca437e71bdca0
/system/keymaster/asymmetric_key.cpp
b9d584d3dacc8041e5502cd0d036e21895eb6dc6 23-Jan-2015 Shawn Willden <swillden@google.com> Switch to using keymaster_defs.h from libhardware.

In the past it was convenient to have a local copy of this file
(for reasons which no longer apply).

Change-Id: Ie4a6f80abd16c77c0252f64ec65f2beeeef9a7a3
/system/keymaster/asymmetric_key.cpp
96599217f08532912bc0e26c1887549f6130669a 26-Sep-2014 Shawn Willden <swillden@google.com> Push padding and digest handling down to specific key types.

AsymmetricKey handled checking for digest and padding, but that doesn't
make sense because not all asymmetric key types need both. This is in
preparation for adding asymmetric encryption/decryption support.

Change-Id: I7b9a4fc37b6d31ab25c56015c1df7d114affe882
/system/keymaster/asymmetric_key.cpp
2c8dd3e93d66fed41561933105e6050ff0655d76 18-Sep-2014 Shawn Willden <swillden@google.com> Refactor: Separate asymmetric key types.

Change-Id: I3368798a8ecea319bb0bfcd6ff24e9a7b6287c80
/system/keymaster/asymmetric_key.cpp
658d7a69a20e9c570df0a7fb08ee98412a9bf74e 18-Sep-2014 Shawn Willden <swillden@google.com> Use calculate_key_size_in_bits method, rather than duplicating
calculation.

Change-Id: Id94a8856589945dda36a2302b9494e834217db04
/system/keymaster/asymmetric_key.cpp
ea387c20d53ba7904512f475f6ba29b69236fd85 18-Sep-2014 Shawn Willden <swillden@google.com> Increase ECDSA default key size to match NIST 2010-2030 recommendation.

Change-Id: I11095a29b1183817dcc66623b39d839f9d6d3656
/system/keymaster/asymmetric_key.cpp
72014adef83b0346859dbe82d77b09b4756d8e64 17-Sep-2014 Shawn Willden <swillden@google.com> Refactor KeyBlob to separate encryption functionality.

This CL is in preparation for another which will refactor libkeymaster
into libkeymaster and libkeymasterclient, the latter for use by programs
which merely interface with keymaster and don't do any crypto on their
own, but do need to parse key blobs to extract authorization list
entries. To make that possible it moves KeyBlob's key encryption and
decryption capabilities into a subclass, PlaintextKeyBlob.

Change-Id: Ic6a65b6f237c122796ea70458655111316f902d8
/system/keymaster/asymmetric_key.cpp
675257e83c8a92ae7d58e321c3800d55a1a3698d 11-Sep-2014 Shawn Willden <swillden@google.com> Add loggers to crypto operation classes.

Change-Id: I06a83884721f3b9ee7853c9495e18d8ccd093182
/system/keymaster/asymmetric_key.cpp
52c8b5d47dd844057ebba8bf6c1910c52c98993d 11-Sep-2014 Shawn Willden <swillden@google.com> Remove the keymaster::Logger::log() method and add debug().

Also, have the logger provide newlines, so every caller doesn't have to.

Change-Id: I9f009e7c2d5c686a0ca97e10daef92a846a57d9a
/system/keymaster/asymmetric_key.cpp
81effc68a04810b76f0b10594d92df4ffbf35c6c 27-Aug-2014 Shawn Willden <swillden@google.com> Finish key import implementation.

This is the last bit of GoogleKeymaster that remained incomplete (for
the v0.3 functionality).

Change-Id: I27be52ae032883c004b2df21f0c7b229af512922
/system/keymaster/asymmetric_key.cpp
368bc7749eaa2e1321d552e45a96d83b5500ba47 27-Aug-2014 Shawn Willden <swillden@google.com> Move key_blob.h in to include/keymaster, to export it.

Change-Id: If28db94840557e6ca3019b7bcf7b5f29f0ff6cf7
/system/keymaster/asymmetric_key.cpp
98d9b92547a9a7553b99e3e941a4175926f95b62 26-Aug-2014 Shawn Willden <swillden@google.com> Reorganize system/keymaster.

This CL moves the includes that should be exported to include/ and
removes the trusty-specific code (some of which is moving to
hardware/google and some of which is moving to the trusty tree.)

Change-Id: Ie4fabf6b5c5f36b50c2f5ff356548ca2e9140fcb
/system/keymaster/asymmetric_key.cpp
407d41282d6b0a7f2d6e2826d44a58b016a5d844 26-Aug-2014 Shawn Willden <swillden@google.com> Implement TrustyKeymaster key generation, plus tests.

Change-Id: I085be101c735d136e7d5b2915a9510102722e695
/system/keymaster/asymmetric_key.cpp
2f3be368e5ad911cc0b014421dd3682130260ffc 25-Aug-2014 Shawn Willden <swillden@google.com> Add the beginnings of logging infrastructure.

Change-Id: Ic36134402bfbb098d2242c463a3b4265d1d65209
/system/keymaster/asymmetric_key.cpp
437fbd195e7de57b7dc0c449c04458bd90ef50de 20-Aug-2014 Shawn Willden <swillden@google.com> Add key importing, RSA only.

Change-Id: I639e797939a28b2b2a815541c9926dc194657c54
/system/keymaster/asymmetric_key.cpp
f268d742dbefe0e84b4046db7669c4ffbc110f7d 19-Aug-2014 Shawn Willden <swillden@google.com> Refactor export to use new key infrastructure, and work with all key types.

Change-Id: Ie1f621f9db855665d57cde93c24881415de33ca2
/system/keymaster/asymmetric_key.cpp
d67afae61f822463120c36fea846362450dd7d71 19-Aug-2014 Shawn Willden <swillden@google.com> Refactor key and operation details.

Change-Id: I80267e6184955ecd98b08ceab91f4afd50c67614
/system/keymaster/asymmetric_key.cpp