| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you |
| * may not use this file except in compliance with the License. You may |
| * obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| * implied. See the License for the specific language governing |
| * permissions and limitations under the License. |
| */ |
| |
| #ifndef ANDROID_HARDWARE_QCOM_KEYMASTER_H |
| #define ANDROID_HARDWARE_QCOM_KEYMASTER_H |
| |
| #include <stdint.h> |
| #include <sys/cdefs.h> |
| #include <sys/types.h> |
| |
| __BEGIN_DECLS |
| |
| #ifdef _ION_HEAP_MASK_COMPATIBILITY_WA |
| #define ION_HEAP_MASK heap_mask |
| #else |
| #define ION_HEAP_MASK heap_id_mask |
| #endif |
| |
| /** |
| * The id of this module |
| */ |
| #define QCOM_KEYSTORE_KEYMASTER "qcom_keymaster" |
| /** |
| * Operation result |
| */ |
| #define KEYMATER_SUCCESS 0 |
| #define KEYMASTER_FAILURE -1 |
| |
| /** |
| * The API level of this version of the header. The allows the implementing |
| * module to recognize which API level of the client it is dealing with in |
| * the case of pre-compiled binary clients. |
| */ |
| #define QCOM_KEYMASTER_API_VERSION KEYMASTER_MODULE_API_VERSION_0_3 |
| |
| #define KM_MAGIC_NUM (0x4B4D4B42) /* "KMKB" Key Master Key Blob in hex */ |
| #define KM_KEY_SIZE_MAX (512) /* 4096 bits */ |
| #define KM_IV_LENGTH (16) /* AES128 CBC IV */ |
| #define KM_HMAC_LENGTH (32) /* SHA2 will be used for HMAC */ |
| |
| struct qcom_km_key_blob { |
| uint32_t magic_num; |
| uint32_t version_num; |
| uint8_t modulus[KM_KEY_SIZE_MAX]; |
| uint32_t modulus_size; |
| uint8_t public_exponent[KM_KEY_SIZE_MAX]; |
| uint32_t public_exponent_size; |
| uint8_t iv[KM_IV_LENGTH]; |
| uint8_t encrypted_private_exponent[KM_KEY_SIZE_MAX]; |
| uint32_t encrypted_private_exponent_size; |
| uint8_t hmac[KM_HMAC_LENGTH]; |
| }; |
| typedef struct qcom_km_key_blob qcom_km_key_blob_t; |
| /** |
| * Commands supported |
| */ |
| enum keymaster_cmd_t { |
| /* |
| * List the commands supportedin by the hardware. |
| */ |
| KEYMASTER_GENERATE_KEYPAIR = 0x00000001, |
| KEYMASTER_IMPORT_KEYPAIR = 0x00000002, |
| KEYMASTER_SIGN_DATA = 0x00000003, |
| KEYMASTER_VERIFY_DATA = 0x00000004, |
| }; |
| |
| |
| /** |
| * Command to Generate a public and private key. The key data returned |
| * (by secure app) is in shared buffer at offset of "key_blob" and is opaque |
| * |
| * cmd_id : Command issue to secure app |
| * key_type : Currently on RSA_TYPE is supported |
| * rsa_params : Parameters needed to generate an RSA key |
| */ |
| struct keymaster_gen_keypair_cmd { |
| keymaster_cmd_t cmd_id; |
| keymaster_keypair_t key_type; |
| keymaster_rsa_keygen_params_t rsa_params; |
| }; |
| typedef struct keymaster_gen_keypair_cmd keymaster_gen_keypair_cmd_t; |
| |
| /** |
| * Response to Generate a public and private key. The key data returned |
| * (by secure app) is in shared buffer at offset of "key_blob" and is opaque |
| * |
| * cmd_id : Command issue to secure app |
| * key_blob : key blob data |
| * key_blob_len : Total length of key blob information |
| * status : Result (success 0, or failure -1) |
| */ |
| struct keymaster_gen_keypair_resp { |
| keymaster_cmd_t cmd_id; |
| qcom_km_key_blob_t key_blob; |
| size_t key_blob_len; |
| int32_t status; |
| }; |
| typedef struct keymaster_gen_keypair_resp keymaster_gen_keypair_resp_t; |
| |
| |
| /** |
| * Command to import a public and private key pair. The imported keys |
| * will be in PKCS#8 format with DER encoding (Java standard). The key |
| * data returned (by secure app) is in shared buffer at offset of |
| * "key_blob" and is opaque |
| * |
| * cmd_id : Command issue to secure app |
| * pkcs8_key : Pointer to pkcs8 formatted key information |
| * pkcs8_key_len: PKCS8 formatted key length |
| */ |
| struct keymaster_import_keypair_cmd { |
| keymaster_cmd_t cmd_id; |
| uint32_t pkcs8_key; |
| size_t pkcs8_key_len; |
| }; |
| typedef struct keymaster_import_keypair_cmd keymaster_import_keypair_cmd_t; |
| |
| /** |
| * Response to import a public and private key. The key data returned |
| * (by secure app) is in shared buffer at offset of "key_blob" and is opaque |
| * |
| * cmd_id : Command issue to secure app |
| * key_blob : key blob data |
| * key_blob_len : Total length of key blob information |
| * status : Result (success 0, or failure -1) |
| */ |
| struct keymaster_import_keypair_resp { |
| keymaster_cmd_t cmd_id; |
| qcom_km_key_blob_t key_blob; |
| size_t key_blob_len; |
| int32_t status; |
| }; |
| typedef struct keymaster_import_keypair_resp keymaster_import_keypair_resp_t; |
| |
| /** |
| * Command to sign data using a key info generated before. This can use either |
| * an asymmetric key or a secret key. |
| * The signed data is returned (by secure app) at offset of data + dlen. |
| * |
| * cmd_id : Command issue to secure app |
| * sign_param : |
| * key_blob : Key data information (in shared buffer) |
| * data : Pointer to plain data buffer |
| * dlen : Plain data length |
| */ |
| struct keymaster_sign_data_cmd { |
| keymaster_cmd_t cmd_id; |
| keymaster_rsa_sign_params_t sign_param; |
| qcom_km_key_blob_t key_blob; |
| uint32_t data; |
| size_t dlen; |
| }; |
| typedef struct keymaster_sign_data_cmd keymaster_sign_data_cmd_t; |
| |
| /** |
| * Response to sign data response |
| * |
| * cmd_id : Command issue to secure app |
| * signed_data : signature |
| * sig_len : Signed data length |
| * status : Result (success 0, or failure -1) |
| */ |
| struct keymaster_sign_data_resp { |
| keymaster_cmd_t cmd_id; |
| uint8_t signed_data[KM_KEY_SIZE_MAX]; |
| size_t sig_len; |
| int32_t status; |
| }; |
| |
| typedef struct keymaster_sign_data_resp keymaster_sign_data_resp_t; |
| |
| /** |
| * Command to verify data using a key info generated before. This can use either |
| * an asymmetric key or a secret key. |
| * |
| * cmd_id : Command issue to secure app |
| * sign_param : |
| * key_blob : Key data information (in shared buffer) |
| * key_blob_len: Total key length |
| * signed_data : Pointer to signed data buffer |
| * signed_dlen : Signed data length |
| * signature : Offset to the signature data buffer (from signed data buffer) |
| * slen : Signature data length |
| */ |
| struct keymaster_verify_data_cmd { |
| keymaster_cmd_t cmd_id; |
| keymaster_rsa_sign_params_t sign_param; |
| qcom_km_key_blob_t key_blob; |
| uint32_t signed_data; |
| size_t signed_dlen; |
| uint32_t signature; |
| size_t slen; |
| }; |
| typedef struct keymaster_verify_data_cmd keymaster_verify_data_cmd_t; |
| /** |
| * Response to verify data |
| * |
| * cmd_id : Command issue to secure app |
| * status : Result (success 0, or failure -1) |
| */ |
| struct keymaster_verify_data_resp { |
| keymaster_cmd_t cmd_id; |
| int32_t status; |
| }; |
| typedef struct keymaster_verify_data_resp keymaster_verify_data_resp_t; |
| |
| __END_DECLS |
| |
| #endif // ANDROID_HARDWARE_QCOM_KEYMASTER_H |