110 lines
6.6 KiB
Markdown
110 lines
6.6 KiB
Markdown
|
# Security-Related HALs
|
||
|
|
||
|
The `security/` subdirectory holds various security-related HALs. (The final two sections of this
|
||
|
document also describe security-related HALs that are in other places under `hardware/interfaces/`.)
|
||
|
|
||
|
The most significant HAL is KeyMint (**`IKeyMintDevice`** in the
|
||
|
`hardware/interfaces/security/keymint/` directory), which allows access to cryptographic
|
||
|
functionality where the key material is restricted to a secure environment. This functionality is
|
||
|
used by Android system services, and is also made available to apps via Android Keystore.
|
||
|
|
||
|
A KeyMint implementation (or an implementation of its predecessor, Keymaster) that runs in an
|
||
|
isolated execution environment (e.g. ARM TrustZone) is required for most Android devices; see [CDD
|
||
|
9.11](https://source.android.com/docs/compatibility/13/android-13-cdd#911_keys_and_credentials).
|
||
|
|
||
|
A device may optionally also support a second KeyMint instance, running in a dedicated secure
|
||
|
processor; this is known as StrongBox ([CDD
|
||
|
9.11.2](https://source.android.com/docs/compatibility/13/android-13-cdd#9112_strongbox)).
|
||
|
|
||
|
Two specific features of KeyMint are worth highlighting, as they have an impact on the other
|
||
|
security-related HALs:
|
||
|
|
||
|
- KeyMint supports keys that can only be used when the operation is authenticated by the user,
|
||
|
either by their lock screen knowledge factor (LSKF, e.g. PIN or pattern) or by a strong biometric
|
||
|
(e.g. fingerprint).
|
||
|
- KeyMint supports *attestation* of public keys: when an asymmetric keypair is created, the secure
|
||
|
environment produces a chain of signed certificates:
|
||
|
- starting from a trusted root certificate
|
||
|
- terminating in a leaf certificate that holds the public key; this leaf certificate may also
|
||
|
describe the state of the device and the policies attached to the key.
|
||
|
|
||
|
## Authentication Verification
|
||
|
|
||
|
User authentication must also take place in a secure environment (see the final section below), but
|
||
|
the results of that authentication are communicated to KeyMint via Android. As such, the
|
||
|
authentication result (a *hardware auth token*) is signed with a per-boot shared HMAC key known only
|
||
|
to the secure components, so that it's authenticity can be verified.
|
||
|
|
||
|
If an authenticator, for example GateKeeper (described by the **`IGatekeeper`** HAL in
|
||
|
`hardware/interfaces/gatekeeper/`), is co-located in the same secure environment as KeyMint, it can
|
||
|
use a local, vendor-specific, method to communicate the shared HMAC key.
|
||
|
|
||
|
However, if the authenticator is in a different environment than the KeyMint instance then a local
|
||
|
communication mechanism may not be possible. For example, a StrongBox KeyMint instance running in a
|
||
|
separate secure processor may not have a communication channel with a TEE on the main processor.
|
||
|
|
||
|
To allow for this, the **`ISharedSecret`** HAL (in `hardware/interfaces/security/sharedsecret`)
|
||
|
describes an N-party shared key agreement protocol for per-boot derivation of the shared HMAC key,
|
||
|
based on a pre-provisioned shared secret. This HAL can be implemented by any security component
|
||
|
– whether KeyMint instance or authenticator – that needs access to the shared HMAC key.
|
||
|
|
||
|
User authentication operations are also timestamped, but a StrongBox KeyMint instance may not have
|
||
|
access to a secure time source that is aligned with the authenticator's time source.
|
||
|
|
||
|
To allow for this, the **`ISecureClock`** HAL (in `hardware/interfaces/secureclock`) describes a
|
||
|
challenge-based timestamp authentication protocol. This HAL is optional; it need only be
|
||
|
implemented if there is a KeyMint instance without a secure source of time.
|
||
|
|
||
|
## Attestation Key Provisioning
|
||
|
|
||
|
As noted above, key generation may also generate an attestation certificate chain, which requires
|
||
|
that the secure environment have access to a signing key which in turn chains back to the Google
|
||
|
root.
|
||
|
|
||
|
Historically these signing keys were created by Google and provided to vendors for installation in
|
||
|
batches of devices (to prevent their use as unique device identifiers). However, this mechanism had
|
||
|
significant disadvantages, as it required secure handling of key material and only allowed for
|
||
|
coarse-grained revocation.
|
||
|
|
||
|
The remote key provisioning HAL (**`IRemotelyProvisionedComponent`** in
|
||
|
`hardware/interfaces/security/rkp/`) provides a mechanism whereby signing certificates for
|
||
|
attestation can be retrieved at runtime from Google servers based on pre-registered device identity
|
||
|
information. This mechanism is used to provision certificates for KeyMint's signing keys, but is
|
||
|
not restricted to that purpose; it can also be used in other scenarios where keys need to be
|
||
|
provisioned (for example, for [Widevine](https://developers.google.com/widevine/drm/overview)).
|
||
|
|
||
|
## Keymaster
|
||
|
|
||
|
The Keymaster HAL (**`IKeymasterDevice`** in `hardware/interfaces/keymaster/`) is the historical
|
||
|
ancestor of many of the HALs here (and may still be present on older devices). Its functionality is
|
||
|
effectively the union of the following current HALs:
|
||
|
|
||
|
- **`IKeyMintDevice`**
|
||
|
- **`ISharedSecret`**
|
||
|
- **`ISecureClock`**
|
||
|
|
||
|
## Related Authentication HALs
|
||
|
|
||
|
Authentication of users needs to happen in a secure environment, using vendor-specific
|
||
|
functionality, and so involves the use of one of the following HALs (all of which are outside the
|
||
|
`security/` subdirectory).
|
||
|
|
||
|
- The **`IGatekeeper`** HAL (in `hardware/interfaces/gatekeeper/`) provides user authentication
|
||
|
functionality based on the user's lock-screen knowledge factor (LSKF), including throttling
|
||
|
behaviour to prevent attacks. Authentication tokens produced by this HAL are consumed by KeyMint,
|
||
|
validated using the shared HMAC key described above.
|
||
|
- The optional **`IWeaver`** HAL (in `hardware/interfaces/weaver`) improves the security of LSKF
|
||
|
authentication by converting the user's LSKF into a *synthetic password* via hashing and
|
||
|
stretching. This is required to be implemented on a separate secure element, which prevents
|
||
|
offline attacks on Gatekeeper storage. Note that Weaver does not directly interact with KeyMint;
|
||
|
the synthetic password is fed into Gatekeeper in place of the plain user password, and then
|
||
|
Gatekeeper interacts with KeyMint as normal.
|
||
|
- The **`IFingerprint`** and **`IFace`** HAL definitions (under `hardware/interfaces/biometrics/`)
|
||
|
allow access to biometric authentication functionality that is implemented in a secure
|
||
|
environment. Authentication tokens produced by these HALs are consumed by KeyMint, validated
|
||
|
using the shared HMAC key described above.
|
||
|
- The optional **`IConfirmationUI`** HAL (in `hardware/interfaces/confirmationui`) supports
|
||
|
functionality where the user confirms that they have seen a specific message in a secure manner.
|
||
|
Confirmation tokens produced by this HAL are consumed by KeyMint, validated using the shared HMAC
|
||
|
key described above.
|