TF-M Reference Manual  1.2.0
TrustedFirmware-M
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
psa_ps_s_reliability_testsuite.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017-2020, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include "ps_tests.h"
9 
10 #include <stdio.h>
11 
12 #include "psa/protected_storage.h"
13 #include "tfm_memory_utils.h"
14 #include "s_test_helpers.h"
15 #include "test_framework_helpers.h"
16 
17 /* Test UIDs */
18 #define TEST_UID 2UL /* UID 1 cannot be used as it references a write once
19  * asset, created in psa_ps_s_interface_testsuite.c
20  */
21 
22 /* Test suite defines */
23 #define LOOP_ITERATIONS_001 15U
24 #define LOOP_ITERATIONS_002 15U
25 
26 /* Write data */
27 #define WRITE_DATA "THE_FIVE_BOXING_WIZARDS_JUMP_QUICKLY"
28 #define WRITE_DATA_SIZE (sizeof(WRITE_DATA) - 1)
29 #define READ_DATA "############################################"
30 #define RESULT_DATA ("####" WRITE_DATA "####")
31 
32 /* Define test suite for PS reliability tests */
33 /* List of tests */
34 static void tfm_ps_test_3001(struct test_result_t *ret);
35 static void tfm_ps_test_3002(struct test_result_t *ret);
36 
37 static struct test_t reliability_tests[] = {
38  {&tfm_ps_test_3001, "TFM_PS_TEST_3001",
39  "repetitive sets and gets in/from an asset", {TEST_PASSED} },
40  {&tfm_ps_test_3002, "TFM_PS_TEST_3002",
41  "repetitive sets, gets and removes", {TEST_PASSED} },
42 };
43 
45 {
46  uint32_t list_size = (sizeof(reliability_tests) /
47  sizeof(reliability_tests[0]));
48 
49  set_testsuite("PS reliability tests (TFM_PS_TEST_3XXX)",
50  reliability_tests, list_size, p_test_suite);
51 }
52 
56 static void tfm_ps_test_3001(struct test_result_t *ret)
57 {
58  psa_status_t status;
59  const psa_storage_uid_t uid = TEST_UID;
61  const uint32_t data_len = WRITE_DATA_SIZE;
62  const uint32_t offset = 0;
63  uint32_t itr;
64  const uint8_t write_data[] = WRITE_DATA;
65  uint8_t read_data[] = READ_DATA;
66  size_t read_data_len = 0;
67 
68  for (itr = 0; itr < LOOP_ITERATIONS_001; itr++) {
69  TEST_LOG(" > Iteration %d of %d\r", itr + 1, LOOP_ITERATIONS_001);
70 
71  /* Set a data in the asset */
72  status = psa_ps_set(uid, data_len, write_data, flags);
73  if (status != PSA_SUCCESS) {
74  TEST_FAIL("Set should not fail with valid UID");
75  return;
76  }
77 
78  /* Get data from the asset */
79  status = psa_ps_get(uid, offset, data_len, (read_data +
81  &read_data_len);
82  if (status != PSA_SUCCESS) {
83  TEST_FAIL("Get should not fail");
84  return;
85  }
86 
87  /* Check that the data has not changed */
88  if (tfm_memcmp(read_data, RESULT_DATA, sizeof(read_data)) != 0) {
89  TEST_FAIL("The data should not have changed");
90  return;
91  }
92 
93  /* Set the original data into read buffer */
94  tfm_memcpy(read_data, READ_DATA, sizeof(read_data));
95  }
96 
97  TEST_LOG("\n");
98 
99  /* Remove the asset to clean up storage for the next test */
100  status = psa_ps_remove(uid);
101  if (status != PSA_SUCCESS) {
102  TEST_FAIL("Remove should not fail with valid UID");
103  return;
104  }
105 
106  ret->val = TEST_PASSED;
107 }
108 
112 static void tfm_ps_test_3002(struct test_result_t *ret)
113 {
114  psa_status_t status;
115  const psa_storage_uid_t uid = TEST_UID;
117  const uint32_t data_len = WRITE_DATA_SIZE;
118  const uint32_t offset = 0;
119  uint32_t itr;
120  const uint8_t write_data[] = WRITE_DATA;
121  uint8_t read_data[] = READ_DATA;
122  size_t read_data_len = 0;
123 
124  for (itr = 0; itr < LOOP_ITERATIONS_002; itr++) {
125  TEST_LOG(" > Iteration %d of %d\r", itr + 1, LOOP_ITERATIONS_002);
126 
127  /* Set a data in the asset */
128  status = psa_ps_set(uid, data_len, write_data, flags);
129  if (status != PSA_SUCCESS) {
130  TEST_FAIL("Set should not fail with valid UID");
131  return;
132  }
133 
134  /* Get data from the asset */
135  status = psa_ps_get(uid, offset, data_len, (read_data +
137  &read_data_len);
138  if (status != PSA_SUCCESS) {
139  TEST_FAIL("Get should not fail");
140  return;
141  }
142 
143  /* Check that the data has not changed */
144  if (tfm_memcmp(read_data, RESULT_DATA, sizeof(read_data)) != 0) {
145  TEST_FAIL("The data should not have changed");
146  return;
147  }
148 
149  /* Remove the asset from the protected storage */
150  status = psa_ps_remove(uid);
151  if (status != PSA_SUCCESS) {
152  TEST_FAIL("Remove should not fail with valid UID");
153  return;
154  }
155 
156  /* Set the original data into read buffer */
157  tfm_memcpy(read_data, READ_DATA, sizeof(read_data));
158  }
159 
160  TEST_LOG("\n");
161 
162  ret->val = TEST_PASSED;
163 }
#define WRITE_DATA_SIZE
psa_status_t psa_ps_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.
#define PSA_SUCCESS
Definition: crypto_values.h:35
#define TEST_FAIL(info_msg)
#define RESULT_DATA
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.
psa_status_t psa_ps_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.
#define LOOP_ITERATIONS_002
#define WRITE_DATA
struct test_result_t ret
psa_status_t psa_ps_remove(psa_storage_uid_t uid)
Remove the provided uid and its associated data from the storage.
#define HALF_PADDING_SIZE
__STATIC_INLINE void * tfm_memcpy(void *dest, const void *src, size_t num)
#define TEST_LOG(...)
void register_testsuite_s_psa_ps_reliability(struct test_suite_t *p_test_suite)
Register testsuite for the ps reliability tests.
uint64_t psa_storage_uid_t
enum test_status_t val
__STATIC_INLINE int tfm_memcmp(const void *ptr1, const void *ptr2, size_t num)
#define LOOP_ITERATIONS_001
#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