return ret;
}
-TEE_Result KM_ExecCmdVerify(TEE_Param param[4])
-{
- TEE_Result ret = TEE_ERROR_NOT_IMPLEMENTED;
- TEE_OperationHandle digestOperation = TEE_HANDLE_NULL;
- TEE_OperationHandle operation = TEE_HANDLE_NULL;
- KM_SymmetricInput *input = NULL;
- KM_InputData *input_data = NULL;
- KM_IVData *iv_data = NULL;
- KM_KeyId *key_id_data = NULL;
-
- void* digest = NULL;
- uint32_t digest_size = 0;
- uint32_t algo = KM_AlgoHash2SignVerifyAlgo(param[0].value.a, param[0].value.b);
-
- if (algo == 0) {
- LOG("Unsupported algorithm provided: %u", algo);
- return TEE_ERROR_BAD_PARAMETERS;
- }
-
- ret = KM_DeserializeInput(param[1].memref.buffer, param[1].memref.size,
- &input, &input_data, NULL, NULL,
- &key_id_data, NULL, NULL);
- if (ret != TEE_SUCCESS) {
- LOG("Failed to deserialize data from input buffer");
- return TEE_ERROR_BAD_PARAMETERS;
- }
-
- if (!input_data) {
- LOG("There needs to be InputData!");
- return TEE_ERROR_BAD_PARAMETERS;
- }
-
- ret = KM_CreateDigestOperation(KM_Hash2TeeAlgo(param[0].value.b), &digestOperation);
- if (TEE_SUCCESS != ret) {
- LOG("Failed to create digest operation");
- goto clean;
- }
-
- ret = KM_CreateOperationWithKeyId(key_id_data->data, key_id_data->data_size,
- TEE_MODE_VERIFY, algo, &operation);
-
- digest_size = KM_DigestSizeFromHash(param[0].value.b);
- digest = malloc(digest_size);
- if (digest == NULL) {
- LOG("Failed to allocate buffer for digest");
- ret = TEE_ERROR_OUT_OF_MEMORY;
- goto clean;
- }
-
- ret = KM_Digest(digestOperation, input_data->data, input_data->data_size,
- digest, &digest_size);
- if (TEE_SUCCESS != ret) {
- goto clean;
- }
-
- ret = KM_AsymmetricVerify(operation, digest, digest_size,
- iv_data->data, iv_data->data_size);
-
-clean:
- free(digest);
- if (digestOperation != TEE_HANDLE_NULL) TEE_FreeOperation(digestOperation);
- if (operation != TEE_HANDLE_NULL) TEE_FreeOperation(operation);
- return ret;
-}
-
TEE_Result KM_ExecCmdDestroyKey(TEE_Param param[4])
{
TEE_Result ret = TEE_SUCCESS;
ret = KM_ExecCmdSign(param);
break;
}
- case CMD_VERIFY: {
- LOGD("!!! Verify !!!");
-
- if (ALGO_RSA_SV != param[0].value.a &&
- ALGO_DSA_SV != param[0].value.a &&
- ALGO_ECDSA_SV != param[0].value.a) {
- LOG("Invalid key type=%d for command=%d.", param[0].value.a, commandID);
- ret = TEE_ERROR_BAD_PARAMETERS;
- break;
- }
-
- ret = KM_ExecCmdVerify(param);
- break;
- }
case CMD_DESTROY_KEY: {
LOGD("!!! Destroy !!!");
ret = KM_ExecCmdDestroyKey(param);