Get ECDSA algo from key size 63/297263/3
authorDongsun Lee <ds73.lee@samsung.com>
Wed, 16 Aug 2023 05:34:38 +0000 (14:34 +0900)
committerDong Sun Lee <ds73.lee@samsung.com>
Wed, 16 Aug 2023 08:26:33 +0000 (08:26 +0000)
Change-Id: I28902813e51f62aa22e37be27f01c617b9daaef1

ta/src/cmd_exec.c

index f4eb5d94a9e8c152a2dab622ce9135ed33d75fab..59641d7ad432ef3544b8fa05f675a45bba4af140 100644 (file)
@@ -222,7 +222,7 @@ static uint32_t KM_CheckAlgoKeyType(uint32_t algo, uint32_t key_type)
        }
 }
 
-static uint32_t KM_AlgoHash2SignVerifyAlgo(int algo, int hash)
+static uint32_t KM_AlgoHash2SignVerifyAlgo(int algo, int hash, uint32_t key_size_in_bits)
 {
        switch (algo) {
        case ALGO_RSA_SV: {
@@ -242,11 +242,11 @@ static uint32_t KM_AlgoHash2SignVerifyAlgo(int algo, int hash)
                }
        }
        case ALGO_ECDSA_SV: {
-               switch (hash) {
-               case HASH_SHA1: return TEE_ALG_ECDSA_P192;
-               case HASH_SHA256: return TEE_ALG_ECDSA_P256;
-               case HASH_SHA384: return TEE_ALG_ECDSA_P384;
-               case HASH_SHA512: return TEE_ALG_ECDSA_P521;
+               switch (key_size_in_bits) {
+               case 192: return TEE_ALG_ECDSA_P192;
+               case 256: return TEE_ALG_ECDSA_P256;
+               case 384: return TEE_ALG_ECDSA_P384;
+               case 521: return TEE_ALG_ECDSA_P521;
                default: return 0;
                }
        }
@@ -2178,18 +2178,14 @@ TEE_Result KM_ExecCmdSign(TEE_Param param[4])
        uint32_t outSize = 0;
        void *digest = NULL;
        uint32_t digestSize = 0;
-       uint32_t algo = KM_AlgoHash2SignVerifyAlgo(param[0].value.a, param[0].value.b);
+       uint32_t algo = 0;
+       uint32_t key_size_in_bits = 0;
 
        void *in_buffer = param[1].memref.buffer;
        void *out_buffer = param[2].memref.buffer;
        uint32_t in_size_guard = param[1].memref.size;
        uint32_t out_size_guard = param[2].memref.size;
 
-       if (algo == 0) {
-               LOG("Unsupported algorithm provided: %u", algo);
-               return TEE_ERROR_BAD_PARAMETERS;
-       }
-
        if (KM_DeserializeBinaryData(&in_buffer, &in_size_guard, &input_data)) {
                LOG("Error in deserialization");
                ret = TEE_ERROR_BAD_PARAMETERS;
@@ -2223,6 +2219,19 @@ TEE_Result KM_ExecCmdSign(TEE_Param param[4])
                goto clean;
        }
 
+       TEE_GetObjectInfo(key, &info);
+       key_size_in_bits = KM_MaxObjectSizeBits(&info);
+       if (key_size_in_bits == 0) {
+               // In some implementations, objectSize of key is 0. In such case, use maxObjectSize.
+               key_size_in_bits = KM_MaxObjectSizeBits(&info);
+       }
+
+       algo = KM_AlgoHash2SignVerifyAlgo(param[0].value.a, param[0].value.b, key_size_in_bits);
+       if (algo == 0) {
+               LOG("Unsupported algorithm provided: %u", algo);
+               return TEE_ERROR_BAD_PARAMETERS;
+       }
+
        // calculate digest
        ret = KM_InputDataDigest(param[0].value.b, &input_data, &digest, &digestSize);
        if (ret != TEE_SUCCESS)
@@ -2235,8 +2244,6 @@ TEE_Result KM_ExecCmdSign(TEE_Param param[4])
                goto clean;
        }
 
-       TEE_GetObjectInfo(key, &info);
-
        outSize = KM_MaxObjectSizeBytes(&info);
        if (param[0].value.a == ALGO_ECDSA_SV)
                outSize *= 2;
@@ -2275,6 +2282,7 @@ TEE_Result KM_ExecCmdVerify(TEE_Param param[4])
        TEE_Result ret = TEE_SUCCESS;
        TEE_ObjectHandle key = TEE_HANDLE_NULL;
        TEE_OperationHandle operation = TEE_HANDLE_NULL;
+       TEE_ObjectInfo info;
 
        KM_BinaryData input_data;
        KM_BinaryData signature;
@@ -2284,16 +2292,12 @@ TEE_Result KM_ExecCmdVerify(TEE_Param param[4])
 
        void *digest = NULL;
        uint32_t digestSize = 0;
-       uint32_t algo = KM_AlgoHash2SignVerifyAlgo(param[0].value.a, param[0].value.b);
+       uint32_t algo = 0;
+       uint32_t key_size_in_bits = 0;
 
        void *in_buffer = param[1].memref.buffer;
        uint32_t in_size_guard = param[1].memref.size;
 
-       if (algo == 0) {
-               LOG("Unsupported algorithm provided: %u", algo);
-               return TEE_ERROR_BAD_PARAMETERS;
-       }
-
        if (KM_DeserializeBinaryData(&in_buffer, &in_size_guard, &input_data)) {
                LOG("Error in deserialization");
                ret = TEE_ERROR_BAD_PARAMETERS;
@@ -2333,6 +2337,19 @@ TEE_Result KM_ExecCmdVerify(TEE_Param param[4])
                goto clean;
        }
 
+       TEE_GetObjectInfo(key, &info);
+       key_size_in_bits = KM_MaxObjectSizeBits(&info);
+       if (key_size_in_bits == 0) {
+               // In some implementations, objectSize of key is 0. In such case, use maxObjectSize.
+               key_size_in_bits = KM_MaxObjectSizeBits(&info);
+       }
+
+       algo = KM_AlgoHash2SignVerifyAlgo(param[0].value.a, param[0].value.b, key_size_in_bits);
+       if (algo == 0) {
+               LOG("Unsupported algorithm provided: %u", algo);
+               return TEE_ERROR_BAD_PARAMETERS;
+       }
+
        // calculate digest
        ret = KM_InputDataDigest(param[0].value.b, &input_data, &digest, &digestSize);
        if (ret != TEE_SUCCESS)