blob: 98b52fd2cb09ca791d7de1f71561c5ddffca2ae0 [file] [log] [blame]
Pascal Brandc639ac82015-07-02 08:53:34 +02001/*
2 * Copyright (c) 2014, STMicroelectronics International N.V.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include <tee_internal_api.h>
29#include "cryp_taf.h"
30
31#define ASSERT_PARAM_TYPE(pt) \
32do { \
33 if ((pt) != param_type) \
34 return TEE_ERROR_BAD_PARAMETERS; \
35} while (0)
36
Jens Wiklanderc5231592015-11-11 09:27:27 +010037#define VAL2HANDLE(v) (void *)(uintptr_t)(v)
38
Pascal Brandc639ac82015-07-02 08:53:34 +020039TEE_Result ta_entry_allocate_operation(uint32_t param_type, TEE_Param params[4])
40{
41 TEE_Result res;
42 TEE_OperationHandle op;
43
44 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
45 (TEE_PARAM_TYPE_VALUE_INOUT,
46 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
47 TEE_PARAM_TYPE_NONE));
48
49 res = TEE_AllocateOperation(&op,
50 params[0].value.b, params[1].value.a,
51 params[1].value.b);
Jens Wiklanderc5231592015-11-11 09:27:27 +010052 params[0].value.a = (uintptr_t)op;
Pascal Brandc639ac82015-07-02 08:53:34 +020053 return res;
54}
55
56TEE_Result ta_entry_free_operation(uint32_t param_type, TEE_Param params[4])
57{
Jens Wiklanderc5231592015-11-11 09:27:27 +010058 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
59
Pascal Brandc639ac82015-07-02 08:53:34 +020060 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
61 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
62 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
63
Jens Wiklanderc5231592015-11-11 09:27:27 +010064 TEE_FreeOperation(op);
Pascal Brandc639ac82015-07-02 08:53:34 +020065 return TEE_SUCCESS;
66}
67
68TEE_Result ta_entry_get_operation_info(uint32_t param_type, TEE_Param params[4])
69{
Jens Wiklanderc5231592015-11-11 09:27:27 +010070 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
71
Pascal Brandc639ac82015-07-02 08:53:34 +020072 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
73 (TEE_PARAM_TYPE_VALUE_INPUT,
74 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
75 TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +010076
Pascal Brandc639ac82015-07-02 08:53:34 +020077 if (params[1].memref.size < sizeof(TEE_OperationInfo))
78 return TEE_ERROR_SHORT_BUFFER;
79 params[1].memref.size = sizeof(TEE_OperationInfo);
80
Jens Wiklanderc5231592015-11-11 09:27:27 +010081 TEE_GetOperationInfo(op, params[1].memref.buffer);
Pascal Brandc639ac82015-07-02 08:53:34 +020082 return TEE_SUCCESS;
83}
84
85TEE_Result ta_entry_reset_operation(uint32_t param_type, TEE_Param params[4])
86{
Jens Wiklanderc5231592015-11-11 09:27:27 +010087 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
88
Pascal Brandc639ac82015-07-02 08:53:34 +020089 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
90 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
91 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
92
Jens Wiklanderc5231592015-11-11 09:27:27 +010093 TEE_ResetOperation(op);
Pascal Brandc639ac82015-07-02 08:53:34 +020094 return TEE_SUCCESS;
95}
96
97TEE_Result ta_entry_set_operation_key(uint32_t param_type, TEE_Param params[4])
98{
Jens Wiklanderc5231592015-11-11 09:27:27 +010099 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
100 TEE_ObjectHandle key = VAL2HANDLE(params[0].value.b);
101
Pascal Brandc639ac82015-07-02 08:53:34 +0200102 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
103 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
104 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
105
Jens Wiklanderc5231592015-11-11 09:27:27 +0100106 return TEE_SetOperationKey(op, key);
Pascal Brandc639ac82015-07-02 08:53:34 +0200107}
108
109TEE_Result ta_entry_set_operation_key2(uint32_t param_type, TEE_Param params[4])
110{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100111 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
112 TEE_ObjectHandle key1 = VAL2HANDLE(params[0].value.b);
113 TEE_ObjectHandle key2 = VAL2HANDLE(params[1].value.a);
114
Pascal Brandc639ac82015-07-02 08:53:34 +0200115 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
116 (TEE_PARAM_TYPE_VALUE_INPUT,
117 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
118 TEE_PARAM_TYPE_NONE));
119
Jens Wiklanderc5231592015-11-11 09:27:27 +0100120 return TEE_SetOperationKey2(op, key1, key2);
Pascal Brandc639ac82015-07-02 08:53:34 +0200121}
122
123TEE_Result ta_entry_copy_operation(uint32_t param_type, TEE_Param params[4])
124{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100125 TEE_OperationHandle dst = VAL2HANDLE(params[0].value.a);
126 TEE_OperationHandle src = VAL2HANDLE(params[0].value.b);
127
Pascal Brandc639ac82015-07-02 08:53:34 +0200128 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
129 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
130 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
131
Jens Wiklanderc5231592015-11-11 09:27:27 +0100132
133 TEE_CopyOperation(dst, src);
Pascal Brandc639ac82015-07-02 08:53:34 +0200134 return TEE_SUCCESS;
135}
136
137TEE_Result ta_entry_digest_update(uint32_t param_type, TEE_Param params[4])
138{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100139 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
140
Pascal Brandc639ac82015-07-02 08:53:34 +0200141 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
142 (TEE_PARAM_TYPE_VALUE_INPUT,
143 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
144 TEE_PARAM_TYPE_NONE));
145
Jens Wiklanderc5231592015-11-11 09:27:27 +0100146 TEE_DigestUpdate(op, params[1].memref.buffer, params[1].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200147 return TEE_SUCCESS;
148}
149
150TEE_Result ta_entry_digest_do_final(uint32_t param_type, TEE_Param params[4])
151{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100152 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
153
Pascal Brandc639ac82015-07-02 08:53:34 +0200154 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
155 (TEE_PARAM_TYPE_VALUE_INPUT,
156 TEE_PARAM_TYPE_MEMREF_INPUT,
157 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100158
159 return TEE_DigestDoFinal(op,
160 params[1].memref.buffer, params[1].memref.size,
161 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200162}
163
164TEE_Result ta_entry_cipher_init(uint32_t param_type, TEE_Param params[4])
165{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100166 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200167 void *buffer;
168 size_t size;
169
170 if (param_type == TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
171 TEE_PARAM_TYPE_NONE,
172 TEE_PARAM_TYPE_NONE,
173 TEE_PARAM_TYPE_NONE)) {
174 buffer = NULL;
175 size = 0;
176 } else if (param_type == TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
177 TEE_PARAM_TYPE_MEMREF_INPUT,
178 TEE_PARAM_TYPE_NONE,
179 TEE_PARAM_TYPE_NONE)) {
180 buffer = params[1].memref.buffer;
181 size = params[1].memref.size;
182 } else
183 return TEE_ERROR_BAD_PARAMETERS;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100184
185 TEE_CipherInit(op, buffer, size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200186 return TEE_SUCCESS;
187}
188
189TEE_Result ta_entry_cipher_update(uint32_t param_type, TEE_Param params[4])
190{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100191 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
192
Pascal Brandc639ac82015-07-02 08:53:34 +0200193 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
194 (TEE_PARAM_TYPE_VALUE_INPUT,
195 TEE_PARAM_TYPE_MEMREF_INPUT,
196 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100197
198 return TEE_CipherUpdate(op,
199 params[1].memref.buffer, params[1].memref.size,
200 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200201}
202
203TEE_Result ta_entry_cipher_do_final(uint32_t param_type, TEE_Param params[4])
204{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100205 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
206
Pascal Brandc639ac82015-07-02 08:53:34 +0200207 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
208 (TEE_PARAM_TYPE_VALUE_INPUT,
209 TEE_PARAM_TYPE_MEMREF_INPUT,
210 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100211
212 return TEE_CipherDoFinal(op,
213 params[1].memref.buffer, params[1].memref.size,
214 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200215}
216
217TEE_Result ta_entry_mac_init(uint32_t param_type, TEE_Param params[4])
218{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100219 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200220 void *buffer;
221 size_t size;
222
223 if (param_type == TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
224 TEE_PARAM_TYPE_NONE,
225 TEE_PARAM_TYPE_NONE,
226 TEE_PARAM_TYPE_NONE)) {
227 buffer = NULL;
228 size = 0;
229 } else if (param_type == TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
230 TEE_PARAM_TYPE_MEMREF_INPUT,
231 TEE_PARAM_TYPE_NONE,
232 TEE_PARAM_TYPE_NONE)) {
233 buffer = params[1].memref.buffer;
234 size = params[1].memref.size;
235 } else
236 return TEE_ERROR_BAD_PARAMETERS;
237
Jens Wiklanderc5231592015-11-11 09:27:27 +0100238 TEE_MACInit(op, buffer, size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200239 return TEE_SUCCESS;
240}
241
242TEE_Result ta_entry_mac_update(uint32_t param_type, TEE_Param params[4])
243{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100244 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
245
Pascal Brandc639ac82015-07-02 08:53:34 +0200246 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
247 (TEE_PARAM_TYPE_VALUE_INPUT,
248 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
249 TEE_PARAM_TYPE_NONE));
250
Jens Wiklanderc5231592015-11-11 09:27:27 +0100251 TEE_MACUpdate(op, params[1].memref.buffer, params[1].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200252 return TEE_SUCCESS;
253}
254
255TEE_Result ta_entry_mac_final_compute(uint32_t param_type, TEE_Param params[4])
256{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100257 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
258
Pascal Brandc639ac82015-07-02 08:53:34 +0200259 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
260 (TEE_PARAM_TYPE_VALUE_INPUT,
261 TEE_PARAM_TYPE_MEMREF_INPUT,
262 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100263
264 return TEE_MACComputeFinal(op,
265 params[1].memref.buffer, params[1].memref.size,
266 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200267}
268
269TEE_Result ta_entry_mac_final_compare(uint32_t param_type, TEE_Param params[4])
270{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100271 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
272
Pascal Brandc639ac82015-07-02 08:53:34 +0200273 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
274 (TEE_PARAM_TYPE_VALUE_INPUT,
275 TEE_PARAM_TYPE_MEMREF_INPUT,
276 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100277
278 return TEE_MACCompareFinal(op,
279 params[1].memref.buffer, params[1].memref.size,
280 params[2].memref.buffer, params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200281}
282
283TEE_Result ta_entry_allocate_transient_object(uint32_t param_type,
284 TEE_Param params[4])
285{
286 TEE_Result res;
287 TEE_ObjectHandle o;
288
289 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
290 (TEE_PARAM_TYPE_VALUE_INPUT,
291 TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
292 TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100293
294 res = TEE_AllocateTransientObject(params[0].value.a, params[0].value.b,
295 &o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200296 if (res == TEE_SUCCESS)
Jens Wiklanderc5231592015-11-11 09:27:27 +0100297 params[1].value.a = (uint32_t)(uintptr_t)o;
Pascal Brandc639ac82015-07-02 08:53:34 +0200298 return res;
299}
300
301TEE_Result ta_entry_free_transient_object(uint32_t param_type,
302 TEE_Param params[4])
303{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100304 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
305
Pascal Brandc639ac82015-07-02 08:53:34 +0200306 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
307 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
308 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100309
310 TEE_FreeTransientObject(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200311 return TEE_SUCCESS;
312}
313
314TEE_Result ta_entry_reset_transient_object(uint32_t param_type,
315 TEE_Param params[4])
316{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100317 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
318
Pascal Brandc639ac82015-07-02 08:53:34 +0200319 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
320 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
321 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100322
323 TEE_ResetTransientObject(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200324 return TEE_SUCCESS;
325}
326
Jens Wiklanderc5231592015-11-11 09:27:27 +0100327struct attr_packed {
328 uint32_t id;
329 uint32_t a;
330 uint32_t b;
331};
332
Pascal Brandc639ac82015-07-02 08:53:34 +0200333static TEE_Result unpack_attrs(const uint8_t *buf, size_t blen,
334 TEE_Attribute **attrs, uint32_t *attr_count)
335{
336 TEE_Result res = TEE_SUCCESS;
337 TEE_Attribute *a = NULL;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100338 const struct attr_packed *ap;
Pascal Brandc639ac82015-07-02 08:53:34 +0200339 size_t num_attrs = 0;
340 const size_t num_attrs_size = sizeof(uint32_t);
341
342 if (blen == 0)
343 goto out;
344
Jens Wiklanderc5231592015-11-11 09:27:27 +0100345 if (((uintptr_t)buf & 0x3) != 0 || blen < num_attrs_size)
Pascal Brandc639ac82015-07-02 08:53:34 +0200346 return TEE_ERROR_BAD_PARAMETERS;
347 num_attrs = *(uint32_t *) (void *)buf;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100348 if ((blen - num_attrs_size) < (num_attrs * sizeof(*ap)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200349 return TEE_ERROR_BAD_PARAMETERS;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100350 ap = (const struct attr_packed *)(const void *)(buf + num_attrs_size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200351
352 if (num_attrs > 0) {
353 size_t n;
354
355 a = TEE_Malloc(num_attrs * sizeof(TEE_Attribute), 0);
Jens Wiklanderc5231592015-11-11 09:27:27 +0100356 if (!a)
Pascal Brandc639ac82015-07-02 08:53:34 +0200357 return TEE_ERROR_OUT_OF_MEMORY;
Pascal Brandc639ac82015-07-02 08:53:34 +0200358 for (n = 0; n < num_attrs; n++) {
359 uintptr_t p;
360
Jens Wiklanderc5231592015-11-11 09:27:27 +0100361 a[n].attributeID = ap[n].id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200362#define TEE_ATTR_BIT_VALUE (1 << 29)
Jens Wiklanderc5231592015-11-11 09:27:27 +0100363 if (ap[n].id & TEE_ATTR_BIT_VALUE) {
364 a[n].content.value.a = ap[n].a;
365 a[n].content.value.b = ap[n].b;
Pascal Brandc639ac82015-07-02 08:53:34 +0200366 continue;
Pascal Brandc639ac82015-07-02 08:53:34 +0200367 }
Jens Wiklanderc5231592015-11-11 09:27:27 +0100368
369 a[n].content.ref.length = ap[n].b;
370 p = (uintptr_t)ap[n].a;
371 if (p) {
372 if ((p + a[n].content.ref.length) > blen) {
373 res = TEE_ERROR_BAD_PARAMETERS;
374 goto out;
375 }
376 p += (uintptr_t)buf;
377 }
Pascal Brandc639ac82015-07-02 08:53:34 +0200378 a[n].content.ref.buffer = (void *)p;
379 }
380 }
381
382 res = TEE_SUCCESS;
383out:
384 if (res == TEE_SUCCESS) {
385 *attrs = a;
386 *attr_count = num_attrs;
387 } else {
388 TEE_Free(a);
389 }
390 return res;
391}
392
393TEE_Result ta_entry_populate_transient_object(uint32_t param_type,
394 TEE_Param params[4])
395{
396 TEE_Result res;
397 TEE_Attribute *attrs;
398 uint32_t attr_count;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100399 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200400
401 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
402 (TEE_PARAM_TYPE_VALUE_INPUT,
403 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
404 TEE_PARAM_TYPE_NONE));
405
406 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
407 &attrs, &attr_count);
408 if (res != TEE_SUCCESS)
409 return res;
410
Jens Wiklanderc5231592015-11-11 09:27:27 +0100411 res = TEE_PopulateTransientObject(o, attrs, attr_count);
Pascal Brandc639ac82015-07-02 08:53:34 +0200412 TEE_Free(attrs);
413 return res;
414}
415
416TEE_Result ta_entry_copy_object_attributes(uint32_t param_type,
417 TEE_Param params[4])
418{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100419 TEE_ObjectHandle dst = VAL2HANDLE(params[0].value.a);
420 TEE_ObjectHandle src = VAL2HANDLE(params[0].value.b);
421
Pascal Brandc639ac82015-07-02 08:53:34 +0200422 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
423 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
424 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
425
Jens Wiklanderc5231592015-11-11 09:27:27 +0100426 TEE_CopyObjectAttributes1(dst, src);
Pascal Brandc639ac82015-07-02 08:53:34 +0200427 return TEE_SUCCESS;
428}
429
430TEE_Result ta_entry_generate_key(uint32_t param_type, TEE_Param params[4])
431{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100432 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200433 TEE_Result res;
434 TEE_Attribute *attrs;
435 uint32_t attr_count;
436
437 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
438 (TEE_PARAM_TYPE_VALUE_INPUT,
439 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
440 TEE_PARAM_TYPE_NONE));
441
442 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
443 &attrs, &attr_count);
444 if (res != TEE_SUCCESS)
445 return res;
446
Jens Wiklanderc5231592015-11-11 09:27:27 +0100447 res = TEE_GenerateKey(o, params[0].value.b, attrs, attr_count);
Pascal Brandc639ac82015-07-02 08:53:34 +0200448 TEE_Free(attrs);
449 return res;
450}
451
452TEE_Result ta_entry_asymmetric_encrypt(uint32_t param_type, TEE_Param params[4])
453{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100454 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200455 TEE_Result res;
456 TEE_Attribute *attrs;
457 uint32_t attr_count;
458
459 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
460 (TEE_PARAM_TYPE_VALUE_INPUT,
461 TEE_PARAM_TYPE_MEMREF_INPUT,
462 TEE_PARAM_TYPE_MEMREF_INPUT,
463 TEE_PARAM_TYPE_MEMREF_OUTPUT));
464
465 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
466 &attrs, &attr_count);
467 if (res != TEE_SUCCESS)
468 return res;
469
Jens Wiklanderc5231592015-11-11 09:27:27 +0100470 res = TEE_AsymmetricEncrypt(op, attrs, attr_count,
471 params[2].memref.buffer, params[2].memref.size,
472 params[3].memref.buffer, &params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200473 TEE_Free(attrs);
474 return res;
475}
476
477TEE_Result ta_entry_asymmetric_decrypt(uint32_t param_type, TEE_Param params[4])
478{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100479 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200480 TEE_Result res;
481 TEE_Attribute *attrs;
482 uint32_t attr_count;
483
484 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
485 (TEE_PARAM_TYPE_VALUE_INPUT,
486 TEE_PARAM_TYPE_MEMREF_INPUT,
487 TEE_PARAM_TYPE_MEMREF_INPUT,
488 TEE_PARAM_TYPE_MEMREF_OUTPUT));
489
490 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
491 &attrs, &attr_count);
492 if (res != TEE_SUCCESS)
493 return res;
494
Jens Wiklanderc5231592015-11-11 09:27:27 +0100495 res = TEE_AsymmetricDecrypt(op, attrs, attr_count,
496 params[2].memref.buffer, params[2].memref.size,
497 params[3].memref.buffer, &params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200498 TEE_Free(attrs);
499 return res;
500}
501
502TEE_Result ta_entry_asymmetric_sign_digest(uint32_t param_type,
503 TEE_Param params[4])
504{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100505 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200506 TEE_Result res;
507 TEE_Attribute *attrs;
508 uint32_t attr_count;
509
510 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
511 (TEE_PARAM_TYPE_VALUE_INPUT,
512 TEE_PARAM_TYPE_MEMREF_INPUT,
513 TEE_PARAM_TYPE_MEMREF_INPUT,
514 TEE_PARAM_TYPE_MEMREF_OUTPUT));
515
516 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
517 &attrs, &attr_count);
518 if (res != TEE_SUCCESS)
519 return res;
520
Jens Wiklanderc5231592015-11-11 09:27:27 +0100521 res = TEE_AsymmetricSignDigest(op, attrs, attr_count,
522 params[2].memref.buffer, params[2].memref.size,
523 params[3].memref.buffer, &params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200524 TEE_Free(attrs);
525 return res;
526}
527
528TEE_Result ta_entry_asymmetric_verify_digest(uint32_t param_type,
529 TEE_Param params[4])
530{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100531 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200532 TEE_Result res;
533 TEE_Attribute *attrs;
534 uint32_t attr_count;
535
536 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
537 (TEE_PARAM_TYPE_VALUE_INPUT,
538 TEE_PARAM_TYPE_MEMREF_INPUT,
539 TEE_PARAM_TYPE_MEMREF_INPUT,
540 TEE_PARAM_TYPE_MEMREF_INPUT));
541
542 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
543 &attrs, &attr_count);
544 if (res != TEE_SUCCESS)
545 return res;
546
Jens Wiklanderc5231592015-11-11 09:27:27 +0100547 res = TEE_AsymmetricVerifyDigest(op, attrs, attr_count,
548 params[2].memref.buffer, params[2].memref.size,
549 params[3].memref.buffer, params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200550 TEE_Free(attrs);
551 return res;
552}
553
554TEE_Result ta_entry_derive_key(uint32_t param_type, TEE_Param params[4])
555{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100556 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
557 TEE_ObjectHandle key = VAL2HANDLE(params[0].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200558 TEE_Result res;
559 TEE_Attribute *attrs;
560 uint32_t attr_count;
561
562 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
563 (TEE_PARAM_TYPE_VALUE_INPUT,
564 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
565 TEE_PARAM_TYPE_NONE));
566
567 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
568 &attrs, &attr_count);
569 if (res != TEE_SUCCESS)
570 return res;
571
Jens Wiklanderc5231592015-11-11 09:27:27 +0100572 TEE_DeriveKey(op, attrs, attr_count, key);
Pascal Brandc639ac82015-07-02 08:53:34 +0200573 TEE_Free(attrs);
574 return TEE_SUCCESS;
575}
576
577TEE_Result ta_entry_random_number_generate(uint32_t param_type,
578 TEE_Param params[4])
579{
580 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
581 (TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
582 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
583
584 TEE_GenerateRandom(params[0].memref.buffer, params[0].memref.size);
585 return TEE_SUCCESS;
586}
587
588TEE_Result ta_entry_ae_init(uint32_t param_type, TEE_Param params[4])
589{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100590 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
591
Pascal Brandc639ac82015-07-02 08:53:34 +0200592 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
593 (TEE_PARAM_TYPE_VALUE_INPUT,
594 TEE_PARAM_TYPE_MEMREF_INPUT,
Jens Wiklander74a42302015-07-07 01:08:41 +0200595 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100596 return TEE_AEInit(op, params[1].memref.buffer, params[1].memref.size,
Pascal Brandc639ac82015-07-02 08:53:34 +0200597 params[0].value.b * 8, /* tag_len in bits */
598 params[2].value.a, params[2].value.b);
599}
600
601TEE_Result ta_entry_ae_update_aad(uint32_t param_type, TEE_Param params[4])
602{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100603 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
604
Pascal Brandc639ac82015-07-02 08:53:34 +0200605 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
606 (TEE_PARAM_TYPE_VALUE_INPUT,
607 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
608 TEE_PARAM_TYPE_NONE));
609
Jens Wiklanderc5231592015-11-11 09:27:27 +0100610 TEE_AEUpdateAAD(op, params[1].memref.buffer, params[1].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200611 return TEE_SUCCESS;
612}
613
614TEE_Result ta_entry_ae_update(uint32_t param_type, TEE_Param params[4])
615{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100616 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
617
Pascal Brandc639ac82015-07-02 08:53:34 +0200618 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
619 (TEE_PARAM_TYPE_VALUE_INPUT,
620 TEE_PARAM_TYPE_MEMREF_INPUT,
621 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
622
Jens Wiklanderc5231592015-11-11 09:27:27 +0100623 TEE_AEUpdate(op, params[1].memref.buffer, params[1].memref.size,
Pascal Brandc639ac82015-07-02 08:53:34 +0200624 params[2].memref.buffer, &params[2].memref.size);
625 return TEE_SUCCESS;
626}
627
628TEE_Result ta_entry_ae_encrypt_final(uint32_t param_type, TEE_Param params[4])
629{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100630 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200631 TEE_Result res;
632
633 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
634 (TEE_PARAM_TYPE_VALUE_INPUT,
635 TEE_PARAM_TYPE_MEMREF_INPUT,
636 TEE_PARAM_TYPE_MEMREF_OUTPUT,
637 TEE_PARAM_TYPE_MEMREF_OUTPUT));
638
Jens Wiklanderc5231592015-11-11 09:27:27 +0100639 res = TEE_AEEncryptFinal(op,
640 params[1].memref.buffer, params[1].memref.size,
641 params[2].memref.buffer, &params[2].memref.size,
642 params[3].memref.buffer, &params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200643 return res;
644}
645
646TEE_Result ta_entry_ae_decrypt_final(uint32_t param_type, TEE_Param params[4])
647{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100648 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
649
Pascal Brandc639ac82015-07-02 08:53:34 +0200650 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
651 (TEE_PARAM_TYPE_VALUE_INPUT,
652 TEE_PARAM_TYPE_MEMREF_INPUT,
653 TEE_PARAM_TYPE_MEMREF_OUTPUT,
654 TEE_PARAM_TYPE_MEMREF_INPUT));
655
Jens Wiklanderc5231592015-11-11 09:27:27 +0100656 return TEE_AEDecryptFinal(op,
657 params[1].memref.buffer, params[1].memref.size,
658 params[2].memref.buffer, &params[2].memref.size,
659 params[3].memref.buffer, params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200660}
661
662TEE_Result ta_entry_get_object_buffer_attribute(uint32_t param_type,
663 TEE_Param params[4])
664{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100665 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
666
Pascal Brandc639ac82015-07-02 08:53:34 +0200667 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
668 (TEE_PARAM_TYPE_VALUE_INPUT,
669 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
670 TEE_PARAM_TYPE_NONE));
671
Jens Wiklanderc5231592015-11-11 09:27:27 +0100672 return TEE_GetObjectBufferAttribute(o, params[0].value.b,
673 params[1].memref.buffer, &params[1].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200674}
675
676TEE_Result ta_entry_get_object_value_attribute(uint32_t param_type,
677 TEE_Param params[4])
678{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100679 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
680
Pascal Brandc639ac82015-07-02 08:53:34 +0200681 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
682 (TEE_PARAM_TYPE_VALUE_INPUT,
683 TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
684 TEE_PARAM_TYPE_NONE));
685
Jens Wiklanderc5231592015-11-11 09:27:27 +0100686 return TEE_GetObjectValueAttribute(o, params[0].value.b,
687 &params[1].value.a, &params[1].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200688}