keymaster_defs.h revision 340d0b12c5446f1d8c38209780fb00c205289d37
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. */ 110340d0b12c5446f1d8c38209780fb00c205289d37Alex Klyubin KM_TAG_MAC_LENGTH = KM_INT | 6, /* MAC or AEAD authentication tag 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 { 362f883b988e7fa3b750c5a4b0ed8b53ce999ca3842Chad Brubaker KM_KEY_FORMAT_X509 = 0, /* for public key export, required */ 363f883b988e7fa3b750c5a4b0ed8b53ce999ca3842Chad Brubaker KM_KEY_FORMAT_PKCS8 = 1, /* for asymmetric key pair import, required */ 364f883b988e7fa3b750c5a4b0ed8b53ce999ca3842Chad Brubaker KM_KEY_FORMAT_PKCS12 = 2, /* for asymmetric key pair import, not required */ 365f883b988e7fa3b750c5a4b0ed8b53ce999ca3842Chad Brubaker KM_KEY_FORMAT_RAW = 3, /* 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(¶m, 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(¶m, 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(¶m, 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(¶m, 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(¶m, 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(¶m, 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