blob: b66ea01e688d9f28cca00997705897670a8db422 [file] [log] [blame]
Etienne Carriere75141172020-05-16 11:58:23 +02001// SPDX-License-Identifier: BSD-2-Clause
Pascal Brandc639ac82015-07-02 08:53:34 +02002/*
3 * Copyright (c) 2014, STMicroelectronics International N.V.
4 * All rights reserved.
Pascal Brandc639ac82015-07-02 08:53:34 +02005 */
6
7#include <tee_internal_api.h>
8#include "cryp_taf.h"
9
10#define ASSERT_PARAM_TYPE(pt) \
11do { \
12 if ((pt) != param_type) \
13 return TEE_ERROR_BAD_PARAMETERS; \
14} while (0)
15
Alyssa Milburn96d39522017-06-14 18:51:12 +020016/* pointers in 32-bit fields passed as an offset to ta_head */
17extern const void *ta_head;
18#define VAL2HANDLE(v) (void *)(uintptr_t)(v == TEE_HANDLE_NULL ? v : v + (uintptr_t)&ta_head)
19#define HANDLE2VAL(h) (uint32_t)(h == TEE_HANDLE_NULL ? (uintptr_t)h : (uintptr_t)((uintptr_t)h - (uintptr_t)&ta_head))
Jens Wiklanderc5231592015-11-11 09:27:27 +010020
Pascal Brandc639ac82015-07-02 08:53:34 +020021TEE_Result ta_entry_allocate_operation(uint32_t param_type, TEE_Param params[4])
22{
Etienne Carriere102092e2019-03-28 15:24:22 +010023 TEE_Result res = TEE_ERROR_GENERIC;
24 TEE_OperationHandle op = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +020025
26 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
27 (TEE_PARAM_TYPE_VALUE_INOUT,
28 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
29 TEE_PARAM_TYPE_NONE));
30
31 res = TEE_AllocateOperation(&op,
32 params[0].value.b, params[1].value.a,
33 params[1].value.b);
Alyssa Milburn96d39522017-06-14 18:51:12 +020034 params[0].value.a = HANDLE2VAL(op);
Pascal Brandc639ac82015-07-02 08:53:34 +020035 return res;
36}
37
38TEE_Result ta_entry_free_operation(uint32_t param_type, TEE_Param params[4])
39{
Jens Wiklanderc5231592015-11-11 09:27:27 +010040 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
41
Pascal Brandc639ac82015-07-02 08:53:34 +020042 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
43 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
44 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
45
Jens Wiklanderc5231592015-11-11 09:27:27 +010046 TEE_FreeOperation(op);
Pascal Brandc639ac82015-07-02 08:53:34 +020047 return TEE_SUCCESS;
48}
49
50TEE_Result ta_entry_get_operation_info(uint32_t param_type, TEE_Param params[4])
51{
Jens Wiklanderc5231592015-11-11 09:27:27 +010052 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
53
Pascal Brandc639ac82015-07-02 08:53:34 +020054 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
55 (TEE_PARAM_TYPE_VALUE_INPUT,
56 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
57 TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +010058
Pascal Brandc639ac82015-07-02 08:53:34 +020059 if (params[1].memref.size < sizeof(TEE_OperationInfo))
60 return TEE_ERROR_SHORT_BUFFER;
61 params[1].memref.size = sizeof(TEE_OperationInfo);
62
Jens Wiklanderc5231592015-11-11 09:27:27 +010063 TEE_GetOperationInfo(op, params[1].memref.buffer);
Pascal Brandc639ac82015-07-02 08:53:34 +020064 return TEE_SUCCESS;
65}
66
67TEE_Result ta_entry_reset_operation(uint32_t param_type, TEE_Param params[4])
68{
Jens Wiklanderc5231592015-11-11 09:27:27 +010069 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
70
Pascal Brandc639ac82015-07-02 08:53:34 +020071 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
72 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
73 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
74
Jens Wiklanderc5231592015-11-11 09:27:27 +010075 TEE_ResetOperation(op);
Pascal Brandc639ac82015-07-02 08:53:34 +020076 return TEE_SUCCESS;
77}
78
79TEE_Result ta_entry_set_operation_key(uint32_t param_type, TEE_Param params[4])
80{
Jens Wiklanderc5231592015-11-11 09:27:27 +010081 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
82 TEE_ObjectHandle key = VAL2HANDLE(params[0].value.b);
83
Pascal Brandc639ac82015-07-02 08:53:34 +020084 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
85 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
86 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
87
Jens Wiklanderc5231592015-11-11 09:27:27 +010088 return TEE_SetOperationKey(op, key);
Pascal Brandc639ac82015-07-02 08:53:34 +020089}
90
91TEE_Result ta_entry_set_operation_key2(uint32_t param_type, TEE_Param params[4])
92{
Jens Wiklanderc5231592015-11-11 09:27:27 +010093 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
94 TEE_ObjectHandle key1 = VAL2HANDLE(params[0].value.b);
95 TEE_ObjectHandle key2 = VAL2HANDLE(params[1].value.a);
96
Pascal Brandc639ac82015-07-02 08:53:34 +020097 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
98 (TEE_PARAM_TYPE_VALUE_INPUT,
99 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
100 TEE_PARAM_TYPE_NONE));
101
Jens Wiklanderc5231592015-11-11 09:27:27 +0100102 return TEE_SetOperationKey2(op, key1, key2);
Pascal Brandc639ac82015-07-02 08:53:34 +0200103}
104
105TEE_Result ta_entry_copy_operation(uint32_t param_type, TEE_Param params[4])
106{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100107 TEE_OperationHandle dst = VAL2HANDLE(params[0].value.a);
108 TEE_OperationHandle src = VAL2HANDLE(params[0].value.b);
109
Pascal Brandc639ac82015-07-02 08:53:34 +0200110 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
111 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
112 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
113
Jens Wiklanderc5231592015-11-11 09:27:27 +0100114
115 TEE_CopyOperation(dst, src);
Pascal Brandc639ac82015-07-02 08:53:34 +0200116 return TEE_SUCCESS;
117}
118
119TEE_Result ta_entry_digest_update(uint32_t param_type, TEE_Param params[4])
120{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100121 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
122
Pascal Brandc639ac82015-07-02 08:53:34 +0200123 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
124 (TEE_PARAM_TYPE_VALUE_INPUT,
125 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
126 TEE_PARAM_TYPE_NONE));
127
Jens Wiklanderc5231592015-11-11 09:27:27 +0100128 TEE_DigestUpdate(op, params[1].memref.buffer, params[1].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200129 return TEE_SUCCESS;
130}
131
132TEE_Result ta_entry_digest_do_final(uint32_t param_type, TEE_Param params[4])
133{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100134 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
135
Pascal Brandc639ac82015-07-02 08:53:34 +0200136 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
137 (TEE_PARAM_TYPE_VALUE_INPUT,
138 TEE_PARAM_TYPE_MEMREF_INPUT,
139 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100140
141 return TEE_DigestDoFinal(op,
142 params[1].memref.buffer, params[1].memref.size,
143 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200144}
145
146TEE_Result ta_entry_cipher_init(uint32_t param_type, TEE_Param params[4])
147{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100148 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100149 void *buffer = NULL;
150 size_t size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200151
152 if (param_type == TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
153 TEE_PARAM_TYPE_NONE,
154 TEE_PARAM_TYPE_NONE,
155 TEE_PARAM_TYPE_NONE)) {
156 buffer = NULL;
157 size = 0;
158 } else if (param_type == TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
159 TEE_PARAM_TYPE_MEMREF_INPUT,
160 TEE_PARAM_TYPE_NONE,
161 TEE_PARAM_TYPE_NONE)) {
162 buffer = params[1].memref.buffer;
163 size = params[1].memref.size;
164 } else
165 return TEE_ERROR_BAD_PARAMETERS;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100166
167 TEE_CipherInit(op, buffer, size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200168 return TEE_SUCCESS;
169}
170
171TEE_Result ta_entry_cipher_update(uint32_t param_type, TEE_Param params[4])
172{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100173 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
174
Pascal Brandc639ac82015-07-02 08:53:34 +0200175 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
176 (TEE_PARAM_TYPE_VALUE_INPUT,
177 TEE_PARAM_TYPE_MEMREF_INPUT,
178 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100179
180 return TEE_CipherUpdate(op,
181 params[1].memref.buffer, params[1].memref.size,
182 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200183}
184
185TEE_Result ta_entry_cipher_do_final(uint32_t param_type, TEE_Param params[4])
186{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100187 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
188
Pascal Brandc639ac82015-07-02 08:53:34 +0200189 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
190 (TEE_PARAM_TYPE_VALUE_INPUT,
191 TEE_PARAM_TYPE_MEMREF_INPUT,
192 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100193
194 return TEE_CipherDoFinal(op,
195 params[1].memref.buffer, params[1].memref.size,
196 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200197}
198
199TEE_Result ta_entry_mac_init(uint32_t param_type, TEE_Param params[4])
200{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100201 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100202 void *buffer = NULL;
203 size_t size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200204
205 if (param_type == TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
206 TEE_PARAM_TYPE_NONE,
207 TEE_PARAM_TYPE_NONE,
208 TEE_PARAM_TYPE_NONE)) {
209 buffer = NULL;
210 size = 0;
211 } else if (param_type == TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
212 TEE_PARAM_TYPE_MEMREF_INPUT,
213 TEE_PARAM_TYPE_NONE,
214 TEE_PARAM_TYPE_NONE)) {
215 buffer = params[1].memref.buffer;
216 size = params[1].memref.size;
217 } else
218 return TEE_ERROR_BAD_PARAMETERS;
219
Jens Wiklanderc5231592015-11-11 09:27:27 +0100220 TEE_MACInit(op, buffer, size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200221 return TEE_SUCCESS;
222}
223
224TEE_Result ta_entry_mac_update(uint32_t param_type, TEE_Param params[4])
225{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100226 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
227
Pascal Brandc639ac82015-07-02 08:53:34 +0200228 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
229 (TEE_PARAM_TYPE_VALUE_INPUT,
230 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
231 TEE_PARAM_TYPE_NONE));
232
Jens Wiklanderc5231592015-11-11 09:27:27 +0100233 TEE_MACUpdate(op, params[1].memref.buffer, params[1].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200234 return TEE_SUCCESS;
235}
236
237TEE_Result ta_entry_mac_final_compute(uint32_t param_type, TEE_Param params[4])
238{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100239 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
240
Pascal Brandc639ac82015-07-02 08:53:34 +0200241 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
242 (TEE_PARAM_TYPE_VALUE_INPUT,
243 TEE_PARAM_TYPE_MEMREF_INPUT,
244 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100245
246 return TEE_MACComputeFinal(op,
247 params[1].memref.buffer, params[1].memref.size,
248 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200249}
250
251TEE_Result ta_entry_mac_final_compare(uint32_t param_type, TEE_Param params[4])
252{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100253 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
254
Pascal Brandc639ac82015-07-02 08:53:34 +0200255 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
256 (TEE_PARAM_TYPE_VALUE_INPUT,
257 TEE_PARAM_TYPE_MEMREF_INPUT,
258 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100259
260 return TEE_MACCompareFinal(op,
261 params[1].memref.buffer, params[1].memref.size,
262 params[2].memref.buffer, params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200263}
264
265TEE_Result ta_entry_allocate_transient_object(uint32_t param_type,
266 TEE_Param params[4])
267{
Etienne Carriere102092e2019-03-28 15:24:22 +0100268 TEE_Result res = TEE_ERROR_GENERIC;
269 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +0200270
271 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
272 (TEE_PARAM_TYPE_VALUE_INPUT,
273 TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
274 TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100275
276 res = TEE_AllocateTransientObject(params[0].value.a, params[0].value.b,
277 &o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200278 if (res == TEE_SUCCESS)
Alyssa Milburn96d39522017-06-14 18:51:12 +0200279 params[1].value.a = HANDLE2VAL(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200280 return res;
281}
282
283TEE_Result ta_entry_free_transient_object(uint32_t param_type,
284 TEE_Param params[4])
285{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100286 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
287
Pascal Brandc639ac82015-07-02 08:53:34 +0200288 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
289 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
290 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100291
292 TEE_FreeTransientObject(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200293 return TEE_SUCCESS;
294}
295
296TEE_Result ta_entry_reset_transient_object(uint32_t param_type,
297 TEE_Param params[4])
298{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100299 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
300
Pascal Brandc639ac82015-07-02 08:53:34 +0200301 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
302 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
303 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100304
305 TEE_ResetTransientObject(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200306 return TEE_SUCCESS;
307}
308
Jens Wiklanderc5231592015-11-11 09:27:27 +0100309struct attr_packed {
310 uint32_t id;
311 uint32_t a;
312 uint32_t b;
313};
314
Pascal Brandc639ac82015-07-02 08:53:34 +0200315static TEE_Result unpack_attrs(const uint8_t *buf, size_t blen,
316 TEE_Attribute **attrs, uint32_t *attr_count)
317{
318 TEE_Result res = TEE_SUCCESS;
319 TEE_Attribute *a = NULL;
Etienne Carriere102092e2019-03-28 15:24:22 +0100320 const struct attr_packed *ap = NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +0200321 size_t num_attrs = 0;
322 const size_t num_attrs_size = sizeof(uint32_t);
323
324 if (blen == 0)
325 goto out;
326
Jens Wiklanderc5231592015-11-11 09:27:27 +0100327 if (((uintptr_t)buf & 0x3) != 0 || blen < num_attrs_size)
Pascal Brandc639ac82015-07-02 08:53:34 +0200328 return TEE_ERROR_BAD_PARAMETERS;
329 num_attrs = *(uint32_t *) (void *)buf;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100330 if ((blen - num_attrs_size) < (num_attrs * sizeof(*ap)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200331 return TEE_ERROR_BAD_PARAMETERS;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100332 ap = (const struct attr_packed *)(const void *)(buf + num_attrs_size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200333
334 if (num_attrs > 0) {
335 size_t n;
336
337 a = TEE_Malloc(num_attrs * sizeof(TEE_Attribute), 0);
Jens Wiklanderc5231592015-11-11 09:27:27 +0100338 if (!a)
Pascal Brandc639ac82015-07-02 08:53:34 +0200339 return TEE_ERROR_OUT_OF_MEMORY;
Pascal Brandc639ac82015-07-02 08:53:34 +0200340 for (n = 0; n < num_attrs; n++) {
341 uintptr_t p;
342
Jens Wiklanderc5231592015-11-11 09:27:27 +0100343 a[n].attributeID = ap[n].id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200344#define TEE_ATTR_BIT_VALUE (1 << 29)
Jens Wiklanderc5231592015-11-11 09:27:27 +0100345 if (ap[n].id & TEE_ATTR_BIT_VALUE) {
346 a[n].content.value.a = ap[n].a;
347 a[n].content.value.b = ap[n].b;
Pascal Brandc639ac82015-07-02 08:53:34 +0200348 continue;
Pascal Brandc639ac82015-07-02 08:53:34 +0200349 }
Jens Wiklanderc5231592015-11-11 09:27:27 +0100350
351 a[n].content.ref.length = ap[n].b;
352 p = (uintptr_t)ap[n].a;
353 if (p) {
354 if ((p + a[n].content.ref.length) > blen) {
355 res = TEE_ERROR_BAD_PARAMETERS;
356 goto out;
357 }
358 p += (uintptr_t)buf;
359 }
Pascal Brandc639ac82015-07-02 08:53:34 +0200360 a[n].content.ref.buffer = (void *)p;
361 }
362 }
363
364 res = TEE_SUCCESS;
365out:
366 if (res == TEE_SUCCESS) {
367 *attrs = a;
368 *attr_count = num_attrs;
369 } else {
370 TEE_Free(a);
371 }
372 return res;
373}
374
375TEE_Result ta_entry_populate_transient_object(uint32_t param_type,
376 TEE_Param params[4])
377{
Etienne Carriere102092e2019-03-28 15:24:22 +0100378 TEE_Result res = TEE_ERROR_GENERIC;
379 TEE_Attribute *attrs = NULL;
380 uint32_t attr_count = 0;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100381 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200382
383 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
384 (TEE_PARAM_TYPE_VALUE_INPUT,
385 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
386 TEE_PARAM_TYPE_NONE));
387
388 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
389 &attrs, &attr_count);
390 if (res != TEE_SUCCESS)
391 return res;
392
Jens Wiklanderc5231592015-11-11 09:27:27 +0100393 res = TEE_PopulateTransientObject(o, attrs, attr_count);
Pascal Brandc639ac82015-07-02 08:53:34 +0200394 TEE_Free(attrs);
395 return res;
396}
397
398TEE_Result ta_entry_copy_object_attributes(uint32_t param_type,
399 TEE_Param params[4])
400{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100401 TEE_ObjectHandle dst = VAL2HANDLE(params[0].value.a);
402 TEE_ObjectHandle src = VAL2HANDLE(params[0].value.b);
403
Pascal Brandc639ac82015-07-02 08:53:34 +0200404 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
405 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
406 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
407
Oliver Chiang52c67e82019-01-24 13:15:12 +0000408 return TEE_CopyObjectAttributes1(dst, src);
Pascal Brandc639ac82015-07-02 08:53:34 +0200409}
410
411TEE_Result ta_entry_generate_key(uint32_t param_type, TEE_Param params[4])
412{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100413 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100414 TEE_Result res = TEE_ERROR_GENERIC;
415 TEE_Attribute *attrs = NULL;
416 uint32_t attr_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200417
418 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
419 (TEE_PARAM_TYPE_VALUE_INPUT,
420 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
421 TEE_PARAM_TYPE_NONE));
422
423 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
424 &attrs, &attr_count);
425 if (res != TEE_SUCCESS)
426 return res;
427
Jens Wiklanderc5231592015-11-11 09:27:27 +0100428 res = TEE_GenerateKey(o, params[0].value.b, attrs, attr_count);
Pascal Brandc639ac82015-07-02 08:53:34 +0200429 TEE_Free(attrs);
430 return res;
431}
432
433TEE_Result ta_entry_asymmetric_encrypt(uint32_t param_type, TEE_Param params[4])
434{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100435 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100436 TEE_Result res = TEE_ERROR_GENERIC;
437 TEE_Attribute *attrs = NULL;
438 uint32_t attr_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200439
440 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
441 (TEE_PARAM_TYPE_VALUE_INPUT,
442 TEE_PARAM_TYPE_MEMREF_INPUT,
443 TEE_PARAM_TYPE_MEMREF_INPUT,
444 TEE_PARAM_TYPE_MEMREF_OUTPUT));
445
446 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
447 &attrs, &attr_count);
448 if (res != TEE_SUCCESS)
449 return res;
450
Jens Wiklanderc5231592015-11-11 09:27:27 +0100451 res = TEE_AsymmetricEncrypt(op, attrs, attr_count,
452 params[2].memref.buffer, params[2].memref.size,
453 params[3].memref.buffer, &params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200454 TEE_Free(attrs);
455 return res;
456}
457
458TEE_Result ta_entry_asymmetric_decrypt(uint32_t param_type, TEE_Param params[4])
459{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100460 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100461 TEE_Result res = TEE_ERROR_GENERIC;
462 TEE_Attribute *attrs = NULL;
463 uint32_t attr_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200464
465 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
466 (TEE_PARAM_TYPE_VALUE_INPUT,
467 TEE_PARAM_TYPE_MEMREF_INPUT,
468 TEE_PARAM_TYPE_MEMREF_INPUT,
469 TEE_PARAM_TYPE_MEMREF_OUTPUT));
470
471 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
472 &attrs, &attr_count);
473 if (res != TEE_SUCCESS)
474 return res;
475
Jens Wiklanderc5231592015-11-11 09:27:27 +0100476 res = TEE_AsymmetricDecrypt(op, attrs, attr_count,
477 params[2].memref.buffer, params[2].memref.size,
478 params[3].memref.buffer, &params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200479 TEE_Free(attrs);
480 return res;
481}
482
483TEE_Result ta_entry_asymmetric_sign_digest(uint32_t param_type,
484 TEE_Param params[4])
485{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100486 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100487 TEE_Result res = TEE_ERROR_GENERIC;
488 TEE_Attribute *attrs = NULL;
489 uint32_t attr_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200490
491 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
492 (TEE_PARAM_TYPE_VALUE_INPUT,
493 TEE_PARAM_TYPE_MEMREF_INPUT,
494 TEE_PARAM_TYPE_MEMREF_INPUT,
495 TEE_PARAM_TYPE_MEMREF_OUTPUT));
496
497 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
498 &attrs, &attr_count);
499 if (res != TEE_SUCCESS)
500 return res;
501
Jens Wiklanderc5231592015-11-11 09:27:27 +0100502 res = TEE_AsymmetricSignDigest(op, attrs, attr_count,
503 params[2].memref.buffer, params[2].memref.size,
504 params[3].memref.buffer, &params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200505 TEE_Free(attrs);
506 return res;
507}
508
509TEE_Result ta_entry_asymmetric_verify_digest(uint32_t param_type,
510 TEE_Param params[4])
511{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100512 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100513 TEE_Result res = TEE_ERROR_GENERIC;
514 TEE_Attribute *attrs = NULL;
515 uint32_t attr_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200516
517 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
518 (TEE_PARAM_TYPE_VALUE_INPUT,
519 TEE_PARAM_TYPE_MEMREF_INPUT,
520 TEE_PARAM_TYPE_MEMREF_INPUT,
521 TEE_PARAM_TYPE_MEMREF_INPUT));
522
523 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
524 &attrs, &attr_count);
525 if (res != TEE_SUCCESS)
526 return res;
527
Jens Wiklanderc5231592015-11-11 09:27:27 +0100528 res = TEE_AsymmetricVerifyDigest(op, attrs, attr_count,
529 params[2].memref.buffer, params[2].memref.size,
530 params[3].memref.buffer, params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200531 TEE_Free(attrs);
532 return res;
533}
534
535TEE_Result ta_entry_derive_key(uint32_t param_type, TEE_Param params[4])
536{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100537 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
538 TEE_ObjectHandle key = VAL2HANDLE(params[0].value.b);
Etienne Carriere102092e2019-03-28 15:24:22 +0100539 TEE_Result res = TEE_ERROR_GENERIC;
540 TEE_Attribute *attrs = NULL;
541 uint32_t attr_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200542
543 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
544 (TEE_PARAM_TYPE_VALUE_INPUT,
545 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
546 TEE_PARAM_TYPE_NONE));
547
548 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
549 &attrs, &attr_count);
550 if (res != TEE_SUCCESS)
551 return res;
552
Jens Wiklanderc5231592015-11-11 09:27:27 +0100553 TEE_DeriveKey(op, attrs, attr_count, key);
Pascal Brandc639ac82015-07-02 08:53:34 +0200554 TEE_Free(attrs);
555 return TEE_SUCCESS;
556}
557
558TEE_Result ta_entry_random_number_generate(uint32_t param_type,
559 TEE_Param params[4])
560{
561 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
562 (TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
563 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
564
565 TEE_GenerateRandom(params[0].memref.buffer, params[0].memref.size);
566 return TEE_SUCCESS;
567}
568
569TEE_Result ta_entry_ae_init(uint32_t param_type, TEE_Param params[4])
570{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100571 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
572
Pascal Brandc639ac82015-07-02 08:53:34 +0200573 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
574 (TEE_PARAM_TYPE_VALUE_INPUT,
575 TEE_PARAM_TYPE_MEMREF_INPUT,
Jens Wiklander74a42302015-07-07 01:08:41 +0200576 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100577 return TEE_AEInit(op, params[1].memref.buffer, params[1].memref.size,
Pascal Brandc639ac82015-07-02 08:53:34 +0200578 params[0].value.b * 8, /* tag_len in bits */
579 params[2].value.a, params[2].value.b);
580}
581
582TEE_Result ta_entry_ae_update_aad(uint32_t param_type, TEE_Param params[4])
583{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100584 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
585
Pascal Brandc639ac82015-07-02 08:53:34 +0200586 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
587 (TEE_PARAM_TYPE_VALUE_INPUT,
588 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
589 TEE_PARAM_TYPE_NONE));
590
Jens Wiklanderc5231592015-11-11 09:27:27 +0100591 TEE_AEUpdateAAD(op, params[1].memref.buffer, params[1].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200592 return TEE_SUCCESS;
593}
594
595TEE_Result ta_entry_ae_update(uint32_t param_type, TEE_Param params[4])
596{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100597 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
598
Pascal Brandc639ac82015-07-02 08:53:34 +0200599 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
600 (TEE_PARAM_TYPE_VALUE_INPUT,
601 TEE_PARAM_TYPE_MEMREF_INPUT,
602 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
603
Jens Wiklanderc5231592015-11-11 09:27:27 +0100604 TEE_AEUpdate(op, params[1].memref.buffer, params[1].memref.size,
Pascal Brandc639ac82015-07-02 08:53:34 +0200605 params[2].memref.buffer, &params[2].memref.size);
606 return TEE_SUCCESS;
607}
608
609TEE_Result ta_entry_ae_encrypt_final(uint32_t param_type, TEE_Param params[4])
610{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100611 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Etienne Carriere102092e2019-03-28 15:24:22 +0100612 TEE_Result res = TEE_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200613
614 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
615 (TEE_PARAM_TYPE_VALUE_INPUT,
616 TEE_PARAM_TYPE_MEMREF_INPUT,
617 TEE_PARAM_TYPE_MEMREF_OUTPUT,
618 TEE_PARAM_TYPE_MEMREF_OUTPUT));
619
Jens Wiklanderc5231592015-11-11 09:27:27 +0100620 res = TEE_AEEncryptFinal(op,
621 params[1].memref.buffer, params[1].memref.size,
622 params[2].memref.buffer, &params[2].memref.size,
623 params[3].memref.buffer, &params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200624 return res;
625}
626
627TEE_Result ta_entry_ae_decrypt_final(uint32_t param_type, TEE_Param params[4])
628{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100629 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
630
Pascal Brandc639ac82015-07-02 08:53:34 +0200631 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
632 (TEE_PARAM_TYPE_VALUE_INPUT,
633 TEE_PARAM_TYPE_MEMREF_INPUT,
634 TEE_PARAM_TYPE_MEMREF_OUTPUT,
635 TEE_PARAM_TYPE_MEMREF_INPUT));
636
Jens Wiklanderc5231592015-11-11 09:27:27 +0100637 return TEE_AEDecryptFinal(op,
638 params[1].memref.buffer, params[1].memref.size,
639 params[2].memref.buffer, &params[2].memref.size,
640 params[3].memref.buffer, params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200641}
642
643TEE_Result ta_entry_get_object_buffer_attribute(uint32_t param_type,
644 TEE_Param params[4])
645{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100646 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
647
Pascal Brandc639ac82015-07-02 08:53:34 +0200648 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
649 (TEE_PARAM_TYPE_VALUE_INPUT,
650 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
651 TEE_PARAM_TYPE_NONE));
652
Jens Wiklanderc5231592015-11-11 09:27:27 +0100653 return TEE_GetObjectBufferAttribute(o, params[0].value.b,
654 params[1].memref.buffer, &params[1].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200655}
656
657TEE_Result ta_entry_get_object_value_attribute(uint32_t param_type,
658 TEE_Param params[4])
659{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100660 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
661
Pascal Brandc639ac82015-07-02 08:53:34 +0200662 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
663 (TEE_PARAM_TYPE_VALUE_INPUT,
664 TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
665 TEE_PARAM_TYPE_NONE));
666
Jens Wiklanderc5231592015-11-11 09:27:27 +0100667 return TEE_GetObjectValueAttribute(o, params[0].value.b,
668 &params[1].value.a, &params[1].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200669}
Jerome Forissier6635c962020-01-22 17:49:00 +0100670
671TEE_Result ta_entry_is_algo_supported(uint32_t param_type,
672 TEE_Param params[TEE_NUM_PARAMS])
673{
674 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
675 (TEE_PARAM_TYPE_VALUE_INPUT,
676 TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
677 TEE_PARAM_TYPE_NONE));
678
679 params[1].value.a = TEE_IsAlgorithmSupported(params[0].value.a,
680 params[0].value.b);
681
682 return TEE_SUCCESS;
683}