Commit graph

3599 commits

Author SHA1 Message Date
Seth Moore
fbe5cf545c Keystore2: Stop using WAL mode
WAL mode attempts to open an additional file for use as a shared memory
mechanism. If storage is too full, then the database fails to open.
Remove the use of WAL mode so that keystore can perform read-only
transactions on the database and startup even on a full disk.

Disabling WAL mode shows about a 5% performance drop on a synthetic test
that creates and destroys 5000 AES keys.

Bug: 190142197
Test: keystore2_test
Change-Id: I9b1cb7e6398e07fa9f02f0ba4e9eb48313c06472
Merged-In: I9b1cb7e6398e07fa9f02f0ba4e9eb48313c06472
2021-06-14 14:28:32 -07:00
Xin Li
ee5c643f54 Merge "DO NOT MERGE - Merge ab/7272582" 2021-06-14 03:02:54 +00:00
Xin Li
9c0a7e2b65 DO NOT MERGE - Merge ab/7272582
Bug: 190855093
Change-Id: I477816eed7b78ae7768be4eafec685d44f24f4cc
2021-06-11 17:34:04 -07:00
Treehugger Robot
21f7f98fe8 Merge "Keystore 2.0: Don't panic key negotiation checksum failure." 2021-06-10 23:41:44 +00:00
Janis Danisevskis
d7308c7968 Keystore 2.0: Don't panic key negotiation checksum failure.
We should not panic when a checksum failure happens during shared key
negotiation. This is typical for pre production devices that have not
been fully provisioned yet. Not panicking gives the user the chance to
finalize the provisioning step.

Bug: 190702219
Test: N/A
Merged-In: I0c847b52f2c63c6c2eef0765cc1536daa0893d1c
Change-Id: I0c847b52f2c63c6c2eef0765cc1536daa0893d1c
2021-06-10 15:14:45 -07:00
Alan Stokes
ba9317c064 Merge "Add support for an existing CompOS cert." 2021-06-10 08:09:52 +00:00
Janis Danisevskis
d955c25a00 Merge "Keystore 2.0: Fix shared secret negotiation for Keymaster 4.x" 2021-06-09 20:06:04 +00:00
Janis Danisevskis
d0e0888e89 Keystore 2.0: Fix shared secret negotiation for Keymaster 4.x
The km_compat legacy wrapper would only cache the first shared secret
participant and then return this participant regardless of which
security level was requested. As a result only one Keymaster instance
would take part in the shared secret negotiation.

This patch adds a per security level cache for ISharedSecret instances
to km_compat. It filters Keymaster instances in Keystore 2.0 to only
include the highest version of each HIDL Keymaster security level.

Bug: 190539964
Test: See b/190539964
Merged-In: I0b73da88d3e1b6900cfb332c1befc704eca59cc5
Change-Id: I0b73da88d3e1b6900cfb332c1befc704eca59cc5
2021-06-09 10:59:08 -07:00
Alan Stokes
b182178879 Add support for an existing CompOS cert.
Modify odsign to verify an existing CompOS cert and add it to the
fs-verity keyring if ok or delete it if not.

The significant new behaviour is all behind an if (false), since
there's still a lot to do (like making it possible for a valid cert to
exist).

Otherwise, various refactorings and gratuitous tinkering.

Bug: 190166662
Bug: 188450218
Test: Presubmits
Test: Manual - push various differently-invalid certs & observe
Change-Id: I51021c95fa4670d5fd022783565b1e215962483b
2021-06-09 08:43:46 +00:00
Treehugger Robot
fc9ba206e4 Merge "Minor fixes." 2021-06-07 16:41:23 +00:00
Alan Stokes
3b88598cff Minor fixes.
Fix 2 small memory leaks.

Remove now-redundant cast.

Test: atest -p
Change-Id: Icf37fec3b5d6e138671176310d85afda29807ed8
2021-06-07 15:33:05 +01:00
Treehugger Robot
fbeb0a69bc Merge "Keystore 2.0 certificate utils: Set time by string." 2021-06-07 09:36:27 +00:00
Janis Danisevskis
0da3115059 Keystore 2.0 certificate utils: Set time by string.
Set notBefore and notAfter times using strings rather then architecture
dependent time_t.

Bug: 185119443
Test: atest keystore2_crypto_test
Merged-In: I83e64829b20d965f800e648d9b5d1452c526cb35
Change-Id: I83e64829b20d965f800e648d9b5d1452c526cb35
2021-06-04 11:37:31 -07:00
Janis Danisevskis
8801c7c1b0 Merge changes Ic719fcaa,I34999d76,Ia7563394,Id4abe50c,I9e141674, ...
* changes:
  Keystore 2.0: Boot level key: Add missing digest to operation params
  Keystore 2.0: Delete unencrypted boot level keys.
  Keystore 2.0: Add database versioning.
  Keystore 2.0: Move db_utils to database submodule.
  Keystore 2.0: Make key type an explict argument.
  Keystore 2.0: Boot level keys: Check key characteristics.
  Keystore 2.0: Use preferred KM instance for level zero key.
  Keystore 2.0: km_compat: Implement getKeyCharacteristics.
2021-06-02 18:08:24 +00:00
Janis Danisevskis
e2d774bff5 Keystore 2.0: Boot level key: Add missing digest to operation params
When generating the boot level zero key the operation params were
missing the digest parameter which throws off some KM implementaions.

Ignore-AOSP-First: No automerge path from AOSP.
Bug: 187862706
Test: Reboot twice after applying the patch. Check logs from odsign for
      sucessful recovery of boot level keys.
Change-Id: Ic719fcaae4fc3f5550fcf14b55143c1ca1f125cc
Merged-In: Ic719fcaae4fc3f5550fcf14b55143c1ca1f125cc
2021-06-01 14:30:27 -07:00
Janis Danisevskis
cfaf919af6 Keystore 2.0: Delete unencrypted boot level keys.
This patch uses the database versioning mechanism to delete boot level
bound keys that have been generated before cryptographic binding to the
boot level was implemented.

Ignore-AOSP-First: No automerge path from AOSP.
Bug: 187862706
Test: keystore2_test
Change-Id: I34999d7633e4ef17205b055e11751f0498ae6932
Merged-In: I34999d7633e4ef17205b055e11751f0498ae6932
2021-06-01 14:30:27 -07:00
Janis Danisevskis
75e600f846 Keystore 2.0: Add database versioning.
This patch adds database versioning.

When a KeystoreDB connection is opened, the database file is queried for
its version. If the version is lower than current version expected by
keystore2, upgrade function are executed until the target version is
reached and the database version is updated.

Ignore-AOSP-First: No automerge path from AOSP.
Test: keystore2_test (Note the test is added in this CL but not included
      in keystore2_test yet. This will happen in the next CL.)
Bug: 187862706
Bug: 189470584
Change-Id: Ia75633942dbb8f168e781579e1c9a755c84671af
Merged-In: Ia75633942dbb8f168e781579e1c9a755c84671af
2021-06-01 14:30:27 -07:00
Janis Danisevskis
030ba028e8 Keystore 2.0: Move db_utils to database submodule.
Ignore-AOSP-First: No automerge path from AOSP.
Bug: 189470584
Bug: 187862706
Test: N/A
Change-Id: Id4abe50c948140152f83ca4663d7baa890375c6d
Merged-In: Id4abe50c948140152f83ca4663d7baa890375c6d
2021-06-01 14:30:27 -07:00
Janis Danisevskis
0cabd71f51 Keystore 2.0: Make key type an explict argument.
This refactor makes key type an explicit to relevant database function
to make it harder to implicitly use the wrong type.

Ignore-AOSP-First: No automerge path from AOSP.
Bug: 187862706
Bug: 189470584
Test: Regression tested with keystore2_test.
Change-Id: I9e1416743093f0a1ab86fd9351aed97f106ee819
Merged-In: I9e1416743093f0a1ab86fd9351aed97f106ee819
2021-06-01 14:30:27 -07:00
Janis Danisevskis
acebfa2471 Keystore 2.0: Boot level keys: Check key characteristics.
Check the key characteristics of the level zero key to verify its
integrity.

Ignore-AOSP-First: No automerge path from AOSP.
Bug: 187862706
Test: N/A
Change-Id: Id83e581781507e499790e77729b0e2d96795f908
Merged-In: Id83e581781507e499790e77729b0e2d96795f908
2021-06-01 14:30:27 -07:00
Janis Danisevskis
5c7482104f Keystore 2.0: Use preferred KM instance for level zero key.
Prefer KM4.1 and higher over KM4.0 and lower, but prefer TEE over
Strongbox if TEE meets the minimal requirements.

Ignore-AOSP-First: No automerge path from AOSP.
Bug: 187862706
Test: Manually tested by observing logs during boot.
Merged-In: I1d27c80ef7c869b84b6d0c1a5d8eec287c242f6c
Change-Id: I1d27c80ef7c869b84b6d0c1a5d8eec287c242f6c
Merged-In: I1d27c80ef7c869b84b6d0c1a5d8eec287c242f6c
2021-06-01 14:30:27 -07:00
Janis Danisevskis
67f30564f4 Keystore 2.0: km_compat: Implement getKeyCharacteristics.
Ignore-AOSP-First: No automerge path from AOSP.
Bug: 188848331
Bug: 187862706
Test: keystore2_km_compat_test
Change-Id: Ib54916c4f5f4960a82d6e8695aa8b8caa085a2de
Merged-In: Ib54916c4f5f4960a82d6e8695aa8b8caa085a2de
2021-06-01 14:30:27 -07:00
Martijn Coenen
2149815155 Merge "On-device signing: Don't specify MAC_LENGTH on verify operation." 2021-05-31 07:02:18 +00:00
Martijn Coenen
39cee4c03a On-device signing: Don't specify MAC_LENGTH on verify operation.
This parameter is rejected on some implementations.

Bug: 188121857
Test: TEST_MAPPING
Change-Id: Ic41dddc57dbb2e56d22ed79a54515d9467dcfde2
2021-05-27 12:34:48 +02:00
Matthew Maurer
b05c7f6336 Merge "Upgrade to rusqlite-0.25.3." 2021-05-26 18:53:20 +00:00
Treehugger Robot
df6de7d837 Merge "Use accessors for certificates and RSA keys." 2021-05-26 00:42:59 +00:00
Joel Galenson
ff79e3622a Upgrade to rusqlite-0.25.3.
Test: keystore2_test
Change-Id: I6035954f2a7102378a2e3972d4350e42552e6efc
2021-05-25 16:30:50 -07:00
Treehugger Robot
d6a7809990 Merge "Fix typo" 2021-05-25 21:35:10 +00:00
David Benjamin
891b9540ed Use accessors for certificates and RSA keys.
The upstream RSA APIs are annoyingly tedious, but ah well. Note
X509_set1_signature_algo sets both copies of the signature algorithm.
This also fixes an EVP_PKEY leak in some error paths.

Test: mm
Change-Id: Ifa6f130e9d7dce328c649aa241057dbe5c0e5e66
2021-05-25 16:44:35 -04:00
Joel Galenson
97ac914cf9 Fix typo
Test: Run test
Change-Id: I5affbfe0f8b58eb3f75c7e0dbcbae23b6d8e4752
2021-05-25 10:09:36 -07:00
Martijn Coenen
247ed4586f Merge changes I5b5018d4,I688fff83,Ib99d689d
* changes:
  On-device signing: Remove Keymaster implementation.
  On-device signing: verify the public key.
  On-device signing: Switch to using a TEE-backed keystore key.
2021-05-25 10:38:14 +00:00
Martijn Coenen
9451c05e04 On-device signing: Remove Keymaster implementation.
This is no longer needed.

Bug: 165630556
Test: TEST_MAPPING
Change-Id: I5b5018d4f17827c515ffed5f188fd0ce1f34a08c
2021-05-25 08:47:52 +02:00
Martijn Coenen
7278a33e1c On-device signing: verify the public key.
While we can generally trust the key properties of the Keystore key to
be correct, the public key certificate that Keystore returns in
KeyMetadata is simply retrieved from an on-disk database.  This allows
an attacker that gets filesystem access to simply modify the public key,
and we will happily accept that (and the artifacts that are signed with
the private key component).

To prevent this, sign the public key itself with another HMAC key that
carries the same boot level as the signing key. This is secure, because
in order to forge such a signature, an attacker would need to create an
HMAC key with the same boot level, which is not possible once early boot
has passed.

Bug: 187862706
Test: TEST_MAPPING

Change-Id: I688fff83f73b1df4e91c3fa03c43df647703d9f8
2021-05-25 08:47:37 +02:00
Martijn Coenen
9b885740bf On-device signing: Switch to using a TEE-backed keystore key.
We previously used a Strongbox key; but since we'll need to start
verifying the public key component with an HMAC operation on every boot,
switch to a TEE key instead, as TEE operations are much faster, and
this should help bring boot time down.

This also requires some logic to deal with keys in Strongbox on
updating devices.

Bug: 187862706
Test: TEST_MAPPING; manual upgrade test.
Change-Id: Ib99d689dbef02d2f0c34bfa4c852205b1ec680a7
2021-05-25 08:47:34 +02:00
Pavel Grafov
36706e592e Merge "Log key integrity violation to NIAP audit log." 2021-05-18 23:26:44 +00:00
Treehugger Robot
61a6a5bf49 Merge changes I803b7c19,I7097646b
* changes:
  Keystore 2.0: Restrict list to KeyType::Client.
  Keystore 2.0: CLI fixes.
2021-05-18 21:03:36 +00:00
Seth Moore
b77196d8a3 Merge changes I79614739,I357a4454
* changes:
  Improve selinux concurrency test reliability
  Keystore 2.0: Test libselinux concurrent access.
2021-05-18 15:38:12 +00:00
Pavel Grafov
f45034a692 Log key integrity violation to NIAP audit log.
Bug: 183201685
Test: atest MixedDeviceOwnerTest#testSecurityLoggingWithSingleUser
Test: atest keystore2_test
Change-Id: Ic2dbbae818e88c520600c21c5d108cdc4dfca104
2021-05-17 22:09:34 +01:00
Janis Danisevskis
18313830ff Keystore 2.0: Restrict list to KeyType::Client.
Running keystore_cli_v2 as root included user0 super keys in the list of
keys. This revealed that the database list keys query was not
restrictive enough.

Bug: 188451778
Test: keystore_cli_v2 list as root should not include any super keys.
Merged-In: I803b7c19f3cdb8a29fbc114e74da1b0dc2473c81
Change-Id: I803b7c19f3cdb8a29fbc114e74da1b0dc2473c81
2021-05-17 13:51:06 -07:00
Janis Danisevskis
2cb4f090ae Keystore 2.0: CLI fixes.
* Fix keystore_cli_v2 and have it installed on the device by default
  again.
* Fix confirmationui invocation test by statically linking dependencies.

Bug: 188450250
Test: atest confirmationui_invocation_test
      run any keystore_cli_v2 command
Merged-In: I7097646b6714214782cf15c51dffb7368d62761b
Change-Id: I7097646b6714214782cf15c51dffb7368d62761b
2021-05-17 13:41:32 -07:00
Seth Moore
597acfb3ab Improve selinux concurrency test reliability
With these changes, the test easily identifies threading issues by
calling selinux concurrenly. With no locking in the selinux rust module,
this test causes hard locks very quickly (usually within 2 iterations).

Fixed test hangs (false positives) by adding an explicit "complete" to
all all threads instead of using the turnpike for both test start and
test complete.

Added some debug output and increased the iteration count to run the
test longer, getting more confidence in passing tests.

Lastly, use synthetically generated categories (CatCount) for all test
threads instead of just one thread. This seems to both make the test
more "abusive" of selinux as well as reduces test code size.

Test: Remove selinux lock and run keystore2_selinux_concurrency_test
Test: keystore2_selinux_concurrency_test with selinux lock
Change-Id: I796147397da021ca5c78fe8b60aa3853d1a882a3
2021-05-17 12:46:28 -07:00
Janis Danisevskis
d746a0d039 Keystore 2.0: Test libselinux concurrent access.
This test attempts to corrupt the access vector cache of libselinux by
calling selinux_check_access concurrently. The test will fail if the
cache gets corrupted in such a way that selinux_check_access ends up in
an infinite loop.

Test: atest keystore2_selinux_concurrency_test
Bug: 184006658
Change-Id: I357a4454281bdec9865ac1d8a8343378bac1698d
2021-05-17 10:40:16 -07:00
Treehugger Robot
8176ec07ce Merge "Keystore 2.0: Protect libselinux against concurrent access." 2021-05-13 22:39:08 +00:00
Janis Danisevskis
ff188d3a6c Keystore 2.0: Protect libselinux against concurrent access.
Bug: 184006658
Test: Regression test with CtsKeystoreTestCases and keystore2_test
Change-Id: Ifeb1d8ec83c3c16491a7f7cfd53862557fe8e5f7
2021-05-13 13:38:23 -07:00
Hasini Gunasinghe
c1c58f0f77 Merge "Keystore 2.0: Make MonotonicRawTime use milliseconds." 2021-05-13 16:13:40 +00:00
Seth Moore
14e670db60 Merge "Set write-ahead logging once at boot" 2021-05-13 15:01:31 +00:00
Hasini Gunasinghe
66a2460b33 Keystore 2.0: Make MonotonicRawTime use milliseconds.
Bug: 187921344
Test: atest keystore2_test

Change-Id: Iecb86860078899d126527b0633afddf742e77fbc
2021-05-13 01:27:25 +00:00
Seth Moore
472fcbb489 Set write-ahead logging once at boot
This is a rework of the previously reverted commit
6a50983169, which was attempting to set
WAL mode after startup. It turns out that doing this can race with other
code that is trying to use the DB, resulting in DB lock errors.

Bug: 184006658
Test: CtsKeystoreTestCases
Change-Id: I737fd2750c3157a732c2677eaabf8aa114f42832
2021-05-12 16:37:12 -07:00
Seth Moore
407feb7f61 Merge "Revert "Enable write-ahead logging for keystore db."" 2021-05-12 05:10:44 +00:00
Seth Moore
9c70b6b54a Revert "Enable write-ahead logging for keystore db."
This reverts commit 6a50983169.

Reason for revert: Bug 187889158. We forgot to account for database locks in the WAL mode set, and apparently some devices are running into locked dbs.

Change-Id: I43f8cb231397adc69ac6286b64a943cff55629c1
2021-05-12 05:07:27 +00:00