keymaster_defs.h revision 7fd11186a6731402fd5a33b26da9edf738dd750b
19d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/*
29d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Copyright (C) 2014 The Android Open Source Project
39d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden *
49d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Licensed under the Apache License, Version 2.0 (the "License");
59d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * you may not use this file except in compliance with the License.
69d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * You may obtain a copy of the License at
79d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden *
89d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden *      http://www.apache.org/licenses/LICENSE-2.0
99d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden *
109d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Unless required by applicable law or agreed to in writing, software
119d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * distributed under the License is distributed on an "AS IS" BASIS,
129d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * See the License for the specific language governing permissions and
149d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * limitations under the License.
159d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
169d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
179d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden#ifndef ANDROID_HARDWARE_KEYMASTER_DEFS_H
189d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden#define ANDROID_HARDWARE_KEYMASTER_DEFS_H
199d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
209d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden#include <stdint.h>
219d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden#include <stdlib.h>
229d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden#include <string.h>
239d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
247eaa15ffa65239e8f4f23d21ff1a6ed66ed9a13fShawn Willden#ifdef __cplusplus
25c51d01ed029458e8809eeb9c16f9ed2dbe755be4Shawn Willdenextern "C" {
26c51d01ed029458e8809eeb9c16f9ed2dbe755be4Shawn Willden#endif  // __cplusplus
279d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
289d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
299d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Authorization tags each have an associated type.  This enumeration facilitates tagging each with
309d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * a type, by using the high four bits (of an implied 32-bit unsigned enum value) to specify up to
319d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * 16 data types.  These values are ORed with tag IDs to generate the final tag ID values.
329d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
339d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
349d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_INVALID = 0 << 28, /* Invalid type, used to designate a tag as uninitialized */
359d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ENUM = 1 << 28,
369d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ENUM_REP = 2 << 28, /* Repeatable enumeration value. */
37fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_UINT = 3 << 28,
38fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_UINT_REP = 4 << 28, /* Repeatable integer value */
39fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_ULONG = 5 << 28,
409d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_DATE = 6 << 28,
419d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_BOOL = 7 << 28,
429d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_BIGNUM = 8 << 28,
439d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_BYTES = 9 << 28,
44fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_ULONG_REP = 10 << 28, /* Repeatable long value */
459d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_tag_type_t;
469d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
479d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
489d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_INVALID = KM_INVALID | 0,
499d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
509d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /*
519d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * Tags that must be semantically enforced by hardware and software implementations.
529d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     */
539d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
549d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Crypto parameters */
55cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_PURPOSE = KM_ENUM_REP | 1,    /* keymaster_purpose_t. */
56cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_ALGORITHM = KM_ENUM | 2,      /* keymaster_algorithm_t. */
57cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_KEY_SIZE = KM_UINT | 3,       /* Key size in bits. */
58cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_BLOCK_MODE = KM_ENUM_REP | 4, /* keymaster_block_mode_t. */
59cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_DIGEST = KM_ENUM_REP | 5,     /* keymaster_digest_t. */
60cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_PADDING = KM_ENUM_REP | 6,    /* keymaster_padding_t. */
61cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_CALLER_NONCE = KM_BOOL | 7,   /* Allow caller to specify nonce or IV. */
62cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_MIN_MAC_LENGTH = KM_UINT | 8, /* Minimum length of MAC or AEAD authentication tag in
63cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden                                          * bits. */
64cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_KDF = KM_ENUM_REP | 9,        /* keymaster_kdf_t (keymaster2) */
65cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_EC_CURVE = KM_ENUM | 10,      /* keymaster_ec_curve_t (keymaster2) */
669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Algorithm-specific. */
68fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_TAG_RSA_PUBLIC_EXPONENT = KM_ULONG | 200,
6940d59c8155ba3e47126993d96031ea088e45b22dThai Duong    KM_TAG_ECIES_SINGLE_HASH_MODE = KM_BOOL | 201, /* Whether the ephemeral public key is fed into
70cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden                                                    * the KDF */
71cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_INCLUDE_UNIQUE_ID = KM_BOOL | 202,      /* If true, attestation certificates for this key
72cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden                                                    * will contain an application-scoped and
73cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden                                                    * time-bounded device-unique ID. (keymaster2) */
749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
75fb769fc3125d2939683f2f5bff2cf25816e5838cShawn Willden    /* Other hardware-enforced. */
76fb769fc3125d2939683f2f5bff2cf25816e5838cShawn Willden    KM_TAG_BLOB_USAGE_REQUIREMENTS = KM_ENUM | 301, /* keymaster_key_blob_usage_requirements_t */
77fb769fc3125d2939683f2f5bff2cf25816e5838cShawn Willden    KM_TAG_BOOTLOADER_ONLY = KM_BOOL | 302,         /* Usable only by bootloader */
78fb769fc3125d2939683f2f5bff2cf25816e5838cShawn Willden
799d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /*
809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * Tags that should be semantically enforced by hardware if possible and will otherwise be
819d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * enforced by software (keystore).
829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     */
839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Key validity period */
859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_ACTIVE_DATETIME = KM_DATE | 400,             /* Start of validity */
869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_ORIGINATION_EXPIRE_DATETIME = KM_DATE | 401, /* Date when new "messages" should no
879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden                                                           longer be created. */
889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_USAGE_EXPIRE_DATETIME = KM_DATE | 402,       /* Date when existing "messages" should no
899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden                                                           longer be trusted. */
90fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_TAG_MIN_SECONDS_BETWEEN_OPS = KM_UINT | 403,     /* Minimum elapsed time between
919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden                                                           cryptographic operations with the key. */
92fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_TAG_MAX_USES_PER_BOOT = KM_UINT | 404,           /* Number of times the key can be used per
93dc0007bdb41f4ed49bc7a6e30908967cea503bf7Shawn Willden                                                           boot. */
949d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
959d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* User authentication */
96fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_TAG_ALL_USERS = KM_BOOL | 500,           /* Reserved for future use -- ignore */
97fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_TAG_USER_ID = KM_UINT | 501,             /* Reserved for future use -- ignore */
98fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_TAG_USER_SECURE_ID = KM_ULONG_REP | 502, /* Secure ID of authorized user or authenticator(s).
99fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden                                                   Disallowed if KM_TAG_ALL_USERS or
100fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden                                                   KM_TAG_NO_AUTH_REQUIRED is present. */
101fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_TAG_NO_AUTH_REQUIRED = KM_BOOL | 503,    /* If key is usable without authentication. */
102fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_TAG_USER_AUTH_TYPE = KM_ENUM | 504,      /* Bitmask of authenticator types allowed when
103fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden                                                 * KM_TAG_USER_SECURE_ID contains a secure user ID,
104fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden                                                 * rather than a secure authenticator ID.  Defined in
105fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden                                                 * hw_authenticator_type_t in hw_auth_token.h. */
106fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    KM_TAG_AUTH_TIMEOUT = KM_UINT | 505,        /* Required freshness of user authentication for
107fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden                                                   private/secret key operations, in seconds.
108fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden                                                   Public key operations require no authentication.
109fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden                                                   If absent, authentication is required for every
110fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden                                                   use.  Authentication state is lost when the
111fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden                                                   device is powered off. */
11271ca0109becc23c7cfe49c57cbcb56e142667771Shawn Willden    KM_TAG_ALLOW_WHILE_ON_BODY = KM_BOOL | 506, /* Allow key to be used after authentication timeout
11371ca0109becc23c7cfe49c57cbcb56e142667771Shawn Willden                                                 * if device is still on-body (requires secure
11471ca0109becc23c7cfe49c57cbcb56e142667771Shawn Willden                                                 * on-body sensor. */
1159d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1169d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Application access control */
117cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_ALL_APPLICATIONS = KM_BOOL | 600, /* Specified to indicate key is usable by all
118cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden                                              * applications. */
119cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_APPLICATION_ID = KM_BYTES | 601,  /* Byte string identifying the authorized
120cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden                                              * application. */
121cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_EXPORTABLE = KM_BOOL | 602,       /* If true, private/secret key can be exported, but
122cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden                                              * only if all access control requirements for use are
123cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden                                              * met. (keymaster2) */
1249d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1259d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /*
1269d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * Semantically unenforceable tags, either because they have no specific meaning or because
1279d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * they're informational only.
1289d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     */
1297fd11186a6731402fd5a33b26da9edf738dd750bShawn Willden    KM_TAG_APPLICATION_DATA = KM_BYTES | 700,      /* Data provided by authorized application. */
1307fd11186a6731402fd5a33b26da9edf738dd750bShawn Willden    KM_TAG_CREATION_DATETIME = KM_DATE | 701,      /* Key creation time */
1317fd11186a6731402fd5a33b26da9edf738dd750bShawn Willden    KM_TAG_ORIGIN = KM_ENUM | 702,                 /* keymaster_key_origin_t. */
1327fd11186a6731402fd5a33b26da9edf738dd750bShawn Willden    KM_TAG_ROLLBACK_RESISTANT = KM_BOOL | 703,     /* Whether key is rollback-resistant. */
1337fd11186a6731402fd5a33b26da9edf738dd750bShawn Willden    KM_TAG_ROOT_OF_TRUST = KM_BYTES | 704,         /* Root of trust ID. */
1347fd11186a6731402fd5a33b26da9edf738dd750bShawn Willden    KM_TAG_OS_VERSION = KM_UINT | 705,             /* Version of system (keymaster2) */
1357fd11186a6731402fd5a33b26da9edf738dd750bShawn Willden    KM_TAG_OS_PATCHLEVEL = KM_UINT | 706,          /* Patch level of system (keymaster2) */
1367fd11186a6731402fd5a33b26da9edf738dd750bShawn Willden    KM_TAG_UNIQUE_ID = KM_BYTES | 707,             /* Used to provide unique ID in attestation */
1377fd11186a6731402fd5a33b26da9edf738dd750bShawn Willden    KM_TAG_ATTESTATION_CHALLENGE = KM_BYTES | 708, /* Used to provide challenge in attestation */
1389d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
13967ba9e8144ba65ef6fe55bf8211530f2a55b320cShawn Willden    /* Tags used only to provide data to or receive data from operations */
14067ba9e8144ba65ef6fe55bf8211530f2a55b320cShawn Willden    KM_TAG_ASSOCIATED_DATA = KM_BYTES | 1000, /* Used to provide associated data for AEAD modes. */
14141e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden    KM_TAG_NONCE = KM_BYTES | 1001,           /* Nonce or Initialization Vector */
142da89dde9787dfbd8c053119ab52d9e671106b18eShawn Willden    KM_TAG_AUTH_TOKEN = KM_BYTES | 1002,      /* Authentication token that proves secure user
143c3ab05c3c40311cdae88eed35dc8884ecb5b1fd9Shawn Willden                                                 authentication has been performed.  Structure
144c3ab05c3c40311cdae88eed35dc8884ecb5b1fd9Shawn Willden                                                 defined in hw_auth_token_t in hw_auth_token.h. */
145cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_MAC_LENGTH = KM_UINT | 1003,       /* MAC or AEAD authentication tag length in
146cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden                                               * bits. */
147cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden
148cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_TAG_RESET_SINCE_ID_ROTATION = KM_BOOL | 1004, /* Whether the device has beeen factory reset
149cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden                                                        since the last unique ID rotation.  Used for
150cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden                                                        key attestation. */
1519d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_tag_t;
1529d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1539d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
1549d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Algorithms that may be provided by keymaster implementations.  Those that must be provided by all
155fd4b4d5a9b692bbeedc310f3bc970d849035f43dShawn Willden * implementations are tagged as "required".
1569d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
1579d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
1589d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Asymmetric algorithms. */
159e9797a740c913cff9152f89d04fd6fb360dda048Shawn Willden    KM_ALGORITHM_RSA = 1,
160e9797a740c913cff9152f89d04fd6fb360dda048Shawn Willden    // KM_ALGORITHM_DSA = 2, -- Removed, do not re-use value 2.
161e9797a740c913cff9152f89d04fd6fb360dda048Shawn Willden    KM_ALGORITHM_EC = 3,
162e9797a740c913cff9152f89d04fd6fb360dda048Shawn Willden
163e9797a740c913cff9152f89d04fd6fb360dda048Shawn Willden    /* Block ciphers algorithms */
164e9797a740c913cff9152f89d04fd6fb360dda048Shawn Willden    KM_ALGORITHM_AES = 32,
165e9797a740c913cff9152f89d04fd6fb360dda048Shawn Willden
1669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* MAC algorithms */
167e9797a740c913cff9152f89d04fd6fb360dda048Shawn Willden    KM_ALGORITHM_HMAC = 128,
1689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_algorithm_t;
1699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
171c7deedad047c6e5833daeaa2a73f25b77ba0b9ebShawn Willden * Symmetric block cipher modes provided by keymaster implementations.
1729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
1739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
1749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Unauthenticated modes, usable only for encryption/decryption and not generally recommended
1759d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * except for compatibility with existing other protocols. */
1764c19a3af3535eb3442ff7cc4235420baf16322b7Shawn Willden    KM_MODE_ECB = 1,
177c7deedad047c6e5833daeaa2a73f25b77ba0b9ebShawn Willden    KM_MODE_CBC = 2,
1784c19a3af3535eb3442ff7cc4235420baf16322b7Shawn Willden    KM_MODE_CTR = 3,
179c7deedad047c6e5833daeaa2a73f25b77ba0b9ebShawn Willden
1809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Authenticated modes, usable for encryption/decryption and signing/verification.  Recommended
181c7deedad047c6e5833daeaa2a73f25b77ba0b9ebShawn Willden     * over unauthenticated modes for all purposes. */
1824c19a3af3535eb3442ff7cc4235420baf16322b7Shawn Willden    KM_MODE_GCM = 32,
1839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_block_mode_t;
1849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
1869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Padding modes that may be applied to plaintext for encryption operations.  This list includes
1879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * padding modes for both symmetric and asymmetric algorithms.  Note that implementations should not
1889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * provide all possible combinations of algorithm and padding, only the
1899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * cryptographically-appropriate pairs.
1909d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
1919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
1928412fdc42866b4d5c07370f06c2767a4cad5c23aShawn Willden    KM_PAD_NONE = 1, /* deprecated */
1938412fdc42866b4d5c07370f06c2767a4cad5c23aShawn Willden    KM_PAD_RSA_OAEP = 2,
1948412fdc42866b4d5c07370f06c2767a4cad5c23aShawn Willden    KM_PAD_RSA_PSS = 3,
1959d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PAD_RSA_PKCS1_1_5_ENCRYPT = 4,
1969d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PAD_RSA_PKCS1_1_5_SIGN = 5,
1978412fdc42866b4d5c07370f06c2767a4cad5c23aShawn Willden    KM_PAD_PKCS7 = 64,
1989d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_padding_t;
1999d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
2009d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
201fe6c4f0633aa88c1cb84a46362cc74de1c4ddd1eShawn Willden * Digests provided by keymaster implementations.
2029d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
2039d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
204fe6c4f0633aa88c1cb84a46362cc74de1c4ddd1eShawn Willden    KM_DIGEST_NONE = 0,
205fe6c4f0633aa88c1cb84a46362cc74de1c4ddd1eShawn Willden    KM_DIGEST_MD5 = 1, /* Optional, may not be implemented in hardware, will be handled in software
206fe6c4f0633aa88c1cb84a46362cc74de1c4ddd1eShawn Willden                        * if needed. */
207fe6c4f0633aa88c1cb84a46362cc74de1c4ddd1eShawn Willden    KM_DIGEST_SHA1 = 2,
208fe6c4f0633aa88c1cb84a46362cc74de1c4ddd1eShawn Willden    KM_DIGEST_SHA_2_224 = 3,
209fe6c4f0633aa88c1cb84a46362cc74de1c4ddd1eShawn Willden    KM_DIGEST_SHA_2_256 = 4,
210fe6c4f0633aa88c1cb84a46362cc74de1c4ddd1eShawn Willden    KM_DIGEST_SHA_2_384 = 5,
211fe6c4f0633aa88c1cb84a46362cc74de1c4ddd1eShawn Willden    KM_DIGEST_SHA_2_512 = 6,
2129d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_digest_t;
2139d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
21440d59c8155ba3e47126993d96031ea088e45b22dThai Duong/*
21540d59c8155ba3e47126993d96031ea088e45b22dThai Duong * Key derivation functions, mostly used in ECIES.
21640d59c8155ba3e47126993d96031ea088e45b22dThai Duong */
21740d59c8155ba3e47126993d96031ea088e45b22dThai Duongtypedef enum {
218cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    /* Do not apply a key derivation function; use the raw agreed key */
219cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_KDF_NONE = 0,
22040d59c8155ba3e47126993d96031ea088e45b22dThai Duong    /* HKDF defined in RFC 5869 with SHA256 */
221cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_KDF_RFC5869_SHA256 = 1,
22240d59c8155ba3e47126993d96031ea088e45b22dThai Duong    /* KDF1 defined in ISO 18033-2 with SHA1 */
223cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_KDF_ISO18033_2_KDF1_SHA1 = 2,
22440d59c8155ba3e47126993d96031ea088e45b22dThai Duong    /* KDF1 defined in ISO 18033-2 with SHA256 */
225cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_KDF_ISO18033_2_KDF1_SHA256 = 3,
22640d59c8155ba3e47126993d96031ea088e45b22dThai Duong    /* KDF2 defined in ISO 18033-2 with SHA1 */
227cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_KDF_ISO18033_2_KDF2_SHA1 = 4,
22840d59c8155ba3e47126993d96031ea088e45b22dThai Duong    /* KDF2 defined in ISO 18033-2 with SHA256 */
229cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_KDF_ISO18033_2_KDF2_SHA256 = 5,
23040d59c8155ba3e47126993d96031ea088e45b22dThai Duong} keymaster_kdf_t;
23140d59c8155ba3e47126993d96031ea088e45b22dThai Duong
23240d59c8155ba3e47126993d96031ea088e45b22dThai Duong/**
23340d59c8155ba3e47126993d96031ea088e45b22dThai Duong * Supported EC curves, used in ECDSA/ECIES.
23440d59c8155ba3e47126993d96031ea088e45b22dThai Duong */
23540d59c8155ba3e47126993d96031ea088e45b22dThai Duongtypedef enum {
23640d59c8155ba3e47126993d96031ea088e45b22dThai Duong    KM_EC_CURVE_P_224 = 0,
23740d59c8155ba3e47126993d96031ea088e45b22dThai Duong    KM_EC_CURVE_P_256 = 1,
23840d59c8155ba3e47126993d96031ea088e45b22dThai Duong    KM_EC_CURVE_P_384 = 2,
23940d59c8155ba3e47126993d96031ea088e45b22dThai Duong    KM_EC_CURVE_P_521 = 3,
24040d59c8155ba3e47126993d96031ea088e45b22dThai Duong} keymaster_ec_curve_t;
24140d59c8155ba3e47126993d96031ea088e45b22dThai Duong
2429d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
2438d6cf2594c9524205a6f5823378d1b983a1ad073Shawn Willden * The origin of a key (or pair), i.e. where it was generated.  Note that KM_TAG_ORIGIN can be found
2448d6cf2594c9524205a6f5823378d1b983a1ad073Shawn Willden * in either the hardware-enforced or software-enforced list for a key, indicating whether the key
2458d6cf2594c9524205a6f5823378d1b983a1ad073Shawn Willden * is hardware or software-based.  Specifically, a key with KM_ORIGIN_GENERATED in the
2468d6cf2594c9524205a6f5823378d1b983a1ad073Shawn Willden * hardware-enforced list is guaranteed never to have existed outide the secure hardware.
2479d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
2489d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
249cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_ORIGIN_GENERATED = 0, /* Generated in keymaster.  Should not exist outside the TEE. */
250cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_ORIGIN_DERIVED = 1,   /* Derived inside keymaster.  Likely exists off-device. */
251cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_ORIGIN_IMPORTED = 2,  /* Imported into keymaster.  Existed as cleartext in Android. */
252d359b044830b292f492f8a8df5471f869e358399Shawn Willden    KM_ORIGIN_UNKNOWN = 3,   /* Keymaster did not record origin.  This value can only be seen on
253d359b044830b292f492f8a8df5471f869e358399Shawn Willden                              * keys in a keymaster0 implementation.  The keymaster0 adapter uses
254d359b044830b292f492f8a8df5471f869e358399Shawn Willden                              * this value to document the fact that it is unkown whether the key
255d359b044830b292f492f8a8df5471f869e358399Shawn Willden                              * was generated inside or imported into keymaster. */
2569d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_origin_t;
2579d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
2589d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
2599d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Usability requirements of key blobs.  This defines what system functionality must be available
2609d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * for the key to function.  For example, key "blobs" which are actually handles referencing
2619d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * encrypted key material stored in the file system cannot be used until the file system is
2629d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * available, and should have BLOB_REQUIRES_FILE_SYSTEM.  Other requirements entries will be added
263cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden * as needed for implementations.
2649d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
2659d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
2669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_BLOB_STANDALONE = 0,
2679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_BLOB_REQUIRES_FILE_SYSTEM = 1,
2689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_blob_usage_requirements_t;
2699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
2709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
271cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden * Possible purposes of a key (or pair).
2729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
2739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
274cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_PURPOSE_ENCRYPT = 0,    /* Usable with RSA, EC and AES keys. */
275cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_PURPOSE_DECRYPT = 1,    /* Usable with RSA, EC and AES keys. */
276cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_PURPOSE_SIGN = 2,       /* Usable with RSA, EC and HMAC keys. */
277cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_PURPOSE_VERIFY = 3,     /* Usable with RSA, EC and HMAC keys. */
278cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_PURPOSE_DERIVE_KEY = 4, /* Usable with EC keys. */
2799d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_purpose_t;
2809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
2819d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
2829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    const uint8_t* data;
2839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    size_t data_length;
2849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_blob_t;
2859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
2869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
2879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_tag_t tag;
2889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    union {
2899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        uint32_t enumerated;   /* KM_ENUM and KM_ENUM_REP */
2909d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        bool boolean;          /* KM_BOOL */
2919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        uint32_t integer;      /* KM_INT and KM_INT_REP */
2929d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        uint64_t long_integer; /* KM_LONG */
2939d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        uint64_t date_time;    /* KM_DATE */
2949d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        keymaster_blob_t blob; /* KM_BIGNUM and KM_BYTES*/
2959d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    };
2969d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_param_t;
2979d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
2989d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
2999d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t* params; /* may be NULL if length == 0 */
3009d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    size_t length;
3019d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_param_set_t;
3029d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3039d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
3049d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Parameters that define a key's characteristics, including authorized modes of usage and access
3059d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * control restrictions.  The parameters are divided into two categories, those that are enforced by
3069d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * secure hardware, and those that are not.  For a software-only keymaster implementation the
3079d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * enforced array must NULL.  Hardware implementations must enforce everything in the enforced
3089d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * array.
3099d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
3109d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
3119d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_set_t hw_enforced;
3129d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_set_t sw_enforced;
3139d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_characteristics_t;
3149d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3159d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
3169d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    const uint8_t* key_material;
3179d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    size_t key_material_size;
3189d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_blob_t;
3199d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
320cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willdentypedef struct {
321cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    keymaster_blob_t* entries;
322cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    size_t entry_count;
323cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden} keymaster_cert_chain_t;
324cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden
3259d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
326cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden * Formats for key import and export.
3279d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
3289d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
329fb769fc3125d2939683f2f5bff2cf25816e5838cShawn Willden    KM_KEY_FORMAT_X509 = 0,  /* for public key export */
330fb769fc3125d2939683f2f5bff2cf25816e5838cShawn Willden    KM_KEY_FORMAT_PKCS8 = 1, /* for asymmetric key pair import */
331cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_KEY_FORMAT_RAW = 3,   /* for symmetric key import and export*/
3329d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_format_t;
3339d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3349d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
3359d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * The keymaster operation API consists of begin, update, finish and abort. This is the type of the
3369d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * handle used to tie the sequence of calls together.  A 64-bit value is used because it's important
3379d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * that handles not be predictable.  Implementations must use strong random numbers for handle
3389d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * values.
3399d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
3409d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef uint64_t keymaster_operation_handle_t;
3419d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3429d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
3439d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_OK = 0,
3449d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_ROOT_OF_TRUST_ALREADY_SET = -1,
3459d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_PURPOSE = -2,
3469d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_PURPOSE = -3,
3479d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_ALGORITHM = -4,
3489d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_ALGORITHM = -5,
3499d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_KEY_SIZE = -6,
3509d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_BLOCK_MODE = -7,
3519d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_BLOCK_MODE = -8,
3526b424bea8074c997745b3758f8fde0ef925e3218Shawn Willden    KM_ERROR_UNSUPPORTED_MAC_LENGTH = -9,
3539d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_PADDING_MODE = -10,
3549d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_PADDING_MODE = -11,
3559d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_DIGEST = -12,
3569d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_DIGEST = -13,
3579d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_EXPIRATION_TIME = -14,
3589d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_USER_ID = -15,
3599d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_AUTHORIZATION_TIMEOUT = -16,
3609d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_KEY_FORMAT = -17,
3619d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_KEY_FORMAT = -18,
3629d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM = -19,   /* For PKCS8 & PKCS12 */
3639d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_KEY_VERIFICATION_ALGORITHM = -20, /* For PKCS8 & PKCS12 */
3649d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_INPUT_LENGTH = -21,
3659d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_KEY_EXPORT_OPTIONS_INVALID = -22,
3669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_DELEGATION_NOT_ALLOWED = -23,
3679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_KEY_NOT_YET_VALID = -24,
3689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_KEY_EXPIRED = -25,
3699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_KEY_USER_NOT_AUTHENTICATED = -26,
3709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_OUTPUT_PARAMETER_NULL = -27,
3719d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_OPERATION_HANDLE = -28,
3729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INSUFFICIENT_BUFFER_SPACE = -29,
3739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_VERIFICATION_FAILED = -30,
3749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_TOO_MANY_OPERATIONS = -31,
3759d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNEXPECTED_NULL_POINTER = -32,
3769d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_KEY_BLOB = -33,
3779d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORTED_KEY_NOT_ENCRYPTED = -34,
3789d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORTED_KEY_DECRYPTION_FAILED = -35,
3799d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORTED_KEY_NOT_SIGNED = -36,
3809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORTED_KEY_VERIFICATION_FAILED = -37,
3819d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_ARGUMENT = -38,
3829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_TAG = -39,
3839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_TAG = -40,
3849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_MEMORY_ALLOCATION_FAILED = -41,
3859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORT_PARAMETER_MISMATCH = -44,
3869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_SECURE_HW_ACCESS_DENIED = -45,
3879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_OPERATION_CANCELLED = -46,
3889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_CONCURRENT_ACCESS_CONFLICT = -47,
3899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_SECURE_HW_BUSY = -48,
3909d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_SECURE_HW_COMMUNICATION_FAILED = -49,
3919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_EC_FIELD = -50,
392ed94111cce5b3b6fff9833f99ea80f4ab7b37c04Shawn Willden    KM_ERROR_MISSING_NONCE = -51,
393ed94111cce5b3b6fff9833f99ea80f4ab7b37c04Shawn Willden    KM_ERROR_INVALID_NONCE = -52,
3944144c64818fcb88905bc2632e3747be3681a1405Shawn Willden    KM_ERROR_MISSING_MAC_LENGTH = -53,
395396d6cbce987deac076ac1a636d3f7282ec9338dShawn Willden    KM_ERROR_KEY_RATE_LIMIT_EXCEEDED = -54,
3964bdd7cbd47c7b89f6a47c3dbba648a3d95f9a45dShawn Willden    KM_ERROR_CALLER_NONCE_PROHIBITED = -55,
397396d6cbce987deac076ac1a636d3f7282ec9338dShawn Willden    KM_ERROR_KEY_MAX_OPS_EXCEEDED = -56,
398a3f0ab55a73d4c21de9f34ec21f27a2609b568fdShawn Willden    KM_ERROR_INVALID_MAC_LENGTH = -57,
399a3f0ab55a73d4c21de9f34ec21f27a2609b568fdShawn Willden    KM_ERROR_MISSING_MIN_MAC_LENGTH = -58,
400a3f0ab55a73d4c21de9f34ec21f27a2609b568fdShawn Willden    KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH = -59,
40140d59c8155ba3e47126993d96031ea088e45b22dThai Duong    KM_ERROR_UNSUPPORTED_KDF = -60,
40240d59c8155ba3e47126993d96031ea088e45b22dThai Duong    KM_ERROR_UNSUPPORTED_EC_CURVE = -61,
403cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_ERROR_KEY_REQUIRES_UPGRADE = -62,
4047fd11186a6731402fd5a33b26da9edf738dd750bShawn Willden    KM_ERROR_ATTESTATION_CHALLENGE_MISSING = -63,
405ed94111cce5b3b6fff9833f99ea80f4ab7b37c04Shawn Willden
4069d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNIMPLEMENTED = -100,
4079d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_VERSION_MISMATCH = -101,
4089d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4099d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNKNOWN_ERROR = -1000,
4109d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_error_t;
4119d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4129d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/* Convenience functions for manipulating keymaster tag types */
4139d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4149d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenstatic inline keymaster_tag_type_t keymaster_tag_get_type(keymaster_tag_t tag) {
4159d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return (keymaster_tag_type_t)(tag & (0xF << 28));
4169d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4179d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4189d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenstatic inline uint32_t keymaster_tag_mask_type(keymaster_tag_t tag) {
4199d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return tag & 0x0FFFFFFF;
4209d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4219d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4229d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenstatic inline bool keymaster_tag_type_repeatable(keymaster_tag_type_t type) {
4239d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    switch (type) {
424fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    case KM_UINT_REP:
4259d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    case KM_ENUM_REP:
4269d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        return true;
4279d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    default:
4289d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        return false;
4299d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    }
4309d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4319d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4329d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenstatic inline bool keymaster_tag_repeatable(keymaster_tag_t tag) {
4339d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return keymaster_tag_type_repeatable(keymaster_tag_get_type(tag));
4349d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4359d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4369d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/* Convenience functions for manipulating keymaster_key_param_t structs */
4379d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4389d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_enum(keymaster_tag_t tag, uint32_t value) {
4399d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_ENUM || keymaster_tag_get_type(tag) == KM_ENUM_REP);
4409d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
4419d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
4429d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
4439d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.enumerated = value;
4449d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
4459d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4469d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4479d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_int(keymaster_tag_t tag, uint32_t value) {
4489d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_INT || keymaster_tag_get_type(tag) == KM_INT_REP);
4499d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
4509d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
4519d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
4529d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.integer = value;
4539d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
4549d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4559d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4569d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_long(keymaster_tag_t tag, uint64_t value) {
4579d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_LONG);
4589d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
4599d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
4609d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
4619d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.long_integer = value;
4629d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
4639d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4649d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4659d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_blob(keymaster_tag_t tag, const uint8_t* bytes,
4669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden                                                  size_t bytes_len) {
4679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_BYTES || keymaster_tag_get_type(tag) == KM_BIGNUM);
4689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
4699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
4709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
4719d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.blob.data = (uint8_t*)bytes;
4729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.blob.data_length = bytes_len;
4739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
4749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4759d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4769d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_bool(keymaster_tag_t tag) {
4779d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_BOOL);
4789d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
4799d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
4809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
4819d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.boolean = true;
4829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
4839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_date(keymaster_tag_t tag, uint64_t value) {
4869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_DATE);
4879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
4889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
4899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
4909d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.date_time = value;
4919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
4929d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4939d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
49467411d6f5116c52c1b82330b6cd096974636db36Shawn Willden#define KEYMASTER_SIMPLE_COMPARE(a, b) (a < b) ? -1 : ((a > b) ? 1 : 0)
49567411d6f5116c52c1b82330b6cd096974636db36Shawn Willdeninline int keymaster_param_compare(const keymaster_key_param_t* a, const keymaster_key_param_t* b) {
49667411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    int retval = KEYMASTER_SIMPLE_COMPARE(a->tag, b->tag);
49767411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    if (retval != 0)
49867411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        return retval;
49967411d6f5116c52c1b82330b6cd096974636db36Shawn Willden
50067411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    switch (keymaster_tag_get_type(a->tag)) {
50167411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_INVALID:
50267411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_BOOL:
50367411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        return 0;
50467411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_ENUM:
50567411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_ENUM_REP:
50667411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        return KEYMASTER_SIMPLE_COMPARE(a->enumerated, b->enumerated);
507fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    case KM_UINT:
508fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    case KM_UINT_REP:
50967411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        return KEYMASTER_SIMPLE_COMPARE(a->integer, b->integer);
510fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    case KM_ULONG:
511fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    case KM_ULONG_REP:
51267411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        return KEYMASTER_SIMPLE_COMPARE(a->long_integer, b->long_integer);
51367411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_DATE:
51467411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        return KEYMASTER_SIMPLE_COMPARE(a->date_time, b->date_time);
51567411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_BIGNUM:
51667411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_BYTES:
51767411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        // Handle the empty cases.
51867411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        if (a->blob.data_length != 0 && b->blob.data_length == 0)
51967411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            return -1;
52067411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        if (a->blob.data_length == 0 && b->blob.data_length == 0)
52167411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            return 0;
52267411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        if (a->blob.data_length == 0 && b->blob.data_length > 0)
52367411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            return 1;
52467411d6f5116c52c1b82330b6cd096974636db36Shawn Willden
52567411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        retval = memcmp(a->blob.data, b->blob.data, a->blob.data_length < b->blob.data_length
52667411d6f5116c52c1b82330b6cd096974636db36Shawn Willden                                                        ? a->blob.data_length
52767411d6f5116c52c1b82330b6cd096974636db36Shawn Willden                                                        : b->blob.data_length);
52867411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        if (retval != 0)
52967411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            return retval;
53067411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        else if (a->blob.data_length != b->blob.data_length) {
53167411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            // Equal up to the common length; longer one is larger.
53267411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            if (a->blob.data_length < b->blob.data_length)
53367411d6f5116c52c1b82330b6cd096974636db36Shawn Willden                return -1;
53467411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            if (a->blob.data_length > b->blob.data_length)
53567411d6f5116c52c1b82330b6cd096974636db36Shawn Willden                return 1;
53667411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        };
53767411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    }
53867411d6f5116c52c1b82330b6cd096974636db36Shawn Willden
53967411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    return 0;
54067411d6f5116c52c1b82330b6cd096974636db36Shawn Willden}
54167411d6f5116c52c1b82330b6cd096974636db36Shawn Willden#undef KEYMASTER_SIMPLE_COMPARE
54267411d6f5116c52c1b82330b6cd096974636db36Shawn Willden
5439d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline void keymaster_free_param_values(keymaster_key_param_t* param, size_t param_count) {
544a3c0ae16ac1a9f7a8fced4b196d138cefa9462a5Chad Brubaker    while (param_count > 0) {
545a3c0ae16ac1a9f7a8fced4b196d138cefa9462a5Chad Brubaker        param_count--;
5469d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        switch (keymaster_tag_get_type(param->tag)) {
5479d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        case KM_BIGNUM:
5489d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        case KM_BYTES:
5499d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            free((void*)param->blob.data);
5509d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            param->blob.data = NULL;
5519d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            break;
5529d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        default:
5539d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            // NOP
5549d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            break;
5559d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        }
5569d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        ++param;
5579d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    }
5589d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5599d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5609d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline void keymaster_free_param_set(keymaster_key_param_set_t* set) {
5619d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    if (set) {
5629d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        keymaster_free_param_values(set->params, set->length);
5639d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        free(set->params);
5649d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        set->params = NULL;
5659d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    }
5669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline void keymaster_free_characteristics(keymaster_key_characteristics_t* characteristics) {
5699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    if (characteristics) {
5709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        keymaster_free_param_set(&characteristics->hw_enforced);
5719d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        keymaster_free_param_set(&characteristics->sw_enforced);
5729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    }
5739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
575cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willdeninline void keymaster_free_cert_chain(keymaster_cert_chain_t* chain) {
576cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    if (chain) {
577cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden        for (size_t i = 0; i < chain->entry_count; ++i) {
578cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden            free((uint8_t*)chain->entries[i].data);
579cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden            chain->entries[i].data = NULL;
580cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden            chain->entries[i].data_length = 0;
581cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden        }
582cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden        free(chain->entries);
583cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden        chain->entries = NULL;
584cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden        chain->entry_count = 0;
585cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    }
586cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden}
587cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden
5887eaa15ffa65239e8f4f23d21ff1a6ed66ed9a13fShawn Willden#ifdef __cplusplus
589c51d01ed029458e8809eeb9c16f9ed2dbe755be4Shawn Willden}  // extern "C"
590c51d01ed029458e8809eeb9c16f9ed2dbe755be4Shawn Willden#endif  // __cplusplus
5919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5929d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden#endif  // ANDROID_HARDWARE_KEYMASTER_DEFS_H
593