Janis Danisevskis | 34d8809 | 2016-10-12 11:23:58 +0100 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2016 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | package android.hardware.keymaster@3.0; |
| 18 | |
| 19 | /** |
| 20 | * Keymaster device definition. For thorough documentation see the implementer's reference, at |
| 21 | * https://source.android.com/security/keystore/implementer-ref.html |
| 22 | */ |
| 23 | interface IKeymasterDevice { |
| 24 | |
| 25 | /** |
| 26 | * Returns information about the underlying keymaster hardware. |
| 27 | * |
| 28 | * @return isSecure is true if keys are stored and never leave secure hardware (Trusted |
| 29 | * Execution Environment or similar). CDD requires that all devices initially |
| 30 | * launched with Marshmallow or later must have secure hardware. |
| 31 | * |
| 32 | * @return supportsEllipticCurve is true if the hardware supports Elliptic Curve cryptography |
| 33 | * with the NIST curves (P-224, P-256, P-384, and P-521). CDD requires that all |
| 34 | * devices initially launched with Nougat or later must support Elliptic Curve |
| 35 | * cryptography. |
| 36 | * |
| 37 | * @return supportsSymmetricCryptography is true if the hardware supports symmetric |
| 38 | * cryptography, including AES and HMAC. CDD requires that all devices initially |
| 39 | * launched with Nougat or later must support hardware enforcement of Keymaster |
| 40 | * authorizations. |
| 41 | * |
| 42 | * @return supportsAttestation is true if the hardware supports generation of Keymaster public |
| 43 | * key attestation certificates, signed with a key injected in a secure |
| 44 | * environment. CDD requires that all devices initially launched with Android O or |
| 45 | * later must support hardware attestation. |
Shawn Willden | d4417fb | 2017-02-23 11:01:49 -0700 | [diff] [blame^] | 46 | * |
| 47 | * @return supportsAllDigests is true if the hardware supports all keymaster digest functions, |
| 48 | * namely ND-5, SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512. CDD requires that all |
| 49 | * devices launched initially with Android O or later must support all digests. |
| 50 | * |
| 51 | * @return keymasterName is the name of the keymaster implementation. |
| 52 | * |
| 53 | * @return keymasterAuthorName is the name of the author of the keymaster implementation |
| 54 | * (generally this should be the name of an organization, not an individual.) |
Janis Danisevskis | 34d8809 | 2016-10-12 11:23:58 +0100 | [diff] [blame] | 55 | */ |
| 56 | getHardwareFeatures() |
Shawn Willden | d4417fb | 2017-02-23 11:01:49 -0700 | [diff] [blame^] | 57 | generates(bool isSecure, bool supportsEllipticCurve, bool supportsSymmetricCryptography, |
| 58 | bool supportsAttestation, bool supportsAllDigests, string keymasterName, |
| 59 | string keymasterAuthorName); |
Janis Danisevskis | 34d8809 | 2016-10-12 11:23:58 +0100 | [diff] [blame] | 60 | |
| 61 | /** |
| 62 | * Adds entropy to the RNG used by keymaster. Entropy added through this method is guaranteed |
| 63 | * not to be the only source of entropy used, and the mixing function is required to be secure, |
| 64 | * in the sense that if the RNG is seeded (from any source) with any data the attacker cannot |
| 65 | * predict (or control), then the RNG output is indistinguishable from random. Thus, if the |
| 66 | * entropy from any source is good, the output must be good. |
| 67 | * |
| 68 | * @param data Bytes to be mixed into the RNG. |
| 69 | * |
| 70 | * @return error See the ErrorCode enum in types.hal. |
| 71 | */ |
| 72 | addRngEntropy(vec<uint8_t> data) generates(ErrorCode error); |
| 73 | |
| 74 | /** |
| 75 | * Generates a key, or key pair, returning a key blob and/or a description of the key. |
| 76 | * |
| 77 | * @param keyParams Key generation parameters are defined as keymaster tag/value pairs, provided |
| 78 | * in params. See Tag in types.hal for the full list. |
| 79 | * |
| 80 | * @return error See the ErrorCode enum in types.hal. |
| 81 | * |
| 82 | * @return keyBlob Opaque, encrypted descriptor of the generated key, which generally contains a |
| 83 | * copy of the key material, wrapped in a key unavailable outside secure hardware. |
| 84 | * |
| 85 | * @return keyCharacteristics Description of the generated key. See KeyCharacteristis in |
| 86 | * types.hal. |
| 87 | */ |
| 88 | generateKey(vec<KeyParameter> keyParams) |
| 89 | generates(ErrorCode error, vec<uint8_t> keyBlob, KeyCharacteristics keyCharacteristics); |
| 90 | |
| 91 | /** |
| 92 | * Imports a key, or key pair, returning a key blob and/or a description of the key. |
| 93 | * |
| 94 | * @param keyParams Key generation parameters are defined as keymaster tag/value pairs, provided |
| 95 | * in params. See Tag for the full list. |
| 96 | * |
| 97 | * @param keyFormat The format of the key material to import. See KeyFormat in types.hal. |
| 98 | * |
| 99 | * @pram keyData The key material to import, in the format specifed in keyFormat. |
| 100 | * |
| 101 | * @return error See the ErrorCode enum. |
| 102 | * |
| 103 | * @return keyBlob Opaque, encrypted descriptor of the generated key, which will generally |
| 104 | * contain a copy of the key material, wrapped in a key unavailable outside secure |
| 105 | * hardware. |
| 106 | * |
| 107 | * @return keyCharacteristics Decription of the generated key. See KeyCharacteristis. |
| 108 | * |
| 109 | * @return error See the ErrorCode enum. |
| 110 | */ |
| 111 | importKey(vec<KeyParameter> params, KeyFormat keyFormat, vec<uint8_t> keyData) |
| 112 | generates(ErrorCode error, vec<uint8_t> keyBlob, KeyCharacteristics keyCharacteristics); |
| 113 | |
| 114 | /** |
| 115 | * Returns the characteristics of the specified key, if the keyBlob is valid (implementations |
| 116 | * must fully validate the integrity of the key). |
| 117 | * |
| 118 | * @param keyBlob The opaque descriptor returned by generateKey() or importKey(); |
| 119 | * |
| 120 | * @param clientId An opaque byte string identifying the client. This value must match the |
| 121 | * Tag::APPLICATION_ID data provided during key generation/import. Without the |
| 122 | * correct value it must be cryptographically impossible for the secure hardware to |
| 123 | * obtain the key material. |
| 124 | * |
| 125 | * @param appData An opaque byte string provided by the application. This value must match the |
| 126 | * Tag::APPLICATION_DATA data provided during key generation/import. Without the |
| 127 | * correct value it must be cryptographically impossible for the secure hardware to |
| 128 | * obtain the key material. |
| 129 | * |
| 130 | * @return error See the ErrorCode enum in types.hal. |
| 131 | * |
| 132 | * @return keyCharacteristics Decription of the generated key. See KeyCharacteristis in |
| 133 | * types.hal. |
| 134 | */ |
| 135 | getKeyCharacteristics(vec<uint8_t> keyBlob, vec<uint8_t> clientId, vec<uint8_t> appData) |
| 136 | generates(ErrorCode error, KeyCharacteristics keyCharacteristics); |
| 137 | |
| 138 | /** |
| 139 | * Exports a public key, returning the key in the specified format. |
| 140 | * |
| 141 | * @parm keyFormat The format used for export. See KeyFormat in types.hal. |
| 142 | * |
| 143 | * @param keyBlob The opaque descriptor returned by generateKey() or importKey(). The |
| 144 | * referenced key must be asymmetric. |
| 145 | * |
| 146 | * @param clientId An opaque byte string identifying the client. This value must match the |
| 147 | * Tag::APPLICATION_ID data provided during key generation/import. Without the |
| 148 | * correct value it must be cryptographically impossible for the secure hardware to |
| 149 | * obtain the key material. |
| 150 | * |
| 151 | * @param appData An opaque byte string provided by the application. This value must match the |
| 152 | * Tag::APPLICATION_DATA data provided during key generation/import. Without the |
| 153 | * correct value it must be cryptographically impossible for the secure hardware to |
| 154 | * obtain the key material. |
| 155 | * |
| 156 | * @return error See the ErrorCode enum in types.hal. |
| 157 | * |
| 158 | * @return keyMaterial The public key material in PKCS#8 format. |
| 159 | */ |
| 160 | exportKey(KeyFormat keyFormat, vec<uint8_t> keyBlob, vec<uint8_t> clientId, |
| 161 | vec<uint8_t> appData) generates(ErrorCode error, vec<uint8_t> keyMaterial); |
| 162 | |
| 163 | /** |
| 164 | * Generates a signed X.509 certificate chain attesting to the presence of keyToAttest in |
| 165 | * keymaster. The certificate will contain an extension with OID 1.3.6.1.4.1.11129.2.1.17 and |
| 166 | * value defined in: |
| 167 | * |
| 168 | * https://developer.android.com/training/articles/security-key-attestation.html. |
| 169 | * |
| 170 | * @param keyToAttest The opaque descriptor returned by generateKey() or importKey(). The |
| 171 | * referenced key must be asymmetric. |
| 172 | * |
| 173 | * @param attestParams Parameters for the attestation, notably Tag::ATTESTATION_CHALLENGE. |
| 174 | * |
| 175 | * @return error See the ErrorCode enum in types.hal. |
| 176 | */ |
| 177 | attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams) |
| 178 | generates(ErrorCode error, vec<vec<uint8_t>> certChain); |
| 179 | |
| 180 | /** |
| 181 | * Upgrades an old key. Keys can become "old" in two ways: Keymaster can be upgraded to a new |
| 182 | * version, or the system can be updated to invalidate the OS version and/or patch level. In |
| 183 | * either case, attempts to use an old key with getKeyCharacteristics(), exportKey(), |
| 184 | * attestKey() or begin() will result in keymaster returning |
| 185 | * ErrorCode::KEY_REQUIRES_UPGRADE. This method must then be called to upgrade the key. |
| 186 | * |
| 187 | * @param keyBlobToUpgrade The opaque descriptor returned by generateKey() or importKey(); |
| 188 | * |
| 189 | * @param upgradeParams A parameter list containing any parameters needed to complete the |
| 190 | * upgrade, including Tag::APPLICATION_ID and Tag::APPLICATION_DATA. |
| 191 | * |
| 192 | * @return error See the ErrorCode enum. |
| 193 | */ |
| 194 | upgradeKey(vec<uint8_t> keyBlobToUpgrade, vec<KeyParameter> upgradeParams) |
| 195 | generates(ErrorCode error, vec<uint8_t> upgradedKeyBlob); |
| 196 | |
| 197 | /** |
| 198 | * Deletes the key, or key pair, associated with the key blob. After calling this function it |
| 199 | * will be impossible to use the key for any other operations. May be applied to keys from |
| 200 | * foreign roots of trust (keys not usable under the current root of trust). |
| 201 | * |
| 202 | * This is a NOP for keys that don't have rollback protection. |
| 203 | * |
| 204 | * @param keyBlobToUpgrade The opaque descriptor returned by generateKey() or importKey(); |
| 205 | * |
| 206 | * @return error See the ErrorCode enum. |
| 207 | */ |
| 208 | deleteKey(vec<uint8_t> keyBlob) generates(ErrorCode error); |
| 209 | |
| 210 | /** |
| 211 | * Deletes all keys in the hardware keystore. Used when keystore is reset completely. After |
| 212 | * calling this function it will be impossible to use any previously generated or imported key |
| 213 | * blobs for any operations. |
| 214 | * |
| 215 | * This is a NOP if keys don't have rollback protection. |
| 216 | * |
| 217 | * @return error See the ErrorCode enum. |
| 218 | */ |
| 219 | deleteAllKeys() generates(ErrorCode error); |
| 220 | |
| 221 | /** |
Bartosz Fabianowski | aac0fc7 | 2017-01-23 13:51:10 +0100 | [diff] [blame] | 222 | * Destroys knowledge of the device's ids. This prevents all device id attestation in the |
| 223 | * future. The destruction must be permanent so that not even a factory reset will restore the |
| 224 | * device ids. |
| 225 | * |
| 226 | * Device id attestation may be provided only if this method is fully implemented, allowing the |
| 227 | * user to permanently disable device id attestation. If this cannot be guaranteed, the device |
| 228 | * must never attest any device ids. |
| 229 | * |
| 230 | * This is a NOP if device id attestation is not supported. |
| 231 | * |
| 232 | * @return error See the ErrorCode enum. |
| 233 | */ |
| 234 | destroyAttestationIds() generates(ErrorCode error); |
| 235 | |
| 236 | /** |
Janis Danisevskis | 34d8809 | 2016-10-12 11:23:58 +0100 | [diff] [blame] | 237 | * Begins a cryptographic operation using the specified key. If all is well, begin() will return |
| 238 | * ErrorCode::OK and create an operation handle which must be passed to subsequent calls to |
| 239 | * update(), finish() or abort(). |
| 240 | * |
| 241 | * It is critical that each call to begin() be paired with a subsequent call to finish() or |
| 242 | * abort(), to allow the keymaster implementation to clean up any internal operation state. |
| 243 | * Failure to do this may leak internal state space or other internal resources and may |
| 244 | * eventually cause begin() to return ErrorCode::TOO_MANY_OPERATIONS when it runs out of space |
| 245 | * for operations. Any result other than ErrorCode::OK from begin(), update() or finish() |
| 246 | * implicitly aborts the operation, in which case abort() need not be called (and will return |
| 247 | * ErrorCode::INVALID_OPERATION_HANDLE if called). |
| 248 | * |
| 249 | * @param purpose The purpose of the operation, one of KeyPurpose::ENCRYPT, KeyPurpose::DECRYPT, |
| 250 | * KeyPurpose::SIGN or KeyPurpose::VERIFY. Note that for AEAD modes, encryption and |
| 251 | * decryption imply signing and verification, respectively, but must be specified as |
| 252 | * KeyPurpose::ENCRYPT and KeyPurpose::DECRYPT. |
| 253 | * |
| 254 | * @param keyBlob The opaque key descriptor returned by generateKey() or importKey(). The key |
| 255 | * must have a purpose compatible with purpose and all of its usage requirements |
| 256 | * must be satisfied, or begin() will return an appropriate error code. |
| 257 | * |
| 258 | * @param inParams Additional parameters for the operation. This is typically used to provide |
| 259 | * authentication data, with Tag::AUTH_TOKEN. If Tag::APPLICATION_ID or |
| 260 | * Tag::APPLICATION_DATA were provided during generation, they must be provided |
| 261 | * here, or the operation will fail with ErrorCode::INVALID_KEY_BLOB. For operations |
| 262 | * that require a nonce or IV, on keys that were generated with Tag::CALLER_NONCE, |
| 263 | * inParams may contain a tag Tag::NONCE. |
| 264 | * |
| 265 | * @return error See the ErrorCode enum in types.hal. |
| 266 | * |
| 267 | * @return outParams Output parameters. Used to return additional data from the operation |
| 268 | * initialization, notably to return the IV or nonce from operations that generate |
| 269 | * an IV or nonce. |
| 270 | * |
| 271 | * @return operationHandle The newly-created operation handle which must be passed to update(), |
| 272 | * finish() or abort(). |
| 273 | */ |
| 274 | begin(KeyPurpose purpose, vec<uint8_t> key, vec<KeyParameter> inParams) |
| 275 | generates(ErrorCode error, vec<KeyParameter> outParams, OperationHandle operationHandle); |
| 276 | |
| 277 | /** |
| 278 | * Provides data to, and possibly receives output from, an ongoing cryptographic operation begun |
| 279 | * with begin(). |
| 280 | * |
| 281 | * If operationHandle is invalid, update() will return ErrorCode::INVALID_OPERATION_HANDLE. |
| 282 | * |
| 283 | * update() may not consume all of the data provided in the data buffer. update() will return |
| 284 | * the amount consumed in inputConsumed. The caller may provide the unconsumed data in a |
| 285 | * subsequent call. |
| 286 | * |
| 287 | * @param operationHandle The operation handle returned by begin(). |
| 288 | * |
| 289 | * @param inParams Additional parameters for the operation. For AEAD modes, this is used to |
| 290 | * specify Tag::ADDITIONAL_DATA. Note that additional data may be provided in |
| 291 | * multiple calls to update(), but only until input data has been provided. |
| 292 | * |
| 293 | * @param input Data to be processed, per the parameters established in the call to begin(). |
| 294 | * Note that update() may or may not consume all of the data provided. See |
| 295 | * inputConsumed. |
| 296 | * |
| 297 | * @return error See the ErrorCode enum in types.hal. |
| 298 | * |
| 299 | * @return inputConsumed Amount of data that was consumed by update(). If this is less than the |
| 300 | * amount provided, the caller may provide the remainder in a subsequent call to |
| 301 | * update() or finish(). |
| 302 | * |
| 303 | * @return outParams Output parameters, used to return additional data from the operation The |
| 304 | * caller takes ownership of the output parameters array and must free it with |
| 305 | * keymaster_free_param_set(). |
| 306 | * |
| 307 | * @return output The output data, if any. |
| 308 | */ |
| 309 | update(OperationHandle operationHandle, vec<KeyParameter> inParams, vec<uint8_t> input) |
| 310 | generates(ErrorCode error, uint32_t inputConsumed, vec<KeyParameter> outParams, |
| 311 | vec<uint8_t> output); |
| 312 | |
| 313 | /** |
| 314 | * Finalizes a cryptographic operation begun with begin() and invalidates operationHandle. |
| 315 | * |
| 316 | * @param operationHandle The operation handle returned by begin(). This handle will be |
| 317 | * invalid when finish() returns. |
| 318 | * |
| 319 | * @param inParams Additional parameters for the operation. For AEAD modes, this is used to |
| 320 | * specify Tag::ADDITIONAL_DATA, but only if no input data was provided to update(). |
| 321 | * |
| 322 | * @param input Data to be processed, per the parameters established in the call to |
| 323 | * begin(). finish() must consume all provided data or return |
| 324 | * ErrorCode::INVALID_INPUT_LENGTH. |
| 325 | * |
| 326 | * @param signature The signature to be verified if the purpose specified in the begin() call |
| 327 | * was KeyPurpose::VERIFY. |
| 328 | * |
| 329 | * @return error See the ErrorCode enum in types.hal. |
| 330 | * |
| 331 | * @return outParams Any output parameters generated by finish(). |
| 332 | * |
| 333 | * @return output The output data, if any. |
| 334 | */ |
| 335 | finish(OperationHandle operationHandle, vec<KeyParameter> inParams, vec<uint8_t> input, |
| 336 | vec<uint8_t> signature) |
| 337 | generates(ErrorCode error, vec<KeyParameter> outParams, vec<uint8_t> output); |
| 338 | |
| 339 | /** |
| 340 | * Aborts a cryptographic operation begun with begin(), freeing all internal resources and |
| 341 | * invalidating operationHandle. |
| 342 | * |
| 343 | * @param operationHandle The operation handle returned by begin(). This handle will be |
| 344 | * invalid when abort() returns. |
| 345 | * |
| 346 | * @return error See the ErrorCode enum in types.hal. |
| 347 | */ |
| 348 | abort(OperationHandle operationHandle) generates(ErrorCode error); |
| 349 | }; |