blob: 5e68889ba0c323f4d24382de95480df31b8e40f8 [file] [log] [blame]
Etienne Carriere9b7b70d2020-05-16 10:27:23 +02001// SPDX-License-Identifier: GPL-2.0
Pascal Brandc639ac82015-07-02 08:53:34 +02002/*
Javier Almansa Sobrinocddc0002020-02-10 13:35:37 +00003 * Copyright (c) 2020, ARM Limited. All rights reserved.
Pascal Brandc639ac82015-07-02 08:53:34 +02004 * Copyright (c) 2014, STMicroelectronics International N.V.
Pascal Brandc639ac82015-07-02 08:53:34 +02005 */
6
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +03007#include <errno.h>
Etienne Carrierea4653552017-01-11 10:04:24 +01008#include <limits.h>
9#include <pthread.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020010#include <stdio.h>
Jens Wiklanderec545fb2017-11-24 16:58:07 +010011#include <stdlib.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020012#include <string.h>
David Brownb2865ab2016-08-02 11:44:41 -060013#include <sys/stat.h>
14#include <sys/types.h>
Etienne Carrierea4653552017-01-11 10:04:24 +010015#include <unistd.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020016
17#include "xtest_test.h"
18#include "xtest_helpers.h"
Vesa Jääskeläinen502c5492020-04-05 20:12:02 +030019#include "xtest_uuid_helpers.h"
Jens Wiklander4441fe22015-10-23 16:53:02 +020020#include <signed_hdr.h>
Etienne Carriere92c34422018-02-09 13:11:40 +010021#include <util.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020022
Etienne Carriere726d8bc2017-03-21 15:45:59 +010023#include <pta_invoke_tests.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020024#include <ta_crypt.h>
25#include <ta_os_test.h>
26#include <ta_create_fail_test.h>
27#include <ta_rpc_test.h>
28#include <ta_sims_test.h>
Ovidiu Mihalachi15cecff2019-04-02 16:36:31 +030029#include <ta_miss_test.h>
30#include <ta_sims_keepalive_test.h>
Jens Wiklanderac27ec12015-07-15 15:23:14 +020031#include <ta_concurrent.h>
Javier Almansa Sobrinocddc0002020-02-10 13:35:37 +000032#include <ta_tpm_log_test.h>
Ruchika Gupta7a7bc8d2021-12-01 10:44:14 +053033#include <ta_bti.h>
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +030034#include <ta_supp_plugin.h>
Etienne Carriere50abf9a2017-03-24 11:33:50 +010035#include <sdp_basic.h>
Jens Wiklanderec545fb2017-11-24 16:58:07 +010036#include <pta_secstor_ta_mgmt.h>
Jens Wiklanderec545fb2017-11-24 16:58:07 +010037
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +030038#include <test_supp_plugin.h>
39
Jens Wiklanderec545fb2017-11-24 16:58:07 +010040#ifndef MIN
41#define MIN(a, b) ((a) < (b) ? (a) : (b))
42#endif
Pascal Brandc639ac82015-07-02 08:53:34 +020043
Pascal Brandc639ac82015-07-02 08:53:34 +020044struct xtest_crypto_session {
45 ADBG_Case_t *c;
46 TEEC_Session *session;
47 uint32_t cmd_id_sha256;
48 uint32_t cmd_id_aes256ecb_encrypt;
49 uint32_t cmd_id_aes256ecb_decrypt;
50};
51
52static void xtest_crypto_test(struct xtest_crypto_session *cs)
53{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010054 uint32_t ret_orig = 0;
55 uint8_t crypt_out[16] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +020056 uint8_t crypt_in[16] = { 22, 17 };
57
58 crypt_in[15] = 60;
59
60 Do_ADBG_BeginSubCase(cs->c, "AES encrypt");
61 {
62 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
63
64 op.params[0].tmpref.buffer = crypt_in;
65 op.params[0].tmpref.size = sizeof(crypt_in);
66 op.params[1].tmpref.buffer = crypt_out;
67 op.params[1].tmpref.size = sizeof(crypt_out);
68 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
69 TEEC_MEMREF_TEMP_OUTPUT,
70 TEEC_NONE, TEEC_NONE);
71
72 (void)ADBG_EXPECT_TEEC_SUCCESS(cs->c,
73 TEEC_InvokeCommand(cs->session,
74 cs->
75 cmd_id_aes256ecb_encrypt,
76 &op,
77 &ret_orig));
78 }
79 Do_ADBG_EndSubCase(cs->c, "AES encrypt");
80
81 Do_ADBG_BeginSubCase(cs->c, "AES decrypt");
82 {
83 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010084 uint8_t out[16] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +020085
86 op.params[0].tmpref.buffer = crypt_out;
87 op.params[0].tmpref.size = sizeof(crypt_out);
88 op.params[1].tmpref.buffer = out;
89 op.params[1].tmpref.size = sizeof(out);
90 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
91 TEEC_MEMREF_TEMP_OUTPUT,
92 TEEC_NONE, TEEC_NONE);
93
94 (void)ADBG_EXPECT_TEEC_SUCCESS(cs->c,
95 TEEC_InvokeCommand(cs->session,
96 cs->
97 cmd_id_aes256ecb_decrypt,
98 &op,
99 &ret_orig));
100
101 if (!ADBG_EXPECT(cs->c, 0,
102 memcmp(crypt_in, out, sizeof(crypt_in)))) {
103 Do_ADBG_Log("crypt_in:");
104 Do_ADBG_HexLog(crypt_in, sizeof(crypt_in), 16);
105 Do_ADBG_Log("out:");
106 Do_ADBG_HexLog(out, sizeof(out), 16);
107 }
108 }
109 Do_ADBG_EndSubCase(cs->c, "AES decrypt");
110
111 Do_ADBG_BeginSubCase(cs->c, "SHA-256 test, 3 bytes input");
112 {
113 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
114 static const uint8_t sha256_in[] = { 'a', 'b', 'c' };
115 static const uint8_t sha256_out[] = {
116 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
117 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
118 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
119 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
120 };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100121 uint8_t out[32] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200122
123 op.params[0].tmpref.buffer = (void *)sha256_in;
124 op.params[0].tmpref.size = sizeof(sha256_in);
125 op.params[1].tmpref.buffer = out;
126 op.params[1].tmpref.size = sizeof(out);
127 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
128 TEEC_MEMREF_TEMP_OUTPUT,
129 TEEC_NONE, TEEC_NONE);
130
131 (void)ADBG_EXPECT_TEEC_SUCCESS(cs->c,
132 TEEC_InvokeCommand(cs->session,
133 cs->
134 cmd_id_sha256,
135 &op,
136 &ret_orig));
137
138 if (!ADBG_EXPECT(cs->c, 0, memcmp(sha256_out, out,
139 sizeof(sha256_out)))) {
140 Do_ADBG_Log("sha256_out:");
141 Do_ADBG_HexLog(sha256_out, sizeof(sha256_out), 16);
142 Do_ADBG_Log("out:");
143 Do_ADBG_HexLog(out, sizeof(out), 16);
144 }
145 }
146 Do_ADBG_EndSubCase(cs->c, "SHA-256 test, 3 bytes input");
147
Etienne Carrierea3198522017-10-26 09:48:55 +0200148 Do_ADBG_BeginSubCase(cs->c, "AES-256 ECB encrypt (32B, fixed key)");
Pascal Brandc639ac82015-07-02 08:53:34 +0200149 {
150 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
151 static const uint8_t in[] = {
152 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
153 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
154 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
155 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
156 };
157 static const uint8_t exp_out[] = {
158 0x5A, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
159 0xF0, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
160 0xE9, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
161 0xF0, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x8E
162 };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100163 uint8_t out[sizeof(exp_out)] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200164
165 op.params[0].tmpref.buffer = (void *)in;
166 op.params[0].tmpref.size = sizeof(in);
167 op.params[1].tmpref.buffer = out;
168 op.params[1].tmpref.size = sizeof(out);
169 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
170 TEEC_MEMREF_TEMP_OUTPUT,
171 TEEC_NONE, TEEC_NONE);
172
173 (void)ADBG_EXPECT_TEEC_SUCCESS(cs->c,
174 TEEC_InvokeCommand(cs->session,
175 cs->
176 cmd_id_aes256ecb_encrypt,
177 &op,
178 &ret_orig));
179
180 if (!ADBG_EXPECT(cs->c, 0,
181 memcmp(exp_out, out, sizeof(exp_out)))) {
182 Do_ADBG_Log("exp_out:");
183 Do_ADBG_HexLog(exp_out, sizeof(exp_out), 16);
184 Do_ADBG_Log("out:");
185 Do_ADBG_HexLog(out, sizeof(out), 16);
186 }
187 }
Etienne Carrierea3198522017-10-26 09:48:55 +0200188 Do_ADBG_EndSubCase(cs->c, "AES-256 ECB encrypt (32B, fixed key)");
Pascal Brandc639ac82015-07-02 08:53:34 +0200189
Etienne Carrierea3198522017-10-26 09:48:55 +0200190 Do_ADBG_BeginSubCase(cs->c, "AES-256 ECB decrypt (32B, fixed key)");
Pascal Brandc639ac82015-07-02 08:53:34 +0200191 {
192 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
193 static const uint8_t in[] = {
194 0x5A, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
195 0xF0, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
196 0xE9, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
197 0xF0, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x8E
198 };
199 static const uint8_t exp_out[] = {
200 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
201 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
202 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
203 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
204 };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100205 uint8_t out[sizeof(exp_out)] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200206
207 op.params[0].tmpref.buffer = (void *)in;
208 op.params[0].tmpref.size = sizeof(in);
209 op.params[1].tmpref.buffer = out;
210 op.params[1].tmpref.size = sizeof(out);
211 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
212 TEEC_MEMREF_TEMP_OUTPUT,
213 TEEC_NONE, TEEC_NONE);
214
215 (void)ADBG_EXPECT_TEEC_SUCCESS(cs->c,
216 TEEC_InvokeCommand(cs->session,
217 cs->
218 cmd_id_aes256ecb_decrypt,
219 &op,
220 &ret_orig));
221
222 if (!ADBG_EXPECT(cs->c, 0,
223 memcmp(exp_out, out, sizeof(exp_out)))) {
224 Do_ADBG_Log("exp_out:");
225 Do_ADBG_HexLog(exp_out, sizeof(exp_out), 16);
226 Do_ADBG_Log("out:");
227 Do_ADBG_HexLog(out, sizeof(out), 16);
228 }
229 }
Etienne Carrierea3198522017-10-26 09:48:55 +0200230 Do_ADBG_EndSubCase(cs->c, "AES-256 ECB decrypt (32B, fixed key)");
Pascal Brandc639ac82015-07-02 08:53:34 +0200231}
232
233static void xtest_tee_test_1001(ADBG_Case_t *c)
234{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100235 TEEC_Result res = TEEC_ERROR_GENERIC;
236 TEEC_Session session = { };
237 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200238
Etienne Carriere11093162017-10-26 09:49:04 +0200239 /* Pseudo TA is optional: warn and nicely exit if not found */
Etienne Carriere726d8bc2017-03-21 15:45:59 +0100240 res = xtest_teec_open_session(&session, &pta_invoke_tests_ta_uuid, NULL,
Jens Wiklandercf16e842016-02-10 09:07:09 +0100241 &ret_orig);
Etienne Carriere11093162017-10-26 09:49:04 +0200242 if (res == TEEC_ERROR_ITEM_NOT_FOUND) {
243 Do_ADBG_Log(" - 1001 - skip test, pseudo TA not found");
Jens Wiklandercf16e842016-02-10 09:07:09 +0100244 return;
Etienne Carriere11093162017-10-26 09:49:04 +0200245 }
246 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Pascal Brandc639ac82015-07-02 08:53:34 +0200247
Jens Wiklandercf16e842016-02-10 09:07:09 +0100248 (void)ADBG_EXPECT_TEEC_SUCCESS(c, TEEC_InvokeCommand(
Etienne Carriere726d8bc2017-03-21 15:45:59 +0100249 &session, PTA_INVOKE_TESTS_CMD_SELF_TESTS, NULL, &ret_orig));
Jens Wiklandercf16e842016-02-10 09:07:09 +0100250 TEEC_CloseSession(&session);
Pascal Brandc639ac82015-07-02 08:53:34 +0200251}
Jens Wiklander14f48872018-06-29 15:30:13 +0200252ADBG_CASE_DEFINE(regression, 1001, xtest_tee_test_1001, "Core self tests");
Pascal Brandc639ac82015-07-02 08:53:34 +0200253
Jens Wiklander1d70a112017-10-16 15:16:39 +0200254static void xtest_tee_test_1002(ADBG_Case_t *c)
255{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100256 TEEC_Result res = TEEC_ERROR_GENERIC;
257 TEEC_Session session = { };
Jens Wiklander1d70a112017-10-16 15:16:39 +0200258 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100259 uint32_t ret_orig = 0;
260 uint8_t buf[16 * 1024] = { };
Jens Wiklander1d70a112017-10-16 15:16:39 +0200261 uint8_t exp_sum = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100262 size_t n = 0;
Jens Wiklander1d70a112017-10-16 15:16:39 +0200263
Etienne Carriere11093162017-10-26 09:49:04 +0200264 /* Pseudo TA is optional: warn and nicely exit if not found */
Jens Wiklander1d70a112017-10-16 15:16:39 +0200265 res = xtest_teec_open_session(&session, &pta_invoke_tests_ta_uuid, NULL,
266 &ret_orig);
Etienne Carriere11093162017-10-26 09:49:04 +0200267 if (res == TEEC_ERROR_ITEM_NOT_FOUND) {
268 Do_ADBG_Log(" - 1002 - skip test, pseudo TA not found");
Jens Wiklander1d70a112017-10-16 15:16:39 +0200269 return;
Etienne Carriere11093162017-10-26 09:49:04 +0200270 }
271 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Jens Wiklander1d70a112017-10-16 15:16:39 +0200272
273 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE,
274 TEEC_NONE, TEEC_NONE);
275 op.params[0].tmpref.size = sizeof(buf);
276 op.params[0].tmpref.buffer = buf;
277
278 for (n = 0; n < sizeof(buf); n++)
279 buf[n] = n + 1;
280 for (n = 0; n < sizeof(buf); n++)
281 exp_sum += buf[n];
282
283 if (!ADBG_EXPECT_TEEC_SUCCESS(c, TEEC_InvokeCommand(
284 &session, PTA_INVOKE_TESTS_CMD_PARAMS, &op, &ret_orig)))
285 goto out;
286
287 ADBG_EXPECT_COMPARE_SIGNED(c, exp_sum, ==, buf[0]);
288out:
289 TEEC_CloseSession(&session);
290}
Jens Wiklander14f48872018-06-29 15:30:13 +0200291ADBG_CASE_DEFINE(regression, 1002, xtest_tee_test_1002, "PTA parameters");
Jens Wiklander1d70a112017-10-16 15:16:39 +0200292
Jens Wiklander0c86bc32017-11-13 19:52:03 +0100293struct test_1003_arg {
294 uint32_t test_type;
295 size_t repeat;
296 size_t max_before_lockers;
297 size_t max_during_lockers;
298 size_t before_lockers;
299 size_t during_lockers;
300 TEEC_Result res;
301 uint32_t error_orig;
302};
Jens Wiklander1d70a112017-10-16 15:16:39 +0200303
Jens Wiklander0c86bc32017-11-13 19:52:03 +0100304static void *test_1003_thread(void *arg)
305{
306 struct test_1003_arg *a = arg;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100307 TEEC_Session session = { };
Jens Wiklander0c86bc32017-11-13 19:52:03 +0100308 size_t rounds = 64 * 1024;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100309 size_t n = 0;
Jens Wiklander0c86bc32017-11-13 19:52:03 +0100310
311 a->res = xtest_teec_open_session(&session, &pta_invoke_tests_ta_uuid,
312 NULL, &a->error_orig);
313 if (a->res != TEEC_SUCCESS)
314 return NULL;
315
316 for (n = 0; n < a->repeat; n++) {
317 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
318
319 op.params[0].value.a = a->test_type;
320 op.params[0].value.b = rounds;
321
322 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
323 TEEC_VALUE_OUTPUT,
324 TEEC_NONE, TEEC_NONE);
325 a->res = TEEC_InvokeCommand(&session,
326 PTA_INVOKE_TESTS_CMD_MUTEX,
327 &op, &a->error_orig);
328 if (a->test_type == PTA_MUTEX_TEST_WRITER &&
329 op.params[1].value.b != 1) {
330 Do_ADBG_Log("n %zu %" PRIu32, n, op.params[1].value.b);
331 a->res = TEEC_ERROR_BAD_STATE;
332 a->error_orig = 42;
333 break;
334 }
335
336 if (a->test_type == PTA_MUTEX_TEST_READER) {
337 if (op.params[1].value.a > a->max_before_lockers)
338 a->max_before_lockers = op.params[1].value.a;
339
340 if (op.params[1].value.b > a->max_during_lockers)
341 a->max_during_lockers = op.params[1].value.b;
342
343 a->before_lockers += op.params[1].value.a;
344 a->during_lockers += op.params[1].value.b;
345 }
346 }
347 TEEC_CloseSession(&session);
348
349 return NULL;
350}
351
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100352#define TEST_1003_THREAD_COUNT (3 * 2)
353
Jens Wiklander0c86bc32017-11-13 19:52:03 +0100354static void xtest_tee_test_1003(ADBG_Case_t *c)
355{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100356 TEEC_Result res = TEEC_ERROR_GENERIC;
357 TEEC_Session session = { };
358 uint32_t ret_orig = 0;
Jens Wiklander0c86bc32017-11-13 19:52:03 +0100359 size_t repeat = 20;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100360 struct test_1003_arg arg[TEST_1003_THREAD_COUNT] = { };
Jens Wiklander0c86bc32017-11-13 19:52:03 +0100361 size_t max_read_concurrency = 0;
362 size_t max_read_waiters = 0;
363 size_t num_concurrent_read_lockers = 0;
364 size_t num_concurrent_read_waiters = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100365 size_t n = 0;
366 size_t nt = TEST_1003_THREAD_COUNT;
367 double mean_read_concurrency = 0;
368 double mean_read_waiters = 0;
Jens Wiklander0c86bc32017-11-13 19:52:03 +0100369 size_t num_writers = 0;
370 size_t num_readers = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100371 pthread_t thr[TEST_1003_THREAD_COUNT] = { };
Jens Wiklander0c86bc32017-11-13 19:52:03 +0100372
373 /* Pseudo TA is optional: warn and nicely exit if not found */
374 res = xtest_teec_open_session(&session, &pta_invoke_tests_ta_uuid, NULL,
375 &ret_orig);
376 if (res == TEEC_ERROR_ITEM_NOT_FOUND) {
377 Do_ADBG_Log(" - 1003 - skip test, pseudo TA not found");
378 return;
379 }
380 ADBG_EXPECT_TEEC_SUCCESS(c, res);
381 TEEC_CloseSession(&session);
382
Jens Wiklander0c86bc32017-11-13 19:52:03 +0100383 for (n = 0; n < nt; n++) {
384 if (n % 3) {
385 arg[n].test_type = PTA_MUTEX_TEST_READER;
386 num_readers++;
387 } else {
388 arg[n].test_type = PTA_MUTEX_TEST_WRITER;
389 num_writers++;
390 }
391 arg[n].repeat = repeat;
392 if (!ADBG_EXPECT(c, 0, pthread_create(thr + n, NULL,
393 test_1003_thread, arg + n)))
394 nt = n; /* break loop and start cleanup */
395 }
396
397 for (n = 0; n < nt; n++) {
398 ADBG_EXPECT(c, 0, pthread_join(thr[n], NULL));
399 if (!ADBG_EXPECT_TEEC_SUCCESS(c, arg[n].res))
400 Do_ADBG_Log("error origin %" PRIu32,
401 arg[n].error_orig);
402 if (arg[n].test_type == PTA_MUTEX_TEST_READER) {
403 if (arg[n].max_during_lockers > max_read_concurrency)
404 max_read_concurrency =
405 arg[n].max_during_lockers;
406
407 if (arg[n].max_before_lockers > max_read_waiters)
408 max_read_waiters = arg[n].max_before_lockers;
409
410 num_concurrent_read_lockers += arg[n].during_lockers;
411 num_concurrent_read_waiters += arg[n].before_lockers;
412 }
413 }
414
415 mean_read_concurrency = (double)num_concurrent_read_lockers /
416 (double)(repeat * num_readers);
417 mean_read_waiters = (double)num_concurrent_read_waiters /
418 (double)(repeat * num_readers);
419
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100420 Do_ADBG_Log(" Number of parallel threads: %d (%zu writers and %zu readers)",
421 TEST_1003_THREAD_COUNT, num_writers, num_readers);
Jens Wiklander0c86bc32017-11-13 19:52:03 +0100422 Do_ADBG_Log(" Max read concurrency: %zu", max_read_concurrency);
423 Do_ADBG_Log(" Max read waiters: %zu", max_read_waiters);
424 Do_ADBG_Log(" Mean read concurrency: %g", mean_read_concurrency);
425 Do_ADBG_Log(" Mean read waiting: %g", mean_read_waiters);
426}
Jens Wiklander14f48872018-06-29 15:30:13 +0200427ADBG_CASE_DEFINE(regression, 1003, xtest_tee_test_1003,
428 "Core internal read/write mutex");
Jens Wiklander1d70a112017-10-16 15:16:39 +0200429
Pascal Brandc639ac82015-07-02 08:53:34 +0200430static void xtest_tee_test_1004(ADBG_Case_t *c)
431{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100432 TEEC_Session session = { };
433 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200434 struct xtest_crypto_session cs = { c, &session, TA_CRYPT_CMD_SHA256,
435 TA_CRYPT_CMD_AES256ECB_ENC,
436 TA_CRYPT_CMD_AES256ECB_DEC };
437
438 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(
439 &session, &crypt_user_ta_uuid,
440 NULL, &ret_orig)))
441 return;
442
443 /* Run the "complete crypto test suite" */
444 xtest_crypto_test(&cs);
445
446 TEEC_CloseSession(&session);
447}
Jens Wiklander14f48872018-06-29 15:30:13 +0200448ADBG_CASE_DEFINE(regression, 1004, xtest_tee_test_1004, "Test User Crypt TA");
Pascal Brandc639ac82015-07-02 08:53:34 +0200449
Etienne Carriere92c34422018-02-09 13:11:40 +0100450static void xtest_tee_test_invalid_mem_access(ADBG_Case_t *c, unsigned int n)
Pascal Brandc639ac82015-07-02 08:53:34 +0200451{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100452 TEEC_Session session = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200453 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100454 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200455
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300456 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200457 xtest_teec_open_session(&session, &os_test_ta_uuid, NULL,
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300458 &ret_orig)))
459 return;
Pascal Brandc639ac82015-07-02 08:53:34 +0200460
461 op.params[0].value.a = n;
462 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
463 TEEC_NONE);
464
465 (void)ADBG_EXPECT_TEEC_RESULT(c,
466 TEEC_ERROR_TARGET_DEAD,
467 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_BAD_MEM_ACCESS, &op,
468 &ret_orig));
469
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300470 (void)ADBG_EXPECT_TEEC_RESULT(c,
471 TEEC_ERROR_TARGET_DEAD,
472 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_BAD_MEM_ACCESS, &op,
Pascal Brandc639ac82015-07-02 08:53:34 +0200473 &ret_orig));
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300474
Pascal Brandc639ac82015-07-02 08:53:34 +0200475 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TEE, ret_orig);
476
477 TEEC_CloseSession(&session);
478}
479
Etienne Carriere92c34422018-02-09 13:11:40 +0100480static void xtest_tee_test_invalid_mem_access2(ADBG_Case_t *c, unsigned int n,
481 size_t size)
482{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100483 TEEC_Session session = { };
Etienne Carriere92c34422018-02-09 13:11:40 +0100484 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100485 uint32_t ret_orig = 0;
486 TEEC_SharedMemory shm = { };
Etienne Carriere92c34422018-02-09 13:11:40 +0100487
Etienne Carriere92c34422018-02-09 13:11:40 +0100488 shm.size = size;
489 shm.flags = TEEC_MEM_INPUT | TEEC_MEM_OUTPUT;
490 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
491 TEEC_AllocateSharedMemory(&xtest_teec_ctx, &shm)))
492 return;
493
494 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
495 xtest_teec_open_session(&session, &os_test_ta_uuid, NULL,
496 &ret_orig)))
Jens Wiklander6987a822019-06-28 12:47:42 +0200497 goto rel_shm;
Etienne Carriere92c34422018-02-09 13:11:40 +0100498
499 op.params[0].value.a = (uint32_t)n;
500 op.params[1].memref.parent = &shm;
501 op.params[1].memref.size = size;
502 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_MEMREF_WHOLE,
503 TEEC_NONE, TEEC_NONE);
504
505 (void)ADBG_EXPECT_TEEC_RESULT(c,
506 TEEC_ERROR_TARGET_DEAD,
507 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_BAD_MEM_ACCESS, &op,
508 &ret_orig));
509
510 (void)ADBG_EXPECT_TEEC_RESULT(c,
511 TEEC_ERROR_TARGET_DEAD,
512 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_BAD_MEM_ACCESS, &op,
513 &ret_orig));
514
515 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TEE, ret_orig);
516
517 TEEC_CloseSession(&session);
Jens Wiklander6987a822019-06-28 12:47:42 +0200518rel_shm:
519 TEEC_ReleaseSharedMemory(&shm);
Etienne Carriere92c34422018-02-09 13:11:40 +0100520}
521
Pascal Brandc639ac82015-07-02 08:53:34 +0200522static void xtest_tee_test_1005(ADBG_Case_t *c)
523{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100524 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200525#define MAX_SESSIONS 3
526 TEEC_Session sessions[MAX_SESSIONS];
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100527 int i = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200528
529 for (i = 0; i < MAX_SESSIONS; i++) {
530 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklandereb6bce72016-09-23 11:37:33 +0200531 xtest_teec_open_session(&sessions[i],
532 &concurrent_ta_uuid,
Pascal Brandc639ac82015-07-02 08:53:34 +0200533 NULL, &ret_orig)))
534 break;
535 }
536
537 for (; --i >= 0; )
538 TEEC_CloseSession(&sessions[i]);
539}
Jens Wiklander14f48872018-06-29 15:30:13 +0200540ADBG_CASE_DEFINE(regression, 1005, xtest_tee_test_1005, "Many sessions");
Pascal Brandc639ac82015-07-02 08:53:34 +0200541
542static void xtest_tee_test_1006(ADBG_Case_t *c)
543{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100544 TEEC_Session session = { };
545 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200546 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100547 uint8_t buf[32] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +0200548
549 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
550 xtest_teec_open_session(&session, &os_test_ta_uuid, NULL,
551 &ret_orig)))
552 return;
553
554 op.params[0].tmpref.buffer = buf;
555 op.params[0].tmpref.size = sizeof(buf);
556 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
557 TEEC_NONE, TEEC_NONE);
558
559 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
560 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_BASIC, &op,
561 &ret_orig));
562
563 TEEC_CloseSession(&session);
564}
Jens Wiklander14f48872018-06-29 15:30:13 +0200565ADBG_CASE_DEFINE(regression, 1006, xtest_tee_test_1006,
566 "Test Basic OS features");
Pascal Brandc639ac82015-07-02 08:53:34 +0200567
568static void xtest_tee_test_1007(ADBG_Case_t *c)
569{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100570 TEEC_Session session = { };
571 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200572
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300573 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200574 xtest_teec_open_session(&session, &os_test_ta_uuid, NULL,
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300575 &ret_orig)))
576 return;
Pascal Brandc639ac82015-07-02 08:53:34 +0200577
578 (void)ADBG_EXPECT_TEEC_RESULT(c,
579 TEEC_ERROR_TARGET_DEAD,
580 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_PANIC, NULL,
581 &ret_orig));
582
583 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TEE, ret_orig);
584
585 (void)ADBG_EXPECT_TEEC_RESULT(c,
586 TEEC_ERROR_TARGET_DEAD,
587 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_INIT, NULL,
588 &ret_orig));
589
590 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TEE, ret_orig);
591
592 TEEC_CloseSession(&session);
593}
Jens Wiklander14f48872018-06-29 15:30:13 +0200594ADBG_CASE_DEFINE(regression, 1007, xtest_tee_test_1007, "Test Panic");
Pascal Brandc639ac82015-07-02 08:53:34 +0200595
Jerome Forissierf02a2212015-10-29 14:33:35 +0100596#ifndef TA_DIR
Victor Chong3d8798f2017-03-01 18:31:48 +0000597# ifdef __ANDROID__
Yongqin Liu286f1fc2018-06-21 22:09:15 +0800598#define TA_DIR "/vendor/lib/optee_armtz"
Victor Chong3d8798f2017-03-01 18:31:48 +0000599# else
Jerome Forissierf02a2212015-10-29 14:33:35 +0100600#define TA_DIR "/lib/optee_armtz"
Victor Chong3d8798f2017-03-01 18:31:48 +0000601# endif
Jerome Forissierf02a2212015-10-29 14:33:35 +0100602#endif
603
Jens Wiklanderec545fb2017-11-24 16:58:07 +0100604static FILE *open_ta_file(const TEEC_UUID *uuid, const char *mode)
David Brownb2865ab2016-08-02 11:44:41 -0600605{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100606 char buf[PATH_MAX] = { };
David Brownb2865ab2016-08-02 11:44:41 -0600607
Jens Wiklanderec545fb2017-11-24 16:58:07 +0100608 snprintf(buf, sizeof(buf),
Jens Wiklander6203b872016-12-08 19:18:29 +0100609 "%s/%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x.ta",
Jens Wiklanderec545fb2017-11-24 16:58:07 +0100610 TA_DIR, uuid->timeLow, uuid->timeMid, uuid->timeHiAndVersion,
Jens Wiklanderb7940892015-10-23 16:02:40 +0200611 uuid->clockSeqAndNode[0], uuid->clockSeqAndNode[1],
612 uuid->clockSeqAndNode[2], uuid->clockSeqAndNode[3],
613 uuid->clockSeqAndNode[4], uuid->clockSeqAndNode[5],
David Brownb2865ab2016-08-02 11:44:41 -0600614 uuid->clockSeqAndNode[6], uuid->clockSeqAndNode[7]);
Jens Wiklanderb7940892015-10-23 16:02:40 +0200615
Jens Wiklanderb7940892015-10-23 16:02:40 +0200616 return fopen(buf, mode);
617}
618
Jens Wiklanderec545fb2017-11-24 16:58:07 +0100619static bool load_corrupt_ta(ADBG_Case_t *c, size_t offs, uint8_t mask)
Jens Wiklander4441fe22015-10-23 16:53:02 +0200620{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100621 TEEC_Session session = { };
Jens Wiklanderec545fb2017-11-24 16:58:07 +0100622 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
623 TEEC_UUID uuid = PTA_SECSTOR_TA_MGMT_UUID;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100624 TEEC_Result res = TEEC_ERROR_GENERIC;
625 uint32_t ret_orig = 0;
Jens Wiklanderec545fb2017-11-24 16:58:07 +0100626 FILE *f = NULL;
627 bool r = false;
628 uint8_t *buf = NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100629 size_t sz = 0;
630 size_t fread_res = 0;
Jens Wiklander4441fe22015-10-23 16:53:02 +0200631
Jens Wiklanderec545fb2017-11-24 16:58:07 +0100632 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
633 xtest_teec_open_session(&session, &uuid, NULL, &ret_orig)))
634 goto out;
Jens Wiklander4441fe22015-10-23 16:53:02 +0200635
Jens Wiklanderec545fb2017-11-24 16:58:07 +0100636 f = open_ta_file(&create_fail_test_ta_uuid, "rb");
637 if (!ADBG_EXPECT_NOT_NULL(c, f))
638 goto out;
639 if (!ADBG_EXPECT_TRUE(c, !fseek(f, 0, SEEK_END)))
640 goto out;
641 sz = ftell(f);
642 rewind(f);
643
644 buf = malloc(sz);
645 if (!ADBG_EXPECT_NOT_NULL(c, buf))
646 goto out;
647
648 fread_res = fread(buf, 1, sz, f);
649 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, fread_res, ==, sz))
650 goto out;
651
Jens Wiklander4441fe22015-10-23 16:53:02 +0200652 fclose(f);
Jens Wiklanderec545fb2017-11-24 16:58:07 +0100653 f = NULL;
Jens Wiklander4441fe22015-10-23 16:53:02 +0200654
Jens Wiklanderec545fb2017-11-24 16:58:07 +0100655 buf[MIN(offs, sz)] ^= mask;
Jens Wiklander4441fe22015-10-23 16:53:02 +0200656
Jens Wiklanderec545fb2017-11-24 16:58:07 +0100657 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
658 TEEC_NONE, TEEC_NONE);
659 op.params[0].tmpref.buffer = buf;
660 op.params[0].tmpref.size = sz;
661
662 res = TEEC_InvokeCommand(&session, PTA_SECSTOR_TA_MGMT_BOOTSTRAP, &op,
663 &ret_orig);
664 r = ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_SECURITY, res);
665out:
666 free(buf);
667 if (f)
668 fclose(f);
669 TEEC_CloseSession(&session);
Jens Wiklander4441fe22015-10-23 16:53:02 +0200670 return r;
671}
Jens Wiklandere1a201d2020-02-12 18:36:20 +0100672
673static void test_1008_corrupt_ta(ADBG_Case_t *c)
674{
675 TEEC_UUID uuid = PTA_SECSTOR_TA_MGMT_UUID;
676 TEEC_Result res = TEEC_ERROR_GENERIC;
677 TEEC_Session session = { };
678 uint32_t ret_orig = 0;
679
680 res = xtest_teec_open_session(&session, &uuid, NULL, &ret_orig);
681 if (res) {
682 if (ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
683 res))
Joakim Becha1212b62020-04-07 12:06:00 +0200684 Do_ADBG_Log("PTA Secure Storage TA Management not found: skip test");
Jens Wiklandere1a201d2020-02-12 18:36:20 +0100685 return;
686 }
687 TEEC_CloseSession(&session);
688
689 ADBG_EXPECT_TRUE(c,
690 load_corrupt_ta(c, offsetof(struct shdr, magic), 1));
691 ADBG_EXPECT_TRUE(c,
692 load_corrupt_ta(c, offsetof(struct shdr, img_type), 1));
693 ADBG_EXPECT_TRUE(c,
694 load_corrupt_ta(c, offsetof(struct shdr, img_size), 1));
695 ADBG_EXPECT_TRUE(c,
696 load_corrupt_ta(c, offsetof(struct shdr, algo), 1));
697 ADBG_EXPECT_TRUE(c,
698 load_corrupt_ta(c, offsetof(struct shdr, hash_size), 1));
699 ADBG_EXPECT_TRUE(c,
700 load_corrupt_ta(c, offsetof(struct shdr, sig_size), 1));
701 ADBG_EXPECT_TRUE(c,
702 load_corrupt_ta(c, sizeof(struct shdr), 1)); /* hash */
703 ADBG_EXPECT_TRUE(c,
704 load_corrupt_ta(c, sizeof(struct shdr) + 32, 1)); /* sig */
705 ADBG_EXPECT_TRUE(c, load_corrupt_ta(c, 3000, 1)); /* payload */
706 ADBG_EXPECT_TRUE(c, load_corrupt_ta(c, 8000, 1)); /* payload */
707}
Jens Wiklander4441fe22015-10-23 16:53:02 +0200708
Pascal Brandc639ac82015-07-02 08:53:34 +0200709static void xtest_tee_test_1008(ADBG_Case_t *c)
710{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100711 TEEC_Session session = { };
712 TEEC_Session session_crypt = { };
713 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200714
715 Do_ADBG_BeginSubCase(c, "Invoke command");
716 {
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300717 if (ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200718 xtest_teec_open_session(&session, &os_test_ta_uuid,
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300719 NULL, &ret_orig))) {
Pascal Brandc639ac82015-07-02 08:53:34 +0200720
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300721 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
722 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CLIENT,
723 NULL, &ret_orig));
724 TEEC_CloseSession(&session);
725 }
Pascal Brandc639ac82015-07-02 08:53:34 +0200726
Pascal Brandc639ac82015-07-02 08:53:34 +0200727 }
728 Do_ADBG_EndSubCase(c, "Invoke command");
729
730 Do_ADBG_BeginSubCase(c, "Invoke command with timeout");
731 {
732 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
733
734 op.params[0].value.a = 2000;
735 op.paramTypes = TEEC_PARAM_TYPES(
736 TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
737
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300738 if (ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200739 xtest_teec_open_session(&session,
740 &os_test_ta_uuid,
741 NULL,
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300742 &ret_orig))) {
Pascal Brandc639ac82015-07-02 08:53:34 +0200743
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300744 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
745 TEEC_InvokeCommand(&session,
746 TA_OS_TEST_CMD_CLIENT_WITH_TIMEOUT,
747 &op, &ret_orig));
748 TEEC_CloseSession(&session);
749 }
Pascal Brandc639ac82015-07-02 08:53:34 +0200750 }
751 Do_ADBG_EndSubCase(c, "Invoke command with timeout");
752
753 Do_ADBG_BeginSubCase(c, "Create session fail");
754 {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100755 size_t n = 0;
Jens Wiklanderb7940892015-10-23 16:02:40 +0200756
Pascal Brandc639ac82015-07-02 08:53:34 +0200757 for (n = 0; n < 100; n++) {
758 Do_ADBG_Log("n = %zu", n);
759 (void)ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_GENERIC,
760 xtest_teec_open_session(&session_crypt,
761 &create_fail_test_ta_uuid,
762 NULL, &ret_orig));
Jerome Forissierec7a31f2020-11-20 11:30:06 +0100763 /* level > 0 may be used to detect/debug memory leaks */
764 if (!level)
765 break;
Pascal Brandc639ac82015-07-02 08:53:34 +0200766 }
767 }
768 Do_ADBG_EndSubCase(c, "Create session fail");
Jens Wiklanderb7940892015-10-23 16:02:40 +0200769
Jens Wiklander4441fe22015-10-23 16:53:02 +0200770 Do_ADBG_BeginSubCase(c, "Load corrupt TA");
Jens Wiklandere1a201d2020-02-12 18:36:20 +0100771 test_1008_corrupt_ta(c);
Jens Wiklander4441fe22015-10-23 16:53:02 +0200772 Do_ADBG_EndSubCase(c, "Load corrupt TA");
Pascal Brandc639ac82015-07-02 08:53:34 +0200773}
Jens Wiklander14f48872018-06-29 15:30:13 +0200774ADBG_CASE_DEFINE(regression, 1008, xtest_tee_test_1008,
775 "TEE internal client API");
Pascal Brandc639ac82015-07-02 08:53:34 +0200776
Pascal Brandc639ac82015-07-02 08:53:34 +0200777static void *cancellation_thread(void *arg)
778{
779 /*
780 * Sleep 0.5 seconds before cancellation to make sure that the other
781 * thread is in RPC_WAIT.
782 */
783 (void)usleep(500000);
784 TEEC_RequestCancellation(arg);
785 return NULL;
786}
Pascal Brandc639ac82015-07-02 08:53:34 +0200787
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300788static void xtest_tee_test_1009_subcase(ADBG_Case_t *c, const char *subcase,
789 uint32_t timeout, bool cancel)
Pascal Brandc639ac82015-07-02 08:53:34 +0200790{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100791 TEEC_Session session = { };
792 uint32_t ret_orig = 0;
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300793 pthread_t thr;
Pascal Brandc639ac82015-07-02 08:53:34 +0200794
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100795 memset(&thr, 0, sizeof(thr));
796
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300797 Do_ADBG_BeginSubCase(c, "%s", subcase);
Pascal Brandc639ac82015-07-02 08:53:34 +0200798 {
799 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
800
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300801 if (ADBG_EXPECT_TEEC_SUCCESS(c,
802 xtest_teec_open_session(&session, &os_test_ta_uuid,
803 NULL, &ret_orig))) {
Pascal Brandc639ac82015-07-02 08:53:34 +0200804
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300805 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c,
806 TEEC_ORIGIN_TRUSTED_APP,
807 ret_orig);
Pascal Brandc639ac82015-07-02 08:53:34 +0200808
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300809 op.params[0].value.a = timeout;
810 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
811 TEEC_NONE,
812 TEEC_NONE, TEEC_NONE);
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300813 if (cancel) {
814 (void)ADBG_EXPECT(c, 0,
815 pthread_create(&thr, NULL,
816 cancellation_thread, &op));
Pascal Brandc639ac82015-07-02 08:53:34 +0200817
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300818 (void)ADBG_EXPECT_TEEC_RESULT(c,
819 TEEC_ERROR_CANCEL,
820 TEEC_InvokeCommand(&session,
821 TA_OS_TEST_CMD_WAIT,
822 &op,
823 &ret_orig));
824 } else
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300825
826 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
827 TEEC_InvokeCommand(&session,
828 TA_OS_TEST_CMD_WAIT,
829 &op,
830 &ret_orig));
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300831 if (cancel)
832 (void)ADBG_EXPECT(c, 0, pthread_join(thr, NULL));
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300833
834 TEEC_CloseSession(&session);
835 }
Pascal Brandc639ac82015-07-02 08:53:34 +0200836 }
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300837 Do_ADBG_EndSubCase(c, "%s", subcase);
838}
839
840static void xtest_tee_test_1009(ADBG_Case_t *c)
841{
842 xtest_tee_test_1009_subcase(c, "TEE Wait 0.1s", 100, false);
843 xtest_tee_test_1009_subcase(c, "TEE Wait 0.5s", 500, false);
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300844 xtest_tee_test_1009_subcase(c, "TEE Wait 2s cancel", 2000, true);
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300845 xtest_tee_test_1009_subcase(c, "TEE Wait 2s", 2000, false);
Pascal Brandc639ac82015-07-02 08:53:34 +0200846}
Jens Wiklander14f48872018-06-29 15:30:13 +0200847ADBG_CASE_DEFINE(regression, 1009, xtest_tee_test_1009, "TEE Wait");
Pascal Brandc639ac82015-07-02 08:53:34 +0200848
849static void xtest_tee_test_1010(ADBG_Case_t *c)
850{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100851 unsigned int n = 0;
852 unsigned int idx = 0;
Etienne Carriere92c34422018-02-09 13:11:40 +0100853 size_t memref_sz[] = { 1024, 65536 };
Pascal Brandc639ac82015-07-02 08:53:34 +0200854
Jerome Forissiere4c33f42021-09-21 11:26:17 +0200855 for (n = 1; n <= 7; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +0200856 Do_ADBG_BeginSubCase(c, "Invalid memory access %u", n);
857 xtest_tee_test_invalid_mem_access(c, n);
858 Do_ADBG_EndSubCase(c, "Invalid memory access %u", n);
859 }
Etienne Carriere92c34422018-02-09 13:11:40 +0100860
861 for (idx = 0; idx < ARRAY_SIZE(memref_sz); idx++) {
862 for (n = 1; n <= 5; n++) {
863 Do_ADBG_BeginSubCase(c,
Igor Opaniuke8236ac2018-02-12 12:26:25 +0200864 "Invalid memory access %u with %zu bytes memref",
Etienne Carriere92c34422018-02-09 13:11:40 +0100865 n, memref_sz[idx]);
866 xtest_tee_test_invalid_mem_access2(c, n, memref_sz[idx]);
867 Do_ADBG_EndSubCase(c,
Igor Opaniuke8236ac2018-02-12 12:26:25 +0200868 "Invalid memory access %u with %zu bytes memref",
Etienne Carriere92c34422018-02-09 13:11:40 +0100869 n, memref_sz[idx]);
870 }
871 }
Pascal Brandc639ac82015-07-02 08:53:34 +0200872}
Jens Wiklander14f48872018-06-29 15:30:13 +0200873ADBG_CASE_DEFINE(regression, 1010, xtest_tee_test_1010,
874 "Invalid memory access");
Pascal Brandc639ac82015-07-02 08:53:34 +0200875
876static void xtest_tee_test_1011(ADBG_Case_t *c)
877{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100878 TEEC_Session session = { };
879 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200880 struct xtest_crypto_session cs = {
881 c, &session, TA_RPC_CMD_CRYPT_SHA256,
882 TA_RPC_CMD_CRYPT_AES256ECB_ENC,
883 TA_RPC_CMD_CRYPT_AES256ECB_DEC
884 };
Jens Wiklanderf7b9c632017-01-03 17:32:26 +0100885 struct xtest_crypto_session cs_privmem = {
886 c, &session,
887 TA_RPC_CMD_CRYPT_PRIVMEM_SHA256,
888 TA_RPC_CMD_CRYPT_PRIVMEM_AES256ECB_ENC,
889 TA_RPC_CMD_CRYPT_PRIVMEM_AES256ECB_DEC
890 };
Pascal Brandc639ac82015-07-02 08:53:34 +0200891 TEEC_UUID uuid = rpc_test_ta_uuid;
892
893 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
894 xtest_teec_open_session(&session, &uuid, NULL, &ret_orig)))
895 return;
896
Jens Wiklanderf7b9c632017-01-03 17:32:26 +0100897 Do_ADBG_BeginSubCase(c, "TA-to-TA via non-secure shared memory");
Pascal Brandc639ac82015-07-02 08:53:34 +0200898 /*
Jens Wiklanderf7b9c632017-01-03 17:32:26 +0100899 * Run the "complete crypto test suite" using TA-to-TA
900 * communication
Pascal Brandc639ac82015-07-02 08:53:34 +0200901 */
902 xtest_crypto_test(&cs);
Jens Wiklanderf7b9c632017-01-03 17:32:26 +0100903 Do_ADBG_EndSubCase(c, "TA-to-TA via non-secure shared memory");
904
905 Do_ADBG_BeginSubCase(c, "TA-to-TA via TA private memory");
906 /*
907 * Run the "complete crypto test suite" using TA-to-TA
908 * communication via TA private memory.
909 */
910 xtest_crypto_test(&cs_privmem);
911 Do_ADBG_EndSubCase(c, "TA-to-TA via TA private memory");
912
Pascal Brandc639ac82015-07-02 08:53:34 +0200913 TEEC_CloseSession(&session);
914}
Jens Wiklander14f48872018-06-29 15:30:13 +0200915ADBG_CASE_DEFINE(regression, 1011, xtest_tee_test_1011,
916 "Test TA-to-TA features with User Crypt TA");
Pascal Brandc639ac82015-07-02 08:53:34 +0200917
918/*
919 * Note that this test is failing when
920 * - running twice in a raw
921 * - and the user TA is statically linked
922 * This is because the counter is not reseted when opening the first session
923 * in case the TA is statically linked
924 */
925static void xtest_tee_test_1012(ADBG_Case_t *c)
926{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100927 TEEC_Session session1 = { };
928 TEEC_Session session2 = { };
929 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200930 TEEC_UUID uuid = sims_test_ta_uuid;
931
932 Do_ADBG_BeginSubCase(c, "Single Instance Multi Session");
933 {
934 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
935 static const uint8_t in[] = {
936 0x5A, 0x6E, 0x04, 0x57, 0x08, 0xFB, 0x71, 0x96,
937 0xF0, 0x2E, 0x55, 0x3D, 0x02, 0xC3, 0xA6, 0x92,
938 0xE9, 0xC3, 0xEF, 0x8A, 0xB2, 0x34, 0x53, 0xE6,
939 0xF0, 0x74, 0x9C, 0xD6, 0x36, 0xE7, 0xA8, 0x8E
940 };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100941 uint8_t out[32] = { };
942 int i = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200943
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300944 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200945 xtest_teec_open_session(&session1, &uuid, NULL,
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300946 &ret_orig)))
947 return;
Pascal Brandc639ac82015-07-02 08:53:34 +0200948
949 op.params[0].value.a = 0;
950 op.params[1].tmpref.buffer = (void *)in;
951 op.params[1].tmpref.size = sizeof(in);
952 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
953 TEEC_MEMREF_TEMP_INPUT,
954 TEEC_NONE, TEEC_NONE);
955
956 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
957 TEEC_InvokeCommand(&session1, TA_SIMS_CMD_WRITE, &op,
958 &ret_orig));
959
Jerome Forissier3cc0a422017-12-14 09:53:24 +0100960 for (i = 1; i < 3; i++) {
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300961 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +0200962 xtest_teec_open_session(&session2, &uuid, NULL,
Volodymyr Babchukae3dcd72016-10-20 16:51:59 +0300963 &ret_orig)))
964 continue;
Pascal Brandc639ac82015-07-02 08:53:34 +0200965
966 op.params[0].value.a = 0;
967 op.params[1].tmpref.buffer = out;
968 op.params[1].tmpref.size = sizeof(out);
969 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
970 TEEC_MEMREF_TEMP_OUTPUT,
971 TEEC_NONE, TEEC_NONE);
972
973 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
974 TEEC_InvokeCommand(&session2, TA_SIMS_CMD_READ,
975 &op, &ret_orig));
976
977 if (!ADBG_EXPECT_BUFFER(c, in, sizeof(in), out,
978 sizeof(out))) {
979 Do_ADBG_Log("in:");
980 Do_ADBG_HexLog(in, sizeof(in), 16);
981 Do_ADBG_Log("out:");
982 Do_ADBG_HexLog(out, sizeof(out), 16);
983 }
984
985 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
986 TEEC_NONE, TEEC_NONE,
987 TEEC_NONE);
988
989 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
990 TEEC_InvokeCommand(&session1,
991 TA_SIMS_CMD_GET_COUNTER,
992 &op, &ret_orig));
993
994 (void)ADBG_EXPECT(c, 0, op.params[0].value.a);
995
996 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
997 TEEC_InvokeCommand(&session2,
998 TA_SIMS_CMD_GET_COUNTER, &op,
999 &ret_orig));
1000
1001 (void)ADBG_EXPECT(c, i, op.params[0].value.a);
1002 TEEC_CloseSession(&session2);
1003 }
1004
1005 memset(out, 0, sizeof(out));
1006 op.params[0].value.a = 0;
1007 op.params[1].tmpref.buffer = out;
1008 op.params[1].tmpref.size = sizeof(out);
1009 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
1010 TEEC_MEMREF_TEMP_OUTPUT,
1011 TEEC_NONE, TEEC_NONE);
1012
1013 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
1014 TEEC_InvokeCommand(&session1, TA_SIMS_CMD_READ, &op,
1015 &ret_orig));
1016
1017 if (!ADBG_EXPECT(c, 0, memcmp(in, out, sizeof(in)))) {
1018 Do_ADBG_Log("in:");
1019 Do_ADBG_HexLog(in, sizeof(in), 16);
1020 Do_ADBG_Log("out:");
1021 Do_ADBG_HexLog(out, sizeof(out), 16);
1022 }
1023
1024 TEEC_CloseSession(&session1);
1025 }
Ovidiu Mihalachi3e6183e2019-04-25 10:23:21 +03001026 Do_ADBG_EndSubCase(c, "Single Instance Multi Session");
Pascal Brandc639ac82015-07-02 08:53:34 +02001027}
Jens Wiklander14f48872018-06-29 15:30:13 +02001028ADBG_CASE_DEFINE(regression, 1012, xtest_tee_test_1012,
1029 "Test Single Instance Multi Session features with SIMS TA");
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001030
1031struct test_1013_thread_arg {
Jens Wiklander70672972016-04-06 00:01:45 +02001032 const TEEC_UUID *uuid;
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001033 uint32_t cmd;
1034 uint32_t repeat;
1035 TEEC_SharedMemory *shm;
1036 uint32_t error_orig;
1037 TEEC_Result res;
1038 uint32_t max_concurrency;
1039 const uint8_t *in;
1040 size_t in_len;
1041 uint8_t *out;
1042 size_t out_len;
1043};
1044
1045static void *test_1013_thread(void *arg)
1046{
1047 struct test_1013_thread_arg *a = arg;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001048 TEEC_Session session = { };
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001049 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1050 uint8_t p2 = TEEC_NONE;
1051 uint8_t p3 = TEEC_NONE;
1052
Jens Wiklander70672972016-04-06 00:01:45 +02001053 a->res = xtest_teec_open_session(&session, a->uuid, NULL,
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001054 &a->error_orig);
1055 if (a->res != TEEC_SUCCESS)
1056 return NULL;
1057
1058 op.params[0].memref.parent = a->shm;
1059 op.params[0].memref.size = a->shm->size;
1060 op.params[0].memref.offset = 0;
1061 op.params[1].value.a = a->repeat;
1062 op.params[1].value.b = 0;
1063 op.params[2].tmpref.buffer = (void *)a->in;
1064 op.params[2].tmpref.size = a->in_len;
1065 op.params[3].tmpref.buffer = a->out;
1066 op.params[3].tmpref.size = a->out_len;
1067
1068 if (a->in_len)
1069 p2 = TEEC_MEMREF_TEMP_INPUT;
1070 if (a->out_len)
1071 p3 = TEEC_MEMREF_TEMP_OUTPUT;
1072
1073 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INOUT,
1074 TEEC_VALUE_INOUT, p2, p3);
1075
1076 a->res = TEEC_InvokeCommand(&session, a->cmd, &op, &a->error_orig);
1077 a->max_concurrency = op.params[1].value.b;
1078 a->out_len = op.params[3].tmpref.size;
1079 TEEC_CloseSession(&session);
1080 return NULL;
1081}
1082
Pascal Brand4fa35582015-12-17 10:59:12 +01001083#define NUM_THREADS 3
1084
Jens Wiklander70672972016-04-06 00:01:45 +02001085static void xtest_tee_test_1013_single(ADBG_Case_t *c, double *mean_concurrency,
1086 const TEEC_UUID *uuid)
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001087{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001088 size_t nt = 0;
1089 size_t n = 0;
Jens Wiklander70672972016-04-06 00:01:45 +02001090 size_t repeat = 1000;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001091 TEEC_SharedMemory shm = { };
1092 size_t max_concurrency = 0;
1093 struct test_1013_thread_arg arg[NUM_THREADS] = { };
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001094 static const uint8_t sha256_in[] = { 'a', 'b', 'c' };
1095 static const uint8_t sha256_out[] = {
1096 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
1097 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
1098 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
1099 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
1100 };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001101 uint8_t out[32] = { };
1102 pthread_t thr[NUM_THREADS] = { };
Jerome Forissierfbdc1752021-06-29 11:25:35 +02001103 bool skip = false;
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001104
Jens Wiklander70672972016-04-06 00:01:45 +02001105 Do_ADBG_BeginSubCase(c, "Busy loop repeat %zu", repeat * 10);
Pascal Brand4fa35582015-12-17 10:59:12 +01001106 *mean_concurrency = 0;
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001107
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001108 shm.size = sizeof(struct ta_concurrent_shm);
1109 shm.flags = TEEC_MEM_INPUT | TEEC_MEM_OUTPUT;
1110 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1111 TEEC_AllocateSharedMemory(&xtest_teec_ctx, &shm)))
1112 return;
1113
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001114 memset(shm.buffer, 0, shm.size);
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001115 max_concurrency = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001116 nt = NUM_THREADS;
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001117
1118 for (n = 0; n < nt; n++) {
Jens Wiklander70672972016-04-06 00:01:45 +02001119 arg[n].uuid = uuid;
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001120 arg[n].cmd = TA_CONCURRENT_CMD_BUSY_LOOP;
Jens Wiklander70672972016-04-06 00:01:45 +02001121 arg[n].repeat = repeat * 10;
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001122 arg[n].shm = &shm;
1123 if (!ADBG_EXPECT(c, 0, pthread_create(thr + n, NULL,
1124 test_1013_thread, arg + n)))
1125 nt = n; /* break loop and start cleanup */
1126 }
1127
1128 for (n = 0; n < nt; n++) {
1129 ADBG_EXPECT(c, 0, pthread_join(thr[n], NULL));
Jerome Forissierfbdc1752021-06-29 11:25:35 +02001130 if (arg[n].res == TEEC_ERROR_OUT_OF_MEMORY &&
1131 !memcmp(uuid, &concurrent_large_ta_uuid, sizeof(*uuid))) {
1132 Do_ADBG_Log("TEEC_ERROR_OUT_OF_MEMORY - ignored");
1133 skip = true;
1134 continue;
1135 }
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001136 ADBG_EXPECT_TEEC_SUCCESS(c, arg[n].res);
1137 if (arg[n].max_concurrency > max_concurrency)
1138 max_concurrency = arg[n].max_concurrency;
1139 }
1140
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001141 /*
1142 * Concurrency can be limited by several factors, for instance in a
Joakim Becha1212b62020-04-07 12:06:00 +02001143 * single CPU system it's dependent on the Preemption Model used by
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001144 * the kernel (Preemptible Kernel (Low-Latency Desktop) gives the
1145 * best result there).
1146 */
Jerome Forissierfbdc1752021-06-29 11:25:35 +02001147 if (!skip) {
1148 (void)ADBG_EXPECT_COMPARE_UNSIGNED(c, max_concurrency, >, 0);
1149 (void)ADBG_EXPECT_COMPARE_UNSIGNED(c, max_concurrency, <=,
1150 NUM_THREADS);
1151 *mean_concurrency += max_concurrency;
1152 }
Jens Wiklander70672972016-04-06 00:01:45 +02001153 Do_ADBG_EndSubCase(c, "Busy loop repeat %zu", repeat * 10);
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001154
Jens Wiklander70672972016-04-06 00:01:45 +02001155 Do_ADBG_BeginSubCase(c, "SHA-256 loop repeat %zu", repeat);
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001156 memset(shm.buffer, 0, shm.size);
1157 memset(arg, 0, sizeof(arg));
1158 max_concurrency = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001159 nt = NUM_THREADS;
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001160
1161 for (n = 0; n < nt; n++) {
Jens Wiklander70672972016-04-06 00:01:45 +02001162 arg[n].uuid = uuid;
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001163 arg[n].cmd = TA_CONCURRENT_CMD_SHA256;
Jens Wiklander70672972016-04-06 00:01:45 +02001164 arg[n].repeat = repeat;
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001165 arg[n].shm = &shm;
1166 arg[n].in = sha256_in;
1167 arg[n].in_len = sizeof(sha256_in);
1168 arg[n].out = out;
1169 arg[n].out_len = sizeof(out);
1170 if (!ADBG_EXPECT(c, 0, pthread_create(thr + n, NULL,
1171 test_1013_thread, arg + n)))
1172 nt = n; /* break loop and start cleanup */
1173 }
1174
1175 for (n = 0; n < nt; n++) {
Jerome Forissierfbdc1752021-06-29 11:25:35 +02001176 ADBG_EXPECT(c, 0, pthread_join(thr[n], NULL));
1177 if (arg[n].res == TEEC_ERROR_OUT_OF_MEMORY &&
1178 !memcmp(uuid, &concurrent_large_ta_uuid, sizeof(*uuid))) {
1179 Do_ADBG_Log("TEEC_ERROR_OUT_OF_MEMORY - ignored");
1180 continue;
1181 }
1182 if (ADBG_EXPECT_TEEC_SUCCESS(c, arg[n].res))
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001183 ADBG_EXPECT_BUFFER(c, sha256_out, sizeof(sha256_out),
1184 arg[n].out, arg[n].out_len);
1185 if (arg[n].max_concurrency > max_concurrency)
1186 max_concurrency = arg[n].max_concurrency;
1187 }
Pascal Brand4fa35582015-12-17 10:59:12 +01001188 *mean_concurrency += max_concurrency;
Jens Wiklander70672972016-04-06 00:01:45 +02001189 Do_ADBG_EndSubCase(c, "SHA-256 loop repeat %zu", repeat);
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001190
Pascal Brand4fa35582015-12-17 10:59:12 +01001191 *mean_concurrency /= 2.0;
Jens Wiklanderac27ec12015-07-15 15:23:14 +02001192 TEEC_ReleaseSharedMemory(&shm);
1193}
Pascal Brand4fa35582015-12-17 10:59:12 +01001194
1195static void xtest_tee_test_1013(ADBG_Case_t *c)
1196{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001197 int i = 0;
1198 double mean_concurrency = 0;
1199 double concurrency = 0;
Jens Wiklander70672972016-04-06 00:01:45 +02001200 int nb_loops = 24;
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01001201
1202 if (level == 0)
1203 nb_loops /= 2;
Pascal Brand4fa35582015-12-17 10:59:12 +01001204
Jens Wiklander70672972016-04-06 00:01:45 +02001205 Do_ADBG_BeginSubCase(c, "Using small concurrency TA");
Pascal Brand4fa35582015-12-17 10:59:12 +01001206 mean_concurrency = 0;
1207 for (i = 0; i < nb_loops; i++) {
Jens Wiklander70672972016-04-06 00:01:45 +02001208 xtest_tee_test_1013_single(c, &concurrency,
1209 &concurrent_ta_uuid);
Pascal Brand4fa35582015-12-17 10:59:12 +01001210 mean_concurrency += concurrency;
1211 }
1212 mean_concurrency /= nb_loops;
1213
1214 Do_ADBG_Log(" Number of parallel threads: %d", NUM_THREADS);
1215 Do_ADBG_Log(" Mean concurrency: %g", mean_concurrency);
Jens Wiklander70672972016-04-06 00:01:45 +02001216 Do_ADBG_EndSubCase(c, "Using small concurrency TA");
Pascal Brand4fa35582015-12-17 10:59:12 +01001217
Jens Wiklander70672972016-04-06 00:01:45 +02001218 Do_ADBG_BeginSubCase(c, "Using large concurrency TA");
1219 mean_concurrency = 0;
1220 for (i = 0; i < nb_loops; i++) {
1221 xtest_tee_test_1013_single(c, &concurrency,
1222 &concurrent_large_ta_uuid);
1223 mean_concurrency += concurrency;
1224 }
1225 mean_concurrency /= nb_loops;
1226
1227 Do_ADBG_Log(" Number of parallel threads: %d", NUM_THREADS);
1228 Do_ADBG_Log(" Mean concurrency: %g", mean_concurrency);
1229 Do_ADBG_EndSubCase(c, "Using large concurrency TA");
1230}
Jens Wiklander14f48872018-06-29 15:30:13 +02001231ADBG_CASE_DEFINE(regression, 1013, xtest_tee_test_1013,
Joakim Becha1212b62020-04-07 12:06:00 +02001232 "Test concurrency with concurrent TA");
Etienne Carriere50abf9a2017-03-24 11:33:50 +01001233
1234#ifdef CFG_SECURE_DATA_PATH
1235static void xtest_tee_test_1014(ADBG_Case_t *c)
1236{
1237 UNUSED(c);
1238
1239 int size = 17000;
1240 int loop = 10;
1241 int ion_heap = DEFAULT_ION_HEAP_TYPE;
1242 int rnd_offset = 1;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001243 int test = 0;
1244 int ret = 0;
Etienne Carriere50abf9a2017-03-24 11:33:50 +01001245
1246 test = TEST_NS_TO_TA;
1247 Do_ADBG_BeginSubCase(c, "SDP: NonSecure client invokes a SDP TA");
Etienne Carriereb9a95822017-04-26 15:03:53 +02001248 ret = sdp_basic_test(test, size, loop, ion_heap, rnd_offset, 0);
Etienne Carriere50abf9a2017-03-24 11:33:50 +01001249 ADBG_EXPECT(c, 0, ret);
1250 Do_ADBG_EndSubCase(c, "SDP: NonSecure client invokes a SDP TA");
1251
1252 test = TEST_TA_TO_TA;
1253 Do_ADBG_BeginSubCase(c, "SDP: SDP TA invokes a SDP TA");
Etienne Carriereb9a95822017-04-26 15:03:53 +02001254 ret = sdp_basic_test(test, size, loop, ion_heap, rnd_offset, 0);
Etienne Carriere50abf9a2017-03-24 11:33:50 +01001255 ADBG_EXPECT(c, 0, ret);
1256 Do_ADBG_EndSubCase(c, "SDP: SDP TA invokes a SDP TA");
1257
1258 test = TEST_TA_TO_PTA;
Igor Opaniuk2e0a6792021-01-09 00:51:19 +02001259 Do_ADBG_BeginSubCase(c, "SDP: SDP TA invokes a test pTA (invoke_tests.pta)");
Etienne Carriereb9a95822017-04-26 15:03:53 +02001260 ret = sdp_basic_test(test, size, loop, ion_heap, rnd_offset, 0);
Etienne Carriere50abf9a2017-03-24 11:33:50 +01001261 ADBG_EXPECT(c, 0, ret);
Igor Opaniuk2e0a6792021-01-09 00:51:19 +02001262 Do_ADBG_EndSubCase(c, "SDP: SDP TA invokes a test pTA (invoke_tests.pta)");
Etienne Carriere50abf9a2017-03-24 11:33:50 +01001263
1264 test = TEST_NS_TO_PTA;
Igor Opaniuk2e0a6792021-01-09 00:51:19 +02001265 Do_ADBG_BeginSubCase(c, "SDP: NSec CA invokes a test pTA (invoke_tests.pta) (should fail)");
Etienne Carriereb9a95822017-04-26 15:03:53 +02001266 ret = sdp_basic_test(test, size, loop, ion_heap, rnd_offset, 0);
Etienne Carriere50abf9a2017-03-24 11:33:50 +01001267 ADBG_EXPECT(c, 1, ret);
Igor Opaniuk2e0a6792021-01-09 00:51:19 +02001268 Do_ADBG_EndSubCase(c, "SDP: NSec CA invokes a test pTA (invoke_tests.pta) (should fail)");
Etienne Carriered9be3dc2018-04-25 18:30:19 +02001269
1270 Do_ADBG_BeginSubCase(c, "SDP: Invoke TA with out of bounds SDP memref");
1271 ret = sdp_out_of_bounds_memref_test(size, ion_heap, 0);
1272 ADBG_EXPECT(c, 0, ret);
1273 Do_ADBG_EndSubCase(c, NULL);
Etienne Carriere50abf9a2017-03-24 11:33:50 +01001274}
Jens Wiklander14f48872018-06-29 15:30:13 +02001275ADBG_CASE_DEFINE(regression, 1014, xtest_tee_test_1014,
1276 "Test secure data path against SDP TAs and pTAs");
1277#endif /*CFG_SECURE_DATA_PATH*/
Jens Wiklander272d3642017-04-03 13:03:47 +02001278
1279static void xtest_tee_test_1015(ADBG_Case_t *c)
1280{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001281 TEEC_Result res = TEEC_ERROR_GENERIC;
1282 TEEC_Session session = { };
1283 uint32_t ret_orig = 0;
Jens Wiklander272d3642017-04-03 13:03:47 +02001284
Etienne Carriere11093162017-10-26 09:49:04 +02001285 /* Pseudo TA is optional: warn and nicely exit if not found */
Jens Wiklander272d3642017-04-03 13:03:47 +02001286 res = xtest_teec_open_session(&session, &pta_invoke_tests_ta_uuid, NULL,
1287 &ret_orig);
Etienne Carriere11093162017-10-26 09:49:04 +02001288 if (res == TEEC_ERROR_ITEM_NOT_FOUND) {
1289 Do_ADBG_Log(" - 1015 - skip test, pseudo TA not found");
Jens Wiklander272d3642017-04-03 13:03:47 +02001290 return;
Etienne Carriere11093162017-10-26 09:49:04 +02001291 }
1292 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Jens Wiklander272d3642017-04-03 13:03:47 +02001293
1294 ADBG_EXPECT_TEEC_SUCCESS(c,
1295 TEEC_InvokeCommand(&session, PTA_INVOKE_TESTS_CMD_FS_HTREE,
1296 NULL, &ret_orig));
1297 TEEC_CloseSession(&session);
1298}
Jens Wiklander14f48872018-06-29 15:30:13 +02001299ADBG_CASE_DEFINE(regression, 1015, xtest_tee_test_1015,
1300 "FS hash-tree corner cases");
Jerome Forissiere916b102017-06-07 17:55:52 +02001301
1302static void xtest_tee_test_1016(ADBG_Case_t *c)
1303{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001304 TEEC_Session session = { };
Jerome Forissiere916b102017-06-07 17:55:52 +02001305 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001306 uint32_t ret_orig = 0;
Jerome Forissiere916b102017-06-07 17:55:52 +02001307
1308 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1309 xtest_teec_open_session(&session, &os_test_ta_uuid, NULL,
1310 &ret_orig)))
1311 return;
1312
1313 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE,
1314 TEEC_NONE);
1315
1316 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
1317 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_TA2TA_MEMREF, &op,
1318 &ret_orig));
1319
1320 TEEC_CloseSession(&session);
1321}
Jens Wiklander14f48872018-06-29 15:30:13 +02001322ADBG_CASE_DEFINE(regression, 1016, xtest_tee_test_1016,
1323 "Test TA to TA transfers (in/out/inout memrefs on the stack)");
Jens Wiklander87e81702018-03-20 12:00:00 +08001324
1325static void xtest_tee_test_1017(ADBG_Case_t *c)
1326{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001327 TEEC_Session session = { };
Jens Wiklander87e81702018-03-20 12:00:00 +08001328 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001329 uint32_t ret_orig = 0;
1330 TEEC_SharedMemory shm = { };
Jens Wiklander87e81702018-03-20 12:00:00 +08001331 size_t page_size = 4096;
1332
Jens Wiklander87e81702018-03-20 12:00:00 +08001333 shm.size = 8 * page_size;
1334 shm.flags = TEEC_MEM_INPUT | TEEC_MEM_OUTPUT;
1335 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1336 TEEC_AllocateSharedMemory(&xtest_teec_ctx, &shm)))
1337 return;
1338
1339 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1340 xtest_teec_open_session(&session, &os_test_ta_uuid, NULL,
1341 &ret_orig)))
1342 goto out;
1343
1344 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT,
1345 TEEC_MEMREF_PARTIAL_INPUT,
1346 TEEC_MEMREF_PARTIAL_OUTPUT,
1347 TEEC_MEMREF_PARTIAL_OUTPUT);
1348
1349 /*
1350 * The first two memrefs are supposed to be combined into in
1351 * region and the last two memrefs should have one region each
1352 * when the parameters are mapped for the TA.
1353 */
1354 op.params[0].memref.parent = &shm;
1355 op.params[0].memref.size = page_size;
1356 op.params[0].memref.offset = 0;
1357
1358 op.params[1].memref.parent = &shm;
1359 op.params[1].memref.size = page_size;
1360 op.params[1].memref.offset = page_size;
1361
1362 op.params[2].memref.parent = &shm;
1363 op.params[2].memref.size = page_size;
1364 op.params[2].memref.offset = 4 * page_size;
1365
1366 op.params[3].memref.parent = &shm;
1367 op.params[3].memref.size = 2 * page_size;
1368 op.params[3].memref.offset = 6 * page_size;
1369
1370 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
1371 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_PARAMS, &op,
1372 &ret_orig));
1373
1374 TEEC_CloseSession(&session);
1375out:
1376 TEEC_ReleaseSharedMemory(&shm);
1377}
Jens Wiklander14f48872018-06-29 15:30:13 +02001378ADBG_CASE_DEFINE(regression, 1017, xtest_tee_test_1017,
1379 "Test coalescing memrefs");
Jens Wiklanderbb10bcd2018-03-20 12:50:58 +08001380
Etienne Carriere84382b32018-04-25 18:30:30 +02001381static void invoke_1byte_out_of_bounds(ADBG_Case_t *c, TEEC_Session *session,
1382 TEEC_SharedMemory *shm)
1383{
1384 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1385 TEEC_Result ret = TEEC_ERROR_GENERIC;
1386 uint32_t ret_orig = 0;
1387
1388 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT,
1389 TEEC_NONE, TEEC_NONE, TEEC_NONE);
1390
1391 op.params[0].memref.parent = shm;
1392 op.params[0].memref.size = shm->size / 2;
1393 op.params[0].memref.offset = shm->size - (shm->size / 2) + 1;
1394
1395 ret = TEEC_InvokeCommand(session, TA_OS_TEST_CMD_PARAMS,
1396 &op, &ret_orig);
1397
Etienne Carriere48fa1b22020-04-08 13:42:01 +02001398 ADBG_EXPECT_COMPARE_UNSIGNED(c, ret_orig, !=, TEEC_ORIGIN_TRUSTED_APP);
Etienne Carriere84382b32018-04-25 18:30:30 +02001399 if (ret != TEEC_ERROR_BAD_PARAMETERS && ret != TEEC_ERROR_GENERIC) {
1400 ADBG_EXPECT(c, TEEC_ERROR_BAD_PARAMETERS, ret);
1401 ADBG_EXPECT(c, TEEC_ERROR_GENERIC, ret);
1402 }
1403}
1404
Jens Wiklanderbb10bcd2018-03-20 12:50:58 +08001405static void xtest_tee_test_1018(ADBG_Case_t *c)
1406{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001407 TEEC_Session session = { };
Jens Wiklanderbb10bcd2018-03-20 12:50:58 +08001408 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001409 uint32_t ret_orig = 0;
1410 TEEC_SharedMemory shm = { };
Etienne Carriere84382b32018-04-25 18:30:30 +02001411 TEEC_Result ret = TEEC_ERROR_GENERIC;
Jens Wiklanderbb10bcd2018-03-20 12:50:58 +08001412 size_t page_size = 4096;
Joakim Becha1212b62020-04-07 12:06:00 +02001413 /* Intentionally not 4kB aligned and odd */
Etienne Carriere84382b32018-04-25 18:30:30 +02001414 uint8_t buffer[6001] = { };
1415
1416 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1417 xtest_teec_open_session(&session,
1418 &os_test_ta_uuid,
1419 NULL,
1420 &ret_orig)))
1421 return;
1422
Joakim Becha1212b62020-04-07 12:06:00 +02001423 Do_ADBG_BeginSubCase(c, "Out of bounds > 4kB on allocated shm");
Jens Wiklanderbb10bcd2018-03-20 12:50:58 +08001424
Jens Wiklanderbb10bcd2018-03-20 12:50:58 +08001425 shm.size = 8 * page_size;
1426 shm.flags = TEEC_MEM_INPUT | TEEC_MEM_OUTPUT;
1427 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Etienne Carriere84382b32018-04-25 18:30:30 +02001428 TEEC_AllocateSharedMemory(&xtest_teec_ctx,
1429 &shm)))
Jens Wiklanderbb10bcd2018-03-20 12:50:58 +08001430 goto out;
1431
1432 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT,
1433 TEEC_MEMREF_PARTIAL_INPUT,
1434 TEEC_MEMREF_PARTIAL_OUTPUT,
1435 TEEC_MEMREF_PARTIAL_OUTPUT);
1436
1437 /*
1438 * The first two memrefs are supposed to be combined into in
1439 * region and the last two memrefs should have one region each
1440 * when the parameters are mapped for the TA.
1441 */
1442 op.params[0].memref.parent = &shm;
1443 op.params[0].memref.size = page_size;
1444 op.params[0].memref.offset = 0;
1445
1446 op.params[1].memref.parent = &shm;
1447 op.params[1].memref.size = page_size;
1448 op.params[1].memref.offset = page_size;
1449
1450 op.params[2].memref.parent = &shm;
1451 op.params[2].memref.size = page_size;
1452 op.params[2].memref.offset = 4 * page_size;
1453
1454 op.params[3].memref.parent = &shm;
1455 op.params[3].memref.size = 3 * page_size;
1456 op.params[3].memref.offset = 6 * page_size;
1457
Etienne Carriere84382b32018-04-25 18:30:30 +02001458 ret = TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_PARAMS, &op,
1459 &ret_orig);
Jens Wiklanderbb10bcd2018-03-20 12:50:58 +08001460
Etienne Carriere48fa1b22020-04-08 13:42:01 +02001461 ADBG_EXPECT_COMPARE_UNSIGNED(c, ret_orig, !=, TEEC_ORIGIN_TRUSTED_APP);
Etienne Carriere84382b32018-04-25 18:30:30 +02001462 if (ret != TEEC_ERROR_BAD_PARAMETERS && ret != TEEC_ERROR_GENERIC) {
1463 ADBG_EXPECT(c, TEEC_ERROR_BAD_PARAMETERS, ret);
1464 ADBG_EXPECT(c, TEEC_ERROR_GENERIC, ret);
1465 }
1466
Jens Wiklanderbb10bcd2018-03-20 12:50:58 +08001467 TEEC_ReleaseSharedMemory(&shm);
Etienne Carriere84382b32018-04-25 18:30:30 +02001468 Do_ADBG_EndSubCase(c, NULL);
1469
1470 Do_ADBG_BeginSubCase(c, "Out of bounds by 1 byte on registered shm");
1471
1472 memset(&shm, 0, sizeof(shm));
1473 shm.flags = TEEC_MEM_INPUT | TEEC_MEM_OUTPUT;
1474 shm.buffer = buffer;
1475 shm.size = sizeof(buffer);
1476
1477 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1478 TEEC_RegisterSharedMemory(&xtest_teec_ctx,
1479 &shm)))
1480 goto out;
1481
1482 invoke_1byte_out_of_bounds(c, &session, &shm);
1483
1484 TEEC_ReleaseSharedMemory(&shm);
1485 Do_ADBG_EndSubCase(c, NULL);
1486
1487 Do_ADBG_BeginSubCase(c, "Out of bounds by 1 byte ref on allocated shm");
1488
1489 memset(&shm, 0, sizeof(shm));
1490 shm.size = sizeof(buffer);
1491 shm.flags = TEEC_MEM_INPUT | TEEC_MEM_OUTPUT;
1492 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1493 TEEC_AllocateSharedMemory(&xtest_teec_ctx,
1494 &shm)))
1495 goto out;
1496
1497 invoke_1byte_out_of_bounds(c, &session, &shm);
1498
1499 TEEC_ReleaseSharedMemory(&shm);
1500 Do_ADBG_EndSubCase(c, NULL);
1501
1502out:
1503 TEEC_CloseSession(&session);
Jens Wiklanderbb10bcd2018-03-20 12:50:58 +08001504}
Jens Wiklander14f48872018-06-29 15:30:13 +02001505ADBG_CASE_DEFINE(regression, 1018, xtest_tee_test_1018,
1506 "Test memref out of bounds");
Jerome Forissier53bde722018-05-31 09:14:54 +02001507
Jerome Forissier53bde722018-05-31 09:14:54 +02001508static void xtest_tee_test_1019(ADBG_Case_t *c)
1509{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001510 TEEC_Session session = { };
1511 uint32_t ret_orig = 0;
Jerome Forissier53bde722018-05-31 09:14:54 +02001512
1513 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1514 xtest_teec_open_session(&session, &os_test_ta_uuid, NULL,
1515 &ret_orig)))
1516 return;
1517
1518 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
1519 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CALL_LIB, NULL,
1520 &ret_orig));
1521
1522 (void)ADBG_EXPECT_TEEC_RESULT(c,
1523 TEEC_ERROR_TARGET_DEAD,
1524 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CALL_LIB_PANIC,
1525 NULL, &ret_orig));
1526
1527 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TEE, ret_orig);
1528
1529 TEEC_CloseSession(&session);
1530}
Jens Wiklander14f48872018-06-29 15:30:13 +02001531ADBG_CASE_DEFINE(regression, 1019, xtest_tee_test_1019,
1532 "Test dynamically linked TA");
Jerome Forissier3357f872018-10-05 15:13:44 +02001533
1534static void xtest_tee_test_1020(ADBG_Case_t *c)
1535{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001536 TEEC_Result res = TEEC_ERROR_GENERIC;
1537 TEEC_Session session = { };
1538 uint32_t ret_orig = 0;
Jerome Forissier3357f872018-10-05 15:13:44 +02001539
1540 /* Pseudo TA is optional: warn and nicely exit if not found */
1541 res = xtest_teec_open_session(&session, &pta_invoke_tests_ta_uuid, NULL,
1542 &ret_orig);
1543 if (res == TEEC_ERROR_ITEM_NOT_FOUND) {
1544 Do_ADBG_Log(" - 1020 - skip test, pseudo TA not found");
1545 return;
1546 }
1547 ADBG_EXPECT_TEEC_SUCCESS(c, res);
1548
1549 res = TEEC_InvokeCommand(&session, PTA_INVOKE_TESTS_CMD_LOCKDEP,
1550 NULL, &ret_orig);
1551 if (res != TEEC_SUCCESS) {
1552 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
1553 ret_orig);
1554 if (res == TEEC_ERROR_NOT_SUPPORTED) {
1555 Do_ADBG_Log(" - 1020 - skip test, feature not "
1556 "implemented");
1557 goto out;
1558 }
1559 /* Error */
1560 (void)ADBG_EXPECT_TEEC_SUCCESS(c, res);
1561 }
1562out:
1563 TEEC_CloseSession(&session);
1564}
1565ADBG_CASE_DEFINE(regression, 1020, xtest_tee_test_1020,
1566 "Test lockdep algorithm");
Ovidiu Mihalachi15cecff2019-04-02 16:36:31 +03001567
1568static TEEC_Result open_sec_session(TEEC_Session *session,
1569 const TEEC_UUID *uuid)
1570{
1571 TEEC_Result res = TEEC_ERROR_GENERIC;
1572 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1573 uint32_t ret_orig = 0;
1574
1575 op.params[0].tmpref.buffer = (void *)uuid;
1576 op.params[0].tmpref.size = sizeof(*uuid);
1577 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1578 TEEC_NONE, TEEC_NONE, TEEC_NONE);
1579
1580 res = TEEC_InvokeCommand(session, TA_SIMS_OPEN_TA_SESSION,
1581 &op, &ret_orig);
1582 if (res != TEEC_SUCCESS)
1583 return TEEC_ERROR_GENERIC;
1584
1585 return res;
1586}
1587
1588static TEEC_Result sims_get_counter(TEEC_Session *session,
1589 uint32_t *counter)
1590{
1591 TEEC_Result res = TEEC_ERROR_GENERIC;
1592 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1593 uint32_t ret_orig = 0;
1594
1595 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT,
1596 TEEC_NONE, TEEC_NONE, TEEC_NONE);
1597
1598 res = TEEC_InvokeCommand(session, TA_SIMS_CMD_GET_COUNTER,
1599 &op, &ret_orig);
1600 if (res == TEEC_SUCCESS)
1601 *counter = op.params[0].value.a;
1602
1603 return res;
1604}
1605
1606static TEEC_Result trigger_panic(TEEC_Session *session,
1607 const TEEC_UUID *uuid)
1608{
1609 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1610 uint32_t ret_orig = 0;
1611
1612 if (!uuid) {
1613 op.params[0].tmpref.buffer = NULL;
1614 op.params[0].tmpref.size = 0;
1615 } else {
1616 op.params[0].tmpref.buffer = (void *)uuid;
1617 op.params[0].tmpref.size = sizeof(*uuid);
1618 }
1619 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1620 TEEC_NONE, TEEC_NONE, TEEC_NONE);
1621
1622 return TEEC_InvokeCommand(session, TA_SIMS_CMD_PANIC,
1623 &op, &ret_orig);
1624}
1625
1626static void test_panic_ca_to_ta(ADBG_Case_t *c, const TEEC_UUID *uuid,
1627 bool multi_instance)
1628{
1629 TEEC_Result exp_res = TEEC_ERROR_GENERIC;
1630 uint32_t counter = 0;
1631 uint32_t ret_orig = 0;
1632 uint32_t exp_counter = 0;
1633 TEEC_Session cs[3] = { };
1634
1635 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1636 xtest_teec_open_session(&cs[0], uuid, NULL,
1637 &ret_orig)))
1638 return;
1639
1640 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1641 xtest_teec_open_session(&cs[1], uuid, NULL,
1642 &ret_orig)))
1643 goto bail0;
1644
1645 if (!ADBG_EXPECT_TEEC_SUCCESS(c, sims_get_counter(&cs[0], &counter)))
1646 goto bail1;
1647
1648 if (!ADBG_EXPECT(c, 0, counter))
1649 goto bail1;
1650
1651 if (!ADBG_EXPECT_TEEC_SUCCESS(c, sims_get_counter(&cs[1], &counter)))
1652 goto bail1;
1653
1654 exp_counter = multi_instance ? 0 : 1;
Ovidiu Mihalachi110aac42019-09-11 14:08:01 +03001655 if (!ADBG_EXPECT(c, exp_counter, counter))
Ovidiu Mihalachi15cecff2019-04-02 16:36:31 +03001656 goto bail1;
1657
1658 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
1659 trigger_panic(&cs[1], NULL)))
1660 goto bail1;
1661
1662 exp_res = multi_instance ? TEEC_SUCCESS : TEEC_ERROR_TARGET_DEAD;
1663 if (!ADBG_EXPECT_TEEC_RESULT(c, exp_res,
1664 sims_get_counter(&cs[0], &counter)))
1665 goto bail1;
1666
1667 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
1668 sims_get_counter(&cs[1], &counter)))
1669 goto bail1;
1670
1671 /* Attempt to open a session on panicked context */
Ovidiu Mihalachi110aac42019-09-11 14:08:01 +03001672 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Ovidiu Mihalachi15cecff2019-04-02 16:36:31 +03001673 xtest_teec_open_session(&cs[1], uuid, NULL,
1674 &ret_orig)))
1675 goto bail1;
1676
1677 /* Sanity check of still valid TA context */
1678 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1679 xtest_teec_open_session(&cs[2], uuid, NULL,
1680 &ret_orig)))
1681 goto bail1;
1682
1683 /* Sanity check of still valid TA context */
1684 if (multi_instance) {
1685 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1686 sims_get_counter(&cs[0], &counter)))
1687 goto bail2;
1688
1689 if (!ADBG_EXPECT(c, 0, counter))
1690 goto bail2;
1691 }
1692
1693 if (!ADBG_EXPECT_TEEC_SUCCESS(c, sims_get_counter(&cs[2], &counter)))
1694 goto bail2;
1695
Ovidiu Mihalachi110aac42019-09-11 14:08:01 +03001696 exp_counter = multi_instance ? 0 : 1;
1697 if (!ADBG_EXPECT(c, exp_counter, counter))
Ovidiu Mihalachi15cecff2019-04-02 16:36:31 +03001698 goto bail2;
1699
1700bail2:
1701 TEEC_CloseSession(&cs[2]);
1702bail1:
1703 TEEC_CloseSession(&cs[1]);
1704bail0:
1705 TEEC_CloseSession(&cs[0]);
1706}
1707
1708static void test_panic_ta_to_ta(ADBG_Case_t *c, const TEEC_UUID *uuid1,
1709 const TEEC_UUID *uuid2)
1710{
1711 uint32_t ret_orig = 0;
1712 uint32_t counter = 0;
1713 TEEC_Session cs[3] = { };
1714
1715 /* Test pre-conditions */
1716 /* 2.1 - CA opens a session toward TA1 */
1717 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1718 xtest_teec_open_session(&cs[0], uuid1, NULL,
1719 &ret_orig)))
1720 return;
1721
1722 /* 2.2 - CA opens a session toward TA2 */
1723 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1724 xtest_teec_open_session(&cs[1], uuid2, NULL,
1725 &ret_orig)))
1726 goto bail0;
1727
1728 /* 2.3 - TA1 opens a session toward TA2 */
1729 if (!ADBG_EXPECT_TEEC_SUCCESS(c, open_sec_session(&cs[0], uuid2)))
1730 goto bail1;
1731
1732 /* 2.4 - CA invokes TA2 which panics */
1733 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
1734 trigger_panic(&cs[1], NULL)))
1735 goto bail1;
1736
1737 /* Expected results */
1738 /* 2.5 - Expect CA->TA1 session is still alive */
1739 if (!ADBG_EXPECT_TEEC_SUCCESS(c, sims_get_counter(&cs[0], &counter)))
1740 goto bail1;
1741
1742 /* 2.6 - Expect CA->TA2 session is properly released */
1743 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
1744 sims_get_counter(&cs[1], &counter)))
1745 goto bail1;
1746
1747bail1:
1748 TEEC_CloseSession(&cs[1]);
1749bail0:
1750 TEEC_CloseSession(&cs[0]);
1751
1752 memset(cs, 0, sizeof(cs));
1753
1754 /* Test pre-conditions */
1755 /* 2.1 - CA opens a session toward TA1 */
1756 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1757 xtest_teec_open_session(&cs[0], uuid1, NULL,
1758 &ret_orig)))
1759 return;
1760
1761 /* 2.2 - CA opens a session toward TA2 */
1762 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1763 xtest_teec_open_session(&cs[1], uuid2, NULL,
1764 &ret_orig)))
1765 goto bail2;
1766
1767 /* 2.3 - TA1 opens a session toward TA2 */
1768 if (!ADBG_EXPECT_TEEC_SUCCESS(c, open_sec_session(&cs[0], uuid2)))
1769 goto bail3;
1770
1771 /* 2.4 - CA invokes TA1 which invokes TA2 which panics */
1772 if (!ADBG_EXPECT_TEEC_SUCCESS(c, trigger_panic(&cs[0], uuid2)))
1773 goto bail3;
1774
1775 /* Expected results */
1776 /* 2.5 - Expect CA->TA1 session is still alive */
1777 if (!ADBG_EXPECT_TEEC_SUCCESS(c, sims_get_counter(&cs[0], &counter)))
1778 goto bail3;
1779
1780 /* 2.6 - Expect CA->TA2 session is properly released */
1781 if (!ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
1782 sims_get_counter(&cs[1], &counter)))
1783 goto bail3;
1784
1785bail3:
1786 TEEC_CloseSession(&cs[1]);
1787bail2:
1788 TEEC_CloseSession(&cs[0]);
1789}
1790
1791static void xtest_tee_test_1021(ADBG_Case_t *c)
1792{
1793 Do_ADBG_BeginSubCase(c, "Multiple Instances Single Session");
1794 test_panic_ca_to_ta(c, &miss_test_ta_uuid, true);
1795 Do_ADBG_EndSubCase(c, "Multiple Instances Single Session");
1796
1797 Do_ADBG_BeginSubCase(c, "Single Instance Multi Sessions");
1798 test_panic_ca_to_ta(c, &sims_test_ta_uuid, false);
1799 Do_ADBG_EndSubCase(c, "Single Instance Multi Sessions");
1800
1801 Do_ADBG_BeginSubCase(c, "Single Instance Multi Sessions Keep Alive");
1802 test_panic_ca_to_ta(c, &sims_keepalive_test_ta_uuid, false);
1803 Do_ADBG_EndSubCase(c, "Single Instance Multi Sessions Keep Alive");
1804
1805 Do_ADBG_BeginSubCase(c, "Multi Sessions TA to TA");
1806 test_panic_ta_to_ta(c, &sims_test_ta_uuid,
1807 &sims_keepalive_test_ta_uuid);
1808 Do_ADBG_EndSubCase(c, "Multi Sessions TA to TA");
1809}
1810ADBG_CASE_DEFINE(regression, 1021, xtest_tee_test_1021,
1811 "Test panic context release");
Jerome Forissiera9ab5d02019-03-17 21:14:06 +01001812
1813static void xtest_tee_test_1022(ADBG_Case_t *c)
1814{
1815 TEEC_Session session = { 0 };
1816 uint32_t ret_orig = 0;
1817
1818 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1819 xtest_teec_open_session(&session, &os_test_ta_uuid,
1820 NULL, &ret_orig)))
1821 return;
1822
1823 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
1824 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CALL_LIB_DL, NULL,
1825 &ret_orig));
1826
1827 (void)ADBG_EXPECT_TEEC_RESULT(c,
1828 TEEC_ERROR_TARGET_DEAD,
1829 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CALL_LIB_DL_PANIC,
1830 NULL, &ret_orig));
1831
1832 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TEE, ret_orig);
1833
1834 TEEC_CloseSession(&session);
1835}
1836ADBG_CASE_DEFINE(regression, 1022, xtest_tee_test_1022,
1837 "Test dlopen()/dlsym()/dlclose() API");
Jerome Forissiere9571e82020-02-18 15:26:20 +01001838
1839/*
1840 * Testing the ELF initialization (.init_array)
1841 *
1842 * - The TA has a global variable which can also be accessed by the two shared
1843 * libraries os_test_lib (linked with the TA) and os_test_lib_dl (loaded via
1844 * dlopen())
1845 * - The TA and both libraries have initialization functions (declared with the
1846 * "constructor" attribute) which perform the following:
1847 * * The TA multiplies by 10 then adds 1
1848 * * os_test_lib multiplies by 10 then adds 2
1849 * * os_test_lib_dl multiplies by 10 then adds 3
1850 * By testing the variable value we make sure the initializations occurred in
1851 * the correct order.
1852 */
1853static void xtest_tee_test_1023(ADBG_Case_t *c)
1854{
1855 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1856 TEEC_Session session = { 0 };
1857 uint32_t ret_orig = 0;
1858
1859 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE,
1860 TEEC_NONE, TEEC_NONE);
1861
1862 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1863 xtest_teec_open_session(&session, &os_test_ta_uuid,
1864 NULL, &ret_orig)))
1865 return;
1866
1867 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
1868 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_GET_GLOBAL_VAR, &op,
1869 &ret_orig));
1870
1871 /* Expected: initialization of os_test_lib, then TA */
1872 (void)ADBG_EXPECT_COMPARE_SIGNED(c, op.params[0].value.a, ==, 21);
1873
1874 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
1875 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CALL_LIB_DL, NULL,
1876 &ret_orig));
1877
1878 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
1879 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_GET_GLOBAL_VAR, &op,
1880 &ret_orig));
1881
1882 /* Expected: initialization of os_test_lib_dl */
1883 (void)ADBG_EXPECT_COMPARE_SIGNED(c, op.params[0].value.a, ==, 213);
1884
1885 TEEC_CloseSession(&session);
1886}
1887ADBG_CASE_DEFINE(regression, 1023, xtest_tee_test_1023,
1888 "Test ELF initialization (.init_array)");
Javier Almansa Sobrinocddc0002020-02-10 13:35:37 +00001889
1890#ifdef CFG_CORE_TPM_EVENT_LOG
1891static void xtest_tee_test_1024(ADBG_Case_t *c)
1892{
1893 TEEC_Session session = {};
1894 uint32_t ret_orig = 0;
1895
1896 xtest_teec_open_session(&session, &tpm_log_test_ta_uuid,
1897 NULL, &ret_orig);
1898
1899 Do_ADBG_BeginSubCase(c, "TPM test service invocation");
1900 ADBG_EXPECT_TEEC_SUCCESS(c, TEEC_InvokeCommand(&session,
1901 TA_TPM_TEST_GET_LOG,
1902 NULL, &ret_orig));
1903 Do_ADBG_EndSubCase(c, "TPM test service invocation");
1904
1905 Do_ADBG_BeginSubCase(c, "TPM test passing short buffer");
1906 ADBG_EXPECT_TEEC_SUCCESS(c, TEEC_InvokeCommand(&session,
1907 TA_TPM_TEST_SHORT_BUF,
1908 NULL, &ret_orig));
1909 Do_ADBG_EndSubCase(c, "TPM test passing short buffer");
1910
1911 TEEC_CloseSession(&session);
1912}
1913
1914ADBG_CASE_DEFINE(regression, 1024, xtest_tee_test_1024,
1915 "Test PTA_SYSTEM_GET_TPM_EVENT_LOG Service");
1916#endif /* CFG_CORE_TPM_EVENT_LOG */
Cedric Neveux9f483bb2019-03-04 08:58:06 +01001917
1918static void xtest_tee_test_1025(ADBG_Case_t *c)
1919{
1920 TEEC_Session session = {};
1921 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
1922 uint32_t ret_orig = 0;
1923 uint8_t *empty_buf = NULL;
Etienne Carriere71383d42020-04-14 12:31:25 +02001924 TEEC_SharedMemory shm = { };
Etienne Carrieredba3f3b2020-04-08 17:08:16 +02001925 TEEC_Result res = TEEC_ERROR_GENERIC;
Etienne Carriere71383d42020-04-14 12:31:25 +02001926
1927 Do_ADBG_BeginSubCase(c, "Invalid NULL buffer memref registration");
1928
1929 memset(&shm, 0, sizeof(shm));
1930 shm.flags = TEEC_MEM_INPUT;
1931 shm.buffer = NULL;
1932 shm.size = 0;
1933
1934 ADBG_EXPECT(c, TEEC_ERROR_BAD_PARAMETERS,
1935 TEEC_RegisterSharedMemory(&xtest_teec_ctx, &shm));
1936
1937 memset(&shm, 0, sizeof(shm));
1938 shm.flags = TEEC_MEM_OUTPUT;
1939 shm.buffer = NULL;
1940 shm.size = 0;
1941
1942 ADBG_EXPECT(c, TEEC_ERROR_BAD_PARAMETERS,
1943 TEEC_RegisterSharedMemory(&xtest_teec_ctx, &shm));
1944
1945 Do_ADBG_EndSubCase(c, "Invalid NULL buffer memref registration");
Cedric Neveux9f483bb2019-03-04 08:58:06 +01001946
Etienne Carrierec602a522020-04-13 18:53:17 +02001947 if (!xtest_teec_ctx.memref_null) {
Etienne Carriere71383d42020-04-14 12:31:25 +02001948 Do_ADBG_Log("Skip subcases: MEMREF_NULL capability not supported");
Etienne Carrierec602a522020-04-13 18:53:17 +02001949 return;
1950 }
1951
Cedric Neveux9f483bb2019-03-04 08:58:06 +01001952 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1953 xtest_teec_open_session(&session,
1954 &os_test_ta_uuid,
1955 NULL, &ret_orig)))
1956 return;
1957
1958 empty_buf = malloc(1);
1959 if (!empty_buf) {
1960 (void)ADBG_EXPECT_TEEC_SUCCESS(c, TEEC_ERROR_OUT_OF_MEMORY);
Etienne Carrieredba3f3b2020-04-08 17:08:16 +02001961 goto out_session;
Cedric Neveux9f483bb2019-03-04 08:58:06 +01001962 }
1963
1964 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
1965 TEEC_MEMREF_TEMP_INPUT,
1966 TEEC_MEMREF_TEMP_OUTPUT,
1967 TEEC_MEMREF_TEMP_OUTPUT);
1968
1969 Do_ADBG_BeginSubCase(c,
1970 "Input/Output MEMREF Buffer NULL - Size 0 bytes");
1971
1972 op.params[0].tmpref.buffer = empty_buf;
1973 op.params[0].tmpref.size = 0;
1974
1975 op.params[1].tmpref.buffer = NULL;
1976 op.params[1].tmpref.size = 0;
1977
1978 op.params[2].tmpref.buffer = empty_buf;
1979 op.params[2].tmpref.size = 0;
1980
1981 op.params[3].tmpref.buffer = NULL;
1982 op.params[3].tmpref.size = 0;
1983
1984 ADBG_EXPECT(c, TEE_SUCCESS,
1985 TEEC_InvokeCommand(&session,
1986 TA_OS_TEST_CMD_NULL_MEMREF_PARAMS, &op,
1987 &ret_orig));
1988
1989 Do_ADBG_EndSubCase(c, "Input/Output MEMREF Buffer NULL - Size 0 bytes");
1990
1991 Do_ADBG_BeginSubCase(c, "Input MEMREF Buffer NULL - Size non 0 bytes");
1992
1993 op.params[0].tmpref.buffer = empty_buf;
1994 op.params[0].tmpref.size = 1;
1995
1996 op.params[1].tmpref.buffer = NULL;
1997 op.params[1].tmpref.size = 0;
1998
1999 op.params[2].tmpref.buffer = empty_buf;
2000 op.params[2].tmpref.size = 0;
2001
2002 op.params[3].tmpref.buffer = NULL;
2003 op.params[3].tmpref.size = 0;
2004
2005 ADBG_EXPECT(c, TEE_ERROR_BAD_PARAMETERS,
2006 TEEC_InvokeCommand(&session,
2007 TA_OS_TEST_CMD_NULL_MEMREF_PARAMS, &op,
2008 &ret_orig));
2009
Etienne Carrieredba3f3b2020-04-08 17:08:16 +02002010 TEEC_CloseSession(&session);
2011
Cedric Neveux9f483bb2019-03-04 08:58:06 +01002012 Do_ADBG_EndSubCase(c, "Input MEMREF Buffer NULL - Size non 0 bytes");
2013
Etienne Carrieredba3f3b2020-04-08 17:08:16 +02002014 Do_ADBG_BeginSubCase(c, "Input MEMREF Buffer NULL over PTA invocation");
2015
2016 /* Pseudo TA is optional: warn and nicely exit if not found */
2017 res = xtest_teec_open_session(&session, &pta_invoke_tests_ta_uuid, NULL,
2018 &ret_orig);
2019 if (res == TEEC_ERROR_ITEM_NOT_FOUND) {
2020 Do_ADBG_Log(" - 1025 - skip test, pseudo TA not found");
2021 goto out;
2022 }
2023 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2024 goto out;
2025
2026 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE,
2027 TEEC_NONE, TEEC_NONE);
2028 op.params[0].tmpref.buffer = NULL;
2029 op.params[0].tmpref.size = 0;
2030
2031 ADBG_EXPECT(c, TEE_SUCCESS,
2032 TEEC_InvokeCommand(&session,
2033 PTA_INVOKE_TESTS_CMD_MEMREF_NULL,
2034 &op, &ret_orig));
2035
2036out_session:
Cedric Neveux9f483bb2019-03-04 08:58:06 +01002037 TEEC_CloseSession(&session);
Etienne Carrieredba3f3b2020-04-08 17:08:16 +02002038out:
2039 Do_ADBG_EndSubCase(c, NULL);
Cedric Neveux9f483bb2019-03-04 08:58:06 +01002040 free(empty_buf);
2041}
2042ADBG_CASE_DEFINE(regression, 1025, xtest_tee_test_1025,
2043 "Test memref NULL and/or 0 bytes size");
Vesa Jääskeläinene8c0c8d2020-04-05 20:11:53 +03002044
Vesa Jääskeläinen502c5492020-04-05 20:12:02 +03002045#define TEE_UUID_NS_NAME_SIZE 128
2046
2047/*
2048 * TEE Client UUID name space identifier (UUIDv4)
2049 *
2050 * Value here is random UUID that is allocated as name space identifier for
2051 * forming Client UUID's for TEE environment using UUIDv5 scheme.
2052 */
2053static const char *client_uuid_linux_ns = "58ac9ca0-2086-4683-a1b8-ec4bc08e01b6";
2054
Vesa Jääskeläinene8c0c8d2020-04-05 20:11:53 +03002055/* TEEC_LOGIN_PUBLIC's Client UUID is NIL UUID */
2056static TEEC_UUID client_uuid_public = { };
2057
2058static void xtest_tee_test_1026(ADBG_Case_t *c)
2059{
2060 TEEC_Result result = TEEC_ERROR_GENERIC;
2061 uint32_t ret_orig = 0;
2062 TEEC_Session session = { };
2063 uint32_t login = UINT32_MAX;
2064 TEEC_UUID client_uuid = { };
2065
2066 result = TEEC_OpenSession(&xtest_teec_ctx, &session, &os_test_ta_uuid,
2067 TEEC_LOGIN_PUBLIC, NULL, NULL, &ret_orig);
2068
2069 if (!ADBG_EXPECT_TEEC_SUCCESS(c, result))
2070 return;
2071
2072 result = ta_os_test_cmd_client_identity(&session, &login,
2073 &client_uuid);
2074
2075 if (!ADBG_EXPECT_TEEC_SUCCESS(c, result))
2076 goto out;
2077
2078 ADBG_EXPECT_COMPARE_UNSIGNED(c, login, ==, TEEC_LOGIN_PUBLIC);
2079
2080 ADBG_EXPECT_EQUAL(c, &client_uuid_public, &client_uuid,
2081 sizeof(TEEC_UUID));
2082
2083out:
2084 TEEC_CloseSession(&session);
2085}
2086
2087ADBG_CASE_DEFINE(regression, 1026, xtest_tee_test_1026,
2088 "Session: public login");
Vesa Jääskeläinen502c5492020-04-05 20:12:02 +03002089
Etienne Carrieref461e1d2020-05-19 12:42:08 +02002090/*
2091 * regression_1027
2092 * Depends on OpenSSL
Jerome Forissier81e71a82021-06-16 10:39:12 +02002093 * Depends on kernel commit c5b4312bea5d ("tee: optee: Add support for session
2094 * login client UUID generation")
2095 * https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c5b4312bea5d
Etienne Carrieref461e1d2020-05-19 12:42:08 +02002096 *
2097 * xtest skips the test when not built with OpenSSL.
2098 */
Vesa Jääskeläinen502c5492020-04-05 20:12:02 +03002099static void xtest_tee_test_1027(ADBG_Case_t *c)
2100{
Victor Chong8e070bc2020-05-13 09:59:33 +01002101#ifdef OPENSSL_FOUND
Vesa Jääskeläinen502c5492020-04-05 20:12:02 +03002102 TEEC_Result result = TEEC_ERROR_GENERIC;
2103 uint32_t ret_orig = 0;
2104 TEEC_Session session = { };
2105 uint32_t login = UINT32_MAX;
2106 TEEC_UUID client_uuid = { };
2107 TEEC_UUID expected_client_uuid = { };
2108 TEEC_UUID uuid_ns = { };
2109 char uuid_name[TEE_UUID_NS_NAME_SIZE] = { };
2110
2111 result = xtest_uuid_from_str(&uuid_ns, client_uuid_linux_ns);
2112
2113 if (!ADBG_EXPECT_TEEC_SUCCESS(c, result))
2114 return;
2115
2116 sprintf(uuid_name, "uid=%x", geteuid());
2117
2118 result = xtest_uuid_v5(&expected_client_uuid, &uuid_ns, uuid_name,
2119 strlen(uuid_name));
2120 if (!ADBG_EXPECT_TEEC_SUCCESS(c, result))
2121 return;
2122
2123 result = TEEC_OpenSession(&xtest_teec_ctx, &session, &os_test_ta_uuid,
2124 TEEC_LOGIN_USER, NULL, NULL, &ret_orig);
2125
2126 if (!ADBG_EXPECT_TEEC_SUCCESS(c, result))
2127 return;
2128
2129 result = ta_os_test_cmd_client_identity(&session, &login,
2130 &client_uuid);
2131
2132 if (!ADBG_EXPECT_TEEC_SUCCESS(c, result))
2133 goto out;
2134
2135 ADBG_EXPECT_COMPARE_UNSIGNED(c, login, ==, TEEC_LOGIN_USER);
2136
2137 ADBG_EXPECT_EQUAL(c, &expected_client_uuid, &client_uuid,
2138 sizeof(TEEC_UUID));
2139
2140out:
2141 TEEC_CloseSession(&session);
Victor Chong8e070bc2020-05-13 09:59:33 +01002142#else /*!OPENSSL_FOUND*/
2143 UNUSED(c);
Etienne Carriere359b0032020-05-16 05:56:48 +02002144 UNUSED(client_uuid_linux_ns);
Victor Chong8e070bc2020-05-13 09:59:33 +01002145 /* xtest_uuid_v5() depends on OpenSSL */
2146 Do_ADBG_Log("OpenSSL not available, skipping test 1027");
2147#endif
Vesa Jääskeläinen502c5492020-04-05 20:12:02 +03002148}
2149
2150ADBG_CASE_DEFINE(regression, 1027, xtest_tee_test_1027,
2151 "Session: user login for current user");
Vesa Jääskeläinen30dd0872020-04-05 20:12:06 +03002152
Etienne Carrieref461e1d2020-05-19 12:42:08 +02002153/*
2154 * regression_1028
Jerome Forissier81e71a82021-06-16 10:39:12 +02002155 * Depends on kernel commit c5b4312bea5d ("tee: optee: Add support for session
2156 * login client UUID generation")
2157 * https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c5b4312bea5d
Etienne Carrieref461e1d2020-05-19 12:42:08 +02002158 *
2159 * xtest skips the test when not built with OpenSSL.
2160 */
Vesa Jääskeläinen30dd0872020-04-05 20:12:06 +03002161static void xtest_tee_test_1028(ADBG_Case_t *c)
2162{
Victor Chong8e070bc2020-05-13 09:59:33 +01002163#ifdef OPENSSL_FOUND
Vesa Jääskeläinen30dd0872020-04-05 20:12:06 +03002164 TEEC_Result result = TEEC_ERROR_GENERIC;
2165 uint32_t ret_orig = 0;
2166 TEEC_Session session = { };
2167 uint32_t login = UINT32_MAX;
2168 TEEC_UUID client_uuid = { };
2169 TEEC_UUID expected_client_uuid = { };
2170 TEEC_UUID uuid_ns = { };
2171 char uuid_name[TEE_UUID_NS_NAME_SIZE] = { };
2172 uint32_t group = 0;
2173
2174 group = getegid();
2175
2176 result = xtest_uuid_from_str(&uuid_ns, client_uuid_linux_ns);
2177
2178 if (!ADBG_EXPECT_TEEC_SUCCESS(c, result))
2179 return;
2180
2181 sprintf(uuid_name, "gid=%x", group);
2182
2183 result = xtest_uuid_v5(&expected_client_uuid, &uuid_ns, uuid_name,
2184 strlen(uuid_name));
2185 if (!ADBG_EXPECT_TEEC_SUCCESS(c, result))
2186 return;
2187
2188 result = TEEC_OpenSession(&xtest_teec_ctx, &session, &os_test_ta_uuid,
2189 TEEC_LOGIN_GROUP, &group, NULL, &ret_orig);
2190
2191 if (!ADBG_EXPECT_TEEC_SUCCESS(c, result))
2192 return;
2193
2194 result = ta_os_test_cmd_client_identity(&session, &login,
2195 &client_uuid);
2196
2197 if (!ADBG_EXPECT_TEEC_SUCCESS(c, result))
2198 goto out;
2199
2200 ADBG_EXPECT_COMPARE_UNSIGNED(c, login, ==, TEEC_LOGIN_GROUP);
2201
2202 ADBG_EXPECT_EQUAL(c, &expected_client_uuid, &client_uuid,
2203 sizeof(TEEC_UUID));
2204
2205out:
2206 TEEC_CloseSession(&session);
Victor Chong8e070bc2020-05-13 09:59:33 +01002207#else /*!OPENSSL_FOUND*/
2208 UNUSED(c);
2209 /* xtest_uuid_v5() depends on OpenSSL */
2210 Do_ADBG_Log("OpenSSL not available, skipping test 1028");
2211#endif
Vesa Jääskeläinen30dd0872020-04-05 20:12:06 +03002212}
2213
2214ADBG_CASE_DEFINE(regression, 1028, xtest_tee_test_1028,
2215 "Session: group login for current user's effective group");
Jerome Forissier9a7101b2020-06-17 17:55:00 +02002216
2217static void xtest_tee_test_1029(ADBG_Case_t *c)
2218{
Jerome Forissier82e87bb2020-08-19 14:00:09 +02002219 TEEC_Result res = TEEC_SUCCESS;
Jerome Forissier9a7101b2020-06-17 17:55:00 +02002220 TEEC_Session session = { 0 };
2221 uint32_t ret_orig = 0;
2222
2223 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2224 xtest_teec_open_session(&session, &os_test_ta_uuid,
2225 NULL, &ret_orig)))
2226 return;
2227
2228 Do_ADBG_BeginSubCase(c, "TLS variables (main program)");
Jerome Forissier82e87bb2020-08-19 14:00:09 +02002229 res = TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_TLS_TEST_MAIN, NULL,
2230 &ret_orig);
2231 if (res == TEEC_ERROR_NOT_SUPPORTED)
2232 Do_ADBG_Log(" - 1029 - skip test, "
2233 "TA returned TEEC_ERROR_NOT_SUPPORTED");
2234 else
2235 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Jerome Forissier9a7101b2020-06-17 17:55:00 +02002236 Do_ADBG_EndSubCase(c, "TLS variables (main program)");
2237
2238 Do_ADBG_BeginSubCase(c, "TLS variables (shared library)");
Jerome Forissier82e87bb2020-08-19 14:00:09 +02002239 res = TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_TLS_TEST_SHLIB, NULL,
2240 &ret_orig);
2241 if (res == TEEC_ERROR_NOT_SUPPORTED)
2242 Do_ADBG_Log(" - 1029 - skip test, "
2243 "TA returned TEEC_ERROR_NOT_SUPPORTED");
2244 else
2245 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Jerome Forissier9a7101b2020-06-17 17:55:00 +02002246 Do_ADBG_EndSubCase(c, "TLS variables (shared library)");
2247
2248 TEEC_CloseSession(&session);
2249}
2250ADBG_CASE_DEFINE(regression, 1029, xtest_tee_test_1029,
2251 "Test __thread attribute");
Jerome Forissier4565c452020-06-17 17:55:00 +02002252
2253static void xtest_tee_test_1030(ADBG_Case_t *c)
2254{
2255 TEEC_Session session = { 0 };
2256 uint32_t ret_orig = 0;
2257
2258 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2259 xtest_teec_open_session(&session, &os_test_ta_uuid,
2260 NULL, &ret_orig)))
2261 return;
2262
2263 Do_ADBG_BeginSubCase(c, "Before dlopen()");
2264 ADBG_EXPECT_TEEC_SUCCESS(c,
2265 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_DL_PHDR, NULL,
2266 &ret_orig));
2267 Do_ADBG_EndSubCase(c, "Before dlopen()");
2268
2269 Do_ADBG_BeginSubCase(c, "After dlopen()");
2270 ADBG_EXPECT_TEEC_SUCCESS(c,
2271 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_DL_PHDR_DL, NULL,
2272 &ret_orig));
2273 Do_ADBG_EndSubCase(c, "After dlopen()");
2274
2275 TEEC_CloseSession(&session);
2276}
2277ADBG_CASE_DEFINE(regression, 1030, xtest_tee_test_1030,
2278 "Test dl_iterate_phdr()");
Jerome Forissier1a205ae2020-06-17 17:55:00 +02002279
2280#ifndef __clang__
2281static void xtest_tee_test_1031(ADBG_Case_t *c)
2282{
2283 TEEC_Result ret = TEE_SUCCESS;
2284 TEEC_Session session = { 0 };
2285 uint32_t ret_orig = 0;
2286
2287 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2288 xtest_teec_open_session(&session, &os_test_ta_uuid,
2289 NULL, &ret_orig)))
2290 return;
2291
2292 Do_ADBG_BeginSubCase(c, "Global object constructor (main program)");
2293 ret = TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CXX_CTOR_MAIN, NULL,
2294 &ret_orig);
2295 if (ret == TEEC_ERROR_NOT_SUPPORTED) {
2296 printf("TA not built with C++ support, skipping C++ tests\n");
2297 Do_ADBG_EndSubCase(c, "Global object constructor (main program)");
2298 goto out;
2299
2300 }
2301 ADBG_EXPECT_TEEC_SUCCESS(c, ret);
2302 Do_ADBG_EndSubCase(c, "Global object constructor (main program)");
2303
2304 Do_ADBG_BeginSubCase(c, "Global object constructor (shared library)");
2305 ADBG_EXPECT_TEEC_SUCCESS(c,
2306 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CXX_CTOR_SHLIB,
2307 NULL, &ret_orig));
2308 Do_ADBG_EndSubCase(c, "Global object constructor (shared library)");
2309
2310 Do_ADBG_BeginSubCase(c, "Global object constructor (dlopen()ed lib)");
2311 ADBG_EXPECT_TEEC_SUCCESS(c,
2312 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CXX_CTOR_SHLIB_DL,
2313 NULL, &ret_orig));
2314 Do_ADBG_EndSubCase(c, "Global object constructor (dlopen()ed lib)");
2315
2316 Do_ADBG_BeginSubCase(c, "Exceptions (simple)");
2317 ADBG_EXPECT_TEEC_SUCCESS(c,
2318 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CXX_EXC_MAIN, NULL,
2319 &ret_orig));
2320 Do_ADBG_EndSubCase(c, "Exceptions (simple)");
2321
2322 Do_ADBG_BeginSubCase(c, "Exceptions (mixed C/C++ frames)");
2323 ADBG_EXPECT_TEEC_SUCCESS(c,
2324 TEEC_InvokeCommand(&session, TA_OS_TEST_CMD_CXX_EXC_MIXED, NULL,
2325 &ret_orig));
2326 Do_ADBG_EndSubCase(c, "Exceptions (mixed C/C++ frames)");
2327out:
2328 TEEC_CloseSession(&session);
2329}
2330ADBG_CASE_DEFINE(regression, 1031, xtest_tee_test_1031,
2331 "Test C++ features");
2332#endif
Jens Wiklandere16da892020-09-04 09:24:16 +02002333
2334static void xtest_tee_test_1032(ADBG_Case_t *c)
2335{
2336 TEEC_Result res = TEEC_SUCCESS;
2337 TEEC_Context ctx = { };
2338 TEEC_SharedMemory shm1 = {
2339 .buffer = xtest_tee_test_1032,
2340 .size = 32,
2341 .flags = TEEC_MEM_INPUT,
2342 };
2343 static const uint8_t dummy_data[32] = { 1, 2, 3, 4, };
2344 TEEC_SharedMemory shm2 = {
2345 .buffer = (void *)dummy_data,
2346 .size = sizeof(dummy_data),
2347 .flags = TEEC_MEM_INPUT,
2348 };
2349
2350 res = TEEC_InitializeContext(xtest_tee_name, &ctx);
2351 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
2352 return;
2353
2354 res = TEEC_RegisterSharedMemory(&ctx, &shm1);
2355 if (ADBG_EXPECT_TEEC_SUCCESS(c, res))
2356 TEEC_ReleaseSharedMemory(&shm1);
2357
2358 res = TEEC_RegisterSharedMemory(&ctx, &shm2);
2359 if (ADBG_EXPECT_TEEC_SUCCESS(c, res))
2360 TEEC_ReleaseSharedMemory(&shm2);
2361
2362 TEEC_FinalizeContext(&ctx);
2363}
2364ADBG_CASE_DEFINE(regression, 1032, xtest_tee_test_1032,
2365 "Register read-only shared memory");
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +03002366
2367static void xtest_tee_test_1033(ADBG_Case_t *c)
2368{
2369 TEEC_Session session = { };
2370 uint32_t ret_orig = 0;
2371
2372 /* TA will ping the test plugin during open session operation */
2373 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2374 xtest_teec_open_session(&session, &supp_plugin_test_ta_uuid,
2375 NULL, &ret_orig)))
2376 return;
2377
2378 Do_ADBG_BeginSubCase(c, "Pass values to/from a plugin");
2379 {
2380 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
2381
2382 op.params[0].value.a = 20;
2383 op.params[0].value.b = 10;
2384 op.params[1].value.a = '+';
2385 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT,
2386 TEEC_VALUE_INPUT, TEEC_NONE,
2387 TEEC_NONE);
2388
2389 ADBG_EXPECT_TEEC_SUCCESS(c,
2390 TEEC_InvokeCommand(&session,
2391 TA_SUPP_PLUGIN_CMD_PASS_VALUES, &op,
2392 &ret_orig));
2393 ADBG_EXPECT(c, 30, op.params[0].value.a);
2394
2395 /* reassign, because the values was changed during previous op */
2396 op.params[0].value.a = 20;
2397 op.params[0].value.b = 10;
2398 op.params[1].value.a = '-';
2399 ADBG_EXPECT_TEEC_SUCCESS(c,
2400 TEEC_InvokeCommand(&session,
2401 TA_SUPP_PLUGIN_CMD_PASS_VALUES, &op,
2402 &ret_orig));
2403 ADBG_EXPECT(c, 10, op.params[0].value.a);
2404 }
2405 Do_ADBG_EndSubCase(c, "Pass values to/from a plugin");
2406
2407 Do_ADBG_BeginSubCase(c, "Pass array to a plugin");
2408 {
2409 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Aleksandr Anisimov80768392021-03-05 19:36:20 +03002410 uint8_t to_plugin[] = { 0, 1, 2, 3, 4, 5 };
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +03002411
2412 op.params[0].tmpref.buffer = to_plugin;
2413 op.params[0].tmpref.size = sizeof(to_plugin);
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +03002414 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
Aleksandr Anisimov80768392021-03-05 19:36:20 +03002415 TEEC_VALUE_OUTPUT,
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +03002416 TEEC_NONE, TEEC_NONE);
2417
2418 ADBG_EXPECT_TEEC_SUCCESS(c,
2419 TEEC_InvokeCommand(&session,
2420 TA_SUPP_PLUGIN_CMD_WRITE_ARR,
2421 &op, &ret_orig));
2422
2423 /*
Aleksandr Anisimov80768392021-03-05 19:36:20 +03002424 * The test plugin must calculate a sum of the input elements
2425 * and store it to 'op.params[1].value.a'
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +03002426 */
Aleksandr Anisimov80768392021-03-05 19:36:20 +03002427 ADBG_EXPECT(c, 15, op.params[1].value.a);
Aleksandr Anisimov01f6f062021-01-19 11:02:25 +03002428 }
2429 Do_ADBG_EndSubCase(c, "Pass array to a plugin");
2430
2431 Do_ADBG_BeginSubCase(c, "Get array from a plugin");
2432 {
2433 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
2434 char from_plugin[64] = { };
2435 char expected_arr[] = "Array from plugin";
2436 size_t expectes_size = sizeof(expected_arr);
2437
2438 op.params[0].tmpref.buffer = from_plugin;
2439 op.params[0].tmpref.size = sizeof(from_plugin);
2440 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT,
2441 TEEC_VALUE_OUTPUT, TEEC_NONE,
2442 TEEC_NONE);
2443 ADBG_EXPECT_TEEC_SUCCESS(c,
2444 TEEC_InvokeCommand(&session,
2445 TA_SUPP_PLUGIN_CMD_GET_ARR, &op,
2446 &ret_orig));
2447 ADBG_EXPECT(c, expectes_size, op.params[1].value.a);
2448 ADBG_EXPECT_EQUAL(c, expected_arr, from_plugin, expectes_size);
2449 }
2450 Do_ADBG_EndSubCase(c, "Get array from a plugin");
2451
2452 Do_ADBG_BeginSubCase(c, "Not allow bad input to a plugin");
2453 {
2454 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
2455
2456 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE,
2457 TEEC_NONE, TEEC_NONE);
2458 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_BAD_PARAMETERS,
2459 TEEC_InvokeCommand(&session,
2460 TA_SUPP_PLUGIN_CMD_BAD_UUID, &op,
2461 &ret_orig));
2462 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_BAD_PARAMETERS,
2463 TEEC_InvokeCommand(&session,
2464 TA_SUPP_PLUGIN_CMD_BAD_IN_DATA, &op,
2465 &ret_orig));
2466 ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_BAD_PARAMETERS,
2467 TEEC_InvokeCommand(&session,
2468 TA_SUPP_PLUGIN_CMD_BAD_IN_LEN, &op,
2469 &ret_orig));
2470 }
2471 Do_ADBG_EndSubCase(c, "Not allow bad input to a plugin");
2472
2473 Do_ADBG_BeginSubCase(c, "Call an unknown plugin");
2474 {
2475 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
2476
2477 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE,
2478 TEEC_NONE, TEEC_NONE);
2479 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_ITEM_NOT_FOUND,
2480 TEEC_InvokeCommand(&session,
2481 TA_SUPP_PLUGIN_CMD_UNKNOWN_UUID,
2482 &op, &ret_orig));
2483 }
2484 Do_ADBG_EndSubCase(c, "Call an unknown plugin");
2485
2486 TEEC_CloseSession(&session);
2487}
2488ADBG_CASE_DEFINE(regression, 1033, xtest_tee_test_1033,
2489 "Test the supplicant plugin framework");
Jens Wiklander94fb1582021-05-19 10:14:57 +02002490
2491static void xtest_tee_test_1034(ADBG_Case_t *c)
2492{
2493 TEEC_Result res = TEEC_SUCCESS;
2494 TEEC_Session session = { };
2495 uint32_t ret_orig = 0;
2496
2497 res = xtest_teec_open_session(&session, &large_ta_uuid, NULL,
2498 &ret_orig);
Jerome Forissiere8be5b52021-06-29 16:29:06 +02002499 if (res == TEEC_ERROR_OUT_OF_MEMORY) {
2500 Do_ADBG_Log("TEEC_ERROR_OUT_OF_MEMORY - ignored");
2501 } else {
2502 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Jens Wiklander94fb1582021-05-19 10:14:57 +02002503 TEEC_CloseSession(&session);
Jerome Forissiere8be5b52021-06-29 16:29:06 +02002504 }
Jens Wiklander94fb1582021-05-19 10:14:57 +02002505}
2506ADBG_CASE_DEFINE(regression, 1034, xtest_tee_test_1034,
2507 "Test loading a large TA");
Ruchika Gupta7a7bc8d2021-12-01 10:44:14 +05302508
2509struct bti_test {
2510 uint32_t cmd;
2511 uint32_t func;
2512};
2513
2514#define BTI_TEST(caller_func, bti_func) { \
2515 .cmd = caller_func, \
2516 .func = bti_func, \
2517 }
2518
2519static const struct bti_test bti_cases_success[] = {
2520 BTI_TEST(TA_TEST_USING_BLR, TA_FUNC_BTI_C),
2521 BTI_TEST(TA_TEST_USING_BLR, TA_FUNC_BTI_JC),
2522 BTI_TEST(TA_TEST_USING_BR, TA_FUNC_BTI_J),
2523 BTI_TEST(TA_TEST_USING_BR, TA_FUNC_BTI_JC),
2524 BTI_TEST(TA_TEST_USING_BR_X16, TA_FUNC_BTI_C),
2525 BTI_TEST(TA_TEST_USING_BR_X16, TA_FUNC_BTI_J),
2526 BTI_TEST(TA_TEST_USING_BR_X16, TA_FUNC_BTI_JC),
2527};
2528
2529static const struct bti_test bti_cases_panic[] = {
2530 BTI_TEST(TA_TEST_USING_BLR, TA_FUNC_BTI_J),
2531 BTI_TEST(TA_TEST_USING_BLR, TA_FUNC_BTI_NONE),
2532 BTI_TEST(TA_TEST_USING_BR, TA_FUNC_BTI_C),
2533 BTI_TEST(TA_TEST_USING_BR, TA_FUNC_BTI_NONE),
2534 BTI_TEST(TA_TEST_USING_BR_X16, TA_FUNC_BTI_NONE),
2535};
2536
2537static void get_cpu_feature(bool *bti)
2538{
2539 TEEC_Session session = {};
2540 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
2541 uint32_t ret_orig = 0;
2542
2543 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE,
2544 TEEC_NONE);
2545 xtest_teec_open_session(&session, &bti_test_ta_uuid, NULL, &ret_orig);
2546
2547 TEEC_InvokeCommand(&session, TA_BTI_FEATURE, &op, &ret_orig);
2548
2549 if(op.params[0].value.a)
2550 *bti = true;
2551
2552 TEEC_CloseSession(&session);
2553}
2554
2555static void xtest_tee_test_1035(ADBG_Case_t *c)
2556{
2557 TEEC_Session session = {};
2558 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
2559 struct bti_test const *test = NULL;
2560 uint32_t ret_orig = 0;
2561 TEEC_Result res;
2562 unsigned int n = 0;
2563 bool cpu_feature_bti = false;
2564
2565 get_cpu_feature(&cpu_feature_bti);
2566
2567 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
2568 TEEC_NONE);
2569
2570 xtest_teec_open_session(&session, &bti_test_ta_uuid, NULL, &ret_orig);
2571
2572 Do_ADBG_BeginSubCase(c, "BTI Pass Cases");
2573 for (n = 0; n < ARRAY_SIZE(bti_cases_success); n++) {
2574 test = &bti_cases_success[n];
2575
2576 Do_ADBG_BeginSubCase(c, "BTI Case %u", n);
2577 op.params[0].value.a = test->func;
2578
2579 ADBG_EXPECT_TEEC_SUCCESS(c,
2580 TEEC_InvokeCommand(&session, test->cmd, &op, &ret_orig));
2581
2582 Do_ADBG_EndSubCase(c, "BTI Case %u", n);
2583 }
2584 Do_ADBG_EndSubCase(c, "BTI Pass Cases");
2585
2586 TEEC_CloseSession(&session);
2587
2588 Do_ADBG_BeginSubCase(c, "BTI Exception Generation");
2589 for (n = 0; n < ARRAY_SIZE(bti_cases_panic); n++) {
2590 test = &bti_cases_panic[n];
2591 res = TEEC_SUCCESS;
2592
2593#if defined(CFG_TA_BTI)
2594 if (cpu_feature_bti)
2595 res = TEEC_ERROR_TARGET_DEAD;
2596#endif
2597 xtest_teec_open_session(&session, &bti_test_ta_uuid,
2598 NULL, &ret_orig);
2599
2600 Do_ADBG_BeginSubCase(c, "BTI Case %u", n);
2601 op.params[0].value.a = test->func;
2602
2603 (void)ADBG_EXPECT_TEEC_RESULT(c, res,
2604 TEEC_InvokeCommand(&session, test->cmd, &op, &ret_orig));
2605
2606#if defined(CFG_TA_BTI)
2607 if (cpu_feature_bti)
2608 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TEE,
2609 ret_orig);
2610#endif
2611
2612 Do_ADBG_EndSubCase(c, "BTI Case %u", n);
2613
2614 TEEC_CloseSession(&session);
2615 }
2616 Do_ADBG_EndSubCase(c, "BTI Exception Generation");
2617
2618}
2619ADBG_CASE_DEFINE(regression, 1035, xtest_tee_test_1035, "Test BTI");