TF-M Reference Manual  1.2.0
TrustedFirmware-M
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
psa_its_s_reliability_testsuite.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include "its_s_tests.h"
10 #include "test_framework_helpers.h"
11 #include "tfm_memory_utils.h"
12 
13 /* Test UIDs */
14 #define TEST_UID 2UL /* UID 1 cannot be used as it references a write once
15  * asset, created in psa_its_s_interface_testsuite.c
16  */
17 
18 /* Test suite defines */
19 #define LOOP_ITERATIONS_001 15U
20 #define LOOP_ITERATIONS_002 15U
21 
22 /* Write data */
23 #define WRITE_DATA "THEQUICKBROWNFOXJUMPSOVERALAZYDOG"
24 #define WRITE_DATA_SIZE (sizeof(WRITE_DATA) - 1)
25 #define READ_DATA "_________________________________________"
26 #define RESULT_DATA ("____" WRITE_DATA "____")
27 
28 /* Size of ____ from RESULT_DATA */
29 #define HALF_PADDING_SIZE 4
30 
31 /* Define test suite for ITS reliability tests */
32 /* List of tests */
33 static void tfm_its_test_3001(struct test_result_t *ret);
34 static void tfm_its_test_3002(struct test_result_t *ret);
35 
36 static struct test_t reliability_tests[] = {
37  {&tfm_its_test_3001, "TFM_ITS_TEST_3001",
38  "repetitive sets and gets in/from an asset", {TEST_PASSED} },
39  {&tfm_its_test_3002, "TFM_ITS_TEST_3002",
40  "repetitive sets, gets and removes", {TEST_PASSED} },
41 };
42 
44 {
45  uint32_t list_size = (sizeof(reliability_tests) /
46  sizeof(reliability_tests[0]));
47 
48  set_testsuite("ITS reliability tests (TFM_ITS_TEST_3XXX)",
49  reliability_tests, list_size, p_test_suite);
50 }
51 
57 static void tfm_its_test_3001(struct test_result_t *ret)
58 {
59  psa_status_t status;
60  const psa_storage_uid_t uid = TEST_UID;
62  const size_t data_len = WRITE_DATA_SIZE;
63  const size_t offset = 0;
64  uint32_t itr;
65  const uint8_t write_data[] = WRITE_DATA;
66  uint8_t read_data[] = READ_DATA;
67  size_t read_data_length = 0;
68 
69  for (itr = 0; itr < LOOP_ITERATIONS_001; itr++) {
70  TEST_LOG(" > Iteration %d of %d\r", itr + 1, LOOP_ITERATIONS_001);
71 
72  /* Set a data in the asset */
73  status = psa_its_set(uid, data_len, write_data, flags);
74  if (status != PSA_SUCCESS) {
75  TEST_FAIL("Set should not fail with valid UID");
76  return;
77  }
78 
79  /* Get data from the asset */
80  status = psa_its_get(uid, offset, data_len, (read_data +
82  &read_data_length);
83  if (status != PSA_SUCCESS) {
84  TEST_FAIL("Get should not fail");
85  return;
86  }
87 
88  /* Check that the data has not changed */
89  if (tfm_memcmp(read_data, RESULT_DATA, sizeof(read_data)) != 0) {
90  TEST_FAIL("The data should not have changed");
91  return;
92  }
93 
94  /* Set the original data into read buffer */
95  tfm_memcpy(read_data, READ_DATA, sizeof(read_data));
96  }
97 
98  TEST_LOG("\n");
99 
100  /* Remove the asset to clean up storage for the next test */
101  status = psa_its_remove(uid);
102  if (status != PSA_SUCCESS) {
103  TEST_FAIL("Remove should not fail with valid UID");
104  return;
105  }
106 
107  ret->val = TEST_PASSED;
108 }
109 
115 static void tfm_its_test_3002(struct test_result_t *ret)
116 {
117  psa_status_t status;
118  const psa_storage_uid_t uid = TEST_UID;
120  const size_t data_len = WRITE_DATA_SIZE;
121  const size_t offset = 0;
122  uint32_t itr;
123  const uint8_t write_data[] = WRITE_DATA;
124  uint8_t read_data[] = READ_DATA;
125  size_t read_data_length = 0;
126 
127  for (itr = 0; itr < LOOP_ITERATIONS_002; itr++) {
128  TEST_LOG(" > Iteration %d of %d\r", itr + 1, LOOP_ITERATIONS_002);
129 
130  /* Set a data in the asset */
131  status = psa_its_set(uid, data_len, write_data, flags);
132  if (status != PSA_SUCCESS) {
133  TEST_FAIL("Set should not fail with valid UID");
134  return;
135  }
136 
137  /* Get data from the asset */
138  status = psa_its_get(uid, offset, data_len, (read_data +
140  &read_data_length);
141  if (status != PSA_SUCCESS) {
142  TEST_FAIL("Get should not fail");
143  return;
144  }
145 
146  /* Check that the data has not changed */
147  if (tfm_memcmp(read_data, RESULT_DATA, sizeof(read_data)) != 0) {
148  TEST_FAIL("The data should not have changed");
149  return;
150  }
151 
152  /* Remove the asset from the secure storage */
153  status = psa_its_remove(uid);
154  if (status != PSA_SUCCESS) {
155  TEST_FAIL("Remove should not fail with valid UID");
156  return;
157  }
158 
159  /* Set the original data into read buffer */
160  tfm_memcpy(read_data, READ_DATA, sizeof(read_data));
161  }
162 
163  TEST_LOG("\n");
164 
165  ret->val = TEST_PASSED;
166 }
#define HALF_PADDING_SIZE
#define PSA_SUCCESS
Definition: crypto_values.h:35
#define TEST_FAIL(info_msg)
#define LOOP_ITERATIONS_001
enum test_suite_err_t set_testsuite(const char *name, struct test_t *test_list, uint32_t size, struct test_suite_t *p_ts)
Sets test suite parameters.
void register_testsuite_s_psa_its_reliability(struct test_suite_t *p_test_suite)
Register testsuite for the ITS reliability tests.
psa_status_t psa_its_get(psa_storage_uid_t uid, size_t data_offset, size_t data_size, void *p_data, size_t *p_data_length)
Retrieve data associated with a provided UID.
psa_status_t psa_its_remove(psa_storage_uid_t uid)
Remove the provided uid and its associated data from the storage.
#define WRITE_DATA_SIZE
psa_status_t psa_its_set(psa_storage_uid_t uid, size_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
Create a new, or modify an existing, uid/value pair.
struct test_result_t ret
__STATIC_INLINE void * tfm_memcpy(void *dest, const void *src, size_t num)
#define TEST_LOG(...)
uint64_t psa_storage_uid_t
enum test_status_t val
#define LOOP_ITERATIONS_002
__STATIC_INLINE int tfm_memcmp(const void *ptr1, const void *ptr2, size_t num)
#define PSA_STORAGE_FLAG_NONE
uint32_t psa_storage_create_flags_t
int32_t psa_status_t
Function return status.
Definition: crypto_types.h:43