qseecom: add support to clear key for per file encryption

Make a KMS change to support just clear pipe key without deleting it
from ssd storage. Key id definitions for FDE and PDE are also updated.

Change-Id: I7c4804902a7a734087374c81ff0fd95655d84429
Signed-off-by: Zhen Kong <zkong@codeaurora.org>
This commit is contained in:
Zhen Kong
2014-03-25 13:24:56 -07:00
parent a10dcab66e
commit ba69dfe7e8
2 changed files with 41 additions and 23 deletions
+39 -23
View File
@@ -61,7 +61,7 @@
#define QSEE_CE_CLK_100MHZ 100000000
#define QSEECOM_MAX_SG_ENTRY 512
#define QSEECOM_DISK_ENCRYTPION_KEY_ID 0
#define QSEECOM_INVALID_KEY_ID 0xff
/* Save partition image hash for authentication check */
#define SCM_SAVE_PARTITION_HASH_ID 0x01
@@ -226,8 +226,22 @@ struct qseecom_sg_entry {
uint32_t len;
};
uint8_t *key_id_array[QSEECOM_KEY_ID_SIZE] = {
"Disk Encryption"
struct qseecom_key_id_usage_desc {
uint8_t desc[QSEECOM_KEY_ID_SIZE];
};
static struct qseecom_key_id_usage_desc key_id_array[] = {
{
.desc = "Undefined Usage Index",
},
{
.desc = "Full Disk Encryption",
},
{
.desc = "Per File Encryption",
},
};
/* Function proto types */
@@ -2749,13 +2763,13 @@ static int __qseecom_generate_and_save_key(struct qseecom_dev_handle *data,
case QSEOS_RESULT_SUCCESS:
break;
case QSEOS_RESULT_FAIL_KEY_ID_EXISTS:
pr_debug("process_incomplete_cmd return Key ID exists.\n");
pr_debug("Key ID exists.\n");
break;
case QSEOS_RESULT_INCOMPLETE:
ret = __qseecom_process_incomplete_cmd(data, &resp);
if (ret) {
if (resp.result == QSEOS_RESULT_FAIL_KEY_ID_EXISTS) {
pr_debug("process_incomplete_cmd return Key ID exists.\n");
pr_debug("Key ID exists.\n");
ret = 0;
} else {
pr_err("process_incomplete_cmd FAILED, resp.result %d\n",
@@ -2907,8 +2921,6 @@ static int __qseecom_update_current_key_user_info(
if (ret) {
pr_err("scm call to update key userinfo failed : %d\n", ret);
__qseecom_disable_clk(CLK_QSEE);
if (qseecom.qsee.instance != qseecom.ce_drv.instance)
__qseecom_disable_clk(CLK_CE_DRV);
return -EFAULT;
}
@@ -2966,7 +2978,7 @@ static int qseecom_create_key(struct qseecom_dev_handle *data,
memset((void *)generate_key_ireq.key_id, 0, QSEECOM_KEY_ID_SIZE);
memset((void *)generate_key_ireq.hash32, 0, QSEECOM_HASH_SIZE);
memcpy((void *)generate_key_ireq.key_id,
(void *)key_id_array[create_key_req.usage - 1],
(void *)key_id_array[create_key_req.usage].desc,
QSEECOM_KEY_ID_SIZE);
memcpy((void *)generate_key_ireq.hash32,
(void *)create_key_req.hash32, QSEECOM_HASH_SIZE);
@@ -2988,8 +3000,8 @@ static int qseecom_create_key(struct qseecom_dev_handle *data,
memset((void *)set_key_ireq.key_id, 0, QSEECOM_KEY_ID_SIZE);
memset((void *)set_key_ireq.hash32, 0, QSEECOM_HASH_SIZE);
memcpy((void *)set_key_ireq.key_id,
(void *)key_id_array[create_key_req.usage - 1],
QSEECOM_KEY_ID_SIZE);
(void *)key_id_array[create_key_req.usage].desc,
QSEECOM_KEY_ID_SIZE);
memcpy((void *)set_key_ireq.hash32, (void *)create_key_req.hash32,
QSEECOM_HASH_SIZE);
@@ -3034,19 +3046,22 @@ static int qseecom_wipe_key(struct qseecom_dev_handle *data,
return -EINVAL;
}
delete_key_ireq.flags = flags;
delete_key_ireq.qsee_command_id = QSEOS_DELETE_KEY;
memset((void *)delete_key_ireq.key_id, 0, QSEECOM_KEY_ID_SIZE);
memcpy((void *)delete_key_ireq.key_id,
(void *)key_id_array[wipe_key_req.usage - 1],
if (wipe_key_req.wipe_key_flag) {
delete_key_ireq.flags = flags;
delete_key_ireq.qsee_command_id = QSEOS_DELETE_KEY;
memset((void *)delete_key_ireq.key_id, 0, QSEECOM_KEY_ID_SIZE);
memcpy((void *)delete_key_ireq.key_id,
(void *)key_id_array[wipe_key_req.usage].desc,
QSEECOM_KEY_ID_SIZE);
memset((void *)delete_key_ireq.hash32, 0, QSEECOM_HASH_SIZE);
memset((void *)delete_key_ireq.hash32, 0, QSEECOM_HASH_SIZE);
ret = __qseecom_delete_saved_key(data, wipe_key_req.usage,
ret = __qseecom_delete_saved_key(data, wipe_key_req.usage,
&delete_key_ireq);
if (ret) {
pr_err("Failed to delete key from ssd storage: %d\n", ret);
return -EFAULT;
if (ret) {
pr_err("Failed to delete key from ssd storage: %d\n",
ret);
return -EFAULT;
}
}
clear_key_ireq.qsee_command_id = QSEOS_SET_KEY;
@@ -3055,7 +3070,7 @@ static int qseecom_wipe_key(struct qseecom_dev_handle *data,
clear_key_ireq.flags = flags;
clear_key_ireq.pipe_type = QSEOS_PIPE_ENC|QSEOS_PIPE_ENC_XTS;
for (i = 0; i < QSEECOM_KEY_ID_SIZE; i++)
clear_key_ireq.key_id[i] = 0xff;
clear_key_ireq.key_id[i] = QSEECOM_INVALID_KEY_ID;
memset((void *)clear_key_ireq.hash32, 0, QSEECOM_HASH_SIZE);
ret = __qseecom_set_clear_ce_key(data, wipe_key_req.usage,
@@ -3094,8 +3109,9 @@ static int qseecom_update_key_user_info(struct qseecom_dev_handle *data,
memset(ireq.key_id, 0, QSEECOM_KEY_ID_SIZE);
memset((void *)ireq.current_hash32, 0, QSEECOM_HASH_SIZE);
memset((void *)ireq.new_hash32, 0, QSEECOM_HASH_SIZE);
memcpy(ireq.key_id, key_id_array[update_key_req.usage - 1],
QSEECOM_KEY_ID_SIZE);
memcpy((void *)ireq.key_id,
(void *)key_id_array[update_key_req.usage].desc,
QSEECOM_KEY_ID_SIZE);
memcpy((void *)ireq.current_hash32,
(void *)update_key_req.current_hash32, QSEECOM_HASH_SIZE);
memcpy((void *)ireq.new_hash32,
+2
View File
@@ -138,6 +138,8 @@ struct qseecom_create_key_req {
struct qseecom_wipe_key_req {
enum qseecom_key_management_usage_type usage;
int wipe_key_flag;/* 1->remove key from storage(alone with clear key) */
/* 0->do not remove from storage (clear key) */
};
struct qseecom_update_key_userinfo_req {