forked from rubenslte/android_kernel_samsung_msm8226
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:
+39
-23
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user