LPC55S69: Add Protected Storage demo

This demo shows how protected storage works in RTT. It tests by write
and read data over PSA APIs, then check the integrity. The test will
run repeatedly, each time with different data.

The TFM package does not support LPC55S69 board officially yet.

Change-Id: Ib1cd4fc8166b21e3f774f092c95d2811d51123fe
Signed-off-by: Kevin Peng <kevin.peng@arm.com>
Signed-off-by: Karl Zhang <karl.zhang@arm.com>
This commit is contained in:
Kevin Peng 2020-01-10 22:53:35 +08:00 committed by Karl Zhang
parent 2479d7de4a
commit cd95e4cd59
4 changed files with 142 additions and 1 deletions

View File

@ -1,11 +1,13 @@
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
* Copyright (c) 2019-2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2019-10-24 Magicoe first version
* 2020-01-10 Kevin/Karl Add PS demo
*
*/
@ -16,8 +18,12 @@
/* GPIO1_4 is Blue LED */
#define LEDB_PIN GET_PINS(1, 4)
extern void protected_storage_demo_thread(void * parameters);
int main(void)
{
rt_thread_t t_psa_ps_demo;
#if defined(__CC_ARM)
rt_kprintf("using armcc, version: %d\n", __ARMCC_VERSION);
#elif defined(__CLANG_ARM)
@ -28,6 +34,14 @@ int main(void)
rt_kprintf("using gcc, version: %d.%d\n", __GNUC__, __GNUC_MINOR__);
#endif
t_psa_ps_demo = rt_thread_create("psa_ps_demo",
protected_storage_demo_thread,
RT_NULL,
512,
( RT_MAIN_THREAD_PRIORITY - 1),
50);
if (t_psa_ps_demo != RT_NULL) rt_thread_startup(t_psa_ps_demo);
rt_pin_mode(LEDB_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */
while (1)
{

View File

@ -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

View File

@ -370,6 +370,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\applications\tfm_ps.c</PathWithFileName>
<FilenameWithoutPath>tfm_ps.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>

View File

@ -463,6 +463,11 @@
<FileType>1</FileType>
<FilePath>applications\main.c</FilePath>
</File>
<File>
<FileName>tfm_ps.c</FileName>
<FileType>1</FileType>
<FilePath>.\applications\tfm_ps.c</FilePath>
</File>
</Files>
</Group>
<Group>