blob: 4da8369018effc51f8779722e11ac446080e94cc [file] [log] [blame]
Etienne Carriere75141172020-05-16 11:58:23 +02001// SPDX-License-Identifier: BSD-2-Clause
Igor Opaniuk136644a2016-09-13 13:40:56 +03002/*
3 * Copyright (c) 2015, Linaro Limited
4 * All rights reserved.
Igor Opaniuk136644a2016-09-13 13:40:56 +03005 */
6
7#include <tee_internal_api.h>
8#include <tee_ta_api.h>
9#include <string.h>
10#include <trace.h>
11
yuzexi4c9b16a2022-11-24 15:42:34 +080012#include "ta_hash_perf.h"
13#include "ta_hash_perf_priv.h"
Igor Opaniuk136644a2016-09-13 13:40:56 +030014
yuzexi4c9b16a2022-11-24 15:42:34 +080015#define CHECK(res, name, action) do { \
16 if ((res) != TEE_SUCCESS) { \
17 DMSG(name ": %#08"PRIx32, (res));\
18 action \
19 } \
Igor Opaniuk136644a2016-09-13 13:40:56 +030020 } while(0)
21
yuzexi4c9b16a2022-11-24 15:42:34 +080022static TEE_OperationHandle digest_op;
Igor Opaniuk136644a2016-09-13 13:40:56 +030023
24TEE_Result cmd_process(uint32_t param_types, TEE_Param params[4])
25{
Etienne Carriere102092e2019-03-28 15:24:22 +010026 TEE_Result res = TEE_ERROR_GENERIC;
27 int n = 0;
28 void *in = NULL;
29 void *out = NULL;
30 uint32_t insz = 0;
31 uint32_t outsz = 0;
32 uint32_t offset = 0;
Igor Opaniuk136644a2016-09-13 13:40:56 +030033 uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
34 TEE_PARAM_TYPE_MEMREF_OUTPUT,
35 TEE_PARAM_TYPE_VALUE_INPUT,
36 TEE_PARAM_TYPE_NONE);
37
38 if (param_types != exp_param_types)
39 return TEE_ERROR_BAD_PARAMETERS;
40
41 offset = params[2].value.b;
42 in = (uint8_t *)params[0].memref.buffer + offset;
43 insz = params[0].memref.size - offset;
44 out = params[1].memref.buffer;
45 outsz = params[1].memref.size;
46 n = params[2].value.a;
47
48 while (n--) {
49 res = TEE_DigestDoFinal(digest_op, in, insz, out, &outsz);
50 CHECK(res, "TEE_DigestDoFinal", return res;);
51 }
yuzexi4c9b16a2022-11-24 15:42:34 +080052
Igor Opaniuk136644a2016-09-13 13:40:56 +030053 return TEE_SUCCESS;
54}
55
56TEE_Result cmd_prepare_op(uint32_t param_types, TEE_Param params[4])
57{
Etienne Carriere102092e2019-03-28 15:24:22 +010058 TEE_Result res = TEE_ERROR_GENERIC;
59 uint32_t algo = 0;
Igor Opaniuk136644a2016-09-13 13:40:56 +030060 uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
61 TEE_PARAM_TYPE_NONE,
62 TEE_PARAM_TYPE_NONE,
63 TEE_PARAM_TYPE_NONE);
Etienne Carriere102092e2019-03-28 15:24:22 +010064
Igor Opaniuk136644a2016-09-13 13:40:56 +030065 if (param_types != exp_param_types)
66 return TEE_ERROR_BAD_PARAMETERS;
67
68 switch (params[0].value.a) {
69 case TA_SHA_SHA1:
70 algo = TEE_ALG_SHA1;
71 break;
72 case TA_SHA_SHA224:
73 algo = TEE_ALG_SHA224;
74 break;
75 case TA_SHA_SHA256:
76 algo = TEE_ALG_SHA256;
77 break;
78 case TA_SHA_SHA384:
79 algo = TEE_ALG_SHA384;
80 break;
81 case TA_SHA_SHA512:
82 algo = TEE_ALG_SHA512;
83 break;
yuzexi4c9b16a2022-11-24 15:42:34 +080084 case TA_SM3:
85 algo = TEE_ALG_SM3;
86 break;
Igor Opaniuk136644a2016-09-13 13:40:56 +030087 default:
88 return TEE_ERROR_BAD_PARAMETERS;
89 }
90
91 if (digest_op)
92 TEE_FreeOperation(digest_op);
93
94 res = TEE_AllocateOperation(&digest_op, algo, TEE_MODE_DIGEST, 0);
95 CHECK(res, "TEE_AllocateOperation", return res;);
96
97 return TEE_SUCCESS;
98}
99
Igor Opaniuk136644a2016-09-13 13:40:56 +0300100void cmd_clean_res(void)
101{
102 if (digest_op)
yuzexi4c9b16a2022-11-24 15:42:34 +0800103 TEE_FreeOperation(digest_op);
Igor Opaniuk136644a2016-09-13 13:40:56 +0300104}