|
@@ -0,0 +1,110 @@
|
|
|
+/*
|
|
|
+ * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
|
|
|
+ *
|
|
|
+ * SPDX-License-Identifier: Apache-2.0
|
|
|
+ *
|
|
|
+ * Change Logs:
|
|
|
+ * Date Author Notes
|
|
|
+ * 2020-01-10 Kevin/Karl Add PS demo
|
|
|
+ *
|
|
|
+ */
|
|
|
+
|
|
|
+#include <rtdevice.h>
|
|
|
+#include <string.h>
|
|
|
+#include "tfm_ns_lock.h"
|
|
|
+#include "psa_protected_storage.h"
|
|
|
+
|
|
|
+#define TEST_UID_A 2U
|
|
|
+#define ASSET_A "THEQUICKBROWNFOXJUMPSOVERALAZYDOG"
|
|
|
+#define ASSET_A_SIZE (sizeof( ASSET_A ) - 1)
|
|
|
+#define RESETDATA "THISIS"
|
|
|
+#define RESETDATA_SIZE (sizeof( RESETDATA ) - 1)
|
|
|
+#define READ_LENGTH (ASSET_A_SIZE > RESETDATA_SIZE ? \
|
|
|
+ ASSET_A_SIZE : RESETDATA_SIZE)
|
|
|
+
|
|
|
+void protected_storage_demo_thread(void * parameters)
|
|
|
+{
|
|
|
+ psa_ps_status_t status;
|
|
|
+ const psa_ps_uid_t uid = TEST_UID_A;
|
|
|
+ const psa_ps_create_flags_t flags = PSA_PS_FLAG_NONE;
|
|
|
+ uint8_t write_data[] = ASSET_A;
|
|
|
+ const uint32_t data_length = ASSET_A_SIZE;
|
|
|
+ uint8_t rewrite_data[] = RESETDATA;
|
|
|
+ const uint32_t reset_data_length = RESETDATA_SIZE;
|
|
|
+ uint8_t get_data[READ_LENGTH];
|
|
|
+ uint32_t counter = 0;
|
|
|
+
|
|
|
+ tfm_ns_lock_init();
|
|
|
+
|
|
|
+ for ( ; ; )
|
|
|
+ {
|
|
|
+ /* Call TF-M protected storage service and set the asset. */
|
|
|
+ status = psa_ps_set(uid, data_length, write_data, flags);
|
|
|
+ if (status != PSA_PS_SUCCESS)
|
|
|
+ {
|
|
|
+ rt_kprintf("[Protected Storage Asset A Set Round %ld] Fail\r\n", counter);
|
|
|
+ for( ; ; );
|
|
|
+ }
|
|
|
+
|
|
|
+ rt_kprintf("[Protected Storage Asset A Set Round %ld] Success\r\n", counter);
|
|
|
+
|
|
|
+ /* Read the asset. */
|
|
|
+ status = psa_ps_get(uid, 0, data_length, get_data);
|
|
|
+ if (status != PSA_PS_SUCCESS)
|
|
|
+ {
|
|
|
+ rt_kprintf("[Protected Storage Asset A Get Round %ld] Fail\r\n", counter);
|
|
|
+ for ( ; ; );
|
|
|
+ }
|
|
|
+
|
|
|
+ rt_kprintf("[Protected Storage Asset A Get Round %ld] Success\r\n", counter);
|
|
|
+
|
|
|
+ /* Check the read data. */
|
|
|
+ if (memcmp(write_data, get_data, sizeof(write_data) - 1) != 0)
|
|
|
+ {
|
|
|
+ rt_kprintf("[Protected Storage Asset A Get Round %ld] Get the wrong data\r\n", counter);
|
|
|
+ for ( ; ; );
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Change the asset. */
|
|
|
+ status = psa_ps_set(uid, reset_data_length, rewrite_data, flags);
|
|
|
+ if (status != PSA_PS_SUCCESS)
|
|
|
+ {
|
|
|
+ rt_kprintf("[Protected Storage Asset A Reset Round %ld] Fail\r\n", counter);
|
|
|
+ }
|
|
|
+
|
|
|
+ rt_kprintf("[Protected Storage Asset A Reset Round %ld] Success\r\n", counter);
|
|
|
+
|
|
|
+ /* Read the asset. */
|
|
|
+ status = psa_ps_get(uid, 0, reset_data_length, get_data);
|
|
|
+ if (status != PSA_PS_SUCCESS)
|
|
|
+ {
|
|
|
+ rt_kprintf("[Protected Storage Asset A Get Round %ld] Fail\r\n", counter);
|
|
|
+ for ( ; ; );
|
|
|
+ }
|
|
|
+
|
|
|
+ rt_kprintf("[Protected Storage Asset A Get Round %ld] Success\r\n", counter);
|
|
|
+
|
|
|
+ /* Check the read data. */
|
|
|
+ if (memcmp(rewrite_data, get_data, sizeof(rewrite_data) - 1) != 0)
|
|
|
+ {
|
|
|
+ rt_kprintf("[Protected Storage Asset A Get Round %ld] Get the wrong data\r\n", counter);
|
|
|
+ for ( ; ; );
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Remove the asset. */
|
|
|
+ status = psa_ps_remove(uid);
|
|
|
+ if (status != PSA_PS_SUCCESS)
|
|
|
+ {
|
|
|
+ rt_kprintf("[Protected Storage Asset A Remove Round %ld] Fail\r\n", counter);
|
|
|
+ for ( ; ; );
|
|
|
+ }
|
|
|
+
|
|
|
+ rt_kprintf("[Protected Storage Asset A Remove Round %ld] Success\r\n\n", counter);
|
|
|
+
|
|
|
+ /* Wait for a second. */
|
|
|
+ rt_thread_mdelay(1000);
|
|
|
+ counter++;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// end file
|