blob: 302b87cd8a6067fda320f1aaa9d0639648d4d7ba [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
yuzexi99741332022-12-01 11:23:28 +080024static bool is_mac(uint32_t algo)
25{
26 switch (algo) {
27 case TEE_ALG_HMAC_SHA1:
28 case TEE_ALG_HMAC_SHA224:
29 case TEE_ALG_HMAC_SHA256:
30 case TEE_ALG_HMAC_SHA384:
31 case TEE_ALG_HMAC_SHA512:
32 case TEE_ALG_HMAC_SM3:
33 return true;
34 default:
35 return false;
36 }
37}
38
Igor Opaniuk136644a2016-09-13 13:40:56 +030039TEE_Result cmd_process(uint32_t param_types, TEE_Param params[4])
40{
Etienne Carriere102092e2019-03-28 15:24:22 +010041 TEE_Result res = TEE_ERROR_GENERIC;
yuzexi99741332022-12-01 11:23:28 +080042 TEE_OperationInfo info = { };
Etienne Carriere102092e2019-03-28 15:24:22 +010043 int n = 0;
44 void *in = NULL;
45 void *out = NULL;
Jens Wiklandere1634fa2022-12-12 12:59:28 +010046 size_t insz = 0;
47 size_t outsz = 0;
Etienne Carriere102092e2019-03-28 15:24:22 +010048 uint32_t offset = 0;
Igor Opaniuk136644a2016-09-13 13:40:56 +030049 uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
50 TEE_PARAM_TYPE_MEMREF_OUTPUT,
51 TEE_PARAM_TYPE_VALUE_INPUT,
52 TEE_PARAM_TYPE_NONE);
53
54 if (param_types != exp_param_types)
55 return TEE_ERROR_BAD_PARAMETERS;
56
57 offset = params[2].value.b;
58 in = (uint8_t *)params[0].memref.buffer + offset;
59 insz = params[0].memref.size - offset;
60 out = params[1].memref.buffer;
61 outsz = params[1].memref.size;
62 n = params[2].value.a;
63
yuzexi99741332022-12-01 11:23:28 +080064 TEE_GetOperationInfo(digest_op, &info);
65
66 if (is_mac(info.algorithm)) {
67 while (n--) {
68 TEE_MACInit(digest_op, NULL, 0);
69 res = TEE_MACComputeFinal(digest_op, in, insz, out, &outsz);
70 CHECK(res, "TEE_MACComputeFinal", return res;);
71 }
72 } else {
73 while (n--) {
74 res = TEE_DigestDoFinal(digest_op, in, insz, out, &outsz);
75 CHECK(res, "TEE_DigestDoFinal", return res;);
76 }
Igor Opaniuk136644a2016-09-13 13:40:56 +030077 }
yuzexi4c9b16a2022-11-24 15:42:34 +080078
Igor Opaniuk136644a2016-09-13 13:40:56 +030079 return TEE_SUCCESS;
80}
81
82TEE_Result cmd_prepare_op(uint32_t param_types, TEE_Param params[4])
83{
yuzexi99741332022-12-01 11:23:28 +080084 TEE_ObjectHandle hkey = TEE_HANDLE_NULL;
Etienne Carriere102092e2019-03-28 15:24:22 +010085 TEE_Result res = TEE_ERROR_GENERIC;
yuzexi99741332022-12-01 11:23:28 +080086 TEE_Attribute attr = { };
87 uint32_t key_type = TEE_TYPE_HMAC_SHA1;
88 uint32_t mac_key_size = 512;
89 uint32_t max_key_size = 0;
Etienne Carriere102092e2019-03-28 15:24:22 +010090 uint32_t algo = 0;
yuzexi99741332022-12-01 11:23:28 +080091 static uint8_t mac_key[] = {
92 0x00, 0x01, 0x02, 0x03,
93 0x04, 0x05, 0x06, 0x07,
94 0x08, 0x09, 0x0A, 0x0B,
95 0x0C, 0x0D, 0x0E, 0x0F,
96 0x10, 0x11, 0x12, 0x13,
97 0x14, 0x15, 0x16, 0x17,
98 0x18, 0x19, 0x1A, 0x1B,
99 0x1C, 0x1D, 0x1E, 0x1F,
100 0x20, 0x21, 0x22, 0x23,
101 0x24, 0x25, 0x26, 0x27,
102 0x28, 0x29, 0x2A, 0x2B,
103 0x2C, 0x2D, 0x2E, 0x2F,
104 0x30, 0x31, 0x32, 0x33,
105 0x34, 0x35, 0x36, 0x37,
106 0x38, 0x39, 0x3A, 0x3B,
107 0x3C, 0x3D, 0x3E, 0x3F
108 };
Igor Opaniuk136644a2016-09-13 13:40:56 +0300109 uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
110 TEE_PARAM_TYPE_NONE,
111 TEE_PARAM_TYPE_NONE,
112 TEE_PARAM_TYPE_NONE);
Etienne Carriere102092e2019-03-28 15:24:22 +0100113
Igor Opaniuk136644a2016-09-13 13:40:56 +0300114 if (param_types != exp_param_types)
115 return TEE_ERROR_BAD_PARAMETERS;
116
117 switch (params[0].value.a) {
118 case TA_SHA_SHA1:
119 algo = TEE_ALG_SHA1;
120 break;
121 case TA_SHA_SHA224:
122 algo = TEE_ALG_SHA224;
123 break;
124 case TA_SHA_SHA256:
125 algo = TEE_ALG_SHA256;
126 break;
127 case TA_SHA_SHA384:
128 algo = TEE_ALG_SHA384;
129 break;
130 case TA_SHA_SHA512:
131 algo = TEE_ALG_SHA512;
132 break;
yuzexi4c9b16a2022-11-24 15:42:34 +0800133 case TA_SM3:
134 algo = TEE_ALG_SM3;
135 break;
yuzexi99741332022-12-01 11:23:28 +0800136 case TA_HMAC_SHA1:
137 key_type = TEE_TYPE_HMAC_SHA1;
138 algo = TEE_ALG_HMAC_SHA1;
139 max_key_size = 512;
140 break;
141 case TA_HMAC_SHA224:
142 key_type = TEE_TYPE_HMAC_SHA224;
143 algo = TEE_ALG_HMAC_SHA224;
144 max_key_size = 512;
145 break;
146 case TA_HMAC_SHA256:
147 key_type = TEE_TYPE_HMAC_SHA256;
148 algo = TEE_ALG_HMAC_SHA256;
149 max_key_size = 512;
150 break;
151 case TA_HMAC_SHA384:
152 key_type = TEE_TYPE_HMAC_SHA384;
153 algo = TEE_ALG_HMAC_SHA384;
154 max_key_size = 1024;
155 break;
156 case TA_HMAC_SHA512:
157 key_type = TEE_TYPE_HMAC_SHA512;
158 algo = TEE_ALG_HMAC_SHA512;
159 max_key_size = 1024;
160 break;
161 case TA_HMAC_SM3:
162 key_type = TEE_TYPE_HMAC_SM3;
163 algo = TEE_ALG_HMAC_SM3;
164 max_key_size = 512;
165 break;
Igor Opaniuk136644a2016-09-13 13:40:56 +0300166 default:
167 return TEE_ERROR_BAD_PARAMETERS;
168 }
169
170 if (digest_op)
171 TEE_FreeOperation(digest_op);
172
yuzexi99741332022-12-01 11:23:28 +0800173 if (is_mac(algo)) {
174 res = TEE_AllocateOperation(&digest_op, algo, TEE_MODE_MAC, max_key_size);
175 CHECK(res, "TEE_AllocateOperation", return res;);
Igor Opaniuk136644a2016-09-13 13:40:56 +0300176
yuzexi99741332022-12-01 11:23:28 +0800177 res = TEE_AllocateTransientObject(key_type, max_key_size, &hkey);
178 CHECK(res, "TEE_AllocateTransientObject", return res;);
179
180 attr.attributeID = TEE_ATTR_SECRET_VALUE;
181 attr.content.ref.buffer = mac_key;
182 attr.content.ref.length = mac_key_size / 8;
183
184 res = TEE_PopulateTransientObject(hkey, &attr, 1);
185 CHECK(res, "TEE_PopulateTransientObject", return res;);
186
187 res = TEE_SetOperationKey(digest_op, hkey);
188 CHECK(res, "TEE_SetOperationKey", return res;);
189
190 TEE_FreeTransientObject(hkey);
191 } else {
192 res = TEE_AllocateOperation(&digest_op, algo, TEE_MODE_DIGEST, 0);
193 CHECK(res, "TEE_AllocateOperation", return res;);
194 }
Igor Opaniuk136644a2016-09-13 13:40:56 +0300195 return TEE_SUCCESS;
196}
197
Igor Opaniuk136644a2016-09-13 13:40:56 +0300198void cmd_clean_res(void)
199{
200 if (digest_op)
yuzexi4c9b16a2022-11-24 15:42:34 +0800201 TEE_FreeOperation(digest_op);
Igor Opaniuk136644a2016-09-13 13:40:56 +0300202}