Loading drivers/misc/qseecom.c +39 −23 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -213,8 +213,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 */ Loading Loading @@ -2868,13 +2882,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", Loading Loading @@ -3026,8 +3040,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; } Loading Loading @@ -3085,7 +3097,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); Loading @@ -3107,7 +3119,7 @@ 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], (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); Loading Loading @@ -3153,20 +3165,23 @@ static int qseecom_wipe_key(struct qseecom_dev_handle *data, return -EINVAL; } 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 - 1], (void *)key_id_array[wipe_key_req.usage].desc, QSEECOM_KEY_ID_SIZE); memset((void *)delete_key_ireq.hash32, 0, QSEECOM_HASH_SIZE); 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); pr_err("Failed to delete key from ssd storage: %d\n", ret); return -EFAULT; } } clear_key_ireq.qsee_command_id = QSEOS_SET_KEY; clear_key_ireq.ce = ce_hw; Loading @@ -3174,7 +3189,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, Loading Loading @@ -3213,7 +3228,8 @@ 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], 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); Loading include/uapi/linux/qseecom.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading
drivers/misc/qseecom.c +39 −23 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -213,8 +213,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 */ Loading Loading @@ -2868,13 +2882,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", Loading Loading @@ -3026,8 +3040,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; } Loading Loading @@ -3085,7 +3097,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); Loading @@ -3107,7 +3119,7 @@ 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], (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); Loading Loading @@ -3153,20 +3165,23 @@ static int qseecom_wipe_key(struct qseecom_dev_handle *data, return -EINVAL; } 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 - 1], (void *)key_id_array[wipe_key_req.usage].desc, QSEECOM_KEY_ID_SIZE); memset((void *)delete_key_ireq.hash32, 0, QSEECOM_HASH_SIZE); 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); pr_err("Failed to delete key from ssd storage: %d\n", ret); return -EFAULT; } } clear_key_ireq.qsee_command_id = QSEOS_SET_KEY; clear_key_ireq.ce = ce_hw; Loading @@ -3174,7 +3189,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, Loading Loading @@ -3213,7 +3228,8 @@ 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], 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); Loading
include/uapi/linux/qseecom.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading