Use password in CMD_GET_DATA_SIZE 43/297143/2
authorDongsun Lee <ds73.lee@samsung.com>
Fri, 11 Aug 2023 02:33:51 +0000 (11:33 +0900)
committerDong Sun Lee <ds73.lee@samsung.com>
Fri, 11 Aug 2023 06:49:42 +0000 (06:49 +0000)
Change-Id: Idf2c6895b7a8d18d0f87821431c3c10109b73678

ta/include/internal.h
ta/src/cmd_exec.c
ta/src/internal.c

index d49e06f46afbff322a0693399249f325573c933b..6ad3f6db8c1203b81befcd7dbb448ed53d7358ec 100644 (file)
@@ -96,8 +96,8 @@ TEE_Result KM_SaveData(void *data, uint32_t data_size, void *objId, uint32_t obj
 TEE_Result KM_GetData(void *data, uint32_t expected_data_size, KM_BinaryData *obj_id,
                                        uint32_t with_pwd, KM_PwdData *pwdData, uint32_t obj_type);
 
-TEE_Result KM_GetDataSize(uint32_t *data_size, void *objId, uint32_t objId_size,
-                                       uint32_t obj_type);
+TEE_Result KM_GetDataSize(uint32_t *data_size, KM_BinaryData *obj_id,
+                                       uint32_t with_pwd, KM_PwdData *pwdData, uint32_t obj_type);
 
 void KM_DestroyData(void *objId, uint32_t objId_size);
 
index 84b3fd1db271b982a6bfc66af2ea580214e60907..c760b76daac9ce1dfd0ef4ac98ca69182d015628 100644 (file)
@@ -2554,22 +2554,29 @@ TEE_Result KM_ExecCmdGetDataSize(TEE_Param param[4])
 {
        TEE_Result ret = TEE_SUCCESS;
        KM_BinaryData objId;
+       KM_PwdData pwdData;
        uint32_t type;
        void *buffer = param[1].memref.buffer;
        uint32_t in_size_guard = param[1].memref.size;
        uint32_t data_size = 0;
+       uint32_t with_pwd = 0;
 
        if (KM_DeserializeBinaryData(&buffer, &in_size_guard, &objId)) {
                LOG("Error in deserialization");
                return TEE_ERROR_BAD_PARAMETERS;
        }
 
+       if(KM_DeserializeFlagAndPw(&buffer, &in_size_guard, &with_pwd, &pwdData)) {
+               LOG("Error in deserialization");
+               return TEE_ERROR_BAD_PARAMETERS;
+       }
+
        if (KM_DeserializeFlag(&buffer, &in_size_guard, &type)) {
                LOG("Error in deserialization");
                return TEE_ERROR_BAD_PARAMETERS;
        }
 
-       ret = KM_GetDataSize(&data_size, objId.data, objId.data_size, type);
+       ret = KM_GetDataSize(&data_size, &objId, with_pwd, &pwdData, type);
        param[0].value.b = data_size;
 
        return ret;
index 438b0977ee6d97672fa8ede0c276704a944e87b9..04137537c5e9de80eea70806b8fe4add89e604b1 100644 (file)
@@ -1360,8 +1360,8 @@ clean:
        return ret;
 }
 
-TEE_Result KM_GetDataSize(uint32_t *data_size, void *objId, uint32_t objId_size,
-                                       uint32_t obj_type)
+TEE_Result KM_GetDataSize(uint32_t *data_size, KM_BinaryData *obj_id,
+                                       uint32_t with_pwd, KM_PwdData *pwdData, uint32_t obj_type)
 {
        TEE_Result ret = TEE_SUCCESS;
        uint32_t flags = TEE_DATA_FLAG_ACCESS_READ;
@@ -1369,22 +1369,31 @@ TEE_Result KM_GetDataSize(uint32_t *data_size, void *objId, uint32_t objId_size,
        TEE_ObjectInfo info;
        KM_BinaryData der = {0, NULL};
 
-       ret = TEE_OpenPersistentObject(TEE_STORAGE_PRIVATE, objId, objId_size, flags, &hndl);
-       if (TEE_SUCCESS != ret) {
-               LOG("TEE_OpenPersistentObject has failed with=%x.", ret);
-               return ret;
-       }
+       if (obj_type == TYPE_GENERIC_SECRET || obj_type == TYPE_SKEY) {
+               ret = TEE_OpenPersistentObject(TEE_STORAGE_PRIVATE, obj_id->data, obj_id->data_size, flags, &hndl);
+               if (TEE_SUCCESS != ret) {
+                       LOG("TEE_OpenPersistentObject has failed with=%x.", ret);
+                       return ret;
+               }
 
-       TEE_GetObjectInfo(hndl, &info);
+               TEE_GetObjectInfo(hndl, &info);
 
-       if(info.dataSize != 0) {
-               *data_size = info.dataSize;
-       } else if(obj_type == TYPE_SKEY) {
-               // in case of key without encryption
-               // to support export of a key with wrapping
-               *data_size = info.objectSize / 8;
-       } else if(obj_type == TYPE_AKEY_PUBLIC_EC) {
-               // to suppoort export of EC public key
+                if(obj_type == TYPE_SKEY) {
+                       // in case of key without encryption to support export of a key with wrapping
+                       *data_size = info.objectSize / 8;
+                } else {
+                       *data_size = info.dataSize;
+                }
+       } else if (obj_type == TYPE_AKEY_PUBLIC_EC) {
+               if (with_pwd) {
+                       ret = KM_DecryptAsymKey(obj_id, pwdData, &hndl);
+               } else {
+                       ret = KM_OpenKey(obj_id->data, obj_id->data_size, &hndl);
+               }
+               if (ret != TEE_SUCCESS) {
+                       LOG("Fail to open ec public key.");
+                       goto clean;
+               }
                ret = KM_EcpublickeyToDer(hndl, &der);
                if (ret != TEE_SUCCESS) {
                        LOG("Fail to convert ec public key to der format");