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:
parent
2479d7de4a
commit
cd95e4cd59
|
@ -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)
|
||||
|
@ -27,7 +33,15 @@ int main(void)
|
|||
#elif defined(__GNUC__)
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -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
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue