blob: 384faa936ad4848ef767853bc5803c855b8005e0 [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
Alyssa Milburn96d39522017-06-14 18:51:12 +020037/* pointers in 32-bit fields passed as an offset to ta_head */
38extern const void *ta_head;
39#define VAL2HANDLE(v) (void *)(uintptr_t)(v == TEE_HANDLE_NULL ? v : v + (uintptr_t)&ta_head)
40#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 +010041
Pascal Brandc639ac82015-07-02 08:53:34 +020042TEE_Result ta_entry_allocate_operation(uint32_t param_type, TEE_Param params[4])
43{
44 TEE_Result res;
45 TEE_OperationHandle op;
46
47 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
48 (TEE_PARAM_TYPE_VALUE_INOUT,
49 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
50 TEE_PARAM_TYPE_NONE));
51
52 res = TEE_AllocateOperation(&op,
53 params[0].value.b, params[1].value.a,
54 params[1].value.b);
Alyssa Milburn96d39522017-06-14 18:51:12 +020055 params[0].value.a = HANDLE2VAL(op);
Pascal Brandc639ac82015-07-02 08:53:34 +020056 return res;
57}
58
59TEE_Result ta_entry_free_operation(uint32_t param_type, TEE_Param params[4])
60{
Jens Wiklanderc5231592015-11-11 09:27:27 +010061 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
62
Pascal Brandc639ac82015-07-02 08:53:34 +020063 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
64 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
65 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
66
Jens Wiklanderc5231592015-11-11 09:27:27 +010067 TEE_FreeOperation(op);
Pascal Brandc639ac82015-07-02 08:53:34 +020068 return TEE_SUCCESS;
69}
70
71TEE_Result ta_entry_get_operation_info(uint32_t param_type, TEE_Param params[4])
72{
Jens Wiklanderc5231592015-11-11 09:27:27 +010073 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
74
Pascal Brandc639ac82015-07-02 08:53:34 +020075 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
76 (TEE_PARAM_TYPE_VALUE_INPUT,
77 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
78 TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +010079
Pascal Brandc639ac82015-07-02 08:53:34 +020080 if (params[1].memref.size < sizeof(TEE_OperationInfo))
81 return TEE_ERROR_SHORT_BUFFER;
82 params[1].memref.size = sizeof(TEE_OperationInfo);
83
Jens Wiklanderc5231592015-11-11 09:27:27 +010084 TEE_GetOperationInfo(op, params[1].memref.buffer);
Pascal Brandc639ac82015-07-02 08:53:34 +020085 return TEE_SUCCESS;
86}
87
88TEE_Result ta_entry_reset_operation(uint32_t param_type, TEE_Param params[4])
89{
Jens Wiklanderc5231592015-11-11 09:27:27 +010090 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
91
Pascal Brandc639ac82015-07-02 08:53:34 +020092 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
93 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
94 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
95
Jens Wiklanderc5231592015-11-11 09:27:27 +010096 TEE_ResetOperation(op);
Pascal Brandc639ac82015-07-02 08:53:34 +020097 return TEE_SUCCESS;
98}
99
100TEE_Result ta_entry_set_operation_key(uint32_t param_type, TEE_Param params[4])
101{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100102 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
103 TEE_ObjectHandle key = VAL2HANDLE(params[0].value.b);
104
Pascal Brandc639ac82015-07-02 08:53:34 +0200105 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
106 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
107 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
108
Jens Wiklanderc5231592015-11-11 09:27:27 +0100109 return TEE_SetOperationKey(op, key);
Pascal Brandc639ac82015-07-02 08:53:34 +0200110}
111
112TEE_Result ta_entry_set_operation_key2(uint32_t param_type, TEE_Param params[4])
113{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100114 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
115 TEE_ObjectHandle key1 = VAL2HANDLE(params[0].value.b);
116 TEE_ObjectHandle key2 = VAL2HANDLE(params[1].value.a);
117
Pascal Brandc639ac82015-07-02 08:53:34 +0200118 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
119 (TEE_PARAM_TYPE_VALUE_INPUT,
120 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
121 TEE_PARAM_TYPE_NONE));
122
Jens Wiklanderc5231592015-11-11 09:27:27 +0100123 return TEE_SetOperationKey2(op, key1, key2);
Pascal Brandc639ac82015-07-02 08:53:34 +0200124}
125
126TEE_Result ta_entry_copy_operation(uint32_t param_type, TEE_Param params[4])
127{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100128 TEE_OperationHandle dst = VAL2HANDLE(params[0].value.a);
129 TEE_OperationHandle src = VAL2HANDLE(params[0].value.b);
130
Pascal Brandc639ac82015-07-02 08:53:34 +0200131 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
132 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
133 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
134
Jens Wiklanderc5231592015-11-11 09:27:27 +0100135
136 TEE_CopyOperation(dst, src);
Pascal Brandc639ac82015-07-02 08:53:34 +0200137 return TEE_SUCCESS;
138}
139
140TEE_Result ta_entry_digest_update(uint32_t param_type, TEE_Param params[4])
141{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100142 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
143
Pascal Brandc639ac82015-07-02 08:53:34 +0200144 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
145 (TEE_PARAM_TYPE_VALUE_INPUT,
146 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
147 TEE_PARAM_TYPE_NONE));
148
Jens Wiklanderc5231592015-11-11 09:27:27 +0100149 TEE_DigestUpdate(op, params[1].memref.buffer, params[1].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200150 return TEE_SUCCESS;
151}
152
153TEE_Result ta_entry_digest_do_final(uint32_t param_type, TEE_Param params[4])
154{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100155 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
156
Pascal Brandc639ac82015-07-02 08:53:34 +0200157 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
158 (TEE_PARAM_TYPE_VALUE_INPUT,
159 TEE_PARAM_TYPE_MEMREF_INPUT,
160 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100161
162 return TEE_DigestDoFinal(op,
163 params[1].memref.buffer, params[1].memref.size,
164 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200165}
166
167TEE_Result ta_entry_cipher_init(uint32_t param_type, TEE_Param params[4])
168{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100169 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200170 void *buffer;
171 size_t size;
172
173 if (param_type == TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
174 TEE_PARAM_TYPE_NONE,
175 TEE_PARAM_TYPE_NONE,
176 TEE_PARAM_TYPE_NONE)) {
177 buffer = NULL;
178 size = 0;
179 } else if (param_type == TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
180 TEE_PARAM_TYPE_MEMREF_INPUT,
181 TEE_PARAM_TYPE_NONE,
182 TEE_PARAM_TYPE_NONE)) {
183 buffer = params[1].memref.buffer;
184 size = params[1].memref.size;
185 } else
186 return TEE_ERROR_BAD_PARAMETERS;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100187
188 TEE_CipherInit(op, buffer, size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200189 return TEE_SUCCESS;
190}
191
192TEE_Result ta_entry_cipher_update(uint32_t param_type, TEE_Param params[4])
193{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100194 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
195
Pascal Brandc639ac82015-07-02 08:53:34 +0200196 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
197 (TEE_PARAM_TYPE_VALUE_INPUT,
198 TEE_PARAM_TYPE_MEMREF_INPUT,
199 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100200
201 return TEE_CipherUpdate(op,
202 params[1].memref.buffer, params[1].memref.size,
203 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200204}
205
206TEE_Result ta_entry_cipher_do_final(uint32_t param_type, TEE_Param params[4])
207{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100208 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
209
Pascal Brandc639ac82015-07-02 08:53:34 +0200210 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
211 (TEE_PARAM_TYPE_VALUE_INPUT,
212 TEE_PARAM_TYPE_MEMREF_INPUT,
213 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100214
215 return TEE_CipherDoFinal(op,
216 params[1].memref.buffer, params[1].memref.size,
217 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200218}
219
220TEE_Result ta_entry_mac_init(uint32_t param_type, TEE_Param params[4])
221{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100222 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200223 void *buffer;
224 size_t size;
225
226 if (param_type == TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
227 TEE_PARAM_TYPE_NONE,
228 TEE_PARAM_TYPE_NONE,
229 TEE_PARAM_TYPE_NONE)) {
230 buffer = NULL;
231 size = 0;
232 } else if (param_type == TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
233 TEE_PARAM_TYPE_MEMREF_INPUT,
234 TEE_PARAM_TYPE_NONE,
235 TEE_PARAM_TYPE_NONE)) {
236 buffer = params[1].memref.buffer;
237 size = params[1].memref.size;
238 } else
239 return TEE_ERROR_BAD_PARAMETERS;
240
Jens Wiklanderc5231592015-11-11 09:27:27 +0100241 TEE_MACInit(op, buffer, size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200242 return TEE_SUCCESS;
243}
244
245TEE_Result ta_entry_mac_update(uint32_t param_type, TEE_Param params[4])
246{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100247 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
248
Pascal Brandc639ac82015-07-02 08:53:34 +0200249 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
250 (TEE_PARAM_TYPE_VALUE_INPUT,
251 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
252 TEE_PARAM_TYPE_NONE));
253
Jens Wiklanderc5231592015-11-11 09:27:27 +0100254 TEE_MACUpdate(op, params[1].memref.buffer, params[1].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200255 return TEE_SUCCESS;
256}
257
258TEE_Result ta_entry_mac_final_compute(uint32_t param_type, TEE_Param params[4])
259{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100260 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
261
Pascal Brandc639ac82015-07-02 08:53:34 +0200262 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
263 (TEE_PARAM_TYPE_VALUE_INPUT,
264 TEE_PARAM_TYPE_MEMREF_INPUT,
265 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100266
267 return TEE_MACComputeFinal(op,
268 params[1].memref.buffer, params[1].memref.size,
269 params[2].memref.buffer, &params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200270}
271
272TEE_Result ta_entry_mac_final_compare(uint32_t param_type, TEE_Param params[4])
273{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100274 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
275
Pascal Brandc639ac82015-07-02 08:53:34 +0200276 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
277 (TEE_PARAM_TYPE_VALUE_INPUT,
278 TEE_PARAM_TYPE_MEMREF_INPUT,
279 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100280
281 return TEE_MACCompareFinal(op,
282 params[1].memref.buffer, params[1].memref.size,
283 params[2].memref.buffer, params[2].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200284}
285
286TEE_Result ta_entry_allocate_transient_object(uint32_t param_type,
287 TEE_Param params[4])
288{
289 TEE_Result res;
290 TEE_ObjectHandle o;
291
292 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
293 (TEE_PARAM_TYPE_VALUE_INPUT,
294 TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
295 TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100296
297 res = TEE_AllocateTransientObject(params[0].value.a, params[0].value.b,
298 &o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200299 if (res == TEE_SUCCESS)
Alyssa Milburn96d39522017-06-14 18:51:12 +0200300 params[1].value.a = HANDLE2VAL(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200301 return res;
302}
303
304TEE_Result ta_entry_free_transient_object(uint32_t param_type,
305 TEE_Param params[4])
306{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100307 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
308
Pascal Brandc639ac82015-07-02 08:53:34 +0200309 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
310 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
311 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100312
313 TEE_FreeTransientObject(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200314 return TEE_SUCCESS;
315}
316
317TEE_Result ta_entry_reset_transient_object(uint32_t param_type,
318 TEE_Param params[4])
319{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100320 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
321
Pascal Brandc639ac82015-07-02 08:53:34 +0200322 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
323 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
324 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100325
326 TEE_ResetTransientObject(o);
Pascal Brandc639ac82015-07-02 08:53:34 +0200327 return TEE_SUCCESS;
328}
329
Jens Wiklanderc5231592015-11-11 09:27:27 +0100330struct attr_packed {
331 uint32_t id;
332 uint32_t a;
333 uint32_t b;
334};
335
Pascal Brandc639ac82015-07-02 08:53:34 +0200336static TEE_Result unpack_attrs(const uint8_t *buf, size_t blen,
337 TEE_Attribute **attrs, uint32_t *attr_count)
338{
339 TEE_Result res = TEE_SUCCESS;
340 TEE_Attribute *a = NULL;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100341 const struct attr_packed *ap;
Pascal Brandc639ac82015-07-02 08:53:34 +0200342 size_t num_attrs = 0;
343 const size_t num_attrs_size = sizeof(uint32_t);
344
345 if (blen == 0)
346 goto out;
347
Jens Wiklanderc5231592015-11-11 09:27:27 +0100348 if (((uintptr_t)buf & 0x3) != 0 || blen < num_attrs_size)
Pascal Brandc639ac82015-07-02 08:53:34 +0200349 return TEE_ERROR_BAD_PARAMETERS;
350 num_attrs = *(uint32_t *) (void *)buf;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100351 if ((blen - num_attrs_size) < (num_attrs * sizeof(*ap)))
Pascal Brandc639ac82015-07-02 08:53:34 +0200352 return TEE_ERROR_BAD_PARAMETERS;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100353 ap = (const struct attr_packed *)(const void *)(buf + num_attrs_size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200354
355 if (num_attrs > 0) {
356 size_t n;
357
358 a = TEE_Malloc(num_attrs * sizeof(TEE_Attribute), 0);
Jens Wiklanderc5231592015-11-11 09:27:27 +0100359 if (!a)
Pascal Brandc639ac82015-07-02 08:53:34 +0200360 return TEE_ERROR_OUT_OF_MEMORY;
Pascal Brandc639ac82015-07-02 08:53:34 +0200361 for (n = 0; n < num_attrs; n++) {
362 uintptr_t p;
363
Jens Wiklanderc5231592015-11-11 09:27:27 +0100364 a[n].attributeID = ap[n].id;
Pascal Brandc639ac82015-07-02 08:53:34 +0200365#define TEE_ATTR_BIT_VALUE (1 << 29)
Jens Wiklanderc5231592015-11-11 09:27:27 +0100366 if (ap[n].id & TEE_ATTR_BIT_VALUE) {
367 a[n].content.value.a = ap[n].a;
368 a[n].content.value.b = ap[n].b;
Pascal Brandc639ac82015-07-02 08:53:34 +0200369 continue;
Pascal Brandc639ac82015-07-02 08:53:34 +0200370 }
Jens Wiklanderc5231592015-11-11 09:27:27 +0100371
372 a[n].content.ref.length = ap[n].b;
373 p = (uintptr_t)ap[n].a;
374 if (p) {
375 if ((p + a[n].content.ref.length) > blen) {
376 res = TEE_ERROR_BAD_PARAMETERS;
377 goto out;
378 }
379 p += (uintptr_t)buf;
380 }
Pascal Brandc639ac82015-07-02 08:53:34 +0200381 a[n].content.ref.buffer = (void *)p;
382 }
383 }
384
385 res = TEE_SUCCESS;
386out:
387 if (res == TEE_SUCCESS) {
388 *attrs = a;
389 *attr_count = num_attrs;
390 } else {
391 TEE_Free(a);
392 }
393 return res;
394}
395
396TEE_Result ta_entry_populate_transient_object(uint32_t param_type,
397 TEE_Param params[4])
398{
399 TEE_Result res;
400 TEE_Attribute *attrs;
401 uint32_t attr_count;
Jens Wiklanderc5231592015-11-11 09:27:27 +0100402 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200403
404 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
405 (TEE_PARAM_TYPE_VALUE_INPUT,
406 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
407 TEE_PARAM_TYPE_NONE));
408
409 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
410 &attrs, &attr_count);
411 if (res != TEE_SUCCESS)
412 return res;
413
Jens Wiklanderc5231592015-11-11 09:27:27 +0100414 res = TEE_PopulateTransientObject(o, attrs, attr_count);
Pascal Brandc639ac82015-07-02 08:53:34 +0200415 TEE_Free(attrs);
416 return res;
417}
418
419TEE_Result ta_entry_copy_object_attributes(uint32_t param_type,
420 TEE_Param params[4])
421{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100422 TEE_ObjectHandle dst = VAL2HANDLE(params[0].value.a);
423 TEE_ObjectHandle src = VAL2HANDLE(params[0].value.b);
424
Pascal Brandc639ac82015-07-02 08:53:34 +0200425 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
426 (TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
427 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
428
Jens Wiklanderc5231592015-11-11 09:27:27 +0100429 TEE_CopyObjectAttributes1(dst, src);
Pascal Brandc639ac82015-07-02 08:53:34 +0200430 return TEE_SUCCESS;
431}
432
433TEE_Result ta_entry_generate_key(uint32_t param_type, TEE_Param params[4])
434{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100435 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200436 TEE_Result res;
437 TEE_Attribute *attrs;
438 uint32_t attr_count;
439
440 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
441 (TEE_PARAM_TYPE_VALUE_INPUT,
442 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
443 TEE_PARAM_TYPE_NONE));
444
445 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
446 &attrs, &attr_count);
447 if (res != TEE_SUCCESS)
448 return res;
449
Jens Wiklanderc5231592015-11-11 09:27:27 +0100450 res = TEE_GenerateKey(o, params[0].value.b, attrs, attr_count);
Pascal Brandc639ac82015-07-02 08:53:34 +0200451 TEE_Free(attrs);
452 return res;
453}
454
455TEE_Result ta_entry_asymmetric_encrypt(uint32_t param_type, TEE_Param params[4])
456{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100457 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200458 TEE_Result res;
459 TEE_Attribute *attrs;
460 uint32_t attr_count;
461
462 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
463 (TEE_PARAM_TYPE_VALUE_INPUT,
464 TEE_PARAM_TYPE_MEMREF_INPUT,
465 TEE_PARAM_TYPE_MEMREF_INPUT,
466 TEE_PARAM_TYPE_MEMREF_OUTPUT));
467
468 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
469 &attrs, &attr_count);
470 if (res != TEE_SUCCESS)
471 return res;
472
Jens Wiklanderc5231592015-11-11 09:27:27 +0100473 res = TEE_AsymmetricEncrypt(op, attrs, attr_count,
474 params[2].memref.buffer, params[2].memref.size,
475 params[3].memref.buffer, &params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200476 TEE_Free(attrs);
477 return res;
478}
479
480TEE_Result ta_entry_asymmetric_decrypt(uint32_t param_type, TEE_Param params[4])
481{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100482 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200483 TEE_Result res;
484 TEE_Attribute *attrs;
485 uint32_t attr_count;
486
487 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
488 (TEE_PARAM_TYPE_VALUE_INPUT,
489 TEE_PARAM_TYPE_MEMREF_INPUT,
490 TEE_PARAM_TYPE_MEMREF_INPUT,
491 TEE_PARAM_TYPE_MEMREF_OUTPUT));
492
493 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
494 &attrs, &attr_count);
495 if (res != TEE_SUCCESS)
496 return res;
497
Jens Wiklanderc5231592015-11-11 09:27:27 +0100498 res = TEE_AsymmetricDecrypt(op, attrs, attr_count,
499 params[2].memref.buffer, params[2].memref.size,
500 params[3].memref.buffer, &params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200501 TEE_Free(attrs);
502 return res;
503}
504
505TEE_Result ta_entry_asymmetric_sign_digest(uint32_t param_type,
506 TEE_Param params[4])
507{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100508 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200509 TEE_Result res;
510 TEE_Attribute *attrs;
511 uint32_t attr_count;
512
513 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
514 (TEE_PARAM_TYPE_VALUE_INPUT,
515 TEE_PARAM_TYPE_MEMREF_INPUT,
516 TEE_PARAM_TYPE_MEMREF_INPUT,
517 TEE_PARAM_TYPE_MEMREF_OUTPUT));
518
519 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
520 &attrs, &attr_count);
521 if (res != TEE_SUCCESS)
522 return res;
523
Jens Wiklanderc5231592015-11-11 09:27:27 +0100524 res = TEE_AsymmetricSignDigest(op, attrs, attr_count,
525 params[2].memref.buffer, params[2].memref.size,
526 params[3].memref.buffer, &params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200527 TEE_Free(attrs);
528 return res;
529}
530
531TEE_Result ta_entry_asymmetric_verify_digest(uint32_t param_type,
532 TEE_Param params[4])
533{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100534 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200535 TEE_Result res;
536 TEE_Attribute *attrs;
537 uint32_t attr_count;
538
539 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
540 (TEE_PARAM_TYPE_VALUE_INPUT,
541 TEE_PARAM_TYPE_MEMREF_INPUT,
542 TEE_PARAM_TYPE_MEMREF_INPUT,
543 TEE_PARAM_TYPE_MEMREF_INPUT));
544
545 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
546 &attrs, &attr_count);
547 if (res != TEE_SUCCESS)
548 return res;
549
Jens Wiklanderc5231592015-11-11 09:27:27 +0100550 res = TEE_AsymmetricVerifyDigest(op, attrs, attr_count,
551 params[2].memref.buffer, params[2].memref.size,
552 params[3].memref.buffer, params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200553 TEE_Free(attrs);
554 return res;
555}
556
557TEE_Result ta_entry_derive_key(uint32_t param_type, TEE_Param params[4])
558{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100559 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
560 TEE_ObjectHandle key = VAL2HANDLE(params[0].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200561 TEE_Result res;
562 TEE_Attribute *attrs;
563 uint32_t attr_count;
564
565 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
566 (TEE_PARAM_TYPE_VALUE_INPUT,
567 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
568 TEE_PARAM_TYPE_NONE));
569
570 res = unpack_attrs(params[1].memref.buffer, params[1].memref.size,
571 &attrs, &attr_count);
572 if (res != TEE_SUCCESS)
573 return res;
574
Jens Wiklanderc5231592015-11-11 09:27:27 +0100575 TEE_DeriveKey(op, attrs, attr_count, key);
Pascal Brandc639ac82015-07-02 08:53:34 +0200576 TEE_Free(attrs);
577 return TEE_SUCCESS;
578}
579
580TEE_Result ta_entry_random_number_generate(uint32_t param_type,
581 TEE_Param params[4])
582{
583 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
584 (TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
585 TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE));
586
587 TEE_GenerateRandom(params[0].memref.buffer, params[0].memref.size);
588 return TEE_SUCCESS;
589}
590
591TEE_Result ta_entry_ae_init(uint32_t param_type, TEE_Param params[4])
592{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100593 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
594
Pascal Brandc639ac82015-07-02 08:53:34 +0200595 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
596 (TEE_PARAM_TYPE_VALUE_INPUT,
597 TEE_PARAM_TYPE_MEMREF_INPUT,
Jens Wiklander74a42302015-07-07 01:08:41 +0200598 TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE));
Jens Wiklanderc5231592015-11-11 09:27:27 +0100599 return TEE_AEInit(op, params[1].memref.buffer, params[1].memref.size,
Pascal Brandc639ac82015-07-02 08:53:34 +0200600 params[0].value.b * 8, /* tag_len in bits */
601 params[2].value.a, params[2].value.b);
602}
603
604TEE_Result ta_entry_ae_update_aad(uint32_t param_type, TEE_Param params[4])
605{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100606 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
607
Pascal Brandc639ac82015-07-02 08:53:34 +0200608 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
609 (TEE_PARAM_TYPE_VALUE_INPUT,
610 TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_NONE,
611 TEE_PARAM_TYPE_NONE));
612
Jens Wiklanderc5231592015-11-11 09:27:27 +0100613 TEE_AEUpdateAAD(op, params[1].memref.buffer, params[1].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200614 return TEE_SUCCESS;
615}
616
617TEE_Result ta_entry_ae_update(uint32_t param_type, TEE_Param params[4])
618{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100619 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
620
Pascal Brandc639ac82015-07-02 08:53:34 +0200621 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
622 (TEE_PARAM_TYPE_VALUE_INPUT,
623 TEE_PARAM_TYPE_MEMREF_INPUT,
624 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE));
625
Jens Wiklanderc5231592015-11-11 09:27:27 +0100626 TEE_AEUpdate(op, params[1].memref.buffer, params[1].memref.size,
Pascal Brandc639ac82015-07-02 08:53:34 +0200627 params[2].memref.buffer, &params[2].memref.size);
628 return TEE_SUCCESS;
629}
630
631TEE_Result ta_entry_ae_encrypt_final(uint32_t param_type, TEE_Param params[4])
632{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100633 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
Pascal Brandc639ac82015-07-02 08:53:34 +0200634 TEE_Result res;
635
636 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
637 (TEE_PARAM_TYPE_VALUE_INPUT,
638 TEE_PARAM_TYPE_MEMREF_INPUT,
639 TEE_PARAM_TYPE_MEMREF_OUTPUT,
640 TEE_PARAM_TYPE_MEMREF_OUTPUT));
641
Jens Wiklanderc5231592015-11-11 09:27:27 +0100642 res = TEE_AEEncryptFinal(op,
643 params[1].memref.buffer, params[1].memref.size,
644 params[2].memref.buffer, &params[2].memref.size,
645 params[3].memref.buffer, &params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200646 return res;
647}
648
649TEE_Result ta_entry_ae_decrypt_final(uint32_t param_type, TEE_Param params[4])
650{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100651 TEE_OperationHandle op = VAL2HANDLE(params[0].value.a);
652
Pascal Brandc639ac82015-07-02 08:53:34 +0200653 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
654 (TEE_PARAM_TYPE_VALUE_INPUT,
655 TEE_PARAM_TYPE_MEMREF_INPUT,
656 TEE_PARAM_TYPE_MEMREF_OUTPUT,
657 TEE_PARAM_TYPE_MEMREF_INPUT));
658
Jens Wiklanderc5231592015-11-11 09:27:27 +0100659 return TEE_AEDecryptFinal(op,
660 params[1].memref.buffer, params[1].memref.size,
661 params[2].memref.buffer, &params[2].memref.size,
662 params[3].memref.buffer, params[3].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200663}
664
665TEE_Result ta_entry_get_object_buffer_attribute(uint32_t param_type,
666 TEE_Param params[4])
667{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100668 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
669
Pascal Brandc639ac82015-07-02 08:53:34 +0200670 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
671 (TEE_PARAM_TYPE_VALUE_INPUT,
672 TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
673 TEE_PARAM_TYPE_NONE));
674
Jens Wiklanderc5231592015-11-11 09:27:27 +0100675 return TEE_GetObjectBufferAttribute(o, params[0].value.b,
676 params[1].memref.buffer, &params[1].memref.size);
Pascal Brandc639ac82015-07-02 08:53:34 +0200677}
678
679TEE_Result ta_entry_get_object_value_attribute(uint32_t param_type,
680 TEE_Param params[4])
681{
Jens Wiklanderc5231592015-11-11 09:27:27 +0100682 TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
683
Pascal Brandc639ac82015-07-02 08:53:34 +0200684 ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
685 (TEE_PARAM_TYPE_VALUE_INPUT,
686 TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,
687 TEE_PARAM_TYPE_NONE));
688
Jens Wiklanderc5231592015-11-11 09:27:27 +0100689 return TEE_GetObjectValueAttribute(o, params[0].value.b,
690 &params[1].value.a, &params[1].value.b);
Pascal Brandc639ac82015-07-02 08:53:34 +0200691}