keymaster_defs.h revision 79d79346843e03e390ccc61787959ab9e59edf0f
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
249d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden#if defined(__cplusplus)
259d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenextern "C" {
269d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden#endif  // defined(__cplusplus)
279d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
289d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/*!
299d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * \deprecated Flags for keymaster_device::flags
309d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden *
319d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * keymaster_device::flags is deprecated and will be removed in the
329d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * next version of the API in favor of the more detailed information
339d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * available from TODO:
349d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
359d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenenum {
369d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /*
379d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * Indicates this keymaster implementation does not have hardware that
389d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * keeps private keys out of user space.
399d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     *
409d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * This should not be implemented on anything other than the default
419d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * implementation.
429d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     */
439d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KEYMASTER_SOFTWARE_ONLY = 1 << 0,
449d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
459d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /*
469d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * This indicates that the key blobs returned via all the primitives
479d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * are sufficient to operate on their own without the trusted OS
489d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * querying userspace to retrieve some other data. Key blobs of
499d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * this type are normally returned encrypted with a
509d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * Key Encryption Key (KEK).
519d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     *
529d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * This is currently used by "vold" to know whether the whole disk
539d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * encryption secret can be unwrapped without having some external
549d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * service started up beforehand since the "/data" partition will
559d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * be unavailable at that point.
569d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     */
579d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KEYMASTER_BLOBS_ARE_STANDALONE = 1 << 1,
589d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
599d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /*
609d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * Indicates that the keymaster module supports DSA keys.
619d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     */
629d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KEYMASTER_SUPPORTS_DSA = 1 << 2,
639d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
649d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /*
659d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * Indicates that the keymaster module supports EC keys.
669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     */
679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KEYMASTER_SUPPORTS_EC = 1 << 3,
689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden};
699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
719d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * \deprecated Asymmetric key pair types.
729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    TYPE_RSA = 1,
759d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    TYPE_DSA = 2,
769d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    TYPE_EC = 3,
779d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_keypair_t;
789d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
799d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Authorization tags each have an associated type.  This enumeration facilitates tagging each with
819d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * a type, by using the high four bits (of an implied 32-bit unsigned enum value) to specify up to
829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * 16 data types.  These values are ORed with tag IDs to generate the final tag ID values.
839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_INVALID = 0 << 28, /* Invalid type, used to designate a tag as uninitialized */
869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ENUM = 1 << 28,
879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ENUM_REP = 2 << 28, /* Repeatable enumeration value. */
889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_INT = 3 << 28,
899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_INT_REP = 4 << 28, /* Repeatable integer value */
909d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_LONG = 5 << 28,
919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_DATE = 6 << 28,
929d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_BOOL = 7 << 28,
939d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_BIGNUM = 8 << 28,
949d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_BYTES = 9 << 28,
959d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_tag_type_t;
969d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
979d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
989d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_INVALID = KM_INVALID | 0,
999d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1009d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /*
1019d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * Tags that must be semantically enforced by hardware and software implementations.
1029d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     */
1039d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1049d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Crypto parameters */
10579d79346843e03e390ccc61787959ab9e59edf0fShawn Willden    KM_TAG_PURPOSE = KM_ENUM_REP | 1,     /* keymaster_purpose_t. */
10679d79346843e03e390ccc61787959ab9e59edf0fShawn Willden    KM_TAG_ALGORITHM = KM_ENUM | 2,       /* keymaster_algorithm_t. */
10779d79346843e03e390ccc61787959ab9e59edf0fShawn Willden    KM_TAG_KEY_SIZE = KM_INT | 3,         /* Key size in bits. */
10879d79346843e03e390ccc61787959ab9e59edf0fShawn Willden    KM_TAG_BLOCK_MODE = KM_ENUM | 4,      /* keymaster_block_mode_t. */
10979d79346843e03e390ccc61787959ab9e59edf0fShawn Willden    KM_TAG_DIGEST = KM_ENUM | 5,          /* keymaster_digest_t. */
11079d79346843e03e390ccc61787959ab9e59edf0fShawn Willden    KM_TAG_MAC_LENGTH = KM_INT | 6,       /* MAC length in bits. */
11179d79346843e03e390ccc61787959ab9e59edf0fShawn Willden    KM_TAG_PADDING = KM_ENUM | 7,         /* keymaster_padding_t. */
11279d79346843e03e390ccc61787959ab9e59edf0fShawn Willden    KM_TAG_RETURN_UNAUTHED = KM_BOOL | 8, /* Allow AEAD decryption to return plaintext before it has
11379d79346843e03e390ccc61787959ab9e59edf0fShawn Willden                                             been authenticated.  WARNING: Not recommended. */
11479d79346843e03e390ccc61787959ab9e59edf0fShawn Willden    KM_TAG_CALLER_NONCE = KM_BOOL | 9,    /* Allow caller to specify nonce or IV. */
1159d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1169d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Other hardware-enforced. */
1179d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_RESCOPING_ADD = KM_ENUM_REP | 101, /* Tags authorized for addition via rescoping. */
1189d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_RESCOPING_DEL = KM_ENUM_REP | 102, /* Tags authorized for removal via rescoping. */
1199d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_BLOB_USAGE_REQUIREMENTS = KM_ENUM | 705, /* keymaster_key_blob_usage_requirements_t */
1209d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1219d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Algorithm-specific. */
1229d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_RSA_PUBLIC_EXPONENT = KM_LONG | 200, /* Defaults to 2^16+1 */
1239d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_DSA_GENERATOR = KM_BIGNUM | 201,
1249d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_DSA_P = KM_BIGNUM | 202,
1259d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_DSA_Q = KM_BIGNUM | 203,
1269d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Note there are no EC-specific params.  Field size is defined by KM_TAG_KEY_SIZE, and the
1279d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden       curve is chosen from NIST recommendations for field size */
1289d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1299d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /*
1309d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * Tags that should be semantically enforced by hardware if possible and will otherwise be
1319d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * enforced by software (keystore).
1329d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     */
1339d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1349d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Key validity period */
1359d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_ACTIVE_DATETIME = KM_DATE | 400,             /* Start of validity */
1369d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_ORIGINATION_EXPIRE_DATETIME = KM_DATE | 401, /* Date when new "messages" should no
1379d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden                                                           longer be created. */
1389d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_USAGE_EXPIRE_DATETIME = KM_DATE | 402,       /* Date when existing "messages" should no
1399d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden                                                           longer be trusted. */
1409d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_MIN_SECONDS_BETWEEN_OPS = KM_INT | 403,      /* Minimum elapsed time between
1419d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden                                                           cryptographic operations with the key. */
142dc0007bdb41f4ed49bc7a6e30908967cea503bf7Shawn Willden    KM_TAG_MAX_USES_PER_BOOT = KM_INT | 404,            /* Number of times the key can be used per
143dc0007bdb41f4ed49bc7a6e30908967cea503bf7Shawn Willden                                                           boot. */
1449d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1459d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* User authentication */
14641e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden    KM_TAG_ALL_USERS = KM_BOOL | 500,        /* If key is usable by all users. */
14741e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden    KM_TAG_USER_ID = KM_INT | 501,           /* ID of authorized user.  Disallowed if
14841e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden                                                KM_TAG_ALL_USERS is present. */
14941e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden    KM_TAG_NO_AUTH_REQUIRED = KM_BOOL | 502, /* If key is usable without authentication. */
15041e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden    KM_TAG_USER_AUTH_ID = KM_INT_REP | 503,  /* ID of the authenticator to use (e.g. password,
15141e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden                                                fingerprint, etc.).  Repeatable to support
15241e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden                                                multi-factor auth.  Disallowed if
15341e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden                                                KM_TAG_NO_AUTH_REQUIRED is present. */
15441e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden    KM_TAG_AUTH_TIMEOUT = KM_INT | 504,      /* Required freshness of user authentication for
15541e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden                                                private/secret key operations, in seconds.
15641e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden                                                Public key operations require no authentication.
15741e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden                                                If absent, authentication is required for every
15841e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden                                                use.  Authentication state is lost when the
15941e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden                                                device is powered off. */
1609d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1619d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Application access control */
1629d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_ALL_APPLICATIONS = KM_BOOL | 600, /* If key is usable by all applications. */
1639d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_APPLICATION_ID = KM_BYTES | 601,  /* ID of authorized application. Disallowed if
1649d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden                                                KM_TAG_ALL_APPLICATIONS is present. */
1659d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /*
1679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * Semantically unenforceable tags, either because they have no specific meaning or because
1689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * they're informational only.
1699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     */
1709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_APPLICATION_DATA = KM_BYTES | 700,  /* Data provided by authorized application. */
1719d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_CREATION_DATETIME = KM_DATE | 701,  /* Key creation time */
1729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_ORIGIN = KM_ENUM | 702,             /* keymaster_key_origin_t. */
1739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_ROLLBACK_RESISTANT = KM_BOOL | 703, /* Whether key is rollback-resistant. */
1749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_TAG_ROOT_OF_TRUST = KM_BYTES | 704,     /* Root of trust ID.  Empty array means usable by all
1759d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden                                                  roots. */
1769d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
17767ba9e8144ba65ef6fe55bf8211530f2a55b320cShawn Willden    /* Tags used only to provide data to or receive data from operations */
17867ba9e8144ba65ef6fe55bf8211530f2a55b320cShawn Willden    KM_TAG_ASSOCIATED_DATA = KM_BYTES | 1000, /* Used to provide associated data for AEAD modes. */
17941e91e9fa3ac011ade869238f3ce0b3f3ce1e025Shawn Willden    KM_TAG_NONCE = KM_BYTES | 1001,           /* Nonce or Initialization Vector */
18079d79346843e03e390ccc61787959ab9e59edf0fShawn Willden    KM_TAG_CHUNK_LENGTH = KM_INT | 1002,      /* AEAD mode chunk size, in bytes.  0 means no limit,
18179d79346843e03e390ccc61787959ab9e59edf0fShawn Willden                                                 which requires KM_TAG_RETURN_UNAUTHED. */
1829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_tag_t;
1839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
1849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
1859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Algorithms that may be provided by keymaster implementations.  Those that must be provided by all
1869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * implementations are tagged as "required".  Note that where the values in this enumeration overlap
1879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * with the values for the deprecated keymaster_keypair_t, the same algorithm must be
1889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * specified. This type is new in 0_4 and replaces the deprecated keymaster_keypair_t.
1899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
1909d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
1919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Asymmetric algorithms. */
1929d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_RSA = 1,   /* required */
193f7745ac27e45cb3935f66d7b26ce46e952032893Shawn Willden    KM_ALGORITHM_DSA = 2,
1949d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_ECDSA = 3, /* required */
1959d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_ECIES = 4,
1969d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* FIPS Approved Ciphers */
1979d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_AES = 32, /* required */
1989d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_3DES = 33,
1999d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_SKIPJACK = 34,
2009d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* AES Finalists */
2019d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_MARS = 48,
2029d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_RC6 = 49,
2039d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_SERPENT = 50,
2049d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_TWOFISH = 51,
2059d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Other common block ciphers */
2069d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_IDEA = 52,
2079d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_RC5 = 53,
2089d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_CAST5 = 54,
2099d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_BLOWFISH = 55,
2109d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Common stream ciphers */
2119d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_RC4 = 64,
2129d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_CHACHA20 = 65,
2139d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* MAC algorithms */
2149d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ALGORITHM_HMAC = 128, /* required */
2159d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_algorithm_t;
2169d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
2179d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
2189d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Symmetric block cipher modes that may be provided by keymaster implementations.  Those that must
2199d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * be provided by all implementations are tagged as "required".  This type is new in 0_4.
2209d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden *
2219d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * KM_MODE_FIRST_UNAUTHENTICATED, KM_MODE_FIRST_AUTHENTICATED and KM_MODE_FIRST_MAC are not modes,
2229d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * but markers used to separate the available modes into classes.
2239d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
2249d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
2259d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Unauthenticated modes, usable only for encryption/decryption and not generally recommended
2269d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * except for compatibility with existing other protocols. */
2279d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_FIRST_UNAUTHENTICATED = 1,
2289d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_ECB = KM_MODE_FIRST_UNAUTHENTICATED, /* required */
2299d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_CBC = 2,                             /* required */
2309d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_CBC_CTS = 3,                         /* recommended */
2319d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_CTR = 4,                             /* recommended */
2329d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_OFB = 5,
2339d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_CFB = 6,
2349d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_XTS = 7, /* Note: requires double-length keys */
2359d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Authenticated modes, usable for encryption/decryption and signing/verification.  Recommended
2369d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * over unauthenticated modes for all purposes.  One of KM_MODE_GCM and KM_MODE_OCB is
2379d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * required. */
2389d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_FIRST_AUTHENTICATED = 32,
2399d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_GCM = KM_MODE_FIRST_AUTHENTICATED,
2409d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_OCB = 33,
2419d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_CCM = 34,
2429d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* MAC modes -- only for signing/verification */
2439d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_FIRST_MAC = 128,
2449d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_CMAC = KM_MODE_FIRST_MAC,
2459d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_MODE_POLY1305 = 129,
2469d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_block_mode_t;
2479d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
2489d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
2499d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Padding modes that may be applied to plaintext for encryption operations.  This list includes
2509d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * padding modes for both symmetric and asymmetric algorithms.  Note that implementations should not
2519d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * provide all possible combinations of algorithm and padding, only the
2529d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * cryptographically-appropriate pairs.
2539d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
2549d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
2559d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PAD_NONE = 1,     /* required, deprecated */
2569d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PAD_RSA_OAEP = 2, /* required */
2579d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PAD_RSA_PSS = 3,  /* required */
2589d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PAD_RSA_PKCS1_1_5_ENCRYPT = 4,
2599d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PAD_RSA_PKCS1_1_5_SIGN = 5,
2609d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PAD_ANSI_X923 = 32,
2619d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PAD_ISO_10126 = 33,
2629d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PAD_ZERO = 64,  /* required */
2639d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PAD_PKCS7 = 65, /* required */
2649d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PAD_ISO_7816_4 = 66,
2659d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_padding_t;
2669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
2679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
2689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Digests that may be provided by keymaster implementations.  Those that must be provided by all
2699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * implementations are tagged as "required".  Those that have been added since version 0_2 of the
2709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * API are tagged as "new".
2719d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
2729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
2739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_DIGEST_NONE = 0,           /* new, required */
2749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    DIGEST_NONE = KM_DIGEST_NONE, /* For 0_2 compatibility */
2759d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_DIGEST_MD5 = 1,            /* new, for compatibility with old protocols only */
2769d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_DIGEST_SHA1 = 2,           /* new */
2779d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_DIGEST_SHA_2_224 = 3,      /* new */
2789d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_DIGEST_SHA_2_256 = 4,      /* new, required */
2799d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_DIGEST_SHA_2_384 = 5,      /* new, recommended */
2809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_DIGEST_SHA_2_512 = 6,      /* new, recommended */
2819d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_DIGEST_SHA_3_256 = 7,      /* new */
2829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_DIGEST_SHA_3_384 = 8,      /* new */
2839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_DIGEST_SHA_3_512 = 9,      /* new */
2849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_digest_t;
2859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
2869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
2879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * The origin of a key (or pair), i.e. where it was generated.  Origin and can be used together to
2889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * determine whether a key may have existed outside of secure hardware.  This type is new in 0_4.
2899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
2909d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
2919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ORIGIN_HARDWARE = 0, /* Generated in secure hardware */
2929d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ORIGIN_SOFTWARE = 1, /* Generated in non-secure software */
2939d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ORIGIN_IMPORTED = 2, /* Imported, origin unknown */
2949d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_origin_t;
2959d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
2969d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
2979d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Usability requirements of key blobs.  This defines what system functionality must be available
2989d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * for the key to function.  For example, key "blobs" which are actually handles referencing
2999d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * encrypted key material stored in the file system cannot be used until the file system is
3009d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * available, and should have BLOB_REQUIRES_FILE_SYSTEM.  Other requirements entries will be added
3019d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * as needed for implementations.  This type is new in 0_4.
3029d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
3039d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
3049d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_BLOB_STANDALONE = 0,
3059d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_BLOB_REQUIRES_FILE_SYSTEM = 1,
3069d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_blob_usage_requirements_t;
3079d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3089d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
3099d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Possible purposes of a key (or pair). This type is new in 0_4.
3109d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
3119d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
3129d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PURPOSE_ENCRYPT = 0,
3139d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PURPOSE_DECRYPT = 1,
3149d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PURPOSE_SIGN = 2,
3159d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_PURPOSE_VERIFY = 3,
3169d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_purpose_t;
3179d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3189d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
3199d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    const uint8_t* data;
3209d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    size_t data_length;
3219d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_blob_t;
3229d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3239d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
3249d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_tag_t tag;
3259d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    union {
3269d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        uint32_t enumerated;   /* KM_ENUM and KM_ENUM_REP */
3279d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        bool boolean;          /* KM_BOOL */
3289d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        uint32_t integer;      /* KM_INT and KM_INT_REP */
3299d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        uint64_t long_integer; /* KM_LONG */
3309d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        uint64_t date_time;    /* KM_DATE */
3319d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        keymaster_blob_t blob; /* KM_BIGNUM and KM_BYTES*/
3329d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    };
3339d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_param_t;
3349d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3359d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
3369d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t* params; /* may be NULL if length == 0 */
3379d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    size_t length;
3389d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_param_set_t;
3399d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3409d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
3419d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Parameters that define a key's characteristics, including authorized modes of usage and access
3429d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * control restrictions.  The parameters are divided into two categories, those that are enforced by
3439d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * secure hardware, and those that are not.  For a software-only keymaster implementation the
3449d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * enforced array must NULL.  Hardware implementations must enforce everything in the enforced
3459d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * array.
3469d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
3479d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
3489d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_set_t hw_enforced;
3499d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_set_t sw_enforced;
3509d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_characteristics_t;
3519d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3529d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
3539d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    const uint8_t* key_material;
3549d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    size_t key_material_size;
3559d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_blob_t;
3569d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3579d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
3589d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Formats for key import and export.  At present, only asymmetric key import/export is supported.
3599d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * In the future this list will expand greatly to accommodate asymmetric key import/export.
3609d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
3619d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
3629d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_KEY_FORMAT_X509,   /* for public key export, required */
3639d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_KEY_FORMAT_PKCS8,  /* for asymmetric key pair import, required */
3649d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_KEY_FORMAT_PKCS12, /* for asymmetric key pair import, not required */
365e1b7636ca1c60b766a195ad20b3e2957f1edb375Shawn Willden    KM_KEY_FORMAT_RAW,    /* for symmetric key import, required */
3669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_key_format_t;
3679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
3699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * The keymaster operation API consists of begin, update, finish and abort. This is the type of the
3709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * handle used to tie the sequence of calls together.  A 64-bit value is used because it's important
3719d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * that handles not be predictable.  Implementations must use strong random numbers for handle
3729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * values.
3739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
3749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef uint64_t keymaster_operation_handle_t;
3759d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
3769d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
3779d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_OK = 0,
3789d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_ROOT_OF_TRUST_ALREADY_SET = -1,
3799d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_PURPOSE = -2,
3809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_PURPOSE = -3,
3819d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_ALGORITHM = -4,
3829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_ALGORITHM = -5,
3839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_KEY_SIZE = -6,
3849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_BLOCK_MODE = -7,
3859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_BLOCK_MODE = -8,
3866b424bea8074c997745b3758f8fde0ef925e3218Shawn Willden    KM_ERROR_UNSUPPORTED_MAC_LENGTH = -9,
3879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_PADDING_MODE = -10,
3889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_PADDING_MODE = -11,
3899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_DIGEST = -12,
3909d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_DIGEST = -13,
3919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_EXPIRATION_TIME = -14,
3929d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_USER_ID = -15,
3939d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_AUTHORIZATION_TIMEOUT = -16,
3949d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_KEY_FORMAT = -17,
3959d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INCOMPATIBLE_KEY_FORMAT = -18,
3969d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM = -19,   /* For PKCS8 & PKCS12 */
3979d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_KEY_VERIFICATION_ALGORITHM = -20, /* For PKCS8 & PKCS12 */
3989d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_INPUT_LENGTH = -21,
3999d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_KEY_EXPORT_OPTIONS_INVALID = -22,
4009d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_DELEGATION_NOT_ALLOWED = -23,
4019d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_KEY_NOT_YET_VALID = -24,
4029d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_KEY_EXPIRED = -25,
4039d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_KEY_USER_NOT_AUTHENTICATED = -26,
4049d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_OUTPUT_PARAMETER_NULL = -27,
4059d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_OPERATION_HANDLE = -28,
4069d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INSUFFICIENT_BUFFER_SPACE = -29,
4079d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_VERIFICATION_FAILED = -30,
4089d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_TOO_MANY_OPERATIONS = -31,
4099d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNEXPECTED_NULL_POINTER = -32,
4109d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_KEY_BLOB = -33,
4119d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORTED_KEY_NOT_ENCRYPTED = -34,
4129d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORTED_KEY_DECRYPTION_FAILED = -35,
4139d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORTED_KEY_NOT_SIGNED = -36,
4149d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORTED_KEY_VERIFICATION_FAILED = -37,
4159d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_ARGUMENT = -38,
4169d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_TAG = -39,
4179d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_TAG = -40,
4189d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_MEMORY_ALLOCATION_FAILED = -41,
4199d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_RESCOPING = -42,
4209d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_INVALID_DSA_PARAMS = -43,
4219d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_IMPORT_PARAMETER_MISMATCH = -44,
4229d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_SECURE_HW_ACCESS_DENIED = -45,
4239d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_OPERATION_CANCELLED = -46,
4249d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_CONCURRENT_ACCESS_CONFLICT = -47,
4259d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_SECURE_HW_BUSY = -48,
4269d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_SECURE_HW_COMMUNICATION_FAILED = -49,
4279d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNSUPPORTED_EC_FIELD = -50,
4289d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNIMPLEMENTED = -100,
4299d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_VERSION_MISMATCH = -101,
4309d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4319d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    /* Additional error codes may be added by implementations, but implementers should coordinate
4329d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden     * with Google to avoid code collision. */
4339d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    KM_ERROR_UNKNOWN_ERROR = -1000,
4349d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_error_t;
4359d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4369d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
4379d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * \deprecated Parameters needed to generate an RSA key.
4389d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
4399d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
4409d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    uint32_t modulus_size; /* bits */
4419d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    uint64_t public_exponent;
4429d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_rsa_keygen_params_t;
4439d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4449d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
4459d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * \deprecated Parameters needed to generate a DSA key.
4469d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
4479d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
4489d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    uint32_t key_size; /* bits */
4499d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    uint32_t generator_len;
4509d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    uint32_t prime_p_len;
4519d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    uint32_t prime_q_len;
4529d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    const uint8_t* generator;
4539d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    const uint8_t* prime_p;
4549d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    const uint8_t* prime_q;
4559d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_dsa_keygen_params_t;
4569d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4579d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
4589d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * \deprecated Parameters needed to generate an EC key.
4599d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden *
4609d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * Field size is the only parameter in version 4. The sizes correspond to these required curves:
4619d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden *
4629d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * 192 = NIST P-192
4639d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * 224 = NIST P-224
4649d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * 256 = NIST P-256
4659d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * 384 = NIST P-384
4669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * 521 = NIST P-521
4679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden *
4689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * The parameters for these curves are available at: http://www.nsa.gov/ia/_files/nist-routines.pdf
4699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * in Chapter 4.
4709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
4719d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct { uint32_t field_size; /* bits */ } keymaster_ec_keygen_params_t;
4729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
4749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * \deprecated Type of padding used for RSA operations.
4759d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
4769d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef enum {
4779d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    PADDING_NONE,
4789d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_rsa_padding_t;
4799d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
4819d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * \deprecated
4829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
4839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct { keymaster_digest_t digest_type; } keymaster_dsa_sign_params_t;
4849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
4869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden * \deprecated
4879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
4889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct { keymaster_digest_t digest_type; } keymaster_ec_sign_params_t;
4899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4909d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/**
4919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden *\deprecated
4929d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden */
4939d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdentypedef struct {
4949d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_digest_t digest_type;
4959d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_rsa_padding_t padding_type;
4969d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden} keymaster_rsa_sign_params_t;
4979d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
4989d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/* Convenience functions for manipulating keymaster tag types */
4999d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5009d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenstatic inline keymaster_tag_type_t keymaster_tag_get_type(keymaster_tag_t tag) {
5019d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return (keymaster_tag_type_t)(tag & (0xF << 28));
5029d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5039d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5049d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenstatic inline uint32_t keymaster_tag_mask_type(keymaster_tag_t tag) {
5059d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return tag & 0x0FFFFFFF;
5069d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5079d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5089d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenstatic inline bool keymaster_tag_type_repeatable(keymaster_tag_type_t type) {
5099d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    switch (type) {
5109d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    case KM_INT_REP:
5119d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    case KM_ENUM_REP:
5129d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        return true;
5139d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    default:
5149d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        return false;
5159d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    }
5169d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5179d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5189d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdenstatic inline bool keymaster_tag_repeatable(keymaster_tag_t tag) {
5199d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return keymaster_tag_type_repeatable(keymaster_tag_get_type(tag));
5209d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5219d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5229d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden/* Convenience functions for manipulating keymaster_key_param_t structs */
5239d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5249d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_enum(keymaster_tag_t tag, uint32_t value) {
5259d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_ENUM || keymaster_tag_get_type(tag) == KM_ENUM_REP);
5269d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
5279d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
5289d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
5299d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.enumerated = value;
5309d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
5319d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5329d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5339d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_int(keymaster_tag_t tag, uint32_t value) {
5349d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_INT || keymaster_tag_get_type(tag) == KM_INT_REP);
5359d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
5369d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
5379d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
5389d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.integer = value;
5399d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
5409d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5419d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5429d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_long(keymaster_tag_t tag, uint64_t value) {
5439d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_LONG);
5449d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
5459d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
5469d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
5479d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.long_integer = value;
5489d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
5499d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5509d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5519d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_blob(keymaster_tag_t tag, const uint8_t* bytes,
5529d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden                                                  size_t bytes_len) {
5539d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_BYTES || keymaster_tag_get_type(tag) == KM_BIGNUM);
5549d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
5559d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
5569d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
5579d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.blob.data = (uint8_t*)bytes;
5589d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.blob.data_length = bytes_len;
5599d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
5609d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5619d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5629d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_bool(keymaster_tag_t tag) {
5639d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_BOOL);
5649d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
5659d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
5669d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
5679d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.boolean = true;
5689d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
5699d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5709d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5719d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline keymaster_key_param_t keymaster_param_date(keymaster_tag_t tag, uint64_t value) {
5729d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    // assert(keymaster_tag_get_type(tag) == KM_DATE);
5739d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    keymaster_key_param_t param;
5749d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    memset(&param, 0, sizeof(param));
5759d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.tag = tag;
5769d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    param.date_time = value;
5779d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    return param;
5789d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5799d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5809d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline void keymaster_free_param_values(keymaster_key_param_t* param, size_t param_count) {
5819d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    while (param_count-- > 0) {
5829d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        switch (keymaster_tag_get_type(param->tag)) {
5839d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        case KM_BIGNUM:
5849d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        case KM_BYTES:
5859d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            free((void*)param->blob.data);
5869d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            param->blob.data = NULL;
5879d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            break;
5889d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        default:
5899d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            // NOP
5909d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden            break;
5919d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        }
5929d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        ++param;
5939d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    }
5949d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
5959d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
5969d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline void keymaster_free_param_set(keymaster_key_param_set_t* set) {
5979d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    if (set) {
5989d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        keymaster_free_param_values(set->params, set->length);
5999d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        free(set->params);
6009d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        set->params = NULL;
6019d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    }
6029d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
6039d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
6049d645a003b0d77462a5f9696a238aacc32580f07Shawn Willdeninline void keymaster_free_characteristics(keymaster_key_characteristics_t* characteristics) {
6059d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    if (characteristics) {
6069d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        keymaster_free_param_set(&characteristics->hw_enforced);
6079d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden        keymaster_free_param_set(&characteristics->sw_enforced);
6089d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden    }
6099d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}
6109d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
6119d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden#if defined(__cplusplus)
6129d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden}  // extern "C"
6139d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden#endif  // defined(__cplusplus)
6149d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden
6159d645a003b0d77462a5f9696a238aacc32580f07Shawn Willden#endif  // ANDROID_HARDWARE_KEYMASTER_DEFS_H
616