Commit graph

3320 commits

Author SHA1 Message Date
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
Seth Moore
8a9352625f Merge "Use a RwLock for DB_PATH" 2021-05-11 22:14:49 +00:00
Treehugger Robot
fb1604952a Merge "Enable write-ahead logging for keystore db." 2021-05-11 20:52:30 +00:00
Treehugger Robot
2bd70bf11f Merge "Keystore 2.0: Reinstate the default busy handler." 2021-05-11 19:35:41 +00:00
Seth Moore
a3e611ae14 Use a RwLock for DB_PATH
The return value of DB_PATH.lock() was being borrowed, which holds the
lock for the duration of the borrow.
This is not itself a major problem, but if anything else blocked DB
object initialization, other threads could be blocked for a long time
until initialization completes.

Bug: 184006658
Test: KeyStoreTest
Change-Id: I585b40b8770b90fe80d6591157525eed0b5124c3
2021-05-11 11:56:30 -07:00
Janis Danisevskis
2ef77d3674 Keystore 2.0: Reinstate the default busy handler.
The default busy handler leads to a semi deadlock when used in
conjunction with an in-memory database. That is, the busy handler would
time out because a mutex was held by a thread trying to acquire the file
lock.

The in-memory database was removed from keystore2, so the default busy
handler may be reinstated.

Test: keystore2_test
Bug: 184006658
Change-Id: Idf3a50250342b9eb677b460074dfc6ee7df73964
2021-05-11 10:58:08 -07:00
Shawn Willden
6a50983169 Enable write-ahead logging for keystore db.
Write-ahead logging wasn't previously enabled for the keystore2 sqlite
databases out of concern that it might make it impossible to open the
database when the file system is full.  Work to correct that problem,
to ensure that sqlite databases can always be opened in WAL mode even
when the WAL file cannot be created, is in progress, so this CL goes
ahead and puts the database in WAL mode.  The approach is a little
wasteful, since it re-sends the pragma on every connection, but that
ensures that it gets done and shouldn't impose any significant
overhead.

In the event that setting WAL mode fails, we log an error and continue
on.

Test: CtsKeystoreTestCases
Change-Id: I7d5618760019dce68576f72575321c54c3c24415
2021-05-11 11:07:51 -06:00
Hasini Gunasinghe
7708000c11 Merge "Keystore 2.0: Fix loading access tuple from the grant table." 2021-05-11 16:54:25 +00:00
Treehugger Robot
79261a4454 Merge changes Iff862198,I5c219d29
* changes:
  Keystore 2.0: Clean up lints
  Keystore 2.0: Move per-boot database out of SQLite
2021-05-11 11:37:48 +00:00
Hasini Gunasinghe
e70a0ec808 Keystore 2.0: Fix loading access tuple from the grant table.
When loading the access tuple from the grant table, we need to eliminate
the unreferenced keys.

Author: jdanis@google.com
Test: atest keystore2_test
Change-Id: I2b768fe48ee1fad829e97e596b4647c50f1d0c54
2021-05-10 21:35:22 +00:00
Matthew Maurer
0df926098f Merge "Keystore 2.0: Reduce sqlite cache to 0.5M" 2021-05-10 21:04:54 +00:00
Matthew Maurer
b77a28de57 Keystore 2.0: Clean up lints
Bug: 184833962
Test: m
Change-Id: Iff862198960003cd780844b0cd6620da941d48bc
2021-05-10 14:02:30 -07:00
Matthew Maurer
d7815caead Keystore 2.0: Move per-boot database out of SQLite
Being in SQLite incurs a variety of overheads. Originally, the per-boot
database was in SQLite with the intention of living in a temporary file
to allow keystore2 to restart without losing auth token state. Since
keystore2 is not allowed to crash, it was moved to an in-memory SQLite
database. Since it is no longer vfs backed, we do not need to pay the
memory, speed, and complexity costs of SQLite for it any longer.

Bug: 186436093
Test: atest keystore2_test
Test: atest CtsKeystoreTestCases
Change-Id: I5c219d294af1876a18a7fdef40307f3b92ae4b8b
2021-05-10 14:02:28 -07:00
Janis Danisevskis
8de5b6f65b Merge "Keystore 2.0: Add watch points to async_task.rs" 2021-05-10 18:11:03 +00:00
Matthew Maurer
4fb1911b8a Keystore 2.0: Reduce sqlite cache to 0.5M
The default sqlite cache size of 2M is excessive for keystore use cases.
Reduce it to avoid memory pressure on low memory devices.

Bug: 186436093
Test: atest CtsKeystoreTestCases, saw heap usage drop ~1M
Change-Id: I52e7d78ee15fe863857866848ede84e0f3e4f216
2021-05-09 14:56:51 -07:00
Xin Li
825af81c42 Merge "DO NOT MERGE - Mark RQ2A.210105.001 as merged." 2021-05-08 01:28:18 +00:00
Xin Li
b9570c65d4 DO NOT MERGE - Mark RQ2A.210105.001 as merged.
Bug: 180401296
Merged-In: I001adb29a4c064620c648f8670690b900265cb8a
Change-Id: Id85a6d722a80633063f049081376c6e3a15f2c31
2021-05-07 14:32:31 -07:00