blob: 8febf765d54463942f746248833b75e81edd0083 [file] [log] [blame]
page.title=Keymaster
@jd:body
<!--
Copyright 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<div id="qv-wrapper">
<div id="qv">
<h2>In this document</h2>
<ol id="auto-toc">
</ol>
</div>
</div>
<p>The availability of a trusted execution environment in a system on a chip (SoC)
offers an opportunity for Android devices to provide hardware-backed, strong
security services to the Android OS, to platform services, and even to
third-party apps.</p>
<p>Keymaster has been <a href="km-features.html">significantly enhanced</a>
in Android 6.0 with the addition of symmetric cryptographic primitives,
AES and HMAC, and the addition of an access control
system for hardware-backed keys. Access controls are specified during key
generation and enforced for the lifetime of the key. Keys can be restricted to
be usable only after the user has authenticated, only at a specific usage
velocity, and only for specified purposes or with specified cryptographic
parameters. For more information, please see
the <a href="km-implementer-ref.html">Implementer's Reference</a>.</p>
<p>Before Keymaster 1.0, Android already had a simple, hardware-backed crypto
services API: Keymaster versions 0.2 and 0.3, which provided only digital
signing and verification operations, plus generation of
asymmetric signing key pairs. This is already
implemented on many devices, but there are many security goals that cannot
easily be achieved with only a signature API. The intent of Keymaster 1.0 is to
extend the Keymaster API to provide a broader range of capabilities.</p>
<h2 id=goals>Goals</h2>
<p>The goal of the Keymaster API is to provide a basic but adequate set of
cryptographic primitives to allow the implementation of protocols using
access-controlled, hardware-backed keys.</p>
<p>In addition to expanding the range of cryptographic primitives, Keymaster v1.0
adds the following:</p>
<ul>
<li>A usage control scheme to allow key usage to be limited, to mitigate the risk
of security compromise due to misuse of keys
<li>An access control scheme to enable restriction of keys to specified users,
clients, and a defined time range
</ul>
<h2 id=architecture>Architecture</h2>
<p>The Keymaster API is a Hardware Abstraction Layer module, which is a
dynamically-loaded library. Implementations must not
perform any sensitive operations in user space, or even in kernel space.
Sensitive operations are delegated to a secure processor reached through some
kernel interface. The resulting architecture looks something like the
following:</p>
<img src="../images/access-to-keymaster.png" alt="Access to Keymaster" id="figure1" />
<p class="img-caption"><strong>Figure 1.</strong> Access to Keymaster</p>
<p>Within an Android device, the "client" actually consists of multiple layers
(e.g. app, framework, keystore daemon), but that can be ignored for the
purposes of this document. This means that the described API is low-level, used
by platform-internal components, and not exposed to app developers. The
higher-level API, for API level 23, is described on
the <a href="http://developer.android.com/reference/java/security/KeyStore.html">Android Developer site</a>.</p>
<p>The purpose of the <code>libkeymaster</code> library is not to implement the
security-sensitive algorithms but only to
marshal and unmarshal requests to the secure world. The wire format is
implementation-defined.</p>
<h2 id=compatibility_with_previous_versions>Compatibility with previous versions</h2>
<p>The Keymaster v1.0 API is completely incompatible with the previously-released
APIs, e.g. Keymaster v0.2 and v0.3.
To facilitate interoperability on pre-Marshmallow devices that launched
with the older Keymaster APIs, Keystore provides an adapter that provides
the 1.0 API implemented with calls to the existing hardware library. The result
cannot provide the full range of functionality in the
1.0 API. In particular, it will only support RSA and ECDSA algorithms, and all
of the key authorization enforcement will be performed by the adapter, in the
non-secure world.</p>