diff --git a/current.txt b/current.txt index 81c7074571..15b096b3bb 100644 --- a/current.txt +++ b/current.txt @@ -347,8 +347,8 @@ dd83be076b6b3f10ed62ab34d8c8b95f2415961fb785200eb842e7bfb2b0ee92 android.hardwar 675682dd3007805c985eaaec91612abc88f4c25b3431fb84070b7584a1a741fb android.hardware.health@2.0::IHealth 434c4c32c00b0e54bb05e40c79503208b40f786a318029a2a4f66e34f10f2a76 android.hardware.health@2.0::IHealthInfoCallback c9e498f1ade5e26f00d290b4763a9671ec6720f915e7d592844b62e8cb1f9b5c android.hardware.health@2.0::types -a6cf986593c6ad15fe2ae3a1995d2cae233500bc32c055912a42723bdc076868 android.hardware.keymaster@4.0::IKeymasterDevice -e15ebdf1e0a326ff5b8a59668d4d8cd3852bd88388eae91de13f5f7e1af50ed1 android.hardware.keymaster@4.0::types +5c8e06f9945276d1a9e8f7e37cf0ea8894bdb906fa80809cb06c36abb39afc4f android.hardware.keymaster@4.0::IKeymasterDevice +6695eb5744108035506004dd136068b1aaebe809cf9d4a69c2fe33b73058bb85 android.hardware.keymaster@4.0::types 6d5c646a83538f0f9d8438c259932509f4353410c6c76e56db0d6ca98b69c3bb android.hardware.media.bufferpool@1.0::IAccessor b8c7ed58aa8740361e63d0ce9e7c94227572a629f356958840b34809d2393a7c android.hardware.media.bufferpool@1.0::IClientManager 4a2c0dc82780e6c90731725a103feab8ab6ecf85a64e049b9cbd2b2c61620fe1 android.hardware.media.bufferpool@1.0::IConnection diff --git a/keymaster/4.0/IKeymasterDevice.hal b/keymaster/4.0/IKeymasterDevice.hal index aef81c729c..6c09ef338f 100644 --- a/keymaster/4.0/IKeymasterDevice.hal +++ b/keymaster/4.0/IKeymasterDevice.hal @@ -20,46 +20,234 @@ import android.hardware.keymaster@3.0::ErrorCode; import android.hardware.keymaster@3.0::KeyFormat; /** - * Keymaster device definition. For thorough documentation see the implementer's reference, at - * https://source.android.com/security/keystore/implementer-ref.html + * Keymaster device definition. + * + * == Features == + * + * An IKeymasterDevice provides cryptographic services, including the following categories of + * operations: + * + * o Key generation + * o Import and export (public only) of asymmetric keys + * o Import of raw symmetric keys + * o Asymmetric encryption and decryption with appropriate padding modes + * o Asymmetric signing and verification with digesting and appropriate padding modes + * o Symmetric encryption and decryption in appropriate modes, including an AEAD mode + * o Generation and verification of symmetric message authentication codes + * o Attestation to the presence and configuration of asymmetric keys. + * + * Protocol elements, such as purpose, mode and padding, as well as access control constraints, must + * be specified by the caller when keys are generated or imported and must be permanently bound to + * the key, ensuring that the key cannot be used in any other way. + * + * In addition to the list above, IKeymasterDevice implementations must provide one more service + * which is not exposed as an API but used internally: Random number generation. The random number + * generator must be high-quality and must be used for generation of keys, initialization vectors, + * random padding and other elements of secure protocols that require randomness. + * + * == Types of IKeymasterDevices == + * + * All of the operations and storage of key material must occur in a secure environment. Secure + * environments may be either: + * + * 1. Isolated execution environments, such as a separate virtual machine, hypervisor or + * purpose-built trusted execution environment like ARM TrustZone. The isolated environment + * must provide complete separation from the Android kernel and user space (collectively called + * the "non-secure world", or NSW) so that nothing running in the NSW can observe or manipulate + * the results of any computation in the isolated environment. Isolated execution environments + * are identified by the SecurityLevel TRUSTED_ENVIRONMENT. + * + * 2. Completely separate, purpose-built and certified secure CPUs, called "StrongBox" devices. + * Examples of StrongBox devices are embedded Secure Elements (eSE) or on-SoC secure processing + * units (SPU). StrongBox environments are identified by the SecurityLevel STRONGBOX. To + * qualify as a StrongBox, a device must meet the requirements specified in CDD 9.11.2. + * + * == Necessary Primitives == + * + * All IKeymasterDevice implementations must provide support for the following: + * + * o RSA + * + * - TRUSTED_ENVIRONMENT IKeymasterDevices must support 2048, 3072 and 4096-bit keys. + * STRONGBOX IKeymasterDevices must support 2048-bit keys. + * - Public exponent F4 (2^16+1) + * - Unpadded, RSASSA-PSS and RSASSA-PKCS1-v1_5 padding modes for RSA signing + * - TRUSTED_ENVIRONMENT IKeymasterDevices must support MD5, SHA1, SHA-2 224, SHA-2 256, SHA-2 + * 384 and SHA-2 512 digest modes for RSA signing. STRONGBOX IKeymasterDevices must support + * SHA-2 256. + * - Unpadded, RSAES-OAEP and RSAES-PKCS1-v1_5 padding modes for RSA encryption. + * + * o ECDSA + * + * - TRUSTED_ENVIRONMENT IKeymasterDevices must support NIST curves P-224, P-256, P-384 and + * P-521. STRONGBOX IKeymasterDevices must support NIST curve P-256. + * - TRUSTED_ENVIRONMENT IKeymasterDevices must support SHA1, SHA-2 224, SHA-2 256, SHA-2 + * 384 and SHA-2 512 digest modes. STRONGBOX IKeymasterDevices must support SHA-2 256. + * + * o AES + * + * - 128 and 256-bit keys + * - CBC, CTR, ECB and GCM modes. The GCM mode must not allow the use of tags smaller than 96 + * bits or nonce lengths other than 96 bits. + * - CBC and ECB modes must support unpadded and PKCS7 padding modes. With no padding CBC and + * ECB-mode operations must fail with ErrorCode::INVALID_INPUT_LENGTH if the input isn't a + * multiple of the AES block size. With PKCS7 padding, GCM and CTR operations must fail with + * ErrorCode::INCOMPATIBLE_PADDING_MODE. + * + * o 3DES + * + * - 168-bit keys. + * - CBC and ECB mode. + + * - CBC and ECB modes must support unpadded and PKCS7 padding modes. With no padding CBC and + * ECB-mode operations must fail with ErrorCode::INVALID_INPUT_LENGTH if the input isn't a + * multiple of the DES block size. + * + * o HMAC + * + * - Any key size that is between 64 and 512 bits (inclusive) and a multiple of 8 must be + * supported. STRONGBOX IKeymasterDevices must not support keys larger than 512 bits. + * - TRUSTED_ENVIRONMENT IKeymasterDevices must support MD-5, SHA1, SHA-2-224, SHA-2-256, + * SHA-2-384 and SHA-2-512. STRONGBOX IKeymasterDevices must support SHA-2-256. + * + * == Key Access Control == + * + * Hardware-based keys that can never be extracted from the device don't provide much security if an + * attacker can use them at will (though they're more secure than keys which can be + * exfiltrated). Therefore, IKeymasterDevice must enforce access controls. + * + * Access controls are defined as an "authorization list" of tag/value pairs. Authorization tags + * are 32-bit integers from the Tag enum, and the values are a variety of types, defined in the + * TagType enum. Some tags may be repeated to specify multiple values. Whether a tag may be + * repeated is specified in the documentation for the tag and in the TagType. When a key is created + * or imported, the caller specifies an authorization list. The IKeymasterDevice must divide the + * caller-provided authorizations into two lists, those it enforces in hardware and those it does + * not. These two lists are returned as the "hardwareEnforced" and "softwareEnforced" elements of + * the KeyCharacteristics struct. The IKeymasterDevice must also add the following authorizations + * to the appropriate list: + * + * o Tag::OS_VERSION, must be hardware-enforced. + * o Tag::OS_PATCHLEVEL, must be hardware-enforced. + * o Tag::VENDOR_PATCHLEVEL, must be hardware-enforced. + * o Tag::BOOT_PATCHLEVEL, must be hardware-enforced. + * o Tag::CREATION_DATETIME, must be software-enforced, unless the IKeymasterDevice has access to + * a secure time service. + * o Tag::ORIGIN, must be hardware-enforced. + * + * The IKeymasterDevice must accept arbitrary, unknown tags and return them in the softwareEnforced + * list. + * + * All authorization tags and their values, both hardwareEnforced and softwareEnforced, including + * unknown tags, must be cryptographically bound to the private/secret key material such that any + * modification of the portion of the key blob that contains the authorization list makes it + * impossible for the secure environment to obtain the private/secret key material. The recommended + * approach to meet this requirement is to use the full set of authorization tags associated with a + * key as input to a secure key derivation function used to derive a key that is used to encrypt the + * private/secret key material. + * + * IKeymasterDevice implementations must place any tags they cannot fully and completely enforce in + * the softwareEnforced list. For example, Tag::ORIGINATION_EXPIRE_DATETIME provides the date and + * time after which a key may not be used to encrypt or sign new messages. Unless the + * IKeymasterDevice has access to a secure source of current date/time information, it is not + * possible for the IKeymasterDevice to enforce this tag. An IKeymasterDevice implementation may + * not rely on the non-secure world's notion of time, because it could be controlled by an attacker. + * Similarly, it cannot rely on GPSr time, even if it has exclusive control of the GPSr, because + * that might be spoofed by attacker RF signals. + * + * It is recommended that IKeymasterDevices not enforce any tags they place in the softwareEnforced + * list. The IKeymasterDevice caller must enforce them, and it is unnecessary to enforce them + * twice. + * + * Some tags must be enforced by the IKeymasterDevice. See the detailed documentation on each Tag + * in types.hal. + * + * == Root of Trust Binding == + * + * IKeymasterDevice keys must be bound to a root of trust, which is a bitstring that must be + * provided to the secure environment (by an unspecified, implementation-defined mechanism) during + * startup, preferably by the bootloader. This bitstring must be cryptographically bound to every + * key managed by the IKeymasterDevice. As above, the recommended mechanism for this cryptographic + * binding is to include the Root of Trust data in the input to the key derivation function used to + * derive a key that is used to encryp the private/secret key material. + * + * The root of trust consists of a bitstring that must be derived from the public key used by + * Verified Boot to verify the signature on the boot image and from the the lock state of the + * device. If the public key is changed to allow a different system image to be used or if the lock + * state is changed, then all of the IKeymasterDevice-protected keys created by the previous system + * state must be unusable, unless the previous state is restored. The goal is to increase the value + * of the software-enforced key access controls by making it impossible for an attacker-installed + * operating system to use IKeymasterDevice keys. + * + * == Version Binding == + * + * All keys must also be bound to the operating system and patch level of the system image and the + * patch levels of the vendor image and boot image. This ensures that an attacker who discovers a + * weakness in an old version of the software cannot roll a device back to the vulnerable version + * and use keys created with the newer version. In addition, when a key with a given version and + * patch level is used on a device that has been upgraded to a newer version or patch level, the key + * must be upgraded (See IKeymasterDevice::upgradeKey()) before it can be used, and the previous + * version of the key must be invalidated. In this way, as the device is upgraded, the keys will + * "ratchet" forward along with the device, but any reversion of the device to a previous release + * will cause the keys to be unusable. + * + * This version information must be associated with every key as a set of tag/value pairs in the + * hardwareEnforced authorization list. Tag::OS_VERSION, Tag::OS_PATCHLEVEL, + * Tag::VENDOR_PATCHLEVEL, and Tag::BOOT_PATCHLEVEL must be cryptographically bound to every + * IKeymasterDevice key, as described in the Key Access Control section above. */ + interface IKeymasterDevice { /** - * Returns information about the underlying Keymaster hardware. + * Returns information about the underlying IKeymasterDevice hardware. * - * @return security level of the Keymaster implementation accessed through this HAL. + * @return security level of the IKeymasterDevice implementation accessed through this HAL. * - * @return keymasterName is the name of the Keymaster implementation. + * @return keymasterName is the name of the IKeymasterDevice implementation. * - * @return keymasterAuthorName is the name of the author of the Keymaster implementation + * @return keymasterAuthorName is the name of the author of the IKeymasterDevice implementation * (organization name, not individual). */ getHardwareInfo() generates (SecurityLevel securityLevel, string keymasterName, string keymasterAuthorName); /** - * Start the creation of an HMAC key, shared with another Keymaster implementation. Any device - * with a StrongBox Keymaster has two Keymaster instances, because there must be a TEE Keymaster - * as well. The HMAC key used to MAC and verify authentication tokens must be shared between - * TEE and StrongBox so they can each validate tokens produced by the other. This method is the - * first step in the process for for agreeing on a shared key. It is called by Keystore during - * startup if and only if Keystore loads multiple Keymaster HALs. Keystore calls it on each of - * the HAL instances and collects the results in preparation for the second step. + * Start the creation of an HMAC key, shared with another IKeymasterDevice implementation. Any + * device with a StrongBox IKeymasterDevice has two IKeymasterDevice instances, because there + * must be a TEE Keymaster as well. The HMAC key used to MAC and verify authentication tokens + * (HardwareAuthToken, VerificationToken and ConfirmationToken all use this HMAC key) must be + * shared between TEE and StrongBox so they can each validate tokens produced by the other. + * This method is the first step in the process for for agreeing on a shared key. It is called + * by Android during startup. The system calls it on each of the HAL instances and collects the + * results in preparation for the second step. + * + * @return error ErrorCode::OK on success, ErrorCode::UNIMPLEMENTED if HMAC agreement is not + * implemented (note that all 4.0::IKeymasterDevice HALS must implement HMAC agreement, + * regardless of whether or not the HAL will be used on a device with StrongBox), or + * ErrorCode::UNKNOWN_ERROR if the parameters cannot be returned. + * + * @return params The HmacSharingParameters to use. As specified in the HmacSharingParameters + * documentation in types.hal, the seed must contain the same value in every invocation + * of the method on a given device, and the nonce must return the same value for every + * invocation during a boot session. */ getHmacSharingParameters() generates (ErrorCode error, HmacSharingParameters params); /** - * Complete the creation of an HMAC key, shared with another Keymaster implementation. Any - * device with a StrongBox Keymaster has two Keymasters instances, because there must be a TEE - * Keymaster as well. The HMAC key used to MAC and verify authentication tokens must be shared - * between TEE and StrongBox so they can each validate tokens produced by the other. This - * method is the second and final step in the process for agreeing on a shared key. It is - * called by Keystore during startup if and only if Keystore loads multiple Keymaster HALs. - * Keystore calls it on each of the HAL instances, and sends to it all of the - * HmacSharingParameters returned by all HALs. + * Complete the creation of an HMAC key, shared with another IKeymasterDevice implementation. + * Any device with a StrongBox IKeymasterDevice has two IKeymasterDevice instances, because + * there must be a TEE IKeymasterDevice as well. The HMAC key used to MAC and verify + * authentication tokens must be shared between TEE and StrongBox so they can each validate + * tokens produced by the other. This method is the second and final step in the process for + * agreeing on a shared key. It is called by Android during startup. The system calls it on + * each of the HAL instances, and sends to it all of the HmacSharingParameters returned by all + * HALs. * - * This method computes the shared 32-byte HMAC ``H'' as follows (all Keymaster instances + * To ensure consistent ordering of the HmacSharingParameters, the caller must sort the + * parameters lexicographically. See the support/keymaster_utils.cpp for an operator< that + * defines the appropriate ordering. + * + * This method computes the shared 32-byte HMAC ``H'' as follows (all IKeymasterDevice instances * perform the same computation to arrive at the same result): * * H = CKDF(key = K, @@ -70,25 +258,27 @@ interface IKeymasterDevice { * * ``CKDF'' is the standard AES-CMAC KDF from NIST SP 800-108 in counter mode (see Section * 5.1 of the referenced publication). ``key'', ``context'', and ``label'' are - * defined in the standard. The counter is prefixed, as shown in the construction on - * page 12 of the standard. The label string is UTF-8 encoded. + * defined in the standard. The counter is prefixed and length L appended, as shown + * in the construction on page 12 of the standard. The label string is UTF-8 encoded. * * ``K'' is a pre-established shared secret, set up during factory reset. The mechanism for * establishing this shared secret is implementation-defined, but see below for a - * recommended approach, which assumes that the TEE Keymaster does not have storage - * available to it, but the StrongBox Keymaster does. + * recommended approach, which assumes that the TEE IKeymasterDevice does not have + * storage available to it, but the StrongBox IKeymasterDevice does. * - * CRITICAL SECURITY REQUIREMENT: All keys created by a Keymaster instance must + * CRITICAL SECURITY REQUIREMENT: All keys created by a IKeymasterDevice instance must * be cryptographically bound to the value of K, such that establishing a new K * permanently destroys them. * * ``||'' represents concatenation. * * ``Pi'' is the i'th HmacSharingParameters value in the params vector. Note that at - * present only two Keymaster implementations are supported, but this mechanism + * present only two IKeymasterDevice implementations are supported, but this mechanism * extends without modification to any number of implementations. Encoding of an * HmacSharingParameters is the concatenation of its two fields, i.e. seed || nonce. * + * Note that the label "KeymasterSharedMac" is the 18-byte UTF-8 encoding of the string. + * * Process for establishing K: * * Any method of securely establishing K that ensures that an attacker cannot obtain or @@ -98,19 +288,19 @@ interface IKeymasterDevice { * have secure persistent storage. This model was chosen because StrongBox has secure * persistent storage (by definition), but the TEE may not. The instance without storage is * assumed to be able to derive a unique hardware-bound key (HBK) which is used only for - * this purpose, and is not derivable outside of the secure environment.. + * this purpose, and is not derivable outside the secure environment. * - * In what follows, T is the Keymaster instance without storage, S is the Keymaster instance - * with storage: + * In what follows, T is the IKeymasterDevice instance without storage, S is the + * IKeymasterDevice instance with storage: * - * 1. T generates an ephemeral EC P-256 key pair K1 + * 1. T generates an ephemeral EC P-256 key pair K1. * 2. T sends K1_pub to S, signed with T's attestation key. * 3. S validates the signature on K1_pub. * 4. S generates an ephemeral EC P-256 key pair K2. * 5. S sends {K1_pub, K2_pub}, to T, signed with S's attestation key. - * 6. T validates the signature on {K1_pub, K2_pub} + * 6. T validates the signature on {K1_pub, K2_pub}. * 7. T uses {K1_priv, K2_pub} with ECDH to compute session secret Q. - * 8. T generates a random seed S + * 8. T generates a random seed S. * 9. T computes K = KDF(HBK, S), where KDF is some secure key derivation function. * 10. T sends M = AES-GCM-ENCRYPT(Q, {S || K}) to S. * 10. S uses {K2_priv, K1_pub} with ECDH to compute session secret Q. @@ -121,40 +311,54 @@ interface IKeymasterDevice { * T receives the computeSharedHmac call, it uses the seed provided by S to compute K. S, * of course, has K stored. * - * @param params The HmacSharingParameters data returned by all Keymaster instances when + * @param params The HmacSharingParameters data returned by all IKeymasterDevice instances when * getHmacSharingParameters was called. * - * @return sharingCheck A 32-byte value used to verify that all Keymaster instances have + * @return error ErrorCode::OK in the event that there is no error. ErrorCode::INVALID_ARGUMENT + * if one of the provided parameters is not the value returned by the prior call to + * getHmacParameters(). + * + * @return sharingCheck A 32-byte value used to verify that all IKeymasterDevice instances have * computed the same shared HMAC key. The sharingCheck value is computed as follows: * * sharingCheck = HMAC(H, "Keymaster HMAC Verification") * - * The string is UTF-8 encoded. If the returned values of all Keymaster instances don't - * match, Keystore will assume that HMAC agreement failed. + * The string is UTF-8 encoded, 27 bytes in length. If the returned values of all + * IKeymasterDevice instances don't match, Keystore will assume that HMAC agreement + * failed. */ computeSharedHmac(vec params) generates (ErrorCode error, vec sharingCheck); /** - * Verify authorizations for another Keymaster instance. + * Verify authorizations for another IKeymasterDevice instance. * - * On systems with both a StrongBox and a TEE Keymaster instance it is sometimes useful to ask - * the TEE Keymaster to verify authorizations for a key hosted in StrongBox. + * On systems with both a StrongBox and a TEE IKeymasterDevice instance it is sometimes useful + * to ask the TEE IKeymasterDevice to verify authorizations for a key hosted in StrongBox. * * For every StrongBox operation, Keystore is required to call this method on the TEE Keymaster, * passing in the StrongBox key's hardwareEnforced authorization list and the operation handle - * returned by StrongBox begin(). The TEE Keymaster must validate all of the authorizations it - * can and return those it validated in the VerificationToken. If it cannot verify any, the - * parametersVerified field of the VerificationToken must be empty. Keystore must then pass the - * VerificationToken to the subsequent invocations of StrongBox update() and finish(). + * returned by StrongBox begin(). The TEE IKeymasterDevice must validate all of the + * authorizations it can and return those it validated in the VerificationToken. If it cannot + * verify any, the parametersVerified field of the VerificationToken must be empty. Keystore + * must then pass the VerificationToken to the subsequent invocations of StrongBox update() and + * finish(). * * StrongBox implementations must return ErrorCode::UNIMPLEMENTED. * * @param operationHandle the operation handle returned by StrongBox Keymaster's begin(). * - * @param parametersToVerify Set of authorizations to verify. + * @param parametersToVerify Set of authorizations to verify. The caller may provide an empty + * vector if the only required information is the TEE timestamp. * * @param authToken A HardwareAuthToken if needed to authorize key usage. + * + * @return error ErrorCode::OK on success or ErrorCode::UNIMPLEMENTED if the IKeymasterDevice is + * a StrongBox. If the IKeymasterDevice cannot verify one or more elements of + * parametersToVerify it must not return an error code, but just omit the unverified + * parameter from the VerificationToken. + * + * @return token the verification token. See VerificationToken in types.hal for details. */ verifyAuthorization(uint64_t operationHandle, vec parametersToVerify, HardwareAuthToken authToken) @@ -162,53 +366,143 @@ interface IKeymasterDevice { /** - * Adds entropy to the RNG used by Keymaster. Entropy added through this method is guaranteed - * not to be the only source of entropy used, and the mixing function is required to be secure, - * in the sense that if the RNG is seeded (from any source) with any data the attacker cannot - * predict (or control), then the RNG output is indistinguishable from random. Thus, if the - * entropy from any source is good, the output must be good. + * Adds entropy to the RNG used by Keymaster. Entropy added through this method must not be the + * only source of entropy used, and a secure mixing function must be used to mix the entropy + * provided by this method with internally-generated entropy. The mixing function must be + * secure in the sense that if any one of the mixing function inputs is provided with any data + * the attacker cannot predict (or control), then the output of the seeded CRNG is + * indistinguishable from random. Thus, if the entropy from any source is good, the output must + * be good. * - * @param data Bytes to be mixed into the RNG. + * @param data Bytes to be mixed into the CRNG seed. The caller must not provide more than 2 + * KiB of data per invocation. * - * @return error See the ErrorCode enum in types.hal. + * @return error ErrorCode::OK on success; ErrorCode::INVALID_INPUT_LENGTH if the caller + * provides more than 2 KiB of data. */ addRngEntropy(vec data) generates (ErrorCode error); /** - * Generates a key, or key pair, returning a key blob and a description of the key. + * Generates a new cryptographic key, specifying associated parameters, which must be + * cryptographically bound to the key. IKeymasterDevice implementations must disallow any use + * of a key in any way inconsistent with the authorizations specified at generation time. With + * respect to parameters that the secure environment cannot enforce, the secure envionment's + * obligation is limited to ensuring that the unenforceable parameters associated with the key + * cannot be modified, so that every call to getKeyCharacteristics returns the original + * values. In addition, the characteristics returned by generateKey places parameters correctly + * in the hardware-enforced and software-enforced lists. See getKeyCharacteristics for more + * details. * - * @param keyParams Key generation parameters are defined as Keymaster tag/value pairs, provided - * in params. See Tag in types.hal for the full list. + * In addition to the parameters provided, generateKey must add the following to the returned + * characteristics. * - * @return error See the ErrorCode enum in types.hal. + * o Tag::ORIGIN with the value KeyOrigin::GENERATED. * - * @return keyBlob Opaque, encrypted descriptor of the generated key. A recommended - * implementation strategy is to include an encrypted copy of the key material, wrapped - * in a key unavailable outside secure hardware. + * o Tag::BLOB_USAGE_REQUIREMENTS with the appropriate value (see KeyBlobUsageRequirements in + * types.hal). * - * @return keyCharacteristics Description of the generated key. See KeyCharacteristis in - * types.hal. + * o Tag::CREATION_DATETIME with the appropriate value. Note that it is expected that this will + * generally be added by the HAL, not by the secure environment, and that it will be in the + * software-enforced list. It must be cryptographically bound to the key, like all tags. + * + * o Tag::OS_VERSION, Tag::OS_PATCHLEVEL, Tag::VENDOR_PATCHLEVEL and Tag::BOOT_PATCHLEVEL with + * appropriate values. + * + * The parameters provided to generateKey depend on the type of key being generated. This + * section summarizes the necessary and optional tags for each type of key. Tag::ALGORITHM is + * always necessary, to specify the type. + * + * == RSA Keys == + * + * The following parameters are required to generate an RSA key: + * + * o Tag::Key_SIZE specifies the size of the public modulus, in bits. If omitted, generateKey + * must return ErrorCode::UNSUPPORTED_KEY_SIZE. Required values for TEE IKeymasterDevice + * implementations are 1024, 2048, 3072 and 4096. StrongBox IKeymasterDevice implementations + * must support 2048. + * + * o Tag::RSA_PUBLIC_EXPONENT specifies the RSA public exponent value. If omitted, generateKey + * must return ErrorCode::INVALID_ARGUMENT. The values 3 and 65537 must be supported. It is + * recommended to support all prime values up to 2^64. If provided with a non-prime value, + * generateKey must return ErrorCode::INVALID_ARGUMENT. + * + * The following parameters are not necessary to generate a usable RSA key, but generateKey must + * not return an error if they are omitted: + * + * o Tag::PURPOSE specifies allowed purposes. All KeyPurpose values (see types.hal) must be + * supported for RSA keys. + * + * o Tag::DIGEST specifies digest algorithms that may be used with the new key. TEE + * IKeymasterDevice implementatiosn must support all Digest values (see types.hal) for RSA + * keys. StrongBox IKeymasterDevice implementations must support SHA_2_256. + * + * o Tag::PADDING specifies the padding modes that may be used with the new + * key. IKeymasterDevice implementations must support PaddingMode::NONE, + * PaddingMode::RSA_OAEP, PaddingMode::RSA_PSS, PaddingMode::RSA_PKCS1_1_5_ENCRYPT and + * PaddingMode::RSA_PKCS1_1_5_SIGN for RSA keys. + * + * == ECDSA Keys == + * + * Either Tag::KEY_SIZE or Tag::EC_CURVE must be provided to generate an ECDSA key. If neither + * is provided, generateKey must return ErrorCode::UNSUPPORTED_KEY_SIZE. If Tag::KEY_SIZE is + * provided, the possible values are 224, 256, 384 and 521, and must be mapped to Tag::EC_CURVE + * values P_224, P_256, P_384 and P_521, respectively. TEE IKeymasterDevice implementations + * must support all curves. StrongBox implementations must support P_256. + * + * == AES Keys == + * + * Only Tag::KEY_SIZE is required to generate an AES key. If omitted, generateKey must return + * ErrorCode::UNSUPPORTED_KEY_SIZE. 128 and 256-bit key sizes must be supported. + * + * If Tag::BLOCK_MODE is specified with value BlockMode::GCM, then the caller must also provide + * Tag::MIN_MAC_LENGTH. If omitted, generateKey must return ErrorCode::MISSING_MIN_MAC_LENGTH. + * + * + * @param keyParams Key generation parameters are defined as IKeymasterDevice tag/value pairs, + * provided in params. See above for detailed specifications of which tags are required + * for which types of keys. + * + * @return keyBlob Opaque descriptor of the generated key. The recommended implementation + * strategy is to include an encrypted copy of the key material, wrapped in a key + * unavailable outside secure hardware. + * + * @return keyCharacteristics Description of the generated key. See the getKeyCharacteristics + * method below. */ generateKey(vec keyParams) generates (ErrorCode error, vec keyBlob, KeyCharacteristics keyCharacteristics); /** - * Imports a key, or key pair, returning a key blob and/or a description of the key. + * Imports key material into an IKeymasterDevice. Key definition parameters and return values + * are the same as for generateKey, with the following exceptions: * - * @param keyParams Key generation parameters are defined as Keymaster tag/value pairs, provided - * in params. See Tag for the full list. + * o Tag::KEY_SIZE is not necessary in the input parameters. If not provided, the + * IKeymasterDevice must deduce the value from the provided key material and add the tag and + * value to the key characteristics. If Tag::KEY_SIZE is provided, the IKeymasterDevice must + * validate it against the key material. In the event of a mismatch, importKey must return + * ErrorCode::IMPORT_PARAMETER_MISMATCH. * - * @param keyFormat The format of the key material to import. + * o Tag::RSA_PUBLIC_EXPONENT (for RSA keys only) is not necessary in the input parameters. If + * not provided, the IKeymasterDevice must deduce the value from the provided key material and + * add the tag and value to the key characteristics. If Tag::RSA_PUBLIC_EXPONENT is provided, + * the IKeymasterDevice must validate it against the key material. In the event of a + * mismatch, importKey must return ErrorCode::IMPORT_PARAMETER_MISMATCH. + * + * o Tag::ORIGIN (returned in keyCharacteristics) must have the value KeyOrigin::IMPORTED. + * + * @param keyParams Key generation parameters are defined as IKeymasterDevice tag/value pairs, + * provided in params. + * + * @param keyFormat The format of the key material to import. See KeyFormat in types.hal. * * @pram keyData The key material to import, in the format specifed in keyFormat. * - * @return error See the ErrorCode enum. + * @return keyBlob Opaque descriptor of the imported key. The recommended implementation + * strategy is to include an encrypted copy of the key material, wrapped in a key + * unavailable outside secure hardware. * - * @return keyBlob Opaque, encrypted descriptor of the generated key, which will generally - * contain a copy of the key material, wrapped in a key unavailable outside secure - * hardware. - * - * @return keyCharacteristics Decription of the generated key. + * @return keyCharacteristics Decription of the generated key. See the getKeyCharacteristics + * method below. */ importKey(vec keyParams, KeyFormat keyFormat, vec keyData) generates (ErrorCode error, vec keyBlob, KeyCharacteristics keyCharacteristics); @@ -241,10 +535,10 @@ interface IKeymasterDevice { * o keyParams is the characteristics of the key to be imported (as with generateKey or * importKey). If the secure import is successful, these characteristics must be * associated with the key exactly as if the key material had been insecurely imported - * with the @3.0::IKeymasterDevice::importKey. + * with the @3.0::IKeymasterDevice::importKey. See attestKey() for documentation of the + * AuthorizationList schema. * o encryptedTransportKey is a 256-bit AES key, XORed with a masking key and then encrypted - * in RSA-OAEP mode (SHA-256 digest, SHA-1 MGF1 digest) with the wrapping key specified by - * wrappingKeyBlob. + * with the wrapping key specified by wrappingKeyBlob. * o keyDescription is a KeyDescription, above. * o encryptedKey is the key material of the key to be imported, in format keyFormat, and * encrypted with encryptedEphemeralKey in AES-GCM mode, with the DER-encoded @@ -266,10 +560,7 @@ interface IKeymasterDevice { * that the origin tag should be set to SECURELY_IMPORTED. * * @param wrappingKeyBlob The opaque key descriptor returned by generateKey() or importKey(). - * This key must have been created with Purpose::WRAP_KEY, and must be a key algorithm - * that supports encryption and must be at least as strong (in key size) as the key to be - * imported (per NIST key length recommendations: 112 bits symmetric is equivalent to - * 2048-bit RSA or 224-bit EC, 128 bits symmetric ~ 3072-bit RSA or 256-bit EC, etc.). + * This key must have been created with Purpose::WRAP_KEY. * * @param maskingKey The 32-byte value XOR'd with the transport key in the SecureWrappedKey * structure. @@ -291,8 +582,6 @@ interface IKeymasterDevice { * If the wrappedKeyData does not contain such a tag and value, this argument must be * ignored. * - * @return error See the ErrorCode enum. - * * @return keyBlob Opaque descriptor of the imported key. It is recommended that the keyBlob * contain a copy of the key material, wrapped in a key unavailable outside secure * hardware. @@ -303,10 +592,18 @@ interface IKeymasterDevice { generates(ErrorCode error, vec keyBlob, KeyCharacteristics keyCharacteristics); /** - * Returns the characteristics of the specified key, if the keyBlob is valid (implementations - * must fully validate the integrity of the key). + * Returns parameters associated with the provided key, divided into two sets: hardware-enforced + * and software-enforced. The description here applies equally to the key characteristics lists + * returned by generateKey, importKey and importWrappedKey. The characteristics returned by + * this method completely describe the type and usage of the specified key. * - * @param keyBlob The opaque descriptor returned by generateKey() or importKey(); + * The rule that IKeymasterDevice implementations must use for deciding whether a given tag + * belongs in the hardware-enforced or software-enforced list is that if the meaning of the tag + * is fully assured by secure hardware, it is hardware enforced. Otherwise, it's software + * enforced. + * + * + * @param keyBlob The opaque descriptor returned by generateKey, importKey or importWrappedKey. * * @param clientId An opaque byte string identifying the client. This value must match the * Tag::APPLICATION_ID data provided during key generation/import. Without the correct @@ -318,9 +615,7 @@ interface IKeymasterDevice { * value, it must be computationally infeasible for the secure hardware to obtain the key * material. * - * @return error See the ErrorCode enum in types.hal. - * - * @return keyCharacteristics Decription of the generated key. See KeyCharacteristis in + * @return keyCharacteristics Decription of the generated key. See KeyCharacteristics in * types.hal. */ getKeyCharacteristics(vec keyBlob, vec clientId, vec appData) @@ -344,8 +639,6 @@ interface IKeymasterDevice { * value, it must be computationally infeasible for the secure hardware to obtain the key * material. * - * @return error See the ErrorCode enum in types.hal. - * * @return keyMaterial The public key material in PKCS#8 format. */ exportKey(KeyFormat keyFormat, vec keyBlob, vec clientId, @@ -353,56 +646,191 @@ interface IKeymasterDevice { /** * Generates a signed X.509 certificate chain attesting to the presence of keyToAttest in - * Keymaster. The certificate must contain an extension with OID 1.3.6.1.4.1.11129.2.1.17 and - * value defined in: + * Keymaster. * - * https://developer.android.com/training/articles/security-key-attestation.html. + * The certificates in the chain must be ordered such that each certificate is signed by the + * subsequent one, up to the root which must be self-signed. The first certificate in the chain + * signs the public key info of the attested key and must contain the following entries (see RFC + * 5280 for details on each): + * + * o version -- with value 2 + * + * o serialNumber -- with value 1 (same value for all keys) + * + * o signature -- contains an the AlgorithmIdentifier of the algorithm used to sign, must be + * ECDSA for EC keys, RSA for RSA keys. + * + * o issuer -- must contain the same value as the Subject field of the next certificate. + * + * o validity -- SEQUENCE of two dates, containing the values of Tag::ACTIVE_DATETIME and + * Tag::USAGE_EXPIRE_DATETIME. The tag values are in milliseconds since Jan 1, 1970; see RFD + * 5280 for the correct representation in certificates. If Tag::ACTIVE_DATETIME is not + * present in the key, the IKeymasterDevice must use the value of Tag::CREATION_DATETIME. If + * Tag::USAGE_EXPIRE_DATETIME is not present, the IKeymasterDevice must use the expiration + * date of the batch attestation certificate (see below). + * + * o subject -- CN="Android Keystore Key" (same value for all keys) + * + * o subjectPublicKeyInfo -- X.509 SubjectPublicKeyInfo containing the attested public key. + * + * o Key Usage extension -- digitalSignature bit must be set iff the attested key has + * KeyPurpose::SIGN. dataEncipherment bit must be set iff the attested key has + * KeyPurpose::DECRYPT. keyEncipherment bit must be set iff the attested key has + * KeyPurpose::KEY_WRAP. All other bits must be clear. + * + * In addition to the above, the attestation certificate must contain an extension with OID + * 1.3.6.1.4.1.11129.2.1.17 and value according to the KeyDescription schema defined as: + * + * KeyDescription ::= SEQUENCE { + * attestationVersion INTEGER, # Value 3 + * attestationSecurityLevel SecurityLevel, # See below + * keymasterVersion INTEGER, # Value 4 + * keymasterSecurityLevel SecurityLevel, # See below + * attestationChallenge OCTET_STRING, # Tag::ATTESTATION_CHALLENGE from attestParams + * uniqueId OCTET_STRING, # Empty unless key has Tag::INCLUDE_UNIQUE_ID + * softwareEnforced AuthorizationList, # See below + * hardwareEnforced AuthorizationList, # See below + * } + * + * SecurityLevel ::= ENUMERATED { + * Software (0), + * TrustedEnvironment (1), + * StrongBox (2), + * } + * + * RootOfTrust ::= SEQUENCE { + * verifiedBootKey OCTET_STRING, + * deviceLocked BOOLEAN, + * verifiedBootState VerifiedBootState, + * # verifiedBootHash must contain 32-byte value that represents the state of all binaries + * # or other components validated by verified boot. Updating any verified binary or + * # component must cause this value to change. + * verifiedBootHash OCTET_STRING, + * } + * + * VerifiedBootState ::= ENUMERATED { + * Verified (0), + * SelfSigned (1), + * Unverified (2), + * Failed (3), + * } + * + * AuthorizationList ::= SEQUENCE { + * purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, + * algorithm [2] EXPLICIT INTEGER OPTIONAL, + * keySize [3] EXPLICIT INTEGER OPTIONAL. + * blockMode [4] EXPLICIT SET OF INTEGER OPTIONAL, + * digest [5] EXPLICIT SET OF INTEGER OPTIONAL, + * padding [6] EXPLICIT SET OF INTEGER OPTIONAL, + * ecCurve [10] EXPLICIT INTEGER OPTIONAL, + * rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, + * rollbackResistance [303] EXPLICIT NULL OPTIONAL, + * activeDateTime [400] EXPLICIT INTEGER OPTIONAL + * originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL + * usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL + * noAuthRequired [503] EXPLICIT NULL OPTIONAL, + * userAuthType [504] EXPLICIT INTEGER OPTIONAL, + * authTimeout [505] EXPLICIT INTEGER OPTIONAL, + * allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, + * trustedUserPresenceReq [507] EXPLICIT NULL OPTIONAL, + * trustedConfirmationReq [508] EXPLICIT NULL OPTIONAL, + * unlockedDeviceReq [509] EXPLICIT NULL OPTIONAL, + * allApplications [600] EXPLICIT NULL OPTIONAL, + * applicationId [601] EXPLICIT OCTET_STRING OPTIONAL, + * creationDateTime [701] EXPLICIT INTEGER OPTIONAL, + * origin [702] EXPLICIT INTEGER OPTIONAL, + * rollbackResistant [703] EXPLICIT NULL OPTIONAL, + * rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, + * osVersion [705] EXPLICIT INTEGER OPTIONAL, + * osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, + * attestationChallenge [708] EXPLICIT OCTET_STRING OPTIONAL, + * attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, + * attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, + * attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, + * attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, + * attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, + * attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, + * attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, + * attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, + * attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, + * vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, + * bootPatchLevel [718] EXPLICIT INTEGER OPTIONAL, + * } + * + * The above schema is mostly a straightforward translation of the IKeymasterDevice tag/value + * parameter lists to ASN.1: + * + * o TagType::ENUM, TagType::UINT, TagType::ULONG and TagType::DATE tags are represented as + * ASN.1 INTEGER. + * + * o TagType::ENUM_REP, TagType::UINT_REP and TagType::ULONG_REP tags are represented as ASN.1 + * SET of INTEGER. + * + * o TagType::BOOL tags are represented as ASN.1 NULL. All entries in AuthorizationList are + * OPTIONAL, so the presence of the tag means "true", absence means "false". + * + * o TagType::BYTES tags are represented as ASN.1 OCTET_STRING. + * + * The numeric ASN.1 tag numbers are the same values as the IKeymasterDevice Tag enum values, + * except with the TagType modifier stripped. + * + * The attestation certificate must be signed by a "batch" key, which must be securely + * pre-installed into the device, generally in the factory, and securely stored to prevent + * access or extraction. The batch key must be used only for signing attestation certificates. + * The batch attestation certificate must be signed by a chain or zero or more intermediates + * leading to a self-signed roots. The intermediate and root certificate signing keys must not + * exist anywhere on the device. + * + * == ID Attestation == + * + * ID attestation is a special case of key attestation in which unique device ID values are + * included in the signed attestation certificate. * * @param keyToAttest The opaque descriptor returned by generateKey() or importKey(). The * referenced key must be asymmetric. * - * @param attestParams Parameters for the attestation, notably Tag::ATTESTATION_CHALLENGE. - * - * @return error See the ErrorCode enum in types.hal. + * @param attestParams Parameters for the attestation. Must contain Tag::ATTESTATION_CHALLENGE, + * the value of which must be put in the attestationChallenge field of the KeyDescription + * ASN.1 structure defined above. * * @return certChain The attestation certificate, and additional certificates back to the root * attestation certificate, which clients will need to check against a known-good value. + * The certificates must be DER-encoded. */ attestKey(vec keyToAttest, vec attestParams) generates (ErrorCode error, vec> certChain); /** - * Upgrades an old key blob. Keys can become "old" in two ways: Keymaster can be upgraded to a - * new version with an incompatible key blob format, or the system can be updated to invalidate - * the OS version (OS_VERSION tag), system patch level (OS_PATCHLEVEL tag), vendor patch level - * (VENDOR_PATCH_LEVEL tag), boot patch level (BOOT_PATCH_LEVEL tag) or other, + * Upgrades an old key blob. Keys can become "old" in two ways: IKeymasterDevice can be + * upgraded to a new version with an incompatible key blob format, or the system can be updated + * to invalidate the OS version (OS_VERSION tag), system patch level (OS_PATCHLEVEL tag), vendor + * patch level (VENDOR_PATCH_LEVEL tag), boot patch level (BOOT_PATCH_LEVEL tag) or other, * implementation-defined patch level (keymaster implementers are encouraged to extend this HAL - * with a minor version extension to define validatable patch levels for other images; tags - * must be defined in the implemeter's namespace, starting at 10000). In either case, - * attempts to use an old key blob with getKeyCharacteristics(), exportKey(), attestKey() or - * begin() must result in Keymaster returning ErrorCode::KEY_REQUIRES_UPGRADE. The caller must - * use this method to upgrade the key blob. + * with a minor version extension to define validatable patch levels for other images; tags must + * be defined in the implementer's namespace, starting at 10000). In either case, attempts to + * use an old key blob with getKeyCharacteristics(), exportKey(), attestKey() or begin() must + * result in IKeymasterDevice returning ErrorCode::KEY_REQUIRES_UPGRADE. The caller must use + * this method to upgrade the key blob. * - * If upgradeKey is asked to update a key with any version or patch level that is higher than - * the current system version or patch level, it must return ErrorCode::INVALID_ARGUMENT. There - * is one exception: it is always permissible to "upgrade" from any OS_VERSION number to - * OS_VERSION 0. For example, if the key has OS_VERSION 080001, it is permisible to upgrade the - * key if the current system version is 080100, because the new version is larger, or if the - * current system version is 0, because upgrades to 0 are always allowed. If the system version - * were 080000, however, keymaster must return ErrorCode::INVALID_ARGUMENT because that value is - * smaller than 080001. + * The upgradeKey method must examine each version or patch level associated with the key. If + * any one of them is higher than the corresponding current device value upgradeKey() must + * return ErrorCode::INVALID_ARGUMENT. There is one exception: it is always permissible to + * "downgrade" from any OS_VERSION number to OS_VERSION 0. For example, if the key has + * OS_VERSION 080001, it is permisible to upgrade the key if the current system version is + * 080100, because the new version is larger, or if the current system version is 0, because + * upgrades to 0 are always allowed. If the system version were 080000, however, keymaster must + * return ErrorCode::INVALID_ARGUMENT because that value is smaller than 080001. Values other + * than OS_VERSION must never be downgraded. * * Note that Keymaster versions 2 and 3 required that the system and boot images have the same - * patch level and OS version. This requirement is relaxed for Keymaster 4, and the OS version - * in the boot image footer is no longer used. + * patch level and OS version. This requirement is relaxed for 4.0::IKeymasterDevice, and the + * OS version in the boot image footer is no longer used. * * @param keyBlobToUpgrade The opaque descriptor returned by generateKey() or importKey(); * * @param upgradeParams A parameter list containing any parameters needed to complete the * upgrade, including Tag::APPLICATION_ID and Tag::APPLICATION_DATA. * - * @return error See the ErrorCode enum. - * * @return upgradedKeyBlob A new key blob that references the same key as keyBlobToUpgrade, but * is in the new format, or has the new version data. */ @@ -416,8 +844,6 @@ interface IKeymasterDevice { * unusable. * * @param keyBlob The opaque descriptor returned by generateKey() or importKey(); - * - * @return error See the ErrorCode enum. */ deleteKey(vec keyBlob) generates (ErrorCode error); @@ -441,8 +867,6 @@ interface IKeymasterDevice { * must never attest any device ids. * * This is a NOP if device id attestation is not supported. - * - * @return error See the ErrorCode enum. */ destroyAttestationIds() generates (ErrorCode error); @@ -452,12 +876,180 @@ interface IKeymasterDevice { * to update(), finish() or abort(). * * It is critical that each call to begin() be paired with a subsequent call to finish() or - * abort(), to allow the Keymaster implementation to clean up any internal operation state. The - * caller's failure to do this may leak internal state space or other internal resources and may - * eventually cause begin() to return ErrorCode::TOO_MANY_OPERATIONS when it runs out of space - * for operations. Any result other than ErrorCode::OK from begin(), update() or finish() - * implicitly aborts the operation, in which case abort() need not be called (and must return - * ErrorCode::INVALID_OPERATION_HANDLE if called). + * abort(), to allow the IKeymasterDevice implementation to clean up any internal operation + * state. The caller's failure to do this may leak internal state space or other internal + * resources and may eventually cause begin() to return ErrorCode::TOO_MANY_OPERATIONS when it + * runs out of space for operations. Any result other than ErrorCode::OK from begin(), update() + * or finish() implicitly aborts the operation, in which case abort() need not be called (and + * must return ErrorCode::INVALID_OPERATION_HANDLE if called). IKeymasterDevice implementations + * must support 16 concurrent operations. + * + * If Tag::APPLICATION_ID or Tag::APPLICATION_DATA were specified during key generation or + * import, calls to begin must include those tags with the originally-specified values in the + * inParams argument to this method. If not, begin() must return ErrorCode::INVALID_KEY_BLOB. + * + * == Authorization Enforcement == + * + * The following key authorization parameters must be enforced by the IKeymasterDevice secure + * environment if the tags were returned in the "hardwareEnforced" list in the + * KeyCharacteristics. Public key operations, meaning KeyPurpose::ENCRYPT and + * KeyPurpose::VERIFY must be allowed to succeed even if authorization requirements are not met. + * + * -- All Key Types -- + * + * The tags in this section apply to all key types. See below for additional key type-specific + * tags. + * + * o Tag::PURPOSE: The purpose specified in the begin() call must match one of the purposes in + * the key authorizations. If the specified purpose does not match, begin() must return + * ErrorCode::UNSUPPORTED_PURPOSE. + * + * o Tag::ACTIVE_DATETIME can only be enforced if a trusted UTC time source is available. If + * the current date and time is prior to the tag value, begin() must return + * ErrorCode::KEY_NOT_YET_VALID. + * + * o Tag::ORIGINATION_EXPIRE_DATETIME can only be enforced if a trusted UTC time source is + * available. If the current date and time is later than the tag value and the purpose is + * KeyPurpose::ENCRYPT or KeyPurpose::SIGN, begin() must return ErrorCode::KEY_EXPIRED. + * + * o Tag::USAGE_EXPIRE_DATETIME can only be enforced if a trusted UTC time source is + * available. If the current date and time is later than the tag value and the purpose is + * KeyPurpose::DECRYPT or KeyPurpose::VERIFY, begin() must return ErrorCode::KEY_EXPIRED. + + * o Tag::MIN_SECONDS_BETWEEN_OPS must be compared with a trusted relative timer indicating the + * last use of the key. If the last use time plus the tag value is less than the current + * time, begin() must return ErrorCode::KEY_RATE_LIMIT_EXCEEDED. See the tag description for + * important implementation details. + + * o Tag::MAX_USES_PER_BOOT must be compared against a secure counter that tracks the uses of + * the key since boot time. If the count of previous uses exceeds the tag value, begin() must + * return ErrorCode::KEY_MAX_OPS_EXCEEDED. + * + * o Tag::USER_SECURE_ID must be enforced by this method if and only if the key also has + * Tag::AUTH_TIMEOUT (if it does not have Tag::AUTH_TIMEOUT, the Tag::USER_SECURE_ID + * requirement must be enforced by update() and finish()). If the key has both, then this + * method must receive a non-empty HardwareAuthToken in the authToken argument. For the auth + * token to be valid, all of the following have to be true: + * + * o The HMAC field must validate correctly. + * + * o At least one of the Tag::USER_SECURE_ID values from the key must match at least one of + * the secure ID values in the token. + * + * o The key must have a Tag::USER_AUTH_TYPE that matches the auth type in the token. + * + * o The timestamp in the auth token plus the value of the Tag::AUTH_TIMEOUT must be less than + * the current secure timestamp (which is a monotonic timer counting milliseconds since + * boot.) + * + * If any of these conditions are not met, begin() must return + * ErrorCode::KEY_USER_NOT_AUTHENTICATED. + * + * o Tag::CALLER_NONCE allows the caller to specify a nonce or initialization vector (IV). If + * the key doesn't have this tag, but the caller provided Tag::NONCE to this method, + * ErrorCode::CALLER_NONCE_PROHIBITED must be returned. + * + * o Tag::BOOTLOADER_ONLY specifies that only the bootloader may use the key. If this method is + * called with a bootloader-only key after the bootloader has finished executing, it must + * return ErrorCode::INVALID_KEY_BLOB. The mechanism for notifying the IKeymasterDevice that + * the bootloader has finished executing is implementation-defined. + * + * -- RSA Keys -- + * + * All RSA key operations must specify exactly one padding mode in inParams. If unspecified or + * specified more than once, the begin() must return ErrorCode::UNSUPPORTED_PADDING_MODE. + * + * RSA signing and verification operations need a digest, as do RSA encryption and decryption + * operations with OAEP padding mode. For those cases, the caller must specify exactly one + * digest in inParams. If unspecified or specified more than once, begin() must return + * ErrorCode::UNSUPPORTED_DIGEST. + * + * Private key operations (KeyPurpose::DECRYPT and KeyPurpose::SIGN) need authorization of + * digest and padding, which means that the key authorizations need to contain the specified + * values. If not, begin() must return ErrorCode::INCOMPATIBLE_DIGEST or + * ErrorCode::INCOMPATIBLE_PADDING, as appropriate. Public key operations (KeyPurpose::ENCRYPT + * and KeyPurpose::VERIFY) are permitted with unauthorized digest or padding modes. + * + * With the exception of PaddingMode::NONE, all RSA padding modes are applicable only to certain + * purposes. Specifically, PaddingMode::RSA_PKCS1_1_5_SIGN and PaddingMode::RSA_PSS only + * support signing and verification, while PaddingMode::RSA_PKCS1_1_5_ENCRYPT and + * PaddingMode::RSA_OAEP only support encryption and decryption. begin() must return + * ErrorCode::UNSUPPORTED_PADDING_MODE if the specified mode does not support the specified + * purpose. + * + * There are some important interactions between padding modes and digests: + * + * o PaddingMode::NONE indicates that a "raw" RSA operation is performed. If signing or + * verifying, Digest::NONE is specified for the digest. No digest is necessary for unpadded + * encryption or decryption. + * + * o PaddingMode::RSA_PKCS1_1_5_SIGN padding requires a digest. The digest may be Digest::NONE, + * in which case the Keymaster implementation cannot build a proper PKCS#1 v1.5 signature + * structure, because it cannot add the DigestInfo structure. Instead, the IKeymasterDevice + * must construct 0x00 || 0x01 || PS || 0x00 || M, where M is the provided message and PS is a + * random padding string at least eight bytes in length. The size of the RSA key has to be at + * least 11 bytes larger than the message, otherwise begin() must return + * ErrorCode::INVALID_INPUT_LENGTH. + * + * o PaddingMode::RSA_PKCS1_1_1_5_ENCRYPT padding does not require a digest. + * + * o PaddingMode::RSA_PSS padding requires a digest, which may not be Digest::NONE. If + * Digest::NONE is specified, the begin() must return ErrorCode::INCOMPATIBLE_DIGEST. In + * addition, the size of the RSA key must be at least 2 + D bytes larger than the output size + * of the digest, where D is the size of the digest, in bytes. Otherwise begin() must + * return ErrorCode::INCOMPATIBLE_DIGEST. The salt size must be D. + * + * o PaddingMode::RSA_OAEP padding requires a digest, which may not be Digest::NONE. If + * Digest::NONE is specified, begin() must return ErrorCode::INCOMPATIBLE_DIGEST. The OAEP + * mask generation function must be MGF1 and the MGF1 digest must be SHA1, regardless of the + * OAEP digest specified. + * + * -- EC Keys -- + * + * EC key operations must specify exactly one padding mode in inParams. If unspecified or + * specified more than once, begin() must return ErrorCode::UNSUPPORTED_PADDING_MODE. + * + * Private key operations (KeyPurpose::SIGN) need authorization of digest and padding, which + * means that the key authorizations must contain the specified values. If not, begin() must + * return ErrorCode::INCOMPATIBLE_DIGEST. Public key operations (KeyPurpose::VERIFY) are + * permitted with unauthorized digest or padding. + * + * -- AES Keys -- + * + * AES key operations must specify exactly one block mode (Tag::BLOCK_MODE) and one padding mode + * (Tag::PADDING) in inParams. If either value is unspecified or specified more than once, + * begin() must return ErrorCode::UNSUPPORTED_BLOCK_MODE or + * ErrorCode::UNSUPPORTED_PADDING_MODE. The specified modes must be authorized by the key, + * otherwise begin() must return ErrorCode::INCOMPATIBLE_BLOCK_MODE or + * ErrorCode::INCOMPATIBLE_PADDING_MODE. + * + * If the block mode is BlockMode::GCM, inParams must specify Tag::MAC_LENGTH, and the specified + * value must be a multiple of 8 that is not greater than 128 or less than the value of + * Tag::MIN_MAC_LENGTH in the key authorizations. For MAC lengths greater than 128 or + * non-multiples of 8, begin() must return ErrorCode::UNSUPPORTED_MAC_LENGTH. For values less + * than the key's minimum length, begin() must return ErrorCode::INVALID_MAC_LENGTH. + * + * If the block mode is BlockMode::GCM or BlockMode::CTR, the specified padding mode must be + * PaddingMode::NONE. For BlockMode::ECB or BlockMode::CBC, the mode may be PaddingMode::NONE + * or PaddingMode::PKCS7. If the padding mode doesn't meet these conditions, begin() must + * return ErrorCode::INCOMPATIBLE_PADDING_MODE. + * + * If the block mode is BlockMode::CBC, BlockMode::CTR, or BlockMode::GCM, an initialization + * vector or nonce is required. In most cases, callers shouldn't provide an IV or nonce and the + * IKeymasterDevice implementation must generate a random IV or nonce and return it via + * Tag::NONCE in outParams. CBC and CTR IVs are 16 bytes. GCM nonces are 12 bytes. If the key + * authorizations contain Tag::CALLER_NONCE, then the caller may provide an IV/nonce with + * Tag::NONCE in inParams. If a nonce is provided when Tag::CALLER_NONCE is not authorized, + * begin() must return ErrorCode::CALLER_NONCE_PROHIBITED. If a nonce is not provided when + * Tag::CALLER_NONCE is authorized, IKeymasterDevice msut generate a random IV/nonce. + * + * -- HMAC keys -- + * + * HMAC key operations must specify Tag::MAC_LENGTH in inParams. The specified value must be a + * multiple of 8 that is not greater than the digest length or less than the value of + * Tag::MIN_MAC_LENGTH in the key authorizations. For MAC lengths greater than the digest + * length or non-multiples of 8, begin() must return ErrorCode::UNSUPPORTED_MAC_LENGTH. For + * values less than the key's minimum length, begin() must return ErrorCode::INVALID_MAC_LENGTH. * * @param purpose The purpose of the operation, one of KeyPurpose::ENCRYPT, KeyPurpose::DECRYPT, * KeyPurpose::SIGN or KeyPurpose::VERIFY. Note that for AEAD modes, encryption and @@ -466,7 +1058,7 @@ interface IKeymasterDevice { * * @param keyBlob The opaque key descriptor returned by generateKey() or importKey(). The key * must have a purpose compatible with purpose and all of its usage requirements must be - * satisfied, or begin() must return an appropriate error code. + * satisfied, or begin() must return an appropriate error code (see above). * * @param inParams Additional parameters for the operation. If Tag::APPLICATION_ID or * Tag::APPLICATION_DATA were provided during generation, they must be provided here, or @@ -478,8 +1070,6 @@ interface IKeymasterDevice { * @param authToken Authentication token. Callers that provide no token must set all numeric * fields to zero and the MAC must be an empty vector. * - * @return error See the ErrorCode enum in types.hal. - * * @return outParams Output parameters. Used to return additional data from the operation * initialization, notably to return the IV or nonce from operations that generate an IV * or nonce. @@ -493,13 +1083,87 @@ interface IKeymasterDevice { /** * Provides data to, and possibly receives output from, an ongoing cryptographic operation begun - * with begin(). + * with begin(). The operation is specified by the operationHandle paramater. * * If operationHandle is invalid, update() must return ErrorCode::INVALID_OPERATION_HANDLE. * - * update() may not consume all of the data provided in the data buffer. update() must return - * the amount consumed in inputConsumed. The caller may provide the unconsumed data in a - * subsequent call. + * To provide more flexibility for buffer handling, implementations of this method have the + * option of consuming less data than was provided. The caller is responsible for looping to + * feed the rest of the data in subsequent calls. The amount of input consumed must be returned + * in the inputConsumed parameter. Implementations must always consume at least one byte, unless + * the operation cannot accept any more; if more than zero bytes are provided and zero bytes are + * consumed, callers must consider this an error and abort the operation. + * + * Implementations may also choose how much data to return, as a result of the update. This is + * only relevant for encryption and decryption operations, because signing and verification + * return no data until finish. It is recommended to return data as early as possible, rather + * than buffer it. + * + * If this method returns an error code other than ErrorCode::OK, the operation is aborted and + * the operation handle must be invalidated. Any future use of the handle, with this method, + * finish, or abort, must return ErrorCode::INVALID_OPERATION_HANDLE. + * + * == Authorization Enforcement == + * + * Key authorization enforcement is performed primarily in begin(). The one exception is the + * case where the key has: + + * o One or more Tag::USER_SECURE_IDs, and + * + * o Does not have a Tag::AUTH_TIMEOUT + * + * In this case, the key requires an authorization per operation, and the update method must + * receive a non-empty and valid HardwareAuthToken. For the auth token to be valid, all of the + * following has to be true: + * + * o The HMAC field must validate correctly. + * + * o At least one of the Tag::USER_SECURE_ID values from the key must match at least one of + * the secure ID values in the token. + * + * o The key must have a Tag::USER_AUTH_TYPE that matches the auth type in the token. + * + * o The challenge field in the auth token must contain the operationHandle + * + * If any of these conditions are not met, update() must return + * ErrorCode::KEY_USER_NOT_AUTHENTICATED. + * + * The caller must provide the auth token on every call to update() and finish(). + * + * -- RSA keys -- + * + * For signing and verification operations with Digest::NONE, this method must accept the entire + * block to be signed or verified in a single update. It may not consume only a portion of the + * block in these cases. However, the caller may choose to provide the data in multiple updates, + * and update() must accept the data this way as well. If the caller provides more data to sign + * than can be used (length of data exceeds RSA key size), update() must return + * ErrorCode::INVALID_INPUT_LENGTH. + * + * -- ECDSA keys -- + * + * For signing and verification operations with Digest::NONE, this method must accept the entire + * block to be signed or verified in a single update. This method may not consume only a + * portion of the block. However, the caller may choose to provide the data in multiple updates + * and update() must accept the data this way as well. If the caller provides more data to sign + * than can be used, the data is silently truncated. (This differs from the handling of excess + * data provided in similar RSA operations. The reason for this is compatibility with legacy + * clients.) + * + * -- AES keys -- + * + * AES GCM mode supports "associated authentication data," provided via the Tag::ASSOCIATED_DATA + * tag in the inParams argument. The associated data may be provided in repeated calls + * (important if the data is too large to send in a single block) but must always precede data + * to be encrypted or decrypted. An update call may receive both associated data and data to + * encrypt/decrypt, but subsequent updates must not include associated data. If the caller + * provides associated data to an update call after a call that includes data to + * encrypt/decrypt, update() must return ErrorCode::INVALID_TAG. + * + * For GCM encryption, the AEAD tag must be appended to the ciphertext by finish(). During + * decryption, the last Tag::MAC_LENGTH bytes of the data provided to the last update call must + * be the AEAD tag. Since a given invocation of update cannot know if it's the last invocation, + * it must process all but the tag length and buffer the possible tag data for processing during + * finish(). * * @param operationHandle The operation handle returned by begin(). * @@ -513,16 +1177,18 @@ interface IKeymasterDevice { * @param authToken Authentication token. Callers that provide no token must set all numeric * fields to zero and the MAC must be an empty vector. * - * @param verificationToken Verification token, used to prove that another Keymaster HAL has - * verified some parameters, and to deliver the other HAL's current timestamp, if needed. - * If not provided, all fields must be initialized to zero and vectors empty. + * @param verificationToken Verification token, used to prove that another IKeymasterDevice HAL + * has verified some parameters, and to deliver the other HAL's current timestamp, if + * needed. If not provided, all fields must be initialized to zero and vectors must be + * empty. * * @return error See the ErrorCode enum in types.hal. * * @return inputConsumed Amount of data that was consumed by update(). If this is less than the * amount provided, the caller may provide the remainder in a subsequent call to - * update() or finish(). Every call to update must consume at least one byte, and - * implementations should consume as much data as reasonably possible for each call. + * update() or finish(). Every call to update must consume at least one byte, unless + * the input is empty, and implementations should consume as much data as reasonably + * possible for each call. * * @return outParams Output parameters, used to return additional data from the operation. * @@ -536,6 +1202,86 @@ interface IKeymasterDevice { /** * Finalizes a cryptographic operation begun with begin() and invalidates operationHandle. * + * This method is the last one called in an operation, so all processed data must be returned. + * + * Whether it completes successfully or returns an error, this method finalizes the operation + * and therefore must invalidate the provided operation handle. Any future use of the handle, + * with finish(), update(), or abort(), must return ErrorCode::INVALID_OPERATION_HANDLE. + * + * Signing operations return the signature as the output. Verification operations accept the + * signature in the signature parameter, and return no output. + * + * == Authorization enforcement == + * + * Key authorization enforcement is performed primarily in begin(). The exceptions are + * authorization per operation keys and confirmation-required keys. + * + * Authorization per operation keys are the case where the key has one or more + * Tag::USER_SECURE_IDs, and does not have a Tag::AUTH_TIMEOUT. In this case, the key requires + * an authorization per operation, and the finish method must receive a non-empty and valid + * authToken. For the auth token to be valid, all of the following has to be true: + * + * o The HMAC field must validate correctly. + * + * o At least one of the Tag::USER_SECURE_ID values from the key must match at least one of + * the secure ID values in the token. + * + * o The key must have a Tag::USER_AUTH_TYPE that matches the auth type in the token. + * + * o The challenge field in the auth token must contain the operationHandle + * + * If any of these conditions are not met, update() must return + * ErrorCode::KEY_USER_NOT_AUTHENTICATED. + * + * The caller must provide the auth token on every call to update() and finish(). + * + * Confirmation-required keys are keys that were generated with + * Tag::TRUSTED_CONFIRMATION_REQUIRED. For these keys, when doing a signing operation the + * caller must pass a KeyParameter Tag::CONFIRMATION_TOKEN to finish(). Implementations must + * check the confirmation token by computing the 32-byte HMAC-SHA256 over all of the + * to-be-signed data, prefixed with the 18-byte UTF-8 encoded string "confirmation token". If + * the computed value does not match the Tag::CONFIRMATION_TOKEN parameter, finish() must not + * produce a signature and must return ErrorCode::NO_USER_CONFIRMATION. + * + * -- RSA keys -- + * + * Some additional requirements, depending on the padding mode: + * + * o PaddingMode::NONE. For unpadded signing and encryption operations, if the provided data is + * shorter than the key, the data must be zero-padded on the left before + * signing/encryption. If the data is the same length as the key, but numerically larger, + * finish() must return ErrorCode::INVALID_ARGUMENT. For verification and decryption + * operations, the data must be exactly as long as the key. Otherwise, return + * ErrorCode::INVALID_INPUT_LENGTH. + * + * o PaddingMode::RSA_PSS. For PSS-padded signature operations, the PSS salt length must match + * the size of the PSS digest selected. The digest specified with Tag::DIGEST in inputParams + * on begin() must be used as the PSS digest algorithm, MGF1 must be used as the mask + * generation function and SHA1 must be used as the MGF1 digest algorithm. + * + * o PaddingMode::RSA_OAEP. The digest specified with Tag::DIGEST in inputParams on begin is + * used as the OAEP digest algorithm, MGF1 must be used as the mask generation function and + * and SHA1 must be used as the MGF1 digest algorithm. + * + * -- ECDSA keys -- + * + * If the data provided for unpadded signing or verification is too long, truncate it. + * + * -- AES keys -- + * + * Some additional conditions, depending on block mode: + * + * o BlockMode::ECB or BlockMode::CBC. If padding is PaddingMode::NONE and the data length is + * not a multiple of the AES block size, finish() must return + * ErrorCode::INVALID_INPUT_LENGTH. If padding is PaddingMode::PKCS7, pad the data per the + * PKCS#7 specification, including adding an additional padding block if the data is a multiple + * of the block length. + * + * o BlockMode::GCM. During encryption, after processing all plaintext, compute the tag + * (Tag::MAC_LENGTH bytes) and append it to the returned ciphertext. During decryption, + * process the last Tag::MAC_LENGTH bytes as the tag. If tag verification fails, finish() + * must return ErrorCode::VERIFICATION_FAILED. + * * @param operationHandle The operation handle returned by begin(). This handle must be invalid * when finish() returns. * @@ -551,11 +1297,9 @@ interface IKeymasterDevice { * @param authToken Authentication token. Callers that provide no token must set all numeric * fields to zero and the MAC must be an empty vector. * - * @param verificationToken Verification token, used to prove that another Keymaster HAL has - * verified some parameters, and to deliver the other HAL's current timestamp, if needed. - * If not provided, all fields must be initialized to zero and vectors empty. - * - * @return error See the ErrorCode enum in types.hal. + * @param verificationToken Verification token, used to prove that another IKeymasterDevice HAL + * has verified some parameters, and to deliver the other HAL's current timestamp, if + * needed. If not provided, all fields must be initialized to zero and vectors empty. * * @return outParams Any output parameters generated by finish(). * diff --git a/keymaster/4.0/types.hal b/keymaster/4.0/types.hal index 47fd1ed00e..85f181aca9 100644 --- a/keymaster/4.0/types.hal +++ b/keymaster/4.0/types.hal @@ -59,83 +59,364 @@ enum TagType : uint32_t { enum Tag : uint32_t { INVALID = TagType:INVALID | 0, - /* - * Tags that must be semantically enforced by hardware and software implementations. + /** + * Tag::PURPOSE specifies the set of purposes for which the key may be used. Possible values + * are defined in the KeyPurpose enumeration. + * + * This tag is repeatable; keys may be generated with multiple values, although an operation has + * a single purpose. When begin() is called to start an operation, the purpose of the operation + * is specified. If the purpose specified for the operation is not authorized by the key (the + * key didn't have a corresponding Tag::PURPOSE provided during generation/import), the + * operation must fail with ErrorCode::INCOMPATIBLE_PURPOSE. + * + * Must be hardware-enforced. */ + PURPOSE = TagType:ENUM_REP | 1, - /* Crypto parameters */ - PURPOSE = TagType:ENUM_REP | 1, /* KeyPurpose. */ - ALGORITHM = TagType:ENUM | 2, /* Algorithm. */ - KEY_SIZE = TagType:UINT | 3, /* Key size in bits. */ + /** + * Tag::ALGORITHM specifies the cryptographic algorithm with which the key is used. This tag + * must be provided to generateKey and importKey, and must be specified in the wrapped key + * provided to importWrappedKey. + * + * Must be hardware-enforced. + */ + ALGORITHM = TagType:ENUM | 2, + + /** + * Tag::KEY_SIZE pecifies the size, in bits, of the key, measuring in the normal way for the + * key's algorithm. For example, for RSA keys, Tag::KEY_SIZE specifies the size of the public + * modulus. For AES keys it specifies the length of the secret key material. For 3DES keys it + * specifies the length of the key material, not counting parity bits (though parity bits must + * be provided for import, etc.). Since only three-key 3DES keys are supported, 3DES + * Tag::KEY_SIZE must be 168. + * + * Must be hardware-enforced. + */ + KEY_SIZE = TagType:UINT | 3, + + /** + * Tag::BLOCK_MODE specifies the block cipher mode(s) with which the key may be used. This tag + * is only relevant to AES and 3DES keys. Possible values are defined by the BlockMode enum. + * + * This tag is repeatable for key generation/import. For AES and 3DES operations the caller + * must specify a Tag::BLOCK_MODE in the additionalParams argument of begin(). If the mode is + * missing or the specified mode is not in the modes specified for the key during + * generation/import, the operation must fail with ErrorCode::INCOMPATIBLE_BLOCK_MODE. + * + * Must be hardware-enforced. + */ BLOCK_MODE = TagType:ENUM_REP | 4, /* BlockMode. */ - DIGEST = TagType:ENUM_REP | 5, /* Digest. */ - PADDING = TagType:ENUM_REP | 6, /* PaddingMode. */ - CALLER_NONCE = TagType:BOOL | 7, /* Allow caller to specify nonce or IV. */ - MIN_MAC_LENGTH = TagType:UINT | 8, /* Minimum length of MAC or AEAD authentication tag in - * bits. */ - // 9 reserved - EC_CURVE = TagType:ENUM | 10, /* EcCurve. */ - /* Algorithm-specific. */ + /** + * Tag::DIGEST specifies the digest algorithms that may be used with the key to perform signing + * and verification operations. This tag is relevant to RSA, ECDSA and HMAC keys. Possible + * values are defined by the Digest enum. + * + * This tag is repeatable for key generation/import. For signing and verification operations, + * the caller must specify a digest in the additionalParams argument of begin(). If the digest + * is missing or the specified digest is not in the digests associated with the key, the + * operation must fail with ErrorCode::INCOMPATIBLE_DIGEST. + * + * Must be hardware-enforced. + */ + DIGEST = TagType:ENUM_REP | 5, + + /** + * Tag::PADDING specifies the padding modes that may be used with the key. This tag is relevant + * to RSA, AES and 3DES keys. Possible values are defined by the PaddingMode enum. + * + * PaddingMode::RSA_OAEP and PaddingMode::RSA_PKCS1_1_5_ENCRYPT are used only for RSA + * encryption/decryption keys and specify RSA OAEP padding and RSA PKCS#1 v1.5 randomized + * padding, respectively. PaddingMode::RSA_PSS and PaddingMode::RSA_PKCS1_1_5_SIGN are used + * only for RSA signing/verification keys and specify RSA PSS padding and RSA PKCS#1 v1.5 + * deterministic padding, respectively. + * + * PaddingMode::NONE may be used with either RSA, AES or 3DES keys. For AES or 3DES keys, if + * PaddingMode::NONE is used with block mode ECB or CBC and the data to be encrypted or + * decrypted is not a multiple of the AES block size in length, the call to finish() must fail + * with ErrorCode::INVALID_INPUT_LENGTH. + * + * PaddingMode::PKCS7 may only be used with AES and 3DES keys, and only with ECB and CBC modes. + * + * In any case, if the caller specifies a padding mode that is not usable with the key's + * algorithm, the generation or import method must return ErrorCode::INCOMPATIBLE_PADDING_MODE. + * + * This tag is repeatable. A padding mode must be specified in the call to begin(). If the + * specified mode is not authorized for the key, the operation must fail with + * ErrorCode::INCOMPATIBLE_BLOCK_MODE. + * + * Must be hardware-enforced. + */ + PADDING = TagType:ENUM_REP | 6, + + /** + * Tag::CALLER_NONCE specifies that the caller can provide a nonce for nonce-requiring + * operations. This tag is boolean, so the possible values are true (if the tag is present) and + * false (if the tag is not present). + * + * This tag is used only for AES and 3DES keys, and is only relevant for CBC, CTR and GCM block + * modes. If the tag is not present in a key's authorization list, implementations must reject + * any operation that provides Tag::NONCE to begin() with ErrorCode::CALLER_NONCE_PROHIBITED. + * + * Must be hardware-enforced. + */ + CALLER_NONCE = TagType:BOOL | 7, + + /** + * Tag::MIN_MAC_LENGTH specifies the minimum length of MAC that can be requested or verified + * with this key for HMAC keys and AES keys that support GCM mode. + * + * This value is the minimum MAC length, in bits. It must be a multiple of 8 bits. For HMAC + * keys, the value must be least 64 and no more than 512. For GCM keys, the value must be at + * least 96 and no more than 128. If the provided value violates these requirements, + * generateKey() or importKey() must return ErrorCode::UNSUPPORTED_KEY_SIZE. + * + * Must be hardware-enforced. + */ + MIN_MAC_LENGTH = TagType:UINT | 8, + + // Tag 9 reserved + + /** + * Tag::EC_CURVE specifies the elliptic curve. EC key generation requests may have + * Tag:EC_CURVE, Tag::KEY_SIZE, or both. If both are provided and the size and curve do not + * match, IKeymasterDevice must return ErrorCode::INVALID_ARGUMENT. + * + * Must be hardware-enforced. + */ + EC_CURVE = TagType:ENUM | 10, + + /** + * Tag::RSA_PUBLIC_EXPONENT specifies the value of the public exponent for an RSA key pair. + * This tag is relevant only to RSA keys, and is required for all RSA keys. + * + * The value is a 64-bit unsigned integer that satisfies the requirements of an RSA public + * exponent. This value must be a prime number. IKeymasterDevice implementations must support + * the value 2^16+1 and may support other reasonable values. If no exponent is specified or if + * the specified exponent is not supported, key generation must fail with + * ErrorCode::INVALID_ARGUMENT. + * + * Must be hardware-enforced. + */ RSA_PUBLIC_EXPONENT = TagType:ULONG | 200, - // 201 reserved for ECIES - INCLUDE_UNIQUE_ID = TagType:BOOL | 202, /* If true, attestation certificates for this key must - * contain an application-scoped and time-bounded - * device-unique ID.*/ - /* Other hardware-enforced. */ - BLOB_USAGE_REQUIREMENTS = TagType:ENUM | 301, /* KeyBlobUsageRequirements. */ - BOOTLOADER_ONLY = TagType:BOOL | 302, /* Usable only by bootloader. */ - ROLLBACK_RESISTANCE = TagType:BOOL | 303, /* Whether key is rollback-resistant. Specified - * in the key description provided to generateKey - * or importKey if rollback resistance is desired. - * If the implementation cannot provide rollback - * resistance, it must return - * ROLLBACK_RESISTANCE_UNAVAILABLE. */ + // Tag 201 reserved - /* HARDWARE_TYPE specifies the type of the secure hardware that is requested for the key - * generation / import. See the SecurityLevel enum. In the absence of this tag, keystore must - * use TRUSTED_ENVIRONMENT. If this tag is present and the requested hardware type is not - * available, Keymaster returns HARDWARE_TYPE_UNAVAILABLE. This tag is not included in - * attestations, but hardware type must be reflected in the Keymaster SecurityLevel of the - * attestation header. */ + /** + * Tag::INCLUDE_UNIQUE_ID is specified during key generation to indicate that an attestation + * certificate for the generated key should contain an application-scoped and time-bounded + * device-unique ID. See Tag::UNIQUE_ID. + * + * Must be hardware-enforced. + */ + INCLUDE_UNIQUE_ID = TagType:BOOL | 202, + + /** + * Tag::BLOB_USAGE_REQUIREMENTS specifies the necessary system environment conditions for the + * generated key to be used. Possible values are defined by the KeyBlobUsageRequirements enum. + * + * This tag is specified by the caller during key generation or import to require that the key + * is usable in the specified condition. If the caller specifies Tag::BLOB_USAGE_REQUIREMENTS + * with value KeyBlobUsageRequirements::STANDALONE the IKeymasterDevice must return a key blob + * that can be used without file system support. This is critical for devices with encrypted + * disks, where the file system may not be available until after a Keymaster key is used to + * decrypt the disk. + * + * Must be hardware-enforced. + */ + BLOB_USAGE_REQUIREMENTS = TagType:ENUM | 301, + + /** + * Tag::BOOTLOADER_ONLY specifies only the bootloader can use the key. + * + * Any attempt to use a key with Tag::BOOTLOADER_ONLY from the Android system must fail with + * ErrorCode::INVALID_KEY_BLOB. + * + * Must be hardware-enforced. + */ + BOOTLOADER_ONLY = TagType:BOOL | 302, + + /** + * Tag::ROLLBACK_RESISTANCE specifies that the key has rollback resistance, meaning that when + * deleted with deleteKey() or deleteAllKeys(), the key is guaranteed to be permanently deleted + * and unusable. It's possible that keys without this tag could be deleted and then restored + * from backup. + * + * This tag is specified by the caller during key generation or import to require. If the + * IKeymasterDevice cannot guarantee rollback resistance for the specified key, it must return + * ErrorCode::ROLLBACK_RESISTANCE_UNAVAILABLE. IKeymasterDevice implementations are not + * required to support rollback resistance. + * + * Must be hardwared-enforced. + */ + ROLLBACK_RESISTANCE = TagType:BOOL | 303, + + // Reserved for future use. HARDWARE_TYPE = TagType:ENUM | 304, - /* - * Tags that should be semantically enforced by hardware if possible and will otherwise be - * enforced by software (keystore). + /** + * Tag::ACTIVE_DATETIME specifies the date and time at which the key becomes active, in + * milliseconds since Jan 1, 1970. If a key with this tag is used prior to the specified date + * and time, IKeymasterDevice::begin() must return ErrorCode::KEY_NOT_YET_VALID; + * + * Need not be hardware-enforced. */ + ACTIVE_DATETIME = TagType:DATE | 400, /* Start of validity. */ - /* Key validity period */ - ACTIVE_DATETIME = TagType:DATE | 400, /* Start of validity. */ - ORIGINATION_EXPIRE_DATETIME = TagType:DATE | 401, /* Date when new "messages" should no longer - * be created. */ - USAGE_EXPIRE_DATETIME = TagType:DATE | 402, /* Date when existing "messages" should no - * longer be trusted. */ - MIN_SECONDS_BETWEEN_OPS = TagType:UINT | 403, /* Minimum elapsed time between - * cryptographic operations with the key. */ - MAX_USES_PER_BOOT = TagType:UINT | 404, /* Number of times the key can be used per - * boot. */ + /** + * Tag::ORIGINATION_EXPIRE_DATETIME specifies the date and time at which the key expires for + * signing and encryption purposes. After this time, any attempt to use a key with + * KeyPurpose::SIGN or KeyPurpose::ENCRYPT provided to begin() must fail with + * ErrorCode::KEY_EXPIRED. + * + * The value is a 64-bit integer representing milliseconds since January 1, 1970. + * + * Need not be hardware-enforced. + */ + ORIGINATION_EXPIRE_DATETIME = TagType:DATE | 401, - /* User authentication */ - // 500 reserved - USER_ID = TagType:UINT | 501, /* Android ID of authorized user or authenticator(s), */ + /** + * Tag::USAGE_EXPIRE_DATETIME specifies the date and time at which the key expires for + * verification and decryption purposes. After this time, any attempt to use a key with + * KeyPurpose::VERIFY or KeyPurpose::DECRYPT provided to begin() must fail with + * ErrorCode::KEY_EXPIRED. + * + * The value is a 64-bit integer representing milliseconds since January 1, 1970. + * + * Need not be hardware-enforced. + */ + USAGE_EXPIRE_DATETIME = TagType:DATE | 402, + + /** + * Tag::MIN_SECONDS_BETWEEN_OPS specifies the minimum amount of time that elapses between + * allowed operations using a key. This can be used to rate-limit uses of keys in contexts + * where unlimited use may enable brute force attacks. + * + * The value is a 32-bit integer representing seconds between allowed operations. + * + * When a key with this tag is used in an operation, the IKeymasterDevice must start a timer + * during the finish() or abort() call. Any call to begin() that is received before the timer + * indicates that the interval specified by Tag::MIN_SECONDS_BETWEEN_OPS has elapsed must fail + * with ErrorCode::KEY_RATE_LIMIT_EXCEEDED. This implies that the IKeymasterDevice must keep a + * table of use counters for keys with this tag. Because memory is often limited, this table + * may have a fixed maximum size and Keymaster may fail operations that attempt to use keys with + * this tag when the table is full. The table must acommodate at least 8 in-use keys and + * aggressively reuse table slots when key minimum-usage intervals expire. If an operation + * fails because the table is full, Keymaster returns ErrorCode::TOO_MANY_OPERATIONS. + * + * Must be hardware-enforced. + */ + MIN_SECONDS_BETWEEN_OPS = TagType:UINT | 403, + + /** + * Tag::MAX_USES_PER_BOOT specifies the maximum number of times that a key may be used between + * system reboots. This is another mechanism to rate-limit key use. + * + * The value is a 32-bit integer representing uses per boot. + * + * When a key with this tag is used in an operation, a key-associated counter must be + * incremented during the begin() call. After the key counter has exceeded this value, all + * subsequent attempts to use the key must fail with ErrorCode::MAX_OPS_EXCEEDED, until the + * device is restarted. This implies that the IKeymasterDevice must keep a table of use + * counters for keys with this tag. Because Keymaster memory is often limited, this table can + * have a fixed maximum size and Keymaster can fail operations that attempt to use keys with + * this tag when the table is full. The table needs to acommodate at least 8 keys. If an + * operation fails because the table is full, IKeymasterDevice must + * ErrorCode::TOO_MANY_OPERATIONS. + * + * Must be hardware-enforced. + */ + MAX_USES_PER_BOOT = TagType:UINT | 404, + + /** + * Tag::USER_ID specifies the ID of the Android user that is permitted to use the key. + * + * Must not be hardware-enforced. + */ + USER_ID = TagType:UINT | 501, + + /** + * Tag::USER_SECURE_ID specifies that a key may only be used under a particular secure user + * authentication state. This tag is mutually exclusive with Tag::NO_AUTH_REQUIRED. + * + * The value is a 64-bit integer specifying the authentication policy state value which must be + * present in the userId or authenticatorId field of a HardwareAuthToken provided to begin(), + * update(), or finish(). If a key with Tag::USER_SECURE_ID is used without a HardwareAuthToken + * with the matching userId or authenticatorId, the IKeymasterDevice must return + * ErrorCode::KEY_USER_NOT_AUTHENTICATED. + * + * Tag::USER_SECURE_ID interacts with Tag::AUTH_TIMEOUT in a very important way. If + * Tag::AUTH_TIMEOUT is present in the key's characteristics then the key is a "timeout-based" + * key, and may only be used if the difference between the current time when begin() is called + * and the timestamp in the HardwareAuthToken is less than the value in Tag::AUTH_TIMEOUT * 1000 + * (the multiplier is because Tag::AUTH_TIMEOUT is in seconds, but the HardwareAuthToken + * timestamp is in milliseconds). Otherwise the IKeymasterDevice must returrn + * ErrorCode::KEY_USER_NOT_AUTHENTICATED. + * + * If Tag::AUTH_TIMEOUT is not present, then the key is an "auth-per-operation" key. In this + * case, begin() must not require a HardwareAuthToken with appropriate contents. Instead, + * update() and finish() must receive a HardwareAuthToken with Tag::USER_SECURE_ID value in + * userId or authenticatorId fields, and the current operation's operation handle in the + * challenge field. Otherwise the IKeymasterDevice must returrn + * ErrorCode::KEY_USER_NOT_AUTHENTICATED. + * + * This tag is repeatable. If repeated, and any one of the values matches the HardwareAuthToken + * as described above, the key is authorized for use. Otherwise the operation must fail with + * ErrorCode::KEY_USER_NOT_AUTHENTICATED. + * + * Must be hardware-enforced. + */ USER_SECURE_ID = TagType:ULONG_REP | 502, /* Secure ID of authorized user or authenticator(s). - * Disallowed if NO_AUTH_REQUIRED is present. */ - NO_AUTH_REQUIRED = TagType:BOOL | 503, /* If key is usable without authentication. */ - USER_AUTH_TYPE = TagType:ENUM | 504, /* Bitmask of authenticator types allowed when - * USER_SECURE_ID contains a secure user ID, rather - * than a secure authenticator ID. Defined in - * HardwareAuthenticatorType. */ - AUTH_TIMEOUT = TagType:UINT | 505, /* Required freshness of user authentication for - * private/secret key operations, in seconds. Public - * key operations require no authentication. If - * absent, authentication is required for every use. - * Authentication state is lost when the device is - * powered off. */ - ALLOW_WHILE_ON_BODY = TagType:BOOL | 506, /* Allow key to be used after authentication timeout - * if device is still on-body (requires secure - * on-body sensor. */ + * Disallowed if NO_AUTH_REQUIRED is present. */ + + /** + * Tag::NO_AUTH_REQUIRED specifies that no authentication is required to use this key. This tag + * is mutually exclusive with Tag::USER_SECURE_ID. + * + * Must be hardware-enforced. + */ + NO_AUTH_REQUIRED = TagType:BOOL | 503, /* If key is usable without authentication. */ + + /** + * Tag::USER_AUTH_TYPE specifies the types of user authenticators that may be used to authorize + * this key. + * + * The value is one or more values from HardwareAuthenticatorType, ORed together. + * + * When IKeymasterDevice is requested to perform an operation with a key with this tag, it must + * receive a HardwareAuthToken and one or more bits must be set in both the HardwareAuthToken's + * authenticatorType field and the Tag::USER_AUTH_TYPE value. That is, it must be true that + * + * (token.authenticatorType & tag_user_auth_type) != 0 + * + * where token.authenticatorType is the authenticatorType field of the HardwareAuthToken and + * tag_user_auth_type is the value of Tag:USER_AUTH_TYPE. + * + * Must be hardware-enforced. + */ + USER_AUTH_TYPE = TagType:ENUM | 504, + + /** + * Tag::AUTH_TIMEOUT specifies the time in seconds for which the key is authorized for use, + * after user authentication. If + * Tag::USER_SECURE_ID is present and this tag is not, then the key requies authentication for + * every usage (see begin() for the details of the authentication-per-operation flow). + * + * The value is a 32-bit integer specifying the time in seconds after a successful + * authentication of the user specified by Tag::USER_SECURE_ID with the authentication method + * specified by Tag::USER_AUTH_TYPE that the key can be used. + * + * Must be hardware-enforced. + */ + AUTH_TIMEOUT = TagType:UINT | 505, + + /** + * Tag::ALLOW_WHILE_ON_BODY specifies that the key may be used after authentication timeout if + * device is still on-body (requires on-body sensor). + * + * Cannot be hardware-enforced. + */ + ALLOW_WHILE_ON_BODY = TagType:BOOL | 506, /** * TRUSTED_USER_PRESENCE_REQUIRED is an optional feature that specifies that this key must be @@ -166,7 +447,7 @@ enum Tag : uint32_t { * the non-secure world, which means an attacker who has compromised Android can spoof * password authentication. * - * Note that no mechanism is defined for delivering proof of presence to Keymaster, + * Note that no mechanism is defined for delivering proof of presence to an IKeymasterDevice, * except perhaps as implied by an auth token. This means that Keymaster must be able to check * proof of presence some other way. Further, the proof of presence must be performed between * begin() and the first call to update() or finish(). If the first update() or the finish() @@ -182,108 +463,408 @@ enum Tag : uint32_t { */ TRUSTED_USER_PRESENCE_REQUIRED = TagType:BOOL | 507, - /** TRUSTED_CONFIRMATION_REQUIRED is only applicable to keys with KeyPurpose SIGN, and specifies - * that this key must not be usable unless the user provides confirmation of the data to be - * signed. Confirmation is proven to keymaster via an approval token. See CONFIRMATION_TOKEN, - * as well as the ConfirmatinUI HAL. + /** Tag::TRUSTED_CONFIRMATION_REQUIRED is only applicable to keys with KeyPurpose SIGN, and + * specifies that this key must not be usable unless the user provides confirmation of the data + * to be signed. Confirmation is proven to keymaster via an approval token. See + * CONFIRMATION_TOKEN, as well as the ConfirmatinUI HAL. * * If an attempt to use a key with this tag does not have a cryptographically valid * CONFIRMATION_TOKEN provided to finish() or if the data provided to update()/finish() does not * match the data described in the token, keymaster must return NO_USER_CONFIRMATION. */ TRUSTED_CONFIRMATION_REQUIRED = TagType:BOOL | 508, - UNLOCKED_DEVICE_REQUIRED = TagType:BOOL | 509, /* Require the device screen to be unlocked if - * the key is used. */ + /** + * + */ + UNLOCKED_DEVICE_REQUIRED = TagType:BOOL | 509, - /* Application access control */ - APPLICATION_ID = TagType:BYTES | 601, /* Byte string identifying the authorized application. */ + /** + * Tag::APPLICATION_ID. When provided to generateKey or importKey, this tag specifies data + * that is necessary during all uses of the key. In particular, calls to exportKey() and + * getKeyCharacteristics() must provide the same value to the clientId parameter, and calls to + * begin must provide this tag and the same associated data as part of the inParams set. If + * the correct data is not provided, the method must return ErrorCode::INVALID_KEY_BLOB. + * + * The content of this tag must be bound to the key cryptographically, meaning it must not be + * possible for an adversary who has access to all of the secure world secrets but does not have + * access to the tag content to decrypt the key without brute-forcing the tag content, which + * applications can prevent by specifying sufficiently high-entropy content. + * + * Must be hardware-enforced. + */ + APPLICATION_ID = TagType:BYTES | 601, /* * Semantically unenforceable tags, either because they have no specific meaning or because * they're informational only. */ - APPLICATION_DATA = TagType:BYTES | 700, /* Data provided by authorized application. */ - CREATION_DATETIME = TagType:DATE | 701, /* Key creation time */ - ORIGIN = TagType:ENUM | 702, /* keymaster_key_origin_t. */ - // 703 is unused. - ROOT_OF_TRUST = TagType:BYTES | 704, /* Root of trust ID. */ - OS_VERSION = TagType:UINT | 705, /* Version of system (keymaster2) */ - OS_PATCHLEVEL = TagType:UINT | 706, /* Patch level of system (keymaster2) */ - UNIQUE_ID = TagType:BYTES | 707, /* Used to provide unique ID in attestation */ - ATTESTATION_CHALLENGE = TagType:BYTES | 708, /* Used to provide challenge in attestation */ - ATTESTATION_APPLICATION_ID = TagType:BYTES | 709, /* Used to identify the set of possible - * applications of which one has initiated a - * key attestation */ - ATTESTATION_ID_BRAND = TagType:BYTES | 710, /* Used to provide the device's brand name to be - * included in attestation */ - ATTESTATION_ID_DEVICE = TagType:BYTES | 711, /* Used to provide the device's device name to - * be included in attestation */ - ATTESTATION_ID_PRODUCT = TagType:BYTES | 712, /* Used to provide the device's product name to - * be included in attestation */ - ATTESTATION_ID_SERIAL = - TagType:BYTES | 713, /* Used to provide the device's serial number to be - * included in attestation */ - ATTESTATION_ID_IMEI = TagType:BYTES | 714, /* Used to provide the device's IMEI to be included - * in attestation */ - ATTESTATION_ID_MEID = TagType:BYTES | 715, /* Used to provide the device's MEID to be included - * in attestation */ - ATTESTATION_ID_MANUFACTURER = - TagType:BYTES | 716, /* Used to provide the device's manufacturer - * name to be included in attestation */ - ATTESTATION_ID_MODEL = TagType:BYTES | 717, /* Used to provide the device's model name to be - * included in attestation */ /** - * Patch level of vendor image. The value is an integer of the form YYYYMM, where YYYY is the - * four-digit year when the vendor image was released and MM is the two-digit month. During - * each boot, the bootloader must provide the patch level of the vendor image to keymaser - * (mechanism is implemntation-defined). When keymaster keys are created or updated, the - * VENDOR_PATCHLEVEL tag must be cryptographically bound to the keys, with the current value as - * provided by the bootloader. When keys are used, keymaster must verify that the - * VENDOR_PATCHLEVEL bound to the key matches the current value. If they do not match, - * keymaster must return ErrorCode::KEY_REQUIRES_UPGRADE. The client must then call upgradeKey. + * Tag::APPLICATION_DATA. When provided to generateKey or importKey, this tag specifies data + * that is necessary during all uses of the key. In particular, calls to exportKey() and + * getKeyCharacteristics() must provide the same value to the appData parameter, and calls to + * begin must provide this tag and the same associated data as part of the inParams set. If + * the correct data is not provided, the method must return ErrorCode::INVALID_KEY_BLOB. + * + * The content of this tag msut be bound to the key cryptographically, meaning it must not be + * possible for an adversary who has access to all of the secure world secrets but does not have + * access to the tag content to decrypt the key without brute-forcing the tag content, which + * applications can prevent by specifying sufficiently high-entropy content. + * + * Must be hardware-enforced. + */ + APPLICATION_DATA = TagType:BYTES | 700, + + /** + * Tag::CREATION_DATETIME specifies the date and time the key was created, in milliseconds since + * January 1, 1970. This tag is optional and informational only. + * + * Tag::CREATED is informational only, and not enforced by anything. Must be in the + * software-enforced list, if provided. + */ + CREATION_DATETIME = TagType:DATE | 701, + + /** + * Tag::ORIGIN specifies where the key was created, if known. This tag must not be specified + * during key generation or import, and must be added to the key characteristics by the + * IKeymasterDevice. The possible values are defined in the KeyOrigin enum. + * + * Must be hardware-enforced. + */ + ORIGIN = TagType:ENUM | 702, + + // 703 is unused. + + /** + * Tag::ROOT_OF_TRUST specifies the root of trust, the key used by verified boot to validate the + * operating system booted (if any). This tag is never provided to or returned from Keymaster + * in the key characteristics. It exists only to define the tag for use in the attestation + * record. + * + * Must never appear in KeyCharacteristics. + */ + ROOT_OF_TRUST = TagType:BYTES | 704, + + /** + * Tag::OS_VERSION specifies the system OS version with which the key may be used. This tag is + * never sent to the IKeymasterDevice, but is added to the hardware-enforced authorization list + * by the TA. Any attempt to use a key with a Tag::OS_VERSION value different from the + * currently-running OS version must cause begin(), getKeyCharacteristics() or exportKey() to + * return ErrorCode::KEY_REQUIRES_UPGRADE. See upgradeKey() for details. + * + * The value of the tag is an integer of the form MMmmss, where MM is the major version number, + * mm is the minor version number, and ss is the sub-minor version number. For example, for a + * key generated on Android version 4.0.3, the value would be 040003. + * + * The IKeymasterDevice HAL must read the current OS version from the system property + * ro.build.id and deliver it to the secure environment when the HAL is first loaded (mechanism + * is implementation-defined). The secure environment must not accept another version until + * after the next boot. If the content of ro.build.id has additional version information after + * the sub-minor version number, it must not be included in Tag::OS_VERSION. If the content is + * non-numeric, the secure environment must use 0 as the system version. + * + * Must be hardware-enforced. + */ + OS_VERSION = TagType:UINT | 705, + + /** + * Tag::OS_PATCHLEVEL specifies the system security patch level with which the key may be used. + * This tag is never sent to the keymaster TA, but is added to the hardware-enforced + * authorization list by the TA. Any attempt to use a key with a Tag::OS_PATCHLEVEL value + * different from the currently-running system patchlevel must cause begin(), + * getKeyCharacteristics() or exportKey() to return ErrorCode::KEY_REQUIRES_UPGRADE. See + * upgradeKey() for details. + * + * The value of the tag is an integer of the form YYYYMM, where YYYY is the four-digit year of + * the last update and MM is the two-digit month of the last update. For example, for a key + * generated on an Android device last updated in December 2015, the value would be 201512. + * + * The IKeymasterDevice HAL must read the current system patchlevel from the system property + * ro.build.version.security_patch and deliver it to the secure environment when the HAL is + * first loaded (mechanism is implementation-defined). The secure environment must not accept + * another patchlevel until after the next boot. + * + * Must be hardware-enforced. + */ + OS_PATCHLEVEL = TagType:UINT | 706, + + /** + * Tag::UNIQUE_ID specifies a unique, time-based identifier. This tag is never provided to or + * returned from Keymaster in the key characteristics. It exists only to define the tag for use + * in the attestation record. + * + * When a key with Tag::INCLUDE_UNIQUE_ID is attested, the unique ID is added to the attestation + * record. The value is a 128-bit hash that is unique per device and per calling application, + * and changes monthly and on most password resets. It is computed with: + * + * HMAC_SHA256(T || C || R, HBK) + * + * Where: + * + * T is the "temporal counter value", computed by dividing the value of + * Tag::CREATION_DATETIME by 2592000000, dropping any remainder. T changes every 30 days + * (2592000000 = 30 * 24 * 60 * 60 * 1000). + * + * C is the value of Tag::ATTESTATION_APPLICATION_ID that is provided to attestKey(). + * + * R is 1 if Tag::RESET_SINCE_ID_ROTATION was provided to attestKey or 0 if the tag was not + * provided. + * + * HBK is a unique hardware-bound secret known to the secure environment and never revealed + * by it. The secret must contain at least 128 bits of entropy and be unique to the + * individual device (probabilistic uniqueness is acceptable). + * + * HMAC_SHA256 is the HMAC function, with SHA-2-256 as the hash. + * + * The output of the HMAC function must be truncated to 128 bits. + * + * Must be hardware-enforced. + */ + UNIQUE_ID = TagType:BYTES | 707, + + /** + * Tag::ATTESTATION_CHALLENGE is used to deliver a "challenge" value to the attestKey() method, + * which must place the value in the KeyDescription SEQUENCE of the attestation extension. See + * attestKey(). + * + * Must never appear in KeyCharacteristics. + */ + ATTESTATION_CHALLENGE = TagType:BYTES | 708, /* Used to provide challenge in attestation */ + + /** + * Tag::ATTESTATION_APPLICATION_ID identifies the set of applications which may use a key, used + * only with attestKey(). + * + * The content of Tag::ATTESTATION_APPLICATION_ID is a DER-encoded ASN.1 structure, with the + * following schema: + * + * AttestationApplicationId ::= SEQUENCE { + * packageInfoRecords SET OF PackageInfoRecord, + * signatureDigests SET OF OCTET_STRING, + * } + * + * PackageInfoRecord ::= SEQUENCE { + * packageName OCTET_STRING, + * version INTEGER, + * } + * + * See system/security/keystore/keystore_attestation_id.cpp for details of construction. + * IKeymasterDevice implementers do not need to create or parse the ASN.1 structure, but only + * copy the tag value into the attestation record. The DER-encoded string must not exceed 1 KiB + * in length. + * + * Cannot be hardware-enforced. + */ + ATTESTATION_APPLICATION_ID = TagType:BYTES | 709, + + /** + * Tag::ATTESTATION_ID_BRAND provides the device's brand name, as returned by Build.BRAND in + * Android, to attestKey(). This field is set only when requesting attestation of the device's + * identifiers. + * + * If the device does not support ID attestation (or destroyAttestationIds() was previously + * called and the device can no longer attest its IDs), any key attestation request that + * includes this tag must fail with ErrorCode::CANNOT_ATTEST_IDS. + * + * Must never appear in KeyCharacteristics. + */ + ATTESTATION_ID_BRAND = TagType:BYTES | 710, + + /** + * Tag::ATTESTATION_ID_DEVICE provides the device's device name, as returned by Build.DEVICE in + * Android, to attestKey(). This field is set only when requesting attestation of the device's + * identifiers. + * + * If the device does not support ID attestation (or destroyAttestationIds() was previously + * called and the device can no longer attest its IDs), any key attestation request that + * includes this tag must fail with ErrorCode::CANNOT_ATTEST_IDS. + * + * Must never appear in KeyCharacteristics. + */ + ATTESTATION_ID_DEVICE = TagType:BYTES | 711, + + /** + * Tag::ATTESTATION_ID_PRODUCT provides the device's product name, as returned by Build.PRODUCT + * in Android, to attestKey(). This field is set only when requesting attestation of the + * device's identifiers. + * + * If the device does not support ID attestation (or destroyAttestationIds() was previously + * called and the device can no longer attest its IDs), any key attestation request that + * includes this tag must fail with ErrorCode::CANNOT_ATTEST_IDS. + * + * Must never appear in KeyCharacteristics. + */ + ATTESTATION_ID_PRODUCT = TagType:BYTES | 712, + + /** + * Tag::ATTESTATION_ID_SERIAL the device's serial number. This field is set only when + * requesting attestation of the device's identifiers. + * + * If the device does not support ID attestation (or destroyAttestationIds() was previously + * called and the device can no longer attest its IDs), any key attestation request that + * includes this tag must fail with ErrorCode::CANNOT_ATTEST_IDS. + * + * Must never appear in KeyCharacteristics. + */ + ATTESTATION_ID_SERIAL = TagType:BYTES | 713, + + /** + * Tag::ATTESTATION_ID_IMEI provides the IMEIs for all radios on the device to attestKey(). + * This field is set only when requesting attestation of the device's identifiers. + * + * If the device does not support ID attestation (or destroyAttestationIds() was previously + * called and the device can no longer attest its IDs), any key attestation request that + * includes this tag must fail with ErrorCode::CANNOT_ATTEST_IDS. + * + * Must never appear in KeyCharacteristics. + */ + ATTESTATION_ID_IMEI = TagType:BYTES | 714, /* Used to provide the device's IMEI to be included + * in attestation */ + + /** + * Tag::ATTESTATION_ID_MEID provides the MEIDs for all radios on the device to attestKey(). + * This field will only be set when requesting attestation of the device's identifiers. + * + * If the device does not support ID attestation (or destroyAttestationIds() was previously + * called and the device can no longer attest its IDs), any key attestation request that + * includes this tag must fail with ErrorCode::CANNOT_ATTEST_IDS. + * + * Must never appear in KeyCharacteristics. + */ + ATTESTATION_ID_MEID = TagType:BYTES | 715, /* Used to provide the device's MEID to be included + * in attestation */ + + /** + * Tag::ATTESTATION_ID_MANUFACTURER provides the device's manufacturer name, as returned by + * Build.MANUFACTURER in Android, to attstKey(). This field is set only when requesting + * attestation of the device's identifiers. + * + * If the device does not support ID attestation (or destroyAttestationIds() was previously + * called and the device can no longer attest its IDs), any key attestation request that + * includes this tag must fail with ErrorCode::CANNOT_ATTEST_IDS. + * + * Must never appear in KeyCharacteristics. + */ + ATTESTATION_ID_MANUFACTURER = TagType:BYTES | 716, + + /** + * Tag::ATTESTATION_ID_MODEL provides the device's model name, as returned by Build.MODEL in + * Android, to attestKey(). This field is set only when requesting attestation of the device's + * identifiers. + * + * If the device does not support ID attestation (or destroyAttestationIds() was previously + * called and the device can no longer attest its IDs), any key attestation request that + * includes this tag must fail with ErrorCode::CANNOT_ATTEST_IDS. + * + * Must never appear in KeyCharacteristics. + */ + ATTESTATION_ID_MODEL = TagType:BYTES | 717, + + /** + * Tag::VENDOR_PATCHLEVEL specifies the vendor image security patch level with which the key may + * be used. This tag is never sent to the keymaster TA, but is added to the hardware-enforced + * authorization list by the TA. Any attempt to use a key with a Tag::VENDOR_PATCHLEVEL value + * different from the currently-running system patchlevel must cause begin(), + * getKeyCharacteristics() or exportKey() to return ErrorCode::KEY_REQUIRES_UPGRADE. See + * upgradeKey() for details. + * + * The value of the tag is an integer of the form YYYYMMDD, where YYYY is the four-digit year of + * the last update, MM is the two-digit month and DD is the two-digit day of the last + * update. For example, for a key generated on an Android device last updated on June 5, 2018, + * the value would be 20180605. + * + * The IKeymasterDevice HAL must read the current vendor patchlevel from the system property + * ro.vendor.build.security_patch and deliver it to the secure environment when the HAL is first + * loaded (mechanism is implementation-defined). The secure environment must not accept another + * patchlevel until after the next boot. + * + * Must be hardware-enforced. */ VENDOR_PATCHLEVEL = TagType:UINT | 718, /** - * Patch level of boot image. The value is an integer of the form YYYYMM, where YYYY is the - * four-digit year when the boot image was released and MM is the two-digit month. During each - * boot, the bootloader must provide the patch level of the boot image to keymaser (mechanism is - * implemntation-defined). When keymaster keys are created or updated, the BOOT_PATCHLEVEL tag - * must be cryptographically bound to the keys, with the current value as provided by the - * bootloader. When keys are used, keymaster must verify that the BOOT_PATCHLEVEL bound to the - * key matches the current value. If they do not match, keymaster must return - * ErrorCode::KEY_REQUIRES_UPGRADE. The client must then call upgradeKey. + * Tag::BOOT_PATCHLEVEL specifies the boot image (kernel) security patch level with which the + * key may be used. This tag is never sent to the keymaster TA, but is added to the + * hardware-enforced authorization list by the TA. Any attempt to use a key with a + * Tag::BOOT_PATCHLEVEL value different from the currently-running system patchlevel must + * cause begin(), getKeyCharacteristics() or exportKey() to return + * ErrorCode::KEY_REQUIRES_UPGRADE. See upgradeKey() for details. + * + * The value of the tag is an integer of the form YYYYMMDD, where YYYY is the four-digit year of + * the last update, MM is the two-digit month and DD is the two-digit day of the last + * update. For example, for a key generated on an Android device last updated on June 5, 2018, + * the value would be 20180605. If the day is not known, 00 may be substituted. + * + * During each boot, the bootloader must provide the patch level of the boot image to the secure + * envirionment (mechanism is implementation-defined). + * + * Must be hardware-enforced. */ BOOT_PATCHLEVEL = TagType:UINT | 719, - /* Tags used only to provide data to or receive data from operations */ - ASSOCIATED_DATA = TagType:BYTES | 1000, /* Used to provide associated data for AEAD modes. */ - NONCE = TagType:BYTES | 1001, /* Nonce or Initialization Vector */ - MAC_LENGTH = TagType:UINT | 1003, /* MAC or AEAD authentication tag length in bits. */ - - RESET_SINCE_ID_ROTATION = TagType:BOOL | 1004, /* Whether the device has beeen factory reset - * since the last unique ID rotation. Used for - * key attestation. */ + /** + * Tag::ASSOCIATED_DATA Provides "associated data" for AES-GCM encryption or decryption. This + * tag is provided to update and specifies data that is not encrypted/decrypted, but is used in + * computing the GCM tag. + * + * Must never appear KeyCharacteristics. + */ + ASSOCIATED_DATA = TagType:BYTES | 1000, /** - * CONFIRMATION_TOKEN is used to deliver a cryptographic token proving that the user confirmed a - * signing request. The content is a full-length HMAC-SHA256 value. See the ConfirmationUI HAL - * for details of token computation. + * Tag::NONCE is used to provide or return a nonce or Initialization Vector (IV) for AES-GCM, + * AES-CBC, AES-CTR, or 3DES-CBC encryption or decryption. This tag is provided to begin during + * encryption and decryption operations. It is only provided to begin if the key has + * Tag::CALLER_NONCE. If not provided, an appropriate nonce or IV will be randomly generated by + * Keymaster and returned from begin. + * + * The value is a blob, an arbitrary-length array of bytes. Allowed lengths depend on the mode: + * GCM nonces are 12 bytes in length; AES-CBC and AES-CTR IVs are 16 bytes in length, 3DES-CBC + * IVs are 8 bytes in length. + * + * Must never appear in KeyCharacteristics. + */ + NONCE = TagType:BYTES | 1001, + + /** + * Tag::MAC_LENGTH provides the requested length of a MAC or GCM authentication tag, in bits. + * + * The value is the MAC length in bits. It must be a multiple of 8 and at least as large as the + * value of Tag::MIN_MAC_LENGTH associated with the key. Otherwise, begin() must return + * ErrorCode::INVALID_MAC_LENGTH. + * + * Must never appear in KeyCharacteristics. + */ + MAC_LENGTH = TagType:UINT | 1003, + + /** + * Tag::RESET_SINCE_ID_ROTATION specifies whether the device has been factory reset since the + * last unique ID rotation. Used for key attestation. + * + * Must never appear in KeyCharacteristics. + */ + RESET_SINCE_ID_ROTATION = TagType:BOOL | 1004, + + /** + * Tag::CONFIRMATION_TOKEN is used to deliver a cryptographic token proving that the user + * confirmed a signing request. The content is a full-length HMAC-SHA256 value. See the + * ConfirmationUI HAL for details of token computation. + * + * Must never appear in KeyCharacteristics. */ CONFIRMATION_TOKEN = TagType:BYTES | 1005, }; /** - * Algorithms provided by keymaser implementations. + * Algorithms provided by IKeymasterDevice implementations. */ enum Algorithm : uint32_t { /** Asymmetric algorithms. */ RSA = 1, - // DSA = 2, -- Removed, do not re-use value 2. + // 2 removed, do not reuse. EC = 3, - /** Block ciphers algorithms */ + /** Block cipher algorithms */ AES = 32, TRIPLE_DES = 33, @@ -393,12 +974,12 @@ enum KeyBlobUsageRequirements : uint32_t { * Possible purposes of a key (or pair). */ enum KeyPurpose : uint32_t { - ENCRYPT = 0, /* Usable with RSA, EC and AES keys. */ - DECRYPT = 1, /* Usable with RSA, EC and AES keys. */ - SIGN = 2, /* Usable with RSA, EC and HMAC keys. */ - VERIFY = 3, /* Usable with RSA, EC and HMAC keys. */ + ENCRYPT = 0, /* Usable with RSA, EC and AES keys. */ + DECRYPT = 1, /* Usable with RSA, EC and AES keys. */ + SIGN = 2, /* Usable with RSA, EC and HMAC keys. */ + VERIFY = 3, /* Usable with RSA, EC and HMAC keys. */ /* 4 is reserved */ - WRAP_KEY = 5, /* Usable with wrapping keys. */ + WRAP_KEY = 5, /* Usable with wrapping keys. */ }; /** @@ -481,6 +1062,8 @@ enum ErrorCode : int32_t { VERSION_MISMATCH = -101, UNKNOWN_ERROR = -1000, + + // Implementer's namespace for error codes starts at -10000. }; /** @@ -521,39 +1104,10 @@ enum SecurityLevel : uint32_t { SOFTWARE = 0, TRUSTED_ENVIRONMENT = 1, /** - * STRONGBOX specifies that the secure hardware satisfies the following requirements: - * - * a) Has a discrete CPU. The StrongBox device must not be the same CPU that is used to run - * the Android non-secure world, or any other untrusted code. The StrongBox CPU must not - * share cache, RAM or any other critical resources with any device that runs untrusted - * code. - * - * b) Has integral secure storage. The StrongBox device must have its own non-volatile - * storage that is not accessible by any other hardware component. - * - * c) Has a high-quality True Random Number Generator. The StrongBox device must have sole - * control of and access to a high-quality TRNG which it uses for generating necessary - * random bits. It must combine the output of this TRNG with caller-provided entropy in a - * strong CPRNG, as do non-Strongbox Keymaster implementations. - * - * d) Is enclosed in tamper-resistant packaging. The StrongBox device must have - * tamper-resistant packaging which provides obstacles to physical penetration which are - * higher than those provided by normal integrated circuit packages. - * - * e) Provides side-channel resistance. The StrongBox device must implement resistance - * against common side-channel attacks, including power analysis, timing analysis, EM - * snooping, etc. - * - * Devices with StrongBox Keymasters must also have a non-StrongBox Keymaster, which lives in - * the higher-performance TEE. Keystore must load both StrongBox (if available) and - * non-StrongBox HALs and route key generation/import requests appropriately. Callers that want - * StrongBox keys must add Tag::HARDWARE_TYPE with value SecurityLevel::STRONGBOX to the key - * description provided to generateKey or importKey. Keytore must route the request to a - * StrongBox HAL (a HAL whose isStrongBox method returns true). Keymaster implementations that - * receive a request for a Tag::HARDWARE_TYPE that is inappropriate must fail with - * ErrorCode::HARDWARE_TYPE_UNAVAILABLE. + * STRONGBOX specifies that the secure hardware satisfies the requirements specified in CDD + * 9.11.2. */ - STRONGBOX = 2, /* See IKeymaster::isStrongBox */ + STRONGBOX = 2, }; /** @@ -564,17 +1118,19 @@ enum KeyFormat : uint32_t { X509 = 0, /** PCKS#8 format, asymmetric key pair import. */ PKCS8 = 1, - /** Raw bytes, for symmetric key import and export. */ + /** Raw bytes, for symmetric key import. */ RAW = 3, }; struct KeyParameter { /** - * Discriminates the uinon/blob field used. The blob cannot be coincided with the union, but - * only one of "f" and "blob" is ever used at a time. */ + * Discriminates the union/blob field used. The blob cannot be placed in the union, but only + * one of "f" and "blob" may ever be used at a time. + */ Tag tag; + union IntegerParams { - /** Enum types */ + /* Enum types */ Algorithm algorithm; BlockMode blockMode; PaddingMode paddingMode; @@ -587,7 +1143,7 @@ struct KeyParameter { HardwareAuthenticatorType hardwareAuthenticatorType; SecurityLevel hardwareType; - /** Other types */ + /* Other types */ bool boolValue; // Always true, if a boolean tag is present. uint32_t integer; uint64_t longInteger; @@ -597,20 +1153,68 @@ struct KeyParameter { vec blob; }; +/** + * KeyCharacteristics defines the attributes of a key, including cryptographic parameters, and usage + * restrictions. It consits of two vectors of KeyParameters, one for "softwareEnforced" attributes + * and one for "hardwareEnforced" attributes. + * + * KeyCharacteristics objects are returned by generateKey, importKey, importWrappedKey and + * getKeyCharacteristics. The IKeymasterDevice secure environment is responsible for allocating the + * parameters, all of which are Tags with associated values, to the correct vector. The + * hardwareEnforced vector must contain only those attributes which are enforced by secure hardware. + * All others should be in the softwareEnforced vector. See the definitions of individual Tag enums + * for specification of which must be hardware-enforced, which may be software-enforced and which + * must never appear in KeyCharacteristics. + */ struct KeyCharacteristics { vec softwareEnforced; vec hardwareEnforced; }; /** - * Data used to prove successful authentication. + * HardwareAuthToken is used to prove successful user authentication, to unlock the use of a key. + * + * HardwareAuthTokens are produced by other secure environment applications, notably GateKeeper and + * Fingerprint, in response to successful user authentication events. These tokens are passed to + * begin(), update(), and finish() to prove that authentication occurred. See those methods for + * more details. It is up to the caller to determine which of the generated auth tokens is + * appropriate for a given key operation. */ struct HardwareAuthToken { + /** + * challenge is a value that's used to enable authentication tokens to authorize specific + * events. The primary use case for challenge is to authorize an IKeymasterDevice cryptographic + * operation, for keys that require authentication per operation. See begin() for details. + */ uint64_t challenge; - uint64_t userId; // Secure User ID, not Android user ID. - uint64_t authenticatorId; // Secure authenticator ID. + + /** + * userId is the a "secure" user ID. It is not related to any Android user ID or UID, but is + * created in the Gatekeeper application in the secure environment. + */ + uint64_t userId; + + /** + * authenticatorId is the a "secure" user ID. It is not related to any Android user ID or UID, + * but is created in an authentication application in the secure environment, such as the + * Fingerprint application. + */ + uint64_t authenticatorId; // Secure authenticator ID. + + /** + * authenticatorType describes the type of authentication that took place, e.g. password or + * fingerprint. + */ HardwareAuthenticatorType authenticatorType; + + /** + * timestamp indicates when the user authentication took place, in milliseconds since some + * starting point (generally the most recent device boot) which all of the applications within + * one secure environment must agree upon. This timestamp is used to determine whether or not + * the authentication occurred recently enough to unlock a key (see Tag::AUTH_TIMEOUT). + */ Timestamp timestamp; + /** * MACs are computed with a backward-compatible method, used by Keymaster 3.0, Gatekeeper 1.0 * and Fingerprint 1.0, as well as pre-treble HALs. @@ -623,7 +1227,8 @@ struct HardwareAuthToken { * where ``||'' represents concatenation, the leading zero is a single byte, and all integers * are represented as unsigned values, the full width of the type. The challenge, userId and * authenticatorId values are in machine order, but authenticatorType and timestamp are in - * network order. This odd construction is compatible with the hw_auth_token_t structure, + * network order (big-endian). This odd construction is compatible with the hw_auth_token_t + * structure, * * Note that mac is a vec rather than an array, not because it's actually variable-length but * because it could be empty. As documented in the IKeymasterDevice::begin,