blob: 2137d28092a4c7c29bedaa9c12720f592b9da7fd [file] [log] [blame]
Xinyu Zhang21559372021-09-24 17:06:09 +08001/*
Jianliang Shen0f81aa02022-02-08 11:07:35 +08002 * Copyright (c) 2021-2022, Arm Limited. All rights reserved.
Xinyu Zhang21559372021-09-24 17:06:09 +08003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#include <stdint.h>
9#include "test_framework.h"
10#include "tfm_ns_client_ext.h"
11#include "nsid_svc_handler.h"
12#include "tfm_nsid_manager.h"
13
14/*
15 * The following macros are defined for white-box test only.
16 * Some of them are duplicated from secure side.
17 * It is unnecessary to export these definitions to NS side in actual scenarios.
18 */
19#define MAKE_NS_CLIENT_TOKEN(tid, gid, idx) \
20 (uint32_t)((((uint32_t)tid & 0xff) \
21 | (((uint32_t)gid & 0xff) << 8) \
22 | (((uint32_t)idx & 0xff) << 16)) \
23 & 0x00ffffff)
24
25#define VALID_INDEX 0x00
26#define VALID_GROUP_ID 0x00
27#define VALID_THREAD_ID_MIN 0x00
28#define VALID_THREAD_ID_MAX UINT8_MAX
29#define VALID_NSID_MAX ((int32_t)-1)
30#define VALID_NSID_MIN INT32_MIN
31#define INVALID_INDEX 0x01
32#define INVALID_GROUP_ID 0x01
33#define INVALID_RESERVED_TOKEN_BIT 0x10000000
34#define TFM_NS_CONTEXT_MAX 1
35
36static uint8_t thread_id = 0x20;
37static int32_t nsid = -500;
38
39/*
40 * This func is to be called at the beginning of test cases.
41 * The current active token needs to be saved first
42 * before calling ns_client_ext APIs through NS SVC.
43 * Values of NSID and Thread ID are changed to make sure
44 * every test case could be assigned with different tokens.
45 */
46static void nsid_test_case_init(struct test_result_t *ret)
47{
48 if (nsid_save_ctx_svc(current_active_token) != TFM_NS_CLIENT_ERR_SUCCESS) {
49 TEST_FAIL("SAVE fail when saving test thread ctx\r\n");
50 }
51
52 nsid--;
53 thread_id++;
54
55 return;
56}
57
58/*
59 * This func is to be called at the end of test cases
60 * to re-load the saved token at the beginning of the test case.
61 */
62static void nsid_test_case_finish(struct test_result_t *ret)
63{
64 if (nsid_load_ctx_svc(current_active_token,
65 nsid_mgr_query_nsid(current_active_token))
66 != TFM_NS_CLIENT_ERR_SUCCESS) {
67 TEST_FAIL("LOAD fail when re-loading test thread ctx\r\n");
68 }
69 return;
70}
71
72/* Initialize with valid params */
73static void tfm_nsid_test_case_1(struct test_result_t *ret)
74{
75 nsid_test_case_init(ret);
76
77 if (nsid_ext_init_svc(0) != TFM_NS_CONTEXT_MAX) {
78 TEST_FAIL("INITIALIZE shall return TFM_NS_CONTEXT_MAX\r\n");
79 nsid_test_case_finish(ret);
80 return;
81 }
82
83 if (nsid_ext_init_svc(1) != 1) {
84 TEST_FAIL("INITIALIZE shall return 1\r\n");
85 nsid_test_case_finish(ret);
86 return;
87 }
88
89 if (nsid_ext_init_svc(TFM_NS_CONTEXT_MAX + 1) != TFM_NS_CONTEXT_MAX) {
90 TEST_FAIL("INITIALIZE shall return TFM_NS_CONTEXT_MAX\r\n");
91 nsid_test_case_finish(ret);
92 return;
93 }
94
95 ret->val = TEST_PASSED;
96
97 nsid_test_case_finish(ret);
98}
99
100/* Normal full sequence */
101static void tfm_nsid_test_case_2(struct test_result_t *ret)
102{
103 uint32_t token;
104
105 nsid_test_case_init(ret);
106
107 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
108
109 if (token != MAKE_NS_CLIENT_TOKEN(thread_id, VALID_GROUP_ID, VALID_INDEX)) {
110 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
111 nsid_test_case_finish(ret);
112 return;
113 }
114
115 if (nsid_load_ctx_svc(token, nsid) != TFM_NS_CLIENT_ERR_SUCCESS) {
116 TEST_FAIL("LOAD shall success with valid token value\r\n");
117 nsid_test_case_finish(ret);
118 return;
119 }
120
121 if (nsid_save_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
122 TEST_FAIL("SAVE shall success with valid token value\r\n");
123 nsid_test_case_finish(ret);
124 return;
125 }
126
127 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
128 TEST_FAIL("RELEASE shall success with valid token value\r\n");
129 nsid_test_case_finish(ret);
130 return;
131 }
132
133 ret->val = TEST_PASSED;
134
135 nsid_test_case_finish(ret);
136}
137
138/* Normal acquire-release sequence */
139static void tfm_nsid_test_case_3(struct test_result_t *ret)
140{
141 uint32_t token;
142
143 nsid_test_case_init(ret);
144
145 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
146
147 if (token != MAKE_NS_CLIENT_TOKEN(thread_id, VALID_GROUP_ID, VALID_INDEX)) {
148 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
149 nsid_test_case_finish(ret);
150 return;
151 }
152
153 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
154 TEST_FAIL("RELEASE shall success with valid token value\r\n");
155 nsid_test_case_finish(ret);
156 return;
157 }
158
159 ret->val = TEST_PASSED;
160
161 nsid_test_case_finish(ret);
162}
163
164/* Normal acquire-load-release sequence */
165static void tfm_nsid_test_case_4(struct test_result_t *ret)
166{
167 uint32_t token;
168
169 nsid_test_case_init(ret);
170
171 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
172
173 if (token != MAKE_NS_CLIENT_TOKEN(thread_id, VALID_GROUP_ID, VALID_INDEX)) {
174 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
175 nsid_test_case_finish(ret);
176 return;
177 }
178
179 if (nsid_load_ctx_svc(token, nsid) != TFM_NS_CLIENT_ERR_SUCCESS) {
180 TEST_FAIL("LOAD shall success with valid token value\r\n");
181 nsid_test_case_finish(ret);
182 return;
183 }
184
185 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
186 TEST_FAIL("RELEASE shall success with valid token value\r\n");
187 nsid_test_case_finish(ret);
188 return;
189 }
190
191 ret->val = TEST_PASSED;
192
193 nsid_test_case_finish(ret);
194}
195
196/* Switch contexts */
197static void tfm_nsid_test_case_5(struct test_result_t *ret)
198{
199 uint32_t token_a;
200 uint32_t token_b;
201
202 nsid_test_case_init(ret);
203
204 token_a = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
205 token_b = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id + 1);
206
207 if (token_a != MAKE_NS_CLIENT_TOKEN(thread_id, \
208 VALID_GROUP_ID, \
209 VALID_INDEX) || \
210 token_b != MAKE_NS_CLIENT_TOKEN(thread_id + 1, \
211 VALID_GROUP_ID, \
212 VALID_INDEX)) {
213 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
214 nsid_test_case_finish(ret);
215 return;
216 }
217
218 if (nsid_load_ctx_svc(token_a, nsid) != TFM_NS_CLIENT_ERR_SUCCESS) {
219 TEST_FAIL("LOAD shall success with valid token value\r\n");
220 nsid_test_case_finish(ret);
221 return;
222 }
223
224 if (nsid_save_ctx_svc(token_a) != TFM_NS_CLIENT_ERR_SUCCESS) {
225 TEST_FAIL("SAVE shall success with valid token value\r\n");
226 nsid_test_case_finish(ret);
227 return;
228 }
229
230 if (nsid_load_ctx_svc(token_b, nsid) != TFM_NS_CLIENT_ERR_SUCCESS) {
231 TEST_FAIL("LOAD shall success with valid token value\r\n");
232 nsid_test_case_finish(ret);
233 return;
234 }
235
236 if (nsid_save_ctx_svc(token_b) != TFM_NS_CLIENT_ERR_SUCCESS) {
237 TEST_FAIL("SAVE shall success with valid token value\r\n");
238 nsid_test_case_finish(ret);
239 return;
240 }
241
242 if (nsid_release_ctx_svc(token_a) != TFM_NS_CLIENT_ERR_SUCCESS) {
243 TEST_FAIL("RELEASE shall success with valid token value\r\n");
244 nsid_test_case_finish(ret);
245 return;
246 }
247
248 if (nsid_release_ctx_svc(token_b) != TFM_NS_CLIENT_ERR_SUCCESS) {
249 TEST_FAIL("RELEASE shall success with valid token value\r\n");
250 nsid_test_case_finish(ret);
251 return;
252 }
253
254 ret->val = TEST_PASSED;
255
256 nsid_test_case_finish(ret);
257}
258
259/* Release inactive context */
260static void tfm_nsid_test_case_6(struct test_result_t *ret)
261{
262 uint32_t token_a;
263 uint32_t token_b;
264
265 nsid_test_case_init(ret);
266
267 token_a = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
268 token_b = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id + 1);
269
270 if (token_a != MAKE_NS_CLIENT_TOKEN(thread_id, \
271 VALID_GROUP_ID,
272 VALID_INDEX) || \
273 token_b != MAKE_NS_CLIENT_TOKEN(thread_id + 1, \
274 VALID_GROUP_ID, \
275 VALID_INDEX)) {
276 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
277 nsid_test_case_finish(ret);
278 return;
279 }
280
281 if (nsid_load_ctx_svc(token_a, nsid) != TFM_NS_CLIENT_ERR_SUCCESS) {
282 TEST_FAIL("LOAD shall success with valid token value\r\n");
283 nsid_test_case_finish(ret);
284 return;
285 }
286
287 if (nsid_release_ctx_svc(token_b) != TFM_NS_CLIENT_ERR_SUCCESS) {
288 TEST_FAIL("RELEASE shall success with valid token value\r\n");
289 nsid_test_case_finish(ret);
290 return;
291 }
292
293 if (nsid_release_ctx_svc(token_a) != TFM_NS_CLIENT_ERR_SUCCESS) {
294 TEST_FAIL("RELEASE shall success with valid token value\r\n");
295 nsid_test_case_finish(ret);
296 return;
297 }
298
299 ret->val = TEST_PASSED;
300
301 nsid_test_case_finish(ret);
302}
303
304/* Max NSID */
305static void tfm_nsid_test_case_7(struct test_result_t *ret)
306{
307 uint32_t token;
308
309 nsid_test_case_init(ret);
310
311 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
312
313 if (token != MAKE_NS_CLIENT_TOKEN(thread_id, VALID_GROUP_ID, VALID_INDEX)) {
314 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
315 nsid_test_case_finish(ret);
316 return;
317 }
318
319 if (nsid_load_ctx_svc(token, VALID_NSID_MAX)
320 != TFM_NS_CLIENT_ERR_SUCCESS) {
321 TEST_FAIL("LOAD shall success with valid token value\r\n");
322 nsid_test_case_finish(ret);
323 return;
324 }
325
326 if (nsid_save_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
327 TEST_FAIL("SAVE shall success with valid token value\r\n");
328 nsid_test_case_finish(ret);
329 return;
330 }
331
332 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
333 TEST_FAIL("RELEASE shall success with valid token value\r\n");
334 nsid_test_case_finish(ret);
335 return;
336 }
337
338 ret->val = TEST_PASSED;
339
340 nsid_test_case_finish(ret);
341}
342
343/* Min NSID */
344static void tfm_nsid_test_case_8(struct test_result_t *ret)
345{
346 uint32_t token;
347
348 nsid_test_case_init(ret);
349
350 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
351
352 if (token != MAKE_NS_CLIENT_TOKEN(thread_id, VALID_GROUP_ID, VALID_INDEX)) {
353 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
354 nsid_test_case_finish(ret);
355 return;
356 }
357
358 if (nsid_load_ctx_svc(token, VALID_NSID_MIN)
359 != TFM_NS_CLIENT_ERR_SUCCESS) {
360 TEST_FAIL("LOAD shall success with valid token value\r\n");
361 nsid_test_case_finish(ret);
362 return;
363 }
364
365 if (nsid_save_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
366 TEST_FAIL("SAVE shall success with valid token value\r\n");
367 nsid_test_case_finish(ret);
368 return;
369 }
370
371 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
372 TEST_FAIL("RELEASE shall success with valid token value\r\n");
373 nsid_test_case_finish(ret);
374 return;
375 }
376
377 ret->val = TEST_PASSED;
378
379 nsid_test_case_finish(ret);
380}
381
382/* Min TID */
383static void tfm_nsid_test_case_9(struct test_result_t *ret)
384{
385 uint32_t token;
386
387 nsid_test_case_init(ret);
388
389 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, VALID_THREAD_ID_MIN);
390
391 if (token != MAKE_NS_CLIENT_TOKEN(0x00, VALID_GROUP_ID, VALID_INDEX)) {
392 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
393 nsid_test_case_finish(ret);
394 return;
395 }
396
397 if (nsid_load_ctx_svc(token, nsid) != TFM_NS_CLIENT_ERR_SUCCESS) {
398 TEST_FAIL("LOAD shall success with valid token value\r\n");
399 nsid_test_case_finish(ret);
400 return;
401 }
402
403 if (nsid_save_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
404 TEST_FAIL("SAVE shall success with valid token value\r\n");
405 nsid_test_case_finish(ret);
406 return;
407 }
408
409 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
410 TEST_FAIL("RELEASE shall success with valid token value\r\n");
411 nsid_test_case_finish(ret);
412 return;
413 }
414
415 ret->val = TEST_PASSED;
416
417 nsid_test_case_finish(ret);
418}
419
420/* Max TID */
421static void tfm_nsid_test_case_10(struct test_result_t *ret)
422{
423 uint32_t token;
424
425 nsid_test_case_init(ret);
426
427 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, VALID_THREAD_ID_MAX);
428
429 if (token != MAKE_NS_CLIENT_TOKEN(0xFF, VALID_GROUP_ID, VALID_INDEX)) {
430 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
431 nsid_test_case_finish(ret);
432 return;
433 }
434
435 if (nsid_load_ctx_svc(token, nsid) != TFM_NS_CLIENT_ERR_SUCCESS) {
436 TEST_FAIL("LOAD shall success with valid token value\r\n");
437 nsid_test_case_finish(ret);
438 return;
439 }
440
441 if (nsid_save_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
442 TEST_FAIL("SAVE shall success with valid token value\r\n");
443 nsid_test_case_finish(ret);
444 return;
445 }
446
447 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
448 TEST_FAIL("RELEASE shall success with valid token value\r\n");
449 nsid_test_case_finish(ret);
450 return;
451 }
452
453 ret->val = TEST_PASSED;
454
455 nsid_test_case_finish(ret);
456}
457
458/* Load Thread B without saving Thread A */
459static void tfm_nsid_test_case_11(struct test_result_t *ret)
460{
461 uint32_t token_a;
462 uint32_t token_b;
463
464 nsid_test_case_init(ret);
465
466 token_a = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
467 token_b = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id + 1);
468
469 if (token_a != MAKE_NS_CLIENT_TOKEN(thread_id, \
470 VALID_GROUP_ID, \
471 VALID_INDEX) || \
472 token_b != MAKE_NS_CLIENT_TOKEN(thread_id + 1, \
473 VALID_GROUP_ID, \
474 VALID_INDEX)) {
475 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
476 nsid_test_case_finish(ret);
477 return;
478 }
479
480 if (nsid_load_ctx_svc(token_a, nsid) != TFM_NS_CLIENT_ERR_SUCCESS) {
481 TEST_FAIL("LOAD shall success with valid token value\r\n");
482 nsid_test_case_finish(ret);
483 return;
484 }
485
486 if (nsid_load_ctx_svc(token_b, nsid) != TFM_NS_CLIENT_ERR_SUCCESS) {
487 TEST_FAIL("LOAD shall success with valid token value\r\n");
488 nsid_test_case_finish(ret);
489 return;
490 }
491
492 if (nsid_release_ctx_svc(token_a) != TFM_NS_CLIENT_ERR_SUCCESS) {
493 TEST_FAIL("RELEASE shall success with valid token value\r\n");
494 nsid_test_case_finish(ret);
495 return;
496 }
497
498 if (nsid_release_ctx_svc(token_b) != TFM_NS_CLIENT_ERR_SUCCESS) {
499 TEST_FAIL("RELEASE shall success with valid token value\r\n");
500 nsid_test_case_finish(ret);
501 return;
502 }
503
504 ret->val = TEST_PASSED;
505
506 nsid_test_case_finish(ret);
507}
508
509/* Load with non-negative NSID */
510static void tfm_nsid_test_case_12(struct test_result_t *ret)
511{
512 uint32_t token;
513
514 nsid_test_case_init(ret);
515
516 thread_id++;
517
518 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
519
520 if (token != MAKE_NS_CLIENT_TOKEN(thread_id, VALID_GROUP_ID, VALID_INDEX)) {
521 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
522 nsid_test_case_finish(ret);
523 return;
524 }
525
526 if (nsid_load_ctx_svc(token, 0) != TFM_NS_CLIENT_ERR_INVALID_NSID) {
527 TEST_FAIL("LOAD shall fail with non-negative NSID\r\n");
528 nsid_test_case_finish(ret);
529 return;
530 }
531
532 if (nsid_load_ctx_svc(token, 1) != TFM_NS_CLIENT_ERR_INVALID_NSID) {
533 TEST_FAIL("LOAD shall fail with non-negative NSID\r\n");
534 nsid_test_case_finish(ret);
535 return;
536 }
537
538 if (nsid_load_ctx_svc(token, 50) != TFM_NS_CLIENT_ERR_INVALID_NSID) {
539 TEST_FAIL("LOAD shall fail with non-negative NSID\r\n");
540 nsid_test_case_finish(ret);
541 return;
542 }
543
544 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
545 TEST_FAIL("RELEASE shall success with valid token value\r\n");
546 nsid_test_case_finish(ret);
547 return;
548 }
549
550 nsid_test_case_finish(ret);
551
552 ret->val = TEST_PASSED;
553}
554
555/* Load with invalid token */
556static void tfm_nsid_test_case_13(struct test_result_t *ret)
557{
558 uint32_t token;
559
560 nsid_test_case_init(ret);
561
562 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
563
564 if (token != MAKE_NS_CLIENT_TOKEN(thread_id, VALID_GROUP_ID, VALID_INDEX)) {
565 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
566 nsid_test_case_finish(ret);
567 return;
568 }
569
570 if (nsid_load_ctx_svc(TFM_NS_CLIENT_INVALID_TOKEN, nsid)
571 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
572 TEST_FAIL("LOAD shall fail with invalid token\r\n");
573 nsid_test_case_finish(ret);
574 return;
575 }
576
577 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
578 TEST_FAIL("RELEASE shall success with valid token value\r\n");
579 nsid_test_case_finish(ret);
580 return;
581 }
582
583 ret->val = TEST_PASSED;
584
585 nsid_test_case_finish(ret);
586}
587
588/* Save with invalid token */
589static void tfm_nsid_test_case_14(struct test_result_t *ret)
590{
591 uint32_t token;
592
593 nsid_test_case_init(ret);
594
595 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
596
597 if (token != MAKE_NS_CLIENT_TOKEN(thread_id, VALID_GROUP_ID, VALID_INDEX)) {
598 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
599 nsid_test_case_finish(ret);
600 return;
601 }
602
603 if (nsid_load_ctx_svc(token, nsid) != TFM_NS_CLIENT_ERR_SUCCESS) {
604 TEST_FAIL("LOAD shall pass with valid token\r\n");
605 nsid_test_case_finish(ret);
606 return;
607 }
608
609 if (nsid_save_ctx_svc(TFM_NS_CLIENT_INVALID_TOKEN)
610 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
611 TEST_FAIL("SAVE shall fail with invalid token\r\n");
612 nsid_test_case_finish(ret);
613 return;
614 }
615
616 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
617 TEST_FAIL("RELEASE shall success with valid token value\r\n");
618 nsid_test_case_finish(ret);
619 return;
620 }
621
622 ret->val = TEST_PASSED;
623
624 nsid_test_case_finish(ret);
625}
626
627/* Release with invalid token */
628static void tfm_nsid_test_case_15(struct test_result_t *ret)
629{
630 uint32_t token;
631
632 nsid_test_case_init(ret);
633
634 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
635
636 if (token != MAKE_NS_CLIENT_TOKEN(thread_id, VALID_GROUP_ID, VALID_INDEX)) {
637 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
638 nsid_test_case_finish(ret);
639 return;
640 }
641
642 if (nsid_release_ctx_svc(TFM_NS_CLIENT_INVALID_TOKEN)
643 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
644 TEST_FAIL("RELEASE shall fail with invalid token\r\n");
645 nsid_test_case_finish(ret);
646 return;
647 }
648
649 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
650 TEST_FAIL("RELEASE shall success with valid token value\r\n");
651 nsid_test_case_finish(ret);
652 return;
653 }
654
655 ret->val = TEST_PASSED;
656
657 nsid_test_case_finish(ret);
658}
659
660/* Acquire with undefault GID */
661static void tfm_nsid_test_case_16(struct test_result_t *ret)
662{
663 nsid_test_case_init(ret);
664
665 if (nsid_acquire_ctx_svc(0x01, INVALID_GROUP_ID) \
666 != TFM_NS_CLIENT_INVALID_TOKEN) {
667 TEST_FAIL("ACQUIRE shall fail with invalid GID\r\n");
668 nsid_test_case_finish(ret);
669 return;
670 }
671
672 if (nsid_acquire_ctx_svc(0x50, INVALID_GROUP_ID) \
673 != TFM_NS_CLIENT_INVALID_TOKEN) {
674 TEST_FAIL("ACQUIRE shall fail with invalid GID\r\n");
675 nsid_test_case_finish(ret);
676 return;
677 }
678
679 if (nsid_acquire_ctx_svc(0xFF, INVALID_GROUP_ID) \
680 != TFM_NS_CLIENT_INVALID_TOKEN) {
681 TEST_FAIL("ACQUIRE shall fail with invalid GID\r\n");
682 nsid_test_case_finish(ret);
683 return;
684 }
685
686 ret->val = TEST_PASSED;
687
688 nsid_test_case_finish(ret);
689}
690
691/* Load, save and release with token containing wrong info */
692static void tfm_nsid_test_case_17(struct test_result_t *ret)
693{
694 uint32_t token;
695
696 nsid_test_case_init(ret);
697
698 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
699
700 if (token != MAKE_NS_CLIENT_TOKEN(thread_id, VALID_GROUP_ID, VALID_INDEX)) {
701 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
702 nsid_test_case_finish(ret);
703 return;
704 }
705
706 if (nsid_load_ctx_svc(MAKE_NS_CLIENT_TOKEN(thread_id, \
707 INVALID_GROUP_ID, \
708 VALID_INDEX), nsid) \
709 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
710 TEST_FAIL("LOAD shall fail with token with wrong GID\r\n");
711 nsid_test_case_finish(ret);
712 return;
713 }
714
715 if (nsid_load_ctx_svc(MAKE_NS_CLIENT_TOKEN(thread_id, \
716 VALID_GROUP_ID, \
717 INVALID_INDEX), nsid) \
718 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
719 TEST_FAIL("LOAD shall fail with token with wrong index\r\n");
720 nsid_test_case_finish(ret);
721 return;
722 }
723
724 if (nsid_load_ctx_svc(MAKE_NS_CLIENT_TOKEN(thread_id, \
725 VALID_GROUP_ID, \
726 VALID_INDEX) \
727 | INVALID_RESERVED_TOKEN_BIT, nsid) \
728 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
729 TEST_FAIL("LOAD shall fail with token with wrong reserved bits\r\n");
730 nsid_test_case_finish(ret);
731 return;
732 }
733
734 if (nsid_load_ctx_svc(token, nsid) != TFM_NS_CLIENT_ERR_SUCCESS) {
735 TEST_FAIL("LOAD shall pass with valid token\r\n");
736 nsid_test_case_finish(ret);
737 return;
738 }
739
740 if (nsid_save_ctx_svc(MAKE_NS_CLIENT_TOKEN(0xF0, \
741 VALID_GROUP_ID, \
742 VALID_INDEX)) \
743 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
744 TEST_FAIL("SAVE shall fail with token with wrong TID\r\n");
745 nsid_test_case_finish(ret);
746 return;
747 }
748
749 if (nsid_save_ctx_svc(MAKE_NS_CLIENT_TOKEN(thread_id, \
750 INVALID_GROUP_ID, \
751 VALID_INDEX)) \
752 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
753 TEST_FAIL("SAVE shall fail with token with wrong GID\r\n");
754 nsid_test_case_finish(ret);
755 return;
756 }
757
758 if (nsid_save_ctx_svc(MAKE_NS_CLIENT_TOKEN(thread_id, \
759 VALID_GROUP_ID, \
760 INVALID_INDEX)) \
761 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
762 TEST_FAIL("SAVE shall fail with token with wrong index\r\n");
763 nsid_test_case_finish(ret);
764 return;
765 }
766
767 if (nsid_save_ctx_svc(MAKE_NS_CLIENT_TOKEN(thread_id, \
768 VALID_GROUP_ID, \
769 VALID_INDEX) \
770 | INVALID_RESERVED_TOKEN_BIT) \
771 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
772 TEST_FAIL("SAVE shall fail with token with wrong reserved bits\r\n");
773 nsid_test_case_finish(ret);
774 return;
775 }
776
777 if (nsid_save_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
778 TEST_FAIL("SAVE shall pass with valid token\r\n");
779 nsid_test_case_finish(ret);
780 return;
781 }
782
783 if (nsid_release_ctx_svc(MAKE_NS_CLIENT_TOKEN(thread_id, \
784 INVALID_GROUP_ID, \
785 VALID_INDEX)) \
786 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
787 TEST_FAIL("RELEASE shall fail with token with wrong GID\r\n");
788 nsid_test_case_finish(ret);
789 return;
790 }
791
792 if (nsid_release_ctx_svc(MAKE_NS_CLIENT_TOKEN(thread_id, \
793 VALID_GROUP_ID, \
794 INVALID_INDEX)) \
795 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
796 TEST_FAIL("RELEASE shall fail with token with wrong index\r\n");
797 nsid_test_case_finish(ret);
798 return;
799 }
800
801 if (nsid_release_ctx_svc(MAKE_NS_CLIENT_TOKEN(thread_id, \
802 VALID_GROUP_ID, \
803 VALID_INDEX) \
804 | INVALID_RESERVED_TOKEN_BIT) \
805 != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
806 TEST_FAIL("RELEASE shall fail with token with wrong reserved bits\r\n");
807 nsid_test_case_finish(ret);
808 return;
809 }
810
811 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
812 TEST_FAIL("RELEASE shall success with valid token value\r\n");
813 nsid_test_case_finish(ret);
814 return;
815 }
816
817 ret->val = TEST_PASSED;
818
819 nsid_test_case_finish(ret);
820}
821
822/* Save without loading */
823static void tfm_nsid_test_case_18(struct test_result_t *ret)
824{
825 uint32_t token;
826
827 nsid_test_case_init(ret);
828
829 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
830
831 if (token != MAKE_NS_CLIENT_TOKEN(thread_id, VALID_GROUP_ID, VALID_INDEX)) {
832 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
833 nsid_test_case_finish(ret);
834 return;
835 }
836
837 if (nsid_save_ctx_svc(token) != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
838 TEST_FAIL("SAVE shall fail when not loaded\r\n");
839 nsid_test_case_finish(ret);
840 return;
841 }
842
843 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
844 TEST_FAIL("RELEASE shall success with valid token value\r\n");
845 nsid_test_case_finish(ret);
846 return;
847 }
848
849 ret->val = TEST_PASSED;
850
851 nsid_test_case_finish(ret);
852}
853
854/* Save released context */
855static void tfm_nsid_test_case_19(struct test_result_t *ret)
856{
857 uint32_t token;
858
859 nsid_test_case_init(ret);
860
861 token = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
862
863 if (token != MAKE_NS_CLIENT_TOKEN(thread_id, VALID_GROUP_ID, VALID_INDEX)) {
864 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
865 nsid_test_case_finish(ret);
866 return;
867 }
868
869 if (nsid_release_ctx_svc(token) != TFM_NS_CLIENT_ERR_SUCCESS) {
870 TEST_FAIL("RELEASE shall success with valid token value\r\n");
871 nsid_test_case_finish(ret);
872 return;
873 }
874
875 if (nsid_save_ctx_svc(token) != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
876 TEST_FAIL("SAVE shall fail with released token value\r\n");
877 nsid_test_case_finish(ret);
878 return;
879 }
880
881 ret->val = TEST_PASSED;
882
883 nsid_test_case_finish(ret);
884}
885
886/* Save inactive context */
887static void tfm_nsid_test_case_20(struct test_result_t *ret)
888{
889 uint32_t token_a;
890 uint32_t token_b;
891
892 nsid_test_case_init(ret);
893
894 token_a = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id);
895 token_b = nsid_acquire_ctx_svc(VALID_GROUP_ID, thread_id + 1);
896
897 if (token_a != MAKE_NS_CLIENT_TOKEN(thread_id, \
898 VALID_GROUP_ID, \
899 VALID_INDEX) || \
900 token_b != MAKE_NS_CLIENT_TOKEN(thread_id + 1, \
901 VALID_GROUP_ID, \
902 VALID_INDEX)) {
903 TEST_FAIL("ACQUIRE shall return a valid token\r\n");
904 nsid_test_case_finish(ret);
905 return;
906 }
907
908 if (nsid_load_ctx_svc(token_a, nsid) != TFM_NS_CLIENT_ERR_SUCCESS) {
909 TEST_FAIL("LOAD shall success with valid token value\r\n");
910 nsid_test_case_finish(ret);
911 return;
912 }
913
914 if (nsid_save_ctx_svc(token_b) != TFM_NS_CLIENT_ERR_INVALID_TOKEN) {
915 TEST_FAIL("SAVE shall fail with inactive token value\r\n");
916 nsid_test_case_finish(ret);
917 return;
918 }
919
920 if (nsid_release_ctx_svc(token_a) != TFM_NS_CLIENT_ERR_SUCCESS) {
921 TEST_FAIL("RELEASE shall success with valid token value\r\n");
922 nsid_test_case_finish(ret);
923 return;
924 }
925
926 if (nsid_release_ctx_svc(token_b) != TFM_NS_CLIENT_ERR_SUCCESS) {
927 TEST_FAIL("RELEASE shall success with valid token value\r\n");
928 nsid_test_case_finish(ret);
929 return;
930 }
931
932 ret->val = TEST_PASSED;
933
934 nsid_test_case_finish(ret);
935}
936
937/* Call in thread mode */
938static void tfm_nsid_test_case_21(struct test_result_t *ret)
939{
940 uint32_t token;
941
942 nsid_test_case_init(ret);
943
944 if (tfm_nsce_init(0) != 0) {
945 TEST_FAIL("INITIALIZE shall not success in thread mode\r\n");
946 nsid_test_case_finish(ret);
947 return;
948 }
949
950 token = tfm_nsce_acquire_ctx(VALID_GROUP_ID, thread_id);
951
952 if (token != TFM_NS_CLIENT_ERR_INVALID_ACCESS) {
953 TEST_FAIL("ACQUIRE shall not success in thread mode\r\n");
954 nsid_test_case_finish(ret);
955 return;
956 }
957
958 if (tfm_nsce_load_ctx(token, nsid) != TFM_NS_CLIENT_ERR_INVALID_ACCESS) {
959 TEST_FAIL("LOAD shall not success in thread mode\r\n");
960 nsid_test_case_finish(ret);
961 return;
962 }
963
964 if (tfm_nsce_save_ctx(token) != TFM_NS_CLIENT_ERR_INVALID_ACCESS) {
965 TEST_FAIL("SAVE shall not success in thread mode\r\n");
966 nsid_test_case_finish(ret);
967 return;
968 }
969
970 if (tfm_nsce_release_ctx(token) != TFM_NS_CLIENT_ERR_INVALID_ACCESS) {
971 TEST_FAIL("RELEASE shall not success in thread mode\r\n");
972 nsid_test_case_finish(ret);
973 return;
974 }
975
976 ret->val = TEST_PASSED;
977
978 nsid_test_case_finish(ret);
979}
980
981static struct test_t nsid_test_cases[] = {
982 /* Normal test */
983 {&tfm_nsid_test_case_1, "TFM_NS_NSID_TEST_1001",
Jianliang Shen0f81aa02022-02-08 11:07:35 +0800984 "NSID management initialize ctx pass"},
Xinyu Zhang21559372021-09-24 17:06:09 +0800985 {&tfm_nsid_test_case_2, "TFM_NS_NSID_TEST_1002",
Jianliang Shen0f81aa02022-02-08 11:07:35 +0800986 "NSID management normal full sequence pass"},
Xinyu Zhang21559372021-09-24 17:06:09 +0800987 {&tfm_nsid_test_case_3, "TFM_NS_NSID_TEST_1003",
Jianliang Shen0f81aa02022-02-08 11:07:35 +0800988 "NSID management acquire-release sequence pass"},
Xinyu Zhang21559372021-09-24 17:06:09 +0800989 {&tfm_nsid_test_case_4, "TFM_NS_NSID_TEST_1004",
Jianliang Shen0f81aa02022-02-08 11:07:35 +0800990 "NSID management acquire-load-release sequence pass"},
Xinyu Zhang21559372021-09-24 17:06:09 +0800991 {&tfm_nsid_test_case_5, "TFM_NS_NSID_TEST_1005",
Jianliang Shen0f81aa02022-02-08 11:07:35 +0800992 "NSID management switching contexts pass"},
Xinyu Zhang21559372021-09-24 17:06:09 +0800993 {&tfm_nsid_test_case_6, "TFM_NS_NSID_TEST_1006",
Jianliang Shen0f81aa02022-02-08 11:07:35 +0800994 "NSID management releasing inactive context pass"},
Xinyu Zhang21559372021-09-24 17:06:09 +0800995 /* Corner case test */
996 {&tfm_nsid_test_case_7, "TFM_NS_NSID_TEST_1007",
Jianliang Shen0f81aa02022-02-08 11:07:35 +0800997 "NSID management pass with max valid NSID"},
Xinyu Zhang21559372021-09-24 17:06:09 +0800998 {&tfm_nsid_test_case_8, "TFM_NS_NSID_TEST_1008",
Jianliang Shen0f81aa02022-02-08 11:07:35 +0800999 "NSID management pass with min valid NSID"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001000 {&tfm_nsid_test_case_9, "TFM_NS_NSID_TEST_1009",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001001 "NSID management pass with min TID"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001002 {&tfm_nsid_test_case_10, "TFM_NS_NSID_TEST_1010",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001003 "NSID management pass with max TID"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001004 {&tfm_nsid_test_case_11, "TFM_NS_NSID_TEST_1011",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001005 "NSID management pass when loading B without saving A"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001006 /* Error test */
1007 /* Wrong params */
1008 {&tfm_nsid_test_case_12, "TFM_NS_NSID_TEST_1012",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001009 "NSID management loading fail with non-negative NSID"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001010 {&tfm_nsid_test_case_13, "TFM_NS_NSID_TEST_1013",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001011 "NSID management fail when loading with invalid token"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001012 {&tfm_nsid_test_case_14, "TFM_NS_NSID_TEST_1014",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001013 "NSID management fail when saving with invalid token"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001014 {&tfm_nsid_test_case_15, "TFM_NS_NSID_TEST_1015",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001015 "NSID management fail when releasing with invalid token"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001016 {&tfm_nsid_test_case_16, "TFM_NS_NSID_TEST_1016",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001017 "NSID management fail when acquiring with undefault GID"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001018 {&tfm_nsid_test_case_17, "TFM_NS_NSID_TEST_1017",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001019 "NSID management fail with token containing wrong info"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001020 /* Wrong sequence */
1021 {&tfm_nsid_test_case_18, "TFM_NS_NSID_TEST_1018",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001022 "NSID management fail when saving without loading"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001023 {&tfm_nsid_test_case_19, "TFM_NS_NSID_TEST_1019",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001024 "NSID management fail when saving released token"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001025 {&tfm_nsid_test_case_20, "TFM_NS_NSID_TEST_1020",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001026 "NSID management fail when saving inactive token"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001027 /* Other tests */
1028 {&tfm_nsid_test_case_21, "TFM_NS_NSID_TEST_1021",
Jianliang Shen0f81aa02022-02-08 11:07:35 +08001029 "NSID management fail when called in thread mode"},
Xinyu Zhang21559372021-09-24 17:06:09 +08001030};
1031
1032void register_testsuite_nsid_test(struct test_suite_t *p_test_suite)
1033{
1034 uint32_t list_size;
1035
1036 list_size = (sizeof(nsid_test_cases) / sizeof(nsid_test_cases[0]));
1037
1038 set_testsuite("TFM NSID Test (TFM_NSID_TEST_1xxx)",
1039 nsid_test_cases, list_size, p_test_suite);
1040}