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
3253080276974953e4c61716a71760831f392a75986Shawn Willdentypedef enum {
3263080276974953e4c61716a71760831f392a75986Shawn Willden    KM_VERIFIED_BOOT_VERIFIED = 0,    /* Full chain of trust extending from the bootloader to
3273080276974953e4c61716a71760831f392a75986Shawn Willden                                       * verified partitions, including the bootloader, boot
3283080276974953e4c61716a71760831f392a75986Shawn Willden                                       * partition, and all verified partitions*/
3293080276974953e4c61716a71760831f392a75986Shawn Willden    KM_VERIFIED_BOOT_SELF_SIGNED = 1, /* The boot partition has been verified using the embedded
3303080276974953e4c61716a71760831f392a75986Shawn Willden                                       * certificate, and the signature is valid. The bootloader
3313080276974953e4c61716a71760831f392a75986Shawn Willden                                       * displays a warning and the fingerprint of the public
3323080276974953e4c61716a71760831f392a75986Shawn Willden                                       * key before allowing the boot process to continue.*/
3333080276974953e4c61716a71760831f392a75986Shawn Willden    KM_VERIFIED_BOOT_UNVERIFIED = 2,  /* The device may be freely modified. Device integrity is left
3343080276974953e4c61716a71760831f392a75986Shawn Willden                                       * to the user to verify out-of-band. The bootloader
3353080276974953e4c61716a71760831f392a75986Shawn Willden                                       * displays a warning to the user before allowing the boot
3363080276974953e4c61716a71760831f392a75986Shawn Willden                                       * process to continue */
3373080276974953e4c61716a71760831f392a75986Shawn Willden    KM_VERIFIED_BOOT_FAILED = 3,      /* The device failed verification. The bootloader displays a
3383080276974953e4c61716a71760831f392a75986Shawn Willden                                       * warning and stops the boot process, so no keymaster
3393080276974953e4c61716a71760831f392a75986Shawn Willden                                       * implementation should ever actually return this value,
3403080276974953e4c61716a71760831f392a75986Shawn Willden                                       * since it should not run.  Included here only for
3413080276974953e4c61716a71760831f392a75986Shawn Willden                                       * completeness. */
3423080276974953e4c61716a71760831f392a75986Shawn Willden} keymaster_verified_boot_t;
3433080276974953e4c61716a71760831f392a75986Shawn Willden
344aeb15d64fc331476150622fc693222e3d920b9ecShawn Willdentypedef enum {
345aeb15d64fc331476150622fc693222e3d920b9ecShawn Willden    KM_SECURITY_LEVEL_SOFTWARE = 0,
346aeb15d64fc331476150622fc693222e3d920b9ecShawn Willden    KM_SECURITY_LEVEL_TRUSTED_ENVIRONMENT = 1,
347aeb15d64fc331476150622fc693222e3d920b9ecShawn Willden} keymaster_security_level_t;
348aeb15d64fc331476150622fc693222e3d920b9ecShawn Willden
3499d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
350cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden * Formats for key import and export.
3519d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
3529d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
353fb769fc3125d2939683f2f5bff2cf25816e5838cShawn Willden    KM_KEY_FORMAT_X509 = 0,  /* for public key export */
354fb769fc3125d2939683f2f5bff2cf25816e5838cShawn Willden    KM_KEY_FORMAT_PKCS8 = 1, /* for asymmetric key pair import */
355cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_KEY_FORMAT_RAW = 3,   /* for symmetric key import and export*/
3569d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_format_t;
3579d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3589d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
3599d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * The keymaster operation API consists of begin, update, finish and abort. This is the type of the
3609d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * handle used to tie the sequence of calls together.  A 64-bit value is used because it's important
3619d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * that handles not be predictable.  Implementations must use strong random numbers for handle
3629d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * values.
3639d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
3649d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef uint64_t keymaster_operation_handle_t;
3659d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
3679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_OK = 0,
3689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_ROOT_OF_TRUST_ALREADY_SET = -1,
3699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_PURPOSE = -2,
3709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_PURPOSE = -3,
3719d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_ALGORITHM = -4,
3729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_ALGORITHM = -5,
3739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_KEY_SIZE = -6,
3749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_BLOCK_MODE = -7,
3759d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_BLOCK_MODE = -8,
3766b424bea8074c997745b3758f8fde0ef925e3218Shawn Willden    KM_ERROR_UNSUPPORTED_MAC_LENGTH = -9,
3779d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_PADDING_MODE = -10,
3789d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_PADDING_MODE = -11,
3799d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_DIGEST = -12,
3809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_DIGEST = -13,
3819d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_EXPIRATION_TIME = -14,
3829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_USER_ID = -15,
3839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_AUTHORIZATION_TIMEOUT = -16,
3849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_KEY_FORMAT = -17,
3859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_KEY_FORMAT = -18,
3869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM = -19,   /* For PKCS8 & PKCS12 */
3879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_KEY_VERIFICATION_ALGORITHM = -20, /* For PKCS8 & PKCS12 */
3889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_INPUT_LENGTH = -21,
3899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_KEY_EXPORT_OPTIONS_INVALID = -22,
3909d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_DELEGATION_NOT_ALLOWED = -23,
3919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_KEY_NOT_YET_VALID = -24,
3929d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_KEY_EXPIRED = -25,
3939d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_KEY_USER_NOT_AUTHENTICATED = -26,
3949d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_OUTPUT_PARAMETER_NULL = -27,
3959d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_OPERATION_HANDLE = -28,
3969d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INSUFFICIENT_BUFFER_SPACE = -29,
3979d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_VERIFICATION_FAILED = -30,
3989d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_TOO_MANY_OPERATIONS = -31,
3999d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNEXPECTED_NULL_POINTER = -32,
4009d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_KEY_BLOB = -33,
4019d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORTED_KEY_NOT_ENCRYPTED = -34,
4029d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORTED_KEY_DECRYPTION_FAILED = -35,
4039d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORTED_KEY_NOT_SIGNED = -36,
4049d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORTED_KEY_VERIFICATION_FAILED = -37,
4059d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_ARGUMENT = -38,
4069d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_TAG = -39,
4079d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_TAG = -40,
4089d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_MEMORY_ALLOCATION_FAILED = -41,
4099d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORT_PARAMETER_MISMATCH = -44,
4109d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_SECURE_HW_ACCESS_DENIED = -45,
4119d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_OPERATION_CANCELLED = -46,
4129d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_CONCURRENT_ACCESS_CONFLICT = -47,
4139d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_SECURE_HW_BUSY = -48,
4149d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_SECURE_HW_COMMUNICATION_FAILED = -49,
4159d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_EC_FIELD = -50,
416ed94111cce5b3b6fff9833f99ea80f4ab7b37c04Shawn Willden    KM_ERROR_MISSING_NONCE = -51,
417ed94111cce5b3b6fff9833f99ea80f4ab7b37c04Shawn Willden    KM_ERROR_INVALID_NONCE = -52,
4184144c64818fcb88905bc2632e3747be3681a1405Shawn Willden    KM_ERROR_MISSING_MAC_LENGTH = -53,
419396d6cbce987deac076ac1a636d3f7282ec9338dShawn Willden    KM_ERROR_KEY_RATE_LIMIT_EXCEEDED = -54,
4204bdd7cbd47c7b89f6a47c3dbba648a3d95f9a45dShawn Willden    KM_ERROR_CALLER_NONCE_PROHIBITED = -55,
421396d6cbce987deac076ac1a636d3f7282ec9338dShawn Willden    KM_ERROR_KEY_MAX_OPS_EXCEEDED = -56,
422a3f0ab55a73d4c21de9f34ec21f27a2609b568fdShawn Willden    KM_ERROR_INVALID_MAC_LENGTH = -57,
423a3f0ab55a73d4c21de9f34ec21f27a2609b568fdShawn Willden    KM_ERROR_MISSING_MIN_MAC_LENGTH = -58,
424a3f0ab55a73d4c21de9f34ec21f27a2609b568fdShawn Willden    KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH = -59,
42540d59c8155ba3e47126993d96031ea088e45b22dThai Duong    KM_ERROR_UNSUPPORTED_KDF = -60,
42640d59c8155ba3e47126993d96031ea088e45b22dThai Duong    KM_ERROR_UNSUPPORTED_EC_CURVE = -61,
427cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    KM_ERROR_KEY_REQUIRES_UPGRADE = -62,
4287fd11186a6731402fd5a33b26da9edf738dd750bShawn Willden    KM_ERROR_ATTESTATION_CHALLENGE_MISSING = -63,
4293080276974953e4c61716a71760831f392a75986Shawn Willden    KM_ERROR_KEYMASTER_NOT_CONFIGURED = -64,
430ed94111cce5b3b6fff9833f99ea80f4ab7b37c04Shawn Willden
4319d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNIMPLEMENTED = -100,
4329d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_VERSION_MISMATCH = -101,
4339d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4349d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNKNOWN_ERROR = -1000,
4359d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_error_t;
4369d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4379d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/* Convenience functions for manipulating keymaster tag types */
4389d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4399d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenstatic inline keymaster_tag_type_t keymaster_tag_get_type(keymaster_tag_t tag) {
4409d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return (keymaster_tag_type_t)(tag & (0xF << 28));
4419d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4429d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4439d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenstatic inline uint32_t keymaster_tag_mask_type(keymaster_tag_t tag) {
4449d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return tag & 0x0FFFFFFF;
4459d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4469d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4479d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenstatic inline bool keymaster_tag_type_repeatable(keymaster_tag_type_t type) {
4489d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    switch (type) {
449fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    case KM_UINT_REP:
4509d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    case KM_ENUM_REP:
4519d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        return true;
4529d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    default:
4539d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        return false;
4549d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    }
4559d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4569d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4579d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenstatic inline bool keymaster_tag_repeatable(keymaster_tag_t tag) {
4589d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return keymaster_tag_type_repeatable(keymaster_tag_get_type(tag));
4599d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4609d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4619d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/* Convenience functions for manipulating keymaster_key_param_t structs */
4629d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4639d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_enum(keymaster_tag_t tag, uint32_t value) {
4649d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_ENUM || keymaster_tag_get_type(tag) == KM_ENUM_REP);
4659d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
4669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
4679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
4689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.enumerated = value;
4699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
4709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4719d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_int(keymaster_tag_t tag, uint32_t value) {
4739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_INT || keymaster_tag_get_type(tag) == KM_INT_REP);
4749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
4759d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
4769d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
4779d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.integer = value;
4789d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
4799d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4819d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_long(keymaster_tag_t tag, uint64_t value) {
4829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_LONG);
4839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
4849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
4859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
4869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.long_integer = value;
4879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
4889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
4899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4909d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_blob(keymaster_tag_t tag, const uint8_t* bytes,
4919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden                                                  size_t bytes_len) {
4929d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_BYTES || keymaster_tag_get_type(tag) == KM_BIGNUM);
4939d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
4949d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
4959d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
4969d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.blob.data = (uint8_t*)bytes;
4979d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.blob.data_length = bytes_len;
4989d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
4999d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5009d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5019d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_bool(keymaster_tag_t tag) {
5029d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_BOOL);
5039d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
5049d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
5059d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
5069d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.boolean = true;
5079d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
5089d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5099d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5109d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_date(keymaster_tag_t tag, uint64_t value) {
5119d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_DATE);
5129d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
5139d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
5149d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
5159d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.date_time = value;
5169d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
5179d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5189d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
51967411d6f5116c52c1b82330b6cd096974636db36Shawn Willden#define KEYMASTER_SIMPLE_COMPARE(a, b) (a < b) ? -1 : ((a > b) ? 1 : 0)
52067411d6f5116c52c1b82330b6cd096974636db36Shawn Willdeninline int keymaster_param_compare(const keymaster_key_param_t* a, const keymaster_key_param_t* b) {
52167411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    int retval = KEYMASTER_SIMPLE_COMPARE(a->tag, b->tag);
52267411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    if (retval != 0)
52367411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        return retval;
52467411d6f5116c52c1b82330b6cd096974636db36Shawn Willden
52567411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    switch (keymaster_tag_get_type(a->tag)) {
52667411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_INVALID:
52767411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_BOOL:
52867411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        return 0;
52967411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_ENUM:
53067411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_ENUM_REP:
53167411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        return KEYMASTER_SIMPLE_COMPARE(a->enumerated, b->enumerated);
532fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    case KM_UINT:
533fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    case KM_UINT_REP:
53467411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        return KEYMASTER_SIMPLE_COMPARE(a->integer, b->integer);
535fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    case KM_ULONG:
536fe6bcfa71d7f79029b5b44d5fe8d7f8a80a967b2Shawn Willden    case KM_ULONG_REP:
53767411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        return KEYMASTER_SIMPLE_COMPARE(a->long_integer, b->long_integer);
53867411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_DATE:
53967411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        return KEYMASTER_SIMPLE_COMPARE(a->date_time, b->date_time);
54067411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_BIGNUM:
54167411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    case KM_BYTES:
54267411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        // Handle the empty cases.
54367411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        if (a->blob.data_length != 0 && b->blob.data_length == 0)
54467411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            return -1;
54567411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        if (a->blob.data_length == 0 && b->blob.data_length == 0)
54667411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            return 0;
54767411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        if (a->blob.data_length == 0 && b->blob.data_length > 0)
54867411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            return 1;
54967411d6f5116c52c1b82330b6cd096974636db36Shawn Willden
55067411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        retval = memcmp(a->blob.data, b->blob.data, a->blob.data_length < b->blob.data_length
55167411d6f5116c52c1b82330b6cd096974636db36Shawn Willden                                                        ? a->blob.data_length
55267411d6f5116c52c1b82330b6cd096974636db36Shawn Willden                                                        : b->blob.data_length);
55367411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        if (retval != 0)
55467411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            return retval;
55567411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        else if (a->blob.data_length != b->blob.data_length) {
55667411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            // Equal up to the common length; longer one is larger.
55767411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            if (a->blob.data_length < b->blob.data_length)
55867411d6f5116c52c1b82330b6cd096974636db36Shawn Willden                return -1;
55967411d6f5116c52c1b82330b6cd096974636db36Shawn Willden            if (a->blob.data_length > b->blob.data_length)
56067411d6f5116c52c1b82330b6cd096974636db36Shawn Willden                return 1;
56167411d6f5116c52c1b82330b6cd096974636db36Shawn Willden        };
56267411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    }
56367411d6f5116c52c1b82330b6cd096974636db36Shawn Willden
56467411d6f5116c52c1b82330b6cd096974636db36Shawn Willden    return 0;
56567411d6f5116c52c1b82330b6cd096974636db36Shawn Willden}
56667411d6f5116c52c1b82330b6cd096974636db36Shawn Willden#undef KEYMASTER_SIMPLE_COMPARE
56767411d6f5116c52c1b82330b6cd096974636db36Shawn Willden
5689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline void keymaster_free_param_values(keymaster_key_param_t* param, size_t param_count) {
569a3c0ae16ac1a9f7a8fced4b196d138cefa9462a5Chad Brubaker    while (param_count > 0) {
570a3c0ae16ac1a9f7a8fced4b196d138cefa9462a5Chad Brubaker        param_count--;
5719d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        switch (keymaster_tag_get_type(param->tag)) {
5729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        case KM_BIGNUM:
5739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        case KM_BYTES:
5749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            free((void*)param->blob.data);
5759d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            param->blob.data = NULL;
5769d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            break;
5779d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        default:
5789d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            // NOP
5799d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            break;
5809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        }
5819d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        ++param;
5829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    }
5839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline void keymaster_free_param_set(keymaster_key_param_set_t* set) {
5869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    if (set) {
5879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        keymaster_free_param_values(set->params, set->length);
5889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        free(set->params);
5899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        set->params = NULL;
590e366efd5bb89b2e7556055c5287c4e81e8820785Shawn Willden        set->length = 0;
5919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    }
5929d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5939d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5949d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline void keymaster_free_characteristics(keymaster_key_characteristics_t* characteristics) {
5959d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    if (characteristics) {
5969d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        keymaster_free_param_set(&characteristics->hw_enforced);
5979d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        keymaster_free_param_set(&characteristics->sw_enforced);
5989d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    }
5999d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
6009d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
601cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willdeninline void keymaster_free_cert_chain(keymaster_cert_chain_t* chain) {
602cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    if (chain) {
603cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden        for (size_t i = 0; i < chain->entry_count; ++i) {
604cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden            free((uint8_t*)chain->entries[i].data);
605cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden            chain->entries[i].data = NULL;
606cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden            chain->entries[i].data_length = 0;
607cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden        }
608cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden        free(chain->entries);
609cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden        chain->entries = NULL;
610cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden        chain->entry_count = 0;
611cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden    }
612cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden}
613cf30fe17fd6e367b43884a3091939fe6aa0ab603Shawn Willden
6147eaa15ffa65239e8f4f23d21ff1a6ed66ed9a13fShawn Willden#ifdef __cplusplus
615c51d01ed029458e8809eeb9c16f9ed2dbe755be4Shawn Willden}  // extern "C"
616c51d01ed029458e8809eeb9c16f9ed2dbe755be4Shawn Willden#endif  // __cplusplus
6179d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
6189d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden#endif  // ANDROID_HARDWARE_KEYMASTER_DEFS_H
619