275 lines
10 KiB
C
275 lines
10 KiB
C
/*
|
|
* Copyright (C) 2017 The Android Open Source Project
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person
|
|
* obtaining a copy of this software and associated documentation
|
|
* files (the "Software"), to deal in the Software without
|
|
* restriction, including without limitation the rights to use, copy,
|
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
* of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be
|
|
* included in all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*/
|
|
|
|
#ifndef TRUSTY_INTERFACE_KEYMASTER_H_
|
|
#define TRUSTY_INTERFACE_KEYMASTER_H_
|
|
|
|
#include <trusty/sysdeps.h>
|
|
|
|
#define KEYMASTER_PORT "com.android.trusty.keymaster"
|
|
#define KEYMASTER_MAX_BUFFER_LENGTH 4096
|
|
|
|
enum keymaster_command {
|
|
KEYMASTER_RESP_BIT = 1,
|
|
KEYMASTER_STOP_BIT = 2,
|
|
KEYMASTER_REQ_SHIFT = 2,
|
|
|
|
KM_GENERATE_KEY = (0 << KEYMASTER_REQ_SHIFT),
|
|
KM_BEGIN_OPERATION = (1 << KEYMASTER_REQ_SHIFT),
|
|
KM_UPDATE_OPERATION = (2 << KEYMASTER_REQ_SHIFT),
|
|
KM_FINISH_OPERATION = (3 << KEYMASTER_REQ_SHIFT),
|
|
KM_ABORT_OPERATION = (4 << KEYMASTER_REQ_SHIFT),
|
|
KM_IMPORT_KEY = (5 << KEYMASTER_REQ_SHIFT),
|
|
|
|
KM_EXPORT_KEY = (6 << KEYMASTER_REQ_SHIFT),
|
|
KM_GET_VERSION = (7 << KEYMASTER_REQ_SHIFT),
|
|
KM_ADD_RNG_ENTROPY = (8 << KEYMASTER_REQ_SHIFT),
|
|
KM_GET_SUPPORTED_ALGORITHMS = (9 << KEYMASTER_REQ_SHIFT),
|
|
KM_GET_SUPPORTED_BLOCK_MODES = (10 << KEYMASTER_REQ_SHIFT),
|
|
KM_GET_SUPPORTED_PADDING_MODES = (11 << KEYMASTER_REQ_SHIFT),
|
|
KM_GET_SUPPORTED_DIGESTS = (12 << KEYMASTER_REQ_SHIFT),
|
|
KM_GET_SUPPORTED_IMPORT_FORMATS = (13 << KEYMASTER_REQ_SHIFT),
|
|
KM_GET_SUPPORTED_EXPORT_FORMATS = (14 << KEYMASTER_REQ_SHIFT),
|
|
KM_GET_KEY_CHARACTERISTICS = (15 << KEYMASTER_REQ_SHIFT),
|
|
|
|
// Bootloader calls.
|
|
KM_SET_BOOT_PARAMS = (0x1000 << KEYMASTER_REQ_SHIFT),
|
|
KM_SET_ATTESTATION_KEY = (0x2000 << KEYMASTER_REQ_SHIFT),
|
|
KM_APPEND_ATTESTATION_CERT_CHAIN = (0x3000 << KEYMASTER_REQ_SHIFT),
|
|
KM_ATAP_GET_CA_REQUEST = (0x4000 << KEYMASTER_REQ_SHIFT),
|
|
KM_ATAP_SET_CA_RESPONSE_BEGIN = (0x5000 << KEYMASTER_REQ_SHIFT),
|
|
KM_ATAP_SET_CA_RESPONSE_UPDATE = (0x6000 << KEYMASTER_REQ_SHIFT),
|
|
KM_ATAP_SET_CA_RESPONSE_FINISH = (0x7000 << KEYMASTER_REQ_SHIFT),
|
|
KM_ATAP_READ_UUID = (0x8000 << KEYMASTER_REQ_SHIFT),
|
|
KM_SET_PRODUCT_ID = (0x9000 << KEYMASTER_REQ_SHIFT)
|
|
};
|
|
|
|
typedef enum {
|
|
KM_VERIFIED_BOOT_VERIFIED = 0, /* Full chain of trust extending from the bootloader to
|
|
* verified partitions, including the bootloader, boot
|
|
* partition, and all verified partitions*/
|
|
KM_VERIFIED_BOOT_SELF_SIGNED = 1, /* The boot partition has been verified using the embedded
|
|
* certificate, and the signature is valid. The bootloader
|
|
* displays a warning and the fingerprint of the public
|
|
* key before allowing the boot process to continue.*/
|
|
KM_VERIFIED_BOOT_UNVERIFIED = 2, /* The device may be freely modified. Device integrity is left
|
|
* to the user to verify out-of-band. The bootloader
|
|
* displays a warning to the user before allowing the boot
|
|
* process to continue */
|
|
KM_VERIFIED_BOOT_FAILED = 3, /* The device failed verification. The bootloader displays a
|
|
* warning and stops the boot process, so no keymaster
|
|
* implementation should ever actually return this value,
|
|
* since it should not run. Included here only for
|
|
* completeness. */
|
|
} keymaster_verified_boot_t;
|
|
|
|
/**
|
|
* Algorithms that may be provided by keymaster implementations.
|
|
*/
|
|
typedef enum {
|
|
/* Asymmetric algorithms. */
|
|
KM_ALGORITHM_RSA = 1,
|
|
// KM_ALGORITHM_DSA = 2, -- Removed, do not re-use value 2.
|
|
KM_ALGORITHM_EC = 3,
|
|
|
|
/* Block ciphers algorithms */
|
|
KM_ALGORITHM_AES = 32,
|
|
|
|
/* MAC algorithms */
|
|
KM_ALGORITHM_HMAC = 128,
|
|
} keymaster_algorithm_t;
|
|
|
|
typedef enum {
|
|
KM_ERROR_OK = 0,
|
|
KM_ERROR_ROOT_OF_TRUST_ALREADY_SET = -1,
|
|
KM_ERROR_UNSUPPORTED_PURPOSE = -2,
|
|
KM_ERROR_INCOMPATIBLE_PURPOSE = -3,
|
|
KM_ERROR_UNSUPPORTED_ALGORITHM = -4,
|
|
KM_ERROR_INCOMPATIBLE_ALGORITHM = -5,
|
|
KM_ERROR_UNSUPPORTED_KEY_SIZE = -6,
|
|
KM_ERROR_UNSUPPORTED_BLOCK_MODE = -7,
|
|
KM_ERROR_INCOMPATIBLE_BLOCK_MODE = -8,
|
|
KM_ERROR_UNSUPPORTED_MAC_LENGTH = -9,
|
|
KM_ERROR_UNSUPPORTED_PADDING_MODE = -10,
|
|
KM_ERROR_INCOMPATIBLE_PADDING_MODE = -11,
|
|
KM_ERROR_UNSUPPORTED_DIGEST = -12,
|
|
KM_ERROR_INCOMPATIBLE_DIGEST = -13,
|
|
KM_ERROR_INVALID_EXPIRATION_TIME = -14,
|
|
KM_ERROR_INVALID_USER_ID = -15,
|
|
KM_ERROR_INVALID_AUTHORIZATION_TIMEOUT = -16,
|
|
KM_ERROR_UNSUPPORTED_KEY_FORMAT = -17,
|
|
KM_ERROR_INCOMPATIBLE_KEY_FORMAT = -18,
|
|
KM_ERROR_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM = -19, /* For PKCS8 & PKCS12 */
|
|
KM_ERROR_UNSUPPORTED_KEY_VERIFICATION_ALGORITHM = -20, /* For PKCS8 & PKCS12 */
|
|
KM_ERROR_INVALID_INPUT_LENGTH = -21,
|
|
KM_ERROR_KEY_EXPORT_OPTIONS_INVALID = -22,
|
|
KM_ERROR_DELEGATION_NOT_ALLOWED = -23,
|
|
KM_ERROR_KEY_NOT_YET_VALID = -24,
|
|
KM_ERROR_KEY_EXPIRED = -25,
|
|
KM_ERROR_KEY_USER_NOT_AUTHENTICATED = -26,
|
|
KM_ERROR_OUTPUT_PARAMETER_NULL = -27,
|
|
KM_ERROR_INVALID_OPERATION_HANDLE = -28,
|
|
KM_ERROR_INSUFFICIENT_BUFFER_SPACE = -29,
|
|
KM_ERROR_VERIFICATION_FAILED = -30,
|
|
KM_ERROR_TOO_MANY_OPERATIONS = -31,
|
|
KM_ERROR_UNEXPECTED_NULL_POINTER = -32,
|
|
KM_ERROR_INVALID_KEY_BLOB = -33,
|
|
KM_ERROR_IMPORTED_KEY_NOT_ENCRYPTED = -34,
|
|
KM_ERROR_IMPORTED_KEY_DECRYPTION_FAILED = -35,
|
|
KM_ERROR_IMPORTED_KEY_NOT_SIGNED = -36,
|
|
KM_ERROR_IMPORTED_KEY_VERIFICATION_FAILED = -37,
|
|
KM_ERROR_INVALID_ARGUMENT = -38,
|
|
KM_ERROR_UNSUPPORTED_TAG = -39,
|
|
KM_ERROR_INVALID_TAG = -40,
|
|
KM_ERROR_MEMORY_ALLOCATION_FAILED = -41,
|
|
KM_ERROR_IMPORT_PARAMETER_MISMATCH = -44,
|
|
KM_ERROR_SECURE_HW_ACCESS_DENIED = -45,
|
|
KM_ERROR_OPERATION_CANCELLED = -46,
|
|
KM_ERROR_CONCURRENT_ACCESS_CONFLICT = -47,
|
|
KM_ERROR_SECURE_HW_BUSY = -48,
|
|
KM_ERROR_SECURE_HW_COMMUNICATION_FAILED = -49,
|
|
KM_ERROR_UNSUPPORTED_EC_FIELD = -50,
|
|
KM_ERROR_MISSING_NONCE = -51,
|
|
KM_ERROR_INVALID_NONCE = -52,
|
|
KM_ERROR_MISSING_MAC_LENGTH = -53,
|
|
KM_ERROR_KEY_RATE_LIMIT_EXCEEDED = -54,
|
|
KM_ERROR_CALLER_NONCE_PROHIBITED = -55,
|
|
KM_ERROR_KEY_MAX_OPS_EXCEEDED = -56,
|
|
KM_ERROR_INVALID_MAC_LENGTH = -57,
|
|
KM_ERROR_MISSING_MIN_MAC_LENGTH = -58,
|
|
KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH = -59,
|
|
KM_ERROR_UNSUPPORTED_KDF = -60,
|
|
KM_ERROR_UNSUPPORTED_EC_CURVE = -61,
|
|
KM_ERROR_KEY_REQUIRES_UPGRADE = -62,
|
|
KM_ERROR_ATTESTATION_CHALLENGE_MISSING = -63,
|
|
KM_ERROR_KEYMASTER_NOT_CONFIGURED = -64,
|
|
|
|
KM_ERROR_UNIMPLEMENTED = -100,
|
|
KM_ERROR_VERSION_MISMATCH = -101,
|
|
|
|
KM_ERROR_UNKNOWN_ERROR = -1000,
|
|
} keymaster_error_t;
|
|
|
|
/**
|
|
* keymaster_message - Serial header for communicating with KM server
|
|
*
|
|
* @cmd: the command, one of keymaster_command.
|
|
* @payload: start of the serialized command specific payload
|
|
*/
|
|
struct keymaster_message {
|
|
uint32_t cmd;
|
|
uint8_t payload[0];
|
|
};
|
|
|
|
/**
|
|
* km_no_response - Generic keymaster response for commands with no special
|
|
* response data
|
|
*
|
|
* @error: error code from command
|
|
*/
|
|
struct km_no_response {
|
|
int32_t error;
|
|
};
|
|
|
|
/**
|
|
* km_get_version_resp - response format for KM_GET_VERSION.
|
|
*/
|
|
struct km_get_version_resp {
|
|
int32_t error;
|
|
uint8_t major_ver;
|
|
uint8_t minor_ver;
|
|
uint8_t subminor_ver;
|
|
} TRUSTY_ATTR_PACKED;
|
|
|
|
/**
|
|
* km_raw_buffer_resp - response format for a raw buffer
|
|
*/
|
|
struct km_raw_buffer_resp {
|
|
int32_t error;
|
|
uint32_t data_size;
|
|
int8_t data[0];
|
|
} TRUSTY_ATTR_PACKED;
|
|
|
|
/**
|
|
* km_set_ca_response_begin_req - starts the process to set the ATAP CA Response
|
|
*
|
|
* @ca_response_size: total size of the CA Response message
|
|
*/
|
|
struct km_set_ca_response_begin_req {
|
|
uint32_t ca_response_size;
|
|
} TRUSTY_ATTR_PACKED;
|
|
|
|
/**
|
|
* km_boot_params - Parameters sent from the bootloader to the Keymaster TA
|
|
*
|
|
* Since verified_boot_key_hash and verified_boot_hash have variable sizes, this
|
|
* structure must be serialized before sending to the secure side
|
|
* using km_boot_params_serialize().
|
|
*
|
|
* @os_version: OS version from Android image header
|
|
* @os_patchlevel: OS patch level from Android image header
|
|
* @device_locked: nonzero if device is locked
|
|
* @verified_boot_state: one of keymaster_verified_boot_t
|
|
* @verified_boot_key_hash_size: size of verified_boot_key_hash
|
|
* @verified_boot_key_hash: hash of key used to verify Android image
|
|
* @verified_boot_hash_size: size of verified_boot_hash
|
|
* @verified_boot_hash: cumulative hash of all images verified thus far
|
|
*/
|
|
struct km_boot_params {
|
|
uint32_t os_version;
|
|
uint32_t os_patchlevel;
|
|
uint32_t device_locked;
|
|
uint32_t verified_boot_state;
|
|
uint32_t verified_boot_key_hash_size;
|
|
const uint8_t *verified_boot_key_hash;
|
|
uint32_t verified_boot_hash_size;
|
|
const uint8_t *verified_boot_hash;
|
|
} TRUSTY_ATTR_PACKED;
|
|
|
|
/**
|
|
* km_attestation_data - represents a DER encoded key or certificate
|
|
*
|
|
* @algorithm: one of KM_ALGORITHM_RSA or KM_ALGORITHM_EC
|
|
* @data_size: size of |data|
|
|
* @data: DER encoded key or certificate (depending on operation)
|
|
*/
|
|
struct km_attestation_data {
|
|
uint32_t algorithm;
|
|
uint32_t data_size;
|
|
const uint8_t *data;
|
|
} TRUSTY_ATTR_PACKED;
|
|
|
|
/**
|
|
* km_raw_buffer - represents a single raw buffer
|
|
*
|
|
* @data_size: size of |data|
|
|
* @data: pointer to the buffer
|
|
*/
|
|
struct km_raw_buffer {
|
|
uint32_t data_size;
|
|
const uint8_t *data;
|
|
} TRUSTY_ATTR_PACKED;
|
|
|
|
#endif /* TRUSTY_INTERFACE_KEYMASTER_H_ */
|