psa arch test v1.2 release commits
diff --git a/api-specs/attestation/v1.0.2/doc/IHI0085-PSA_Attestation_API-1.0.2.pdf b/api-specs/attestation/v1.0.2/doc/IHI0085-PSA_Attestation_API-1.0.2.pdf
new file mode 100644
index 0000000..0c014aa
--- /dev/null
+++ b/api-specs/attestation/v1.0.2/doc/IHI0085-PSA_Attestation_API-1.0.2.pdf
Binary files differ
diff --git a/api-tests/CMakeLists.txt b/api-tests/CMakeLists.txt
index 40479fd..e0f1dbe 100644
--- a/api-tests/CMakeLists.txt
+++ b/api-tests/CMakeLists.txt
@@ -152,6 +152,17 @@
1.0.1
1.0.2
)
+elseif("${SUITE}" STREQUAL "IPC")
+list(APPEND PSA_SPEC_VERSION
+ 1.0
+ 1.1
+)
+
+endif()
+
+#list of values available for connection based
+if(${SUITE} STREQUAL "IPC")
+list(APPEND PSA_STATELESS_ROT 0 1)
endif()
message(STATUS "[PSA] : ----------Process input arguments- start-------------")
@@ -272,7 +283,21 @@
if(${SPEC_VERSION} STREQUAL "1.0.2")
set(TESTSUITE_DB ${PSA_SUITE_DIR}/1.0.2_testsuite.db)
endif()
- endif()
+ elseif(${SUITE} STREQUAL "IPC")
+ if(${SPEC_VERSION} STREQUAL "1.1")
+ if(DEFINED STATELESS_ROT_TESTS)
+ if(${STATELESS_ROT_TESTS} EQUAL 1)
+ set(TESTSUITE_DB ${PSA_SUITE_DIR}/stateless_rot_testsuite.db)
+ else()
+ set(TESTSUITE_DB ${PSA_SUITE_DIR}/testsuite.db)
+ endif()
+ else()
+ set(TESTSUITE_DB ${PSA_SUITE_DIR}/testsuite.db)
+ endif()
+ else()
+ set(TESTSUITE_DB ${PSA_SUITE_DIR}/testsuite.db)
+ endif()
+ endif()
endif()
set(PSA_TESTLIST_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SUITE_LOWER}_testlist.txt)
set(PSA_TEST_ENTRY_LIST_INC ${CMAKE_CURRENT_BINARY_DIR}/test_entry_list.inc)
@@ -419,6 +444,45 @@
endif()
endif()
+if(DEFINED STATELESS_ROT_TESTS)
+ if(NOT ${STATELESS_ROT_TESTS} IN_LIST PSA_STATELESS_ROT)
+ message(FATAL_ERROR "[PSA] : Error: Unsupported value for -DSTATELESS_ROT_TESTS=${STATELESS_ROT_TESTS}, supported values are : ${PSA_STATELESS_ROT}")
+ elseif(${STATELESS_ROT_TESTS} EQUAL 1)
+ message(STATUS "[PSA] : Testing ${SUITE} for stateless rot")
+ elseif(${STATELESS_ROT_TESTS} EQUAL 0)
+ message(STATUS "[PSA] : Testing ${SUITE} for connection based")
+ endif()
+
+ if(NOT DEFINED SPEC_VERSION)
+ message(FATAL_ERROR "[PSA] : Error: SPEC_VERSION is require for STATELESS_ROT_TESTS.")
+ elseif(${SUITE} STREQUAL "IPC")
+ if(${SPEC_VERSION} STREQUAL "1.0")
+ message(FATAL_ERROR "[PSA] : Error: STATELESS_ROT_TESTS is only valid for SPEC_VERSION=1.1.")
+ elseif(${SPEC_VERSION} STREQUAL "1.1")
+ add_definitions(-DSPEC_VERSION=11)
+ if(${STATELESS_ROT_TESTS} EQUAL 1)
+ add_definitions(-DSTATELESS_ROT=1)
+ elseif(${STATELESS_ROT_TESTS} EQUAL 0)
+ add_definitions(-DSTATELESS_ROT=0)
+ endif()
+ endif()
+ else()
+ message(FATAL_ERROR "[PSA] : Error: STATELESS_ROT_TESTS is only applicable to IPC Test Suite.")
+ endif()
+else()
+ add_definitions(-DSTATELESS_ROT=0)
+ if(DEFINED SPEC_VERSION)
+ if(${SUITE} STREQUAL "IPC")
+ if(${SPEC_VERSION} STREQUAL "1.0")
+ add_definitions(-DSPEC_VERSION=10)
+ endif()
+ if(${SPEC_VERSION} STREQUAL "1.1")
+ add_definitions(-DSPEC_VERSION=11)
+ endif()
+ endif()
+ endif()
+endif()
+
message(STATUS "[PSA] : ----------Process input arguments- complete-------------")
diff --git a/api-tests/dev_apis/README.md b/api-tests/dev_apis/README.md
index 180295d..36af1cb 100644
--- a/api-tests/dev_apis/README.md
+++ b/api-tests/dev_apis/README.md
@@ -14,14 +14,14 @@
For more information on the architecture test suite framework and methodology to run the tests, refer to the [Validation Methodology](../docs/Arm_PSA_APIs_Arch_Test_Validation_Methodology.pdf) document.
## This release
- - Code Quality : REL v1.1
+ - Code Quality : REL v1.2
- This release contains following PSA Functional APIs tests: <br />
| Test Category | Specification Version |
|--------------------------|--------------------------------------|
-| Crypto | [PSA Crypto API 1.0-Beta3](../../api-specs/crypto/v1.0-beta3/doc/) |
+| Crypto | [PSA Crypto API 1.0.0](../../api-specs/crypto/v1.0.0/doc/) |
| Storage (PS and ITS) | [PSA Storage API 1.0.0](../../api-specs/storage/v1.0/doc/) |
-| Attestation | [PSA Attestation API 1.0.0](../../api-specs/attestation/v1.0/doc/) |
+| Attestation | [PSA Attestation API 1.0.2](../../api-specs/attestation/v1.0.2/doc/) |
## Release Tags
@@ -30,6 +30,7 @@
| Release version | Release tag | PSA Crypto API | PSA Storage API | PSA Attestation API |
|-----------------|---------------|----------------|-----------------|---------------------|
+| REL v1.2 | [v21.07_API1.2_ADAC_ALPHA](https://github.com/ARM-software/psa-arch-tests/tree//api-tests/dev_apis) | 1.0.0 | 1.0.0 | 1.0.2 |
| REL v1.1 | [v20.11_API1.1](https://github.com/ARM-software/psa-arch-tests/tree/v20.11_API1.1/api-tests/dev_apis) | 1.0-Beta3 | 1.0.0 | 1.0.0 |
| REL v1.0 | [v20.03_API1.0](https://github.com/ARM-software/psa-arch-tests/tree/v20.03_API1.0/api-tests/dev_apis) | 1.0-Beta3 | 1.0.0 | 1.0.0 |
| v0.9 | [v19.06_API0.9](https://github.com/ARM-software/psa-arch-tests/tree/v19.06_API0.9/api-tests/dev_apis) | 1.0-Beta2 | 1.0-Beta2 | 1.0-Beta0 |
@@ -63,8 +64,8 @@
- -G"<generator_name>" : "Unix Makefiles" to generate Makefiles for Linux and Cygwin. "MinGW Makefiles" to generate Makefiles for cmd.exe on Windows <br />
- -DTARGET=<platform_name> is the same as the name of the target-specific directory created in the **platform/targets/** directory. The current release has been tested on **tgt_dev_apis_tfm_an521**, **tgt_dev_apis_tfm_musca_b1** and **tgt_dev_apis_tfm_musca_a** platforms. Refer [Test_failure analysis](../docs/test_failure_analysis.md) document to know the reason for any known test fail.<br />
-- -DTOOLCHAIN=<tool_chain> Compiler toolchain to be used for test suite compilation. Supported values are GNUARM (GNU Arm Embedded), ARMCLANG (ARM Compiler 6.x) and HOST_GCC. Default is GNUARM.<br />
-- -DCPU_ARCH=<cpu_architecture_version> is the Arm Architecture version name for which the tests should be compiled. Supported CPU arch are armv8m_ml, armv8m_bl and armv7m. Default is empty. This option is unused when TOOLCHAIN type is HOST_GCC.<br />
+- -DTOOLCHAIN=<tool_chain> Compiler toolchain to be used for test suite compilation. Supported values are GNUARM (GNU Arm Embedded), ARMCLANG (ARM Compiler 6.x) , HOST_GCC and GCC_LINUX . Default is GNUARM.<br />
+- -DCPU_ARCH=<cpu_architecture_version> is the Arm Architecture version name for which the tests should be compiled. Supported CPU arch are armv8m_ml, armv8m_bl, armv7m and armv8a. Default is empty. This option is unused when TOOLCHAIN type is HOST_GCC.<br />
- -DSUITE=<suite_name> is the test suite name. Supported values are CRYPTO, INITIAL_ATTESTATION, STORAGE(INTERNAL_TRUSTED_STORAGE and PROTECTED_STORAGE), INTERNAL_TRUSTED_STORAGE and PROTECTED_STORAGE .<br />
- -DVERBOSE=<verbose_level>. Print verbosity level. Default is 3. Supported print levels are 1(INFO & above), 2(DEBUG & above), 3(TEST & above), 4(WARN & ERROR) and 5(ERROR).
- -DBUILD=<BUILD_DIR> : To select the build directory to keep output files. Default is BUILD/ inside current directory.
@@ -74,6 +75,8 @@
- -DSPEC_VERSION=<spec_version> is test suite specification version. Which will build for given specified spec_version. Supported values for CRYPTO test suite are 1.0-BETA1, 1.0-BETA2, 1.0-BETA3 , for INITIAL_ATTESATATION test suite are 1.0-BETA0, 1.0.0, 1.0.1, 1.0.2, for STORAGE, INTERNAL_TRUSTED_STORAGE, PROTECTED_STORAGE test suite are 1.0-BETA2, 1.0 . Default is empty. <br/>
If -DSPEC_VERSION option is not given it will build for latest version of testsuite.
For every spec version corresponds test list will be in spec_version_testsuite.db file in api-tests/dev_apis/test_suite_name/ folder.
+- -DCOMPILER_NAME=<compiler_name> Compiler name to be use for selecting compiler. Supported values are gcc. By defualt it will take gcc if not specified.
+ Note: -DCOMPILER_NAME only applicable for linux i.e. -DTOOLCHAIN=GCC_LINUX and DTARGET=tgt_dev_apis_linux.
- -DPSA_INCLUDE_PATHS="<include_path1>;<include_path2>;...;<include_pathn>" is an additional directory to be included into the compiler search path.You must provide Functional APIs header files implementation to the test suite build system using this option. For example, to compile Crypto tests, the include path must point to the path where **psa/crypto.h** is located in your build system. Bydefault, PSA_INCLUDE_PATHS accepts absolute path. However, relative path can be provided using below format:<br />
```
-DPSA_INCLUDE_PATHS=`readlink -f <relative_include_path>`
diff --git a/api-tests/dev_apis/crypto/1.0.0_testsuite.db b/api-tests/dev_apis/crypto/1.0.0_testsuite.db
new file mode 100644
index 0000000..562cedf
--- /dev/null
+++ b/api-tests/dev_apis/crypto/1.0.0_testsuite.db
@@ -0,0 +1,87 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+
+#List of tests to be compiled and run as part of crypto suite
+
+(START)
+
+test_c001
+test_c002
+test_c003
+test_c004
+test_c005
+test_c006
+test_c007
+test_c008
+test_c009
+test_c010
+test_c011
+test_c012
+test_c013
+test_c014
+test_c015
+test_c016
+test_c017
+test_c018
+test_c019
+test_c020
+test_c021
+test_c022
+test_c023
+test_c024
+test_c025
+test_c026
+test_c027
+test_c028
+test_c029
+test_c030
+test_c031
+test_c032
+test_c033
+test_c034
+test_c035
+test_c036
+test_c037
+test_c038
+test_c039
+test_c040
+test_c041
+test_c042
+test_c043
+test_c044
+test_c045
+test_c046
+test_c047
+test_c048
+test_c049
+test_c050
+test_c051
+test_c052
+test_c053
+test_c054
+test_c055
+test_c056
+test_c057
+test_c058
+test_c059
+test_c060
+test_c061
+test_c062
+test_c063
+
+(END)
diff --git a/api-tests/dev_apis/crypto/test_c041/test_entry_c041.c b/api-tests/dev_apis/crypto/test_c041/test_entry_c041.c
index 2e10d6d..0f2dc92 100644
--- a/api-tests/dev_apis/crypto/test_c041/test_entry_c041.c
+++ b/api-tests/dev_apis/crypto/test_c041/test_entry_c041.c
@@ -20,7 +20,7 @@
#include "test_c041.h"
#define TEST_NUM VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 41)
-#define TEST_DESC "Testing crypto asymmetric APIs | UT: psa_asymmetric_sign\n"
+#define TEST_DESC "Testing crypto asymmetric APIs | UT: psa_sign_hash\n"
TEST_PUBLISH(TEST_NUM, test_entry);
val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/test_c042/test_entry_c042.c b/api-tests/dev_apis/crypto/test_c042/test_entry_c042.c
index 1a930bf..eb23d27 100644
--- a/api-tests/dev_apis/crypto/test_c042/test_entry_c042.c
+++ b/api-tests/dev_apis/crypto/test_c042/test_entry_c042.c
@@ -20,7 +20,7 @@
#include "test_c042.h"
#define TEST_NUM VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 42)
-#define TEST_DESC "Testing crypto asymmetric APIs | UT: psa_asymmetric_verify\n"
+#define TEST_DESC "Testing crypto asymmetric APIs | UT: psa_verify_hash\n"
TEST_PUBLISH(TEST_NUM, test_entry);
val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/test_c050/test_entry_c050.c b/api-tests/dev_apis/crypto/test_c050/test_entry_c050.c
index 2d8c99f..355d887 100644
--- a/api-tests/dev_apis/crypto/test_c050/test_entry_c050.c
+++ b/api-tests/dev_apis/crypto/test_c050/test_entry_c050.c
@@ -20,7 +20,7 @@
#include "test_c050.h"
#define TEST_NUM VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 50)
-#define TEST_DESC "Testing crypto key management APIs | UT: psa_open_key\n"
+#define TEST_DESC "Testing crypto key management APIs | UT: psa_sign_message\n"
TEST_PUBLISH(TEST_NUM, test_entry);
val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/test_c051/test_entry_c051.c b/api-tests/dev_apis/crypto/test_c051/test_entry_c051.c
index aa73a08..9f4e7a2 100644
--- a/api-tests/dev_apis/crypto/test_c051/test_entry_c051.c
+++ b/api-tests/dev_apis/crypto/test_c051/test_entry_c051.c
@@ -20,7 +20,7 @@
#include "test_c051.h"
#define TEST_NUM VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 51)
-#define TEST_DESC "Testing crypto key management APIs | UT: psa_close_key\n"
+#define TEST_DESC "Testing crypto key management APIs | UT: psa_verify_message\n"
TEST_PUBLISH(TEST_NUM, test_entry);
val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/test_c058/test_entry_c058.c b/api-tests/dev_apis/crypto/test_c058/test_entry_c058.c
index 6febb42..22fe94f 100644
--- a/api-tests/dev_apis/crypto/test_c058/test_entry_c058.c
+++ b/api-tests/dev_apis/crypto/test_c058/test_entry_c058.c
@@ -20,7 +20,7 @@
#include "test_c058.h"
#define TEST_NUM VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 58)
-#define TEST_DESC "Testing crypto AEAD APIs | UT: psa_aead_update_test\n"
+#define TEST_DESC "Testing crypto AEAD APIs | UT: psa_aead_update\n"
TEST_PUBLISH(TEST_NUM, test_entry);
val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/test_c062/test_entry_c062.c b/api-tests/dev_apis/crypto/test_c062/test_entry_c062.c
index d7cff4a..98de3cf 100644
--- a/api-tests/dev_apis/crypto/test_c062/test_entry_c062.c
+++ b/api-tests/dev_apis/crypto/test_c062/test_entry_c062.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,7 +20,7 @@
#include "test_c062.h"
#define TEST_NUM VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 62)
-#define TEST_DESC "Testing crypto hash functions APIs\n"
+#define TEST_DESC "Testing crypto hash functions APIs | UT: psa_hash_suspend\n"
TEST_PUBLISH(TEST_NUM, test_entry);
val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/test_c063/test_entry_c063.c b/api-tests/dev_apis/crypto/test_c063/test_entry_c063.c
index 4049d97..6bddba5 100644
--- a/api-tests/dev_apis/crypto/test_c063/test_entry_c063.c
+++ b/api-tests/dev_apis/crypto/test_c063/test_entry_c063.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,7 +20,7 @@
#include "test_c063.h"
#define TEST_NUM VAL_CREATE_TEST_ID(VAL_CRYPTO_BASE, 63)
-#define TEST_DESC "Testing crypto hash functions APIs\n"
+#define TEST_DESC "Testing crypto hash functions APIs | UT: psa_hash_resume\n"
TEST_PUBLISH(TEST_NUM, test_entry);
val_api_t *val = NULL;
diff --git a/api-tests/dev_apis/crypto/testsuite.db b/api-tests/dev_apis/crypto/testsuite.db
index a322098..7e4f8b4 100644
--- a/api-tests/dev_apis/crypto/testsuite.db
+++ b/api-tests/dev_apis/crypto/testsuite.db
@@ -1,5 +1,5 @@
#/** @file
-# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
+# * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
# * SPDX-License-Identifier : Apache-2.0
# *
# * Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/api-tests/docs/Arm_PSA-M_Functional_API_Test_Suite_Validation_Methodology.pdf b/api-tests/docs/Arm_PSA-M_Functional_API_Test_Suite_Validation_Methodology.pdf
new file mode 100644
index 0000000..90f44d9
--- /dev/null
+++ b/api-tests/docs/Arm_PSA-M_Functional_API_Test_Suite_Validation_Methodology.pdf
Binary files differ
diff --git a/api-tests/docs/Arm_PSA_APIs_Arch_Test_Validation_Methodology.pdf b/api-tests/docs/Arm_PSA_APIs_Arch_Test_Validation_Methodology.pdf
deleted file mode 100644
index 123d593..0000000
--- a/api-tests/docs/Arm_PSA_APIs_Arch_Test_Validation_Methodology.pdf
+++ /dev/null
Binary files differ
diff --git a/api-tests/docs/sw_requirements.md b/api-tests/docs/sw_requirements.md
index 7c7f8f1..2809434 100644
--- a/api-tests/docs/sw_requirements.md
+++ b/api-tests/docs/sw_requirements.md
@@ -6,7 +6,7 @@
- Host Operating System : Ubuntu 16.04, Windows 10
- Scripting tools : Python 3.7.1
- Host Compiler toolchain : GCC 5.4.0 (Linux Host) or MinGW 6.3.0 (Windows Host)
-- Cross Compiler toolchain : GNU Arm Embedded Toolchain 7.3.1 or Arm Compiler 6.11
+- Cross Compiler toolchain : GNU Arm Embedded Toolchain 7.3.1 or Arm Compiler 6.14
- Build tools : CMake 3.15
**Note**: To compile the test suite code, at least one of the above supported compiler toolchains
@@ -45,4 +45,4 @@
--------------
-*Copyright (c) 2018-2020, Arm Limited and Contributors. All rights reserved.*
+*Copyright (c) 2018-2021, Arm Limited and Contributors. All rights reserved.*
diff --git a/api-tests/docs/test_failure_analysis.md b/api-tests/docs/test_failure_analysis.md
index bb48229..81c10fc 100644
--- a/api-tests/docs/test_failure_analysis.md
+++ b/api-tests/docs/test_failure_analysis.md
@@ -2,8 +2,8 @@
# Test failure analysis document
This file contains list of failures identified when testing the release
-on tgt_dev_apis_tfm_an521, tgt_dev_apis_tfm_musca_a and tgt_dev_apis_tfm_musca_b1
-targets with TFM commit Hash - cea100b1e09fe53fd1ed6818b8129ef51daa0822.
+on tgt_dev_apis_tfm_an521 and tgt_dev_apis_tfm_musca_b1
+targets with TFM commit Hash - d0f6ceb0559af6ef08f4624eeac079cc07a1f077.
The reason for each failing test is listed here in this file.
## Known Failures
@@ -11,11 +11,16 @@
| Test | Fail description | Github issue |
|------|---------------------------------------------------------------------------------| ------------ |
|test_c021 | psa_key_derivation_output_key returns incorrect error code | https://github.com/ARMmbed/mbed-crypto/issues/175 |
+|test_c026 | psa_sign_message not supported | https://jira.arm.com/browse/IOTPSW-4100 |
+|test_c027 | psa_mac_update not supported | https://jira.arm.com/browse/IOTPSW-4100 |
+|test_c028 | PSA_KEY_USAGE_SIGN_MESSAGE not found | https://jira.arm.com/browse/IOTPSW-4100 |
+|test_c029 | PSA_KEY_USAGE_VERIFY_MESSAGE not supported | https://jira.arm.com/browse/IOTPSW-4100 |
+|test_c030 | PSA_KEY_USAGE_VERIFY_MESSAGE not supported | https://jira.arm.com/browse/IOTPSW-4100 |
|test_c046 | psa_mac_compute is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
|test_c047 | psa_mac_verify is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
|test_c048 | psa_cipher_encrypt is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
|test_c049 | psa_cipher_decrypt is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
-|test_c050 | Persistent key storage is unavailable in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/382 |
+|test_c051 | PSA_KEY_USAGE_VERIFY_MESSAGE not supported | https://jira.arm.com/browse/IOTPSW-4100 |
|test_c052 | psa_aead_encrypt_setup is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
|test_c053 | psa_aead_decrypt_setup is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
|test_c054 | psa_aead_generate_nonce is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
@@ -26,6 +31,8 @@
|test_c059 | psa_aead_finish is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
|test_c060 | psa_aead_abort is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
|test_c061 | psa_aead_verify is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://github.com/ARMmbed/mbed-crypto/issues/381 |
+|test_c062 | psa_hash_suspend is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://jira.arm.com/browse/IOTPSW-4100 |
+|test_c063 | psa_hash_resume is unimplemented in TFM/mbed-crypto. So the test has not been verified. | https://jira.arm.com/browse/IOTPSW-4100 |
## License
@@ -33,4 +40,4 @@
--------------
-*Copyright (c) 2020, Arm Limited and Contributors. All rights reserved.*
+*Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.*
diff --git a/api-tests/ff/README.md b/api-tests/ff/README.md
index 371a968..24a2813 100644
--- a/api-tests/ff/README.md
+++ b/api-tests/ff/README.md
@@ -23,13 +23,14 @@
For more information on architecture test suite specification, refer to the [Validation Methodology](../docs/Arm_PSA_APIs_Arch_Test_Validation_Methodology.pdf) document.
## This release
- - Code Quality : REL v1.1
- - This release contains the PSA-FF tests that are written for the PSA FF 1.0 specification.
+ - Code Quality : REL v1.2
+ - This release contains the PSA-FF tests that are written for the PSA FF 1.1 Extensions specification.
## Release Tags
| Release version | Release tag | PSA FF specification version |
|-----------------|---------------|----------------|
+| REL v1.2 | [v21.07_API1.2_ADAC_ALPHA](https://github.com/ARM-software/psa-arch-tests/tree//api-tests/ff) | 1.1-Alpha0 |
| REL v1.1 | [v20.11_API1.1](https://github.com/ARM-software/psa-arch-tests/tree/v20.11_API1.1/api-tests/ff) | 1.0 |
| REL v1.0 | [v20.03_API1.0](https://github.com/ARM-software/psa-arch-tests/tree/v20.03_API1.0/api-tests/ff) | 1.0 |
| v0.9 | [v19.06_API0.9](https://github.com/ARM-software/psa-arch-tests/tree/v19.06_API0.9/api-tests/ff) | 1.0-Beta1 |
@@ -85,11 +86,23 @@
- -DWATCHDOG_AVAILABLE=<0|1>: Test harness may require to access watchdog timer to recover system hang. 0 means skip watchdog programming in the test suite and 1 means program the watchdog. Default is 1. Note, If the system under test doesn't support the reboot of the system when it encounters the panic situation, a watchdog must be available to the tests if INCLUDE_PANIC_TESTS set to 1.
- -DSUITE_TEST_RANGE="<test_start_number>;<test_end_number>" is to select range of tests for build. All tests under -DSUITE are considered by default if not specified.
- -DTFM_PROFILE=<profile_small/profile_medium> is to work with TFM defined Pofile Small/Medium definitions. Supported values are profile_small and profile_medium. Unless specified Default Profile is used.
+- -DSPEC_VERSION=<spec_version> is test suite specification version. Which will build for given specified spec_version. Supported values for FF test suite are 1.0 and 1.1 . Default is empty. <br/>
+ If -DSPEC_VERSION option is not given it will build for latest version of testsuite.
+ For spec version corresponds test list will be in testsuite.db file in api-tests/ff/ipc/ folder.
+ Note: For FF 1.1 make sure to do the manifests changes and use SPEC_VERSION=1.1 .
+- -DSTATELESS_ROT_TESTS=<stateless_rot> is the flag for enabling stateless rot service for FF suite. Supported values are 0 and 1. 0 for connection based services and 1 for stateless rot services.
+ Note: For using STATELESS ROT service must use -DSPEC_VERSION = 1.1 .
- -DPSA_INCLUDE_PATHS="<include_path1>;<include_path2>;...;<include_pathn>" is an additional directory to be included into the compiler search path. To compile IPC tests, the include path must point to the path where **psa/client.h**, **psa/service.h**, **psa/lifecycle.h** and test partition manifest output files(**psa_manifest/sid.h**, **psa_manifest/pid.h** and **psa_manifest/<manifestfilename>.h**) are located in your build system. Bydefault, PSA_INCLUDE_PATHS accepts absolute path. However, relative path can be provided using below format:<br />
```
-DPSA_INCLUDE_PATHS=`readlink -f <relative_include_path>`
```
+For using FF-1.1 do the following manifests changes in api-tests/platform/manifests files.
+ Change "psa_framework_version" attribute from 1.0 to 1.1 in all manifests files.
+ Add "model": "IPC" attribute in manifests files.
+ Add "connection_based" attribute in all services of manifest file. Give value true or false accroding to your requirement. True for connection based services and false for stateless rot services.
+ Replace signal to name in irq attribute of manifest file.
+
To compile IPC tests for **tgt_ff_tfm_an521** platform, execute the following commands:
```
cd api-tests
@@ -148,4 +161,4 @@
--------------
-*Copyright (c) 2018-2020, Arm Limited and Contributors. All rights reserved.*
+*Copyright (c) 2018-2021, Arm Limited and Contributors. All rights reserved.*
diff --git a/api-tests/ff/ipc/stateless_rot_testsuite.db b/api-tests/ff/ipc/stateless_rot_testsuite.db
new file mode 100644
index 0000000..b549418
--- /dev/null
+++ b/api-tests/ff/ipc/stateless_rot_testsuite.db
@@ -0,0 +1,93 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+
+#List of tests to be compiled and run as part of IPC suite
+
+(START)
+
+test_i001
+test_i003
+test_i013, panic_test
+test_i014, panic_test
+test_i015, panic_test
+test_i016, panic_test
+test_i021
+test_i022, panic_test
+test_i023, panic_test
+test_i024, panic_test
+test_i025, panic_test
+test_i026, panic_test
+test_i030, panic_test
+test_i031, panic_test
+test_i032, panic_test
+test_i033, panic_test
+test_i036, panic_test
+test_i037, panic_test
+test_i038, panic_test
+test_i039, panic_test
+test_i042, panic_test
+test_i043, panic_test
+test_i044, panic_test
+test_i045, panic_test
+test_i046, panic_test
+test_i047, panic_test
+test_i048, panic_test
+test_i049, panic_test
+test_i050, panic_test
+test_i051, panic_test
+test_i052, panic_test
+test_i053, panic_test
+test_i054, panic_test
+test_i055, panic_test
+test_i056, panic_test
+test_i057, panic_test
+test_i058
+test_i059, panic_test
+test_i060, panic_test
+test_i061, panic_test
+test_i062, panic_test
+test_i063
+test_i064, panic_test
+test_i065, panic_test
+test_i066, panic_test
+test_i067
+test_i068, panic_test
+test_i069, panic_test
+test_i070, panic_test
+test_i071
+test_i072, panic_test
+test_i073, panic_test
+test_i074, panic_test
+test_i075, panic_test
+test_i076, panic_test
+test_i077, panic_test
+test_i078, panic_test
+test_i079, panic_test
+test_i080, panic_test
+test_i081, panic_test
+test_i082, panic_test
+test_i083, panic_test
+test_i084, panic_test
+test_i085, panic_test
+test_i086, panic_test
+test_i087, panic_test
+test_l088
+test_i089, panic_test
+test_i090, panic_test
+
+(END)
diff --git a/api-tests/ff/ipc/test_i003/test_i003.c b/api-tests/ff/ipc/test_i003/test_i003.c
index 9a3e20c..1e53727 100644
--- a/api-tests/ff/ipc/test_i003/test_i003.c
+++ b/api-tests/ff/ipc/test_i003/test_i003.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,6 +26,261 @@
#include "test_i003.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i003_client_tests_list[] = {
+ NULL,
+ client_test_zero_length_invec,
+ client_test_zero_length_outvec,
+ client_test_call_read_and_skip,
+ client_test_call_and_write,
+ client_test_overlapping_vectors,
+ NULL,
+};
+
+int32_t client_test_zero_length_invec(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ int data[4] = {0x11, 0x22};
+
+ val->print(PRINT_TEST, "[Check 1] Test zero length invec\n", 0);
+
+ /* Invec 0 as zero length vector
+ * Invec 1 as NULL
+ * Invec 2 as valid msg pointer which is not zero length memory pointer
+ */
+ psa_invec data1[3] = { {&data[0], 0},
+ {NULL, 0},
+ {&data[1], sizeof(data[1])} };
+
+ /* Outvec 0 as valid msg pointer which is not zero length memory pointer
+ * Outvec 1 to 3 are NULL
+ */
+ psa_outvec resp[1] = { {&data[2], sizeof(data[2])} };
+
+ status = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, data1, 3, resp, 1);
+
+ if (status < 0)
+ {
+ status = VAL_STATUS_CALL_FAILED;
+ }
+ else if (data[2] != data[1])
+ {
+ val->print(PRINT_ERROR, "\tExpected data=%x\n", data[1]);
+ val->print(PRINT_ERROR, "\tBut actual data=%x\n", data[2]);
+ status = VAL_STATUS_WRITE_FAILED;
+ }
+ else if (resp[0].len != sizeof(data[1]))
+ {
+ val->print(PRINT_ERROR, "\tExpected size= %x\n", sizeof(data[1]));
+ val->print(PRINT_ERROR, "\tBut actual size=%x\n", resp[0].len);
+ status = VAL_STATUS_WRITE_FAILED;
+ }
+
+ if (VAL_ERROR(status))
+ {
+ val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n", status);
+ }
+
+ return status;
+}
+
+int32_t client_test_zero_length_outvec(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ int data[4] = {0x11};
+
+ val->print(PRINT_TEST, "[Check 2] Test zero length outvec\n", 0);
+
+ /* Test invec 1 to 3 are NULL
+ * Invec 1 should be ignored since in_len is 1
+ */
+ psa_invec data1[2] = { {&data[0], sizeof(data[0])},
+ {&data[1], sizeof(data[1])} };
+
+ /* Test outvec 0 as zero length
+ * Test outvec 1 as NULL
+ * Test outvec 2 as valid msg pointer which is not zero length memory pointer
+ */
+ psa_outvec resp[3] = { {&data[0], 0},
+ {NULL, 0},
+ {&data[2], sizeof(data[2])} };
+
+ status = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, data1, 1, resp, 3);
+
+
+ if (status < 0)
+ {
+ status = VAL_STATUS_CALL_FAILED;
+ }
+ /* Compare the outvec with expected data */
+ else if (data[2] != data[0])
+ {
+ val->print(PRINT_ERROR, "\tExpected data=%x\n", data[0]);
+ val->print(PRINT_ERROR, "\tBut actual data=%x\n", data[2]);
+ status = VAL_STATUS_WRITE_FAILED;
+ }
+ /* No. of bytes written by psa_write should update the psa_outvec.len param */
+ else if (resp[2].len != sizeof(data[2]))
+ {
+ val->print(PRINT_ERROR, "\tExpected size=%x\n", sizeof(data[2]));
+ val->print(PRINT_ERROR, "\tBut actual size=%x\n", resp[2].len);
+ status = VAL_STATUS_WRITE_FAILED;
+ }
+
+ if (VAL_ERROR(status))
+ {
+ val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n", status);
+ }
+
+ return status;
+}
+
+int32_t client_test_call_read_and_skip(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ int data1[2] = {0xaa, 0xbb};
+ uint64_t data2 = 0x1122334455667788;
+ uint64_t data3 = 0x1020304050607080;
+
+
+ val->print(PRINT_TEST, "[Check 3] Test psa_call, psa_read and psa_skip\n", 0);
+
+ /* Server test func checks the following:
+ * All iovec as input, out_len=0, inbound read, inbound skip,
+ * outbound read, outbound skip
+ */
+ psa_invec data[4] = { {&data1[0], sizeof(data1[0])},
+ {&data1[1], sizeof(data1[1])},
+ {&data2, sizeof(data2)},
+ {&data3, sizeof(data3)} };
+
+ status = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, data, 4, NULL, 0);
+
+
+ if (status < 0)
+ {
+ val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n", status);
+ status = VAL_STATUS_CALL_FAILED;
+ }
+
+ return status;
+}
+
+int32_t client_test_call_and_write(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ int data[4] = {0}, expected_data[4] = {0xaa, 0xbb, 0xcc, 0xeedd}, i;
+ size_t expected_size[] = {sizeof(expected_data[0]),
+ sizeof(expected_data[1]),
+ sizeof(expected_data[2]),
+ 2};
+
+
+ val->print(PRINT_TEST, "[Check 4] Test psa_call and psa_write\n", 0);
+
+ /* Check all iovec as output */
+ /* Check for in_len=0 */
+ /* check for iovec write using psa_write */
+ /* check for write concatenation */
+ psa_outvec resp[4] = { {&data[0], sizeof(data[0])},
+ {&data[1], sizeof(data[1])},
+ {&data[2], sizeof(data[2])},
+ {&data[3], sizeof(data[3])} };
+
+ status = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, resp, 4);
+
+ if (status < 0)
+ {
+ status = VAL_STATUS_CALL_FAILED;
+ }
+
+ for (i = 0; i < 4 ; i++)
+ {
+ if (data[i] != expected_data[i])
+ {
+ val->print(PRINT_ERROR, "\tIteration= %x\n", i);
+ val->print(PRINT_ERROR, "\tExpected data=%x\n", expected_data[i]);
+ val->print(PRINT_ERROR, "\tBut actual data=%x\n", data[i]);
+ status = VAL_STATUS_WRITE_FAILED;
+ }
+ /* No. of bytes written by psa_write should update the psa_outvec.len param */
+ else if (resp[i].len != expected_size[i])
+ {
+ val->print(PRINT_ERROR, "\tIteration= %x\n", i);
+ val->print(PRINT_ERROR, "\tExpected size=%x\n", expected_size[i]);
+ val->print(PRINT_ERROR, "\tBut actual size=%x\n", resp[i].len);
+ status = VAL_STATUS_WRITE_FAILED;
+ }
+ }
+
+ if (VAL_ERROR(status))
+ {
+ val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n", status);
+ }
+
+ return status;
+}
+
+int32_t client_test_overlapping_vectors(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ uint8_t data = 0x11, expected_data[] = {0x22, 0x33};
+
+ val->print(PRINT_TEST, "[Check 6] Test overlapping vectors\n", 0);
+
+#if STATELESS_ROT != 1
+ psa_handle_t handle = 0;
+ if (val->ipc_connect(SERVER_UNSPECIFED_VERSION_SID,
+ SERVER_UNSPECIFED_VERSION_VERSION,
+ &handle))
+ {
+ return VAL_STATUS_CONNECTION_FAILED;
+ }
+#endif
+
+ /* Rule- When client provides an input and output vectors which are referencing
+ * to same memory location, psa_read after psa_write to that memory location
+ * can return original or modified value.
+ *
+ * Rule- When client provides an input and output vectors which are referencing to same
+ * memory location, a psa_write(s) to both memory vectors can return either the 1st
+ * or the 2nd value written.
+ *
+ * Input [0] and output [0,1] vectors have been used to verify these rule.
+ * All of these vectors are pointing to same memory location.
+ */
+
+ psa_invec invec[1] = { {&data, sizeof(data)} } ;
+ psa_outvec outvec[2] = { {&data, sizeof(data)},
+ {&data, sizeof(data)} };
+
+ status = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 2);
+
+ if (status < 0)
+ {
+ status = VAL_STATUS_CALL_FAILED;
+ }
+ /* data should contain either value written by 1st psa_write or 2nd */
+ else if ((data != expected_data[0]) && (data != expected_data[1]))
+ {
+ val->print(PRINT_ERROR, "\tInvalid data received=%x\n", data);
+ status = VAL_STATUS_CALL_FAILED;
+ }
+
+ if (VAL_ERROR(status))
+ {
+ val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n", status);
+ }
+
+ return status;
+}
+
+#else
+
const client_test_t test_i003_client_tests_list[] = {
NULL,
client_test_zero_length_invec,
@@ -88,8 +343,8 @@
{
val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n", status);
}
-
val->ipc_close(handle);
+
return status;
}
@@ -123,6 +378,7 @@
{&data[2], sizeof(data[2])}};
status = psa->call(handle, PSA_IPC_CALL, data1, 1, resp, 3);
+
if (status < 0)
{
status = VAL_STATUS_CALL_FAILED;
@@ -148,6 +404,7 @@
}
val->ipc_close(handle);
+
return status;
}
@@ -178,6 +435,7 @@
{&data3, sizeof(data3)}};
status = psa->call(handle, PSA_IPC_CALL, data, 4, NULL, 0);
+
if (status < 0)
{
val->print(PRINT_ERROR, "\tpsa_call failed. status=%x\n",status);
@@ -185,6 +443,7 @@
}
val->ipc_close(handle);
+
return status;
}
@@ -217,6 +476,7 @@
{&data[3], sizeof(data[3])}};
status = psa->call(handle, PSA_IPC_CALL, NULL, 0, resp, 4);
+
if (status < 0)
{
status = VAL_STATUS_CALL_FAILED;
@@ -247,6 +507,7 @@
}
val->ipc_close(handle);
+
return status;
}
@@ -289,11 +550,12 @@
int32_t client_test_overlapping_vectors(caller_security_t caller __UNUSED)
{
int32_t status = VAL_STATUS_SUCCESS;
- psa_handle_t handle = 0;
+
uint8_t data = 0x11, expected_data[] = {0x22, 0x33};
val->print(PRINT_TEST, "[Check 6] Test overlapping vectors\n", 0);
+ psa_handle_t handle = 0;
if (val->ipc_connect(SERVER_UNSPECIFED_VERSION_SID,
SERVER_UNSPECIFED_VERSION_VERSION,
&handle))
@@ -336,5 +598,8 @@
}
val->ipc_close(handle);
+
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i003/test_supp_i003.c b/api-tests/ff/ipc/test_i003/test_supp_i003.c
index cd27deb..dfe1a64 100644
--- a/api-tests/ff/ipc/test_i003/test_supp_i003.c
+++ b/api-tests/ff/ipc/test_i003/test_supp_i003.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,10 +23,375 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_call_read_and_skip(void);
+int32_t server_test_call_and_write(void);
+int32_t server_test_zero_length_invec(void);
+int32_t server_test_zero_length_outvec(void);
+int32_t server_test_overlapping_vectors(void);
+
+const server_test_t test_i003_server_tests_list[] = {
+ NULL,
+ server_test_zero_length_invec,
+ server_test_zero_length_outvec,
+ server_test_call_read_and_skip,
+ server_test_call_and_write,
+ server_test_overlapping_vectors,
+ NULL,
+};
+
+static void exit_graceful(psa_handle_t msg_handle, int status_code,
+ int print_next_args, int expected_data, int actual_data)
+{
+ if (print_next_args != 0)
+ {
+ val->print(PRINT_ERROR, "\tExpected data=%x\n", expected_data);
+ val->print(PRINT_ERROR, "\tActual data=%x\n", actual_data);
+ }
+ /* Negative status_code represents check failure and each check has
+ * uniq status_code to identify failing point
+ */
+ psa->reply(msg_handle, status_code);
+}
+
+int32_t server_test_zero_length_invec(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ int data[5] = {0}, actual_data = 0x22;
+
+ if (val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
+ {
+ exit_graceful(msg.handle, -2, 0, 0, 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ if (((msg.in_size[0] != 0)) ||
+ ((msg.in_size[1] != 0)) ||
+ ((msg.in_size[2] != sizeof(int))) ||
+ ((msg.in_size[3] != 0)))
+ {
+ exit_graceful(msg.handle, -3, 0, 0, 0);
+ return VAL_STATUS_MSG_INSIZE_FAILED;
+ }
+
+ if ((msg.in_size[2] <= sizeof(data[2])) &&
+ (psa->read(msg.handle, 2, &data[2], msg.in_size[2]) != msg.in_size[2]))
+ {
+ exit_graceful(msg.handle, -4, 0, 0, 0);
+ return VAL_STATUS_READ_FAILED;
+ }
+
+ if (actual_data != data[2])
+ {
+ exit_graceful(msg.handle, -5, 1, data[2], actual_data);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ if (((msg.out_size[0] != sizeof(int))) ||
+ ((msg.out_size[1] != 0)) ||
+ ((msg.out_size[2] != 0)) ||
+ ((msg.out_size[3] != 0)))
+ {
+ exit_graceful(msg.handle, -6, 0, 0, 0);
+ return VAL_STATUS_MSG_OUTSIZE_FAILED;
+ }
+
+ psa->write(msg.handle, 0, &data[2], msg.out_size[0]);
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return status;
+}
+
+int32_t server_test_zero_length_outvec(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ int data[5] = {0}, actual_data = 0x11;
+
+ if (val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
+ {
+ exit_graceful(msg.handle, -2, 0, 0, 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ if (((msg.in_size[0] != sizeof(int))) ||
+ ((msg.in_size[1] != 0)) ||
+ ((msg.in_size[2] != 0)) ||
+ ((msg.in_size[3] != 0)))
+ {
+ exit_graceful(msg.handle, -3, 0, 0, 0);
+ return VAL_STATUS_MSG_INSIZE_FAILED;
+ }
+
+ if ((msg.in_size[0] <= sizeof(data[0])) &&
+ (psa->read(msg.handle, 0, &data[0], msg.in_size[0]) != msg.in_size[0]))
+ {
+ exit_graceful(msg.handle, -4, 0, 0, 0);
+ return VAL_STATUS_READ_FAILED;
+ }
+
+ if (actual_data != data[0])
+ {
+ exit_graceful(msg.handle, -5, 1, data[2], actual_data);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ if (((msg.out_size[0] != 0)) ||
+ ((msg.out_size[1] != 0)) ||
+ ((msg.out_size[2] != sizeof(int))) ||
+ ((msg.out_size[3] != 0)))
+ {
+ exit_graceful(msg.handle, -6, 0, 0, 0);
+ return VAL_STATUS_MSG_OUTSIZE_FAILED;
+ }
+ psa->write(msg.handle, 2, &data[0], msg.out_size[2]);
+
+ /* Dummy write with zero byte. This should not overwrite previously written data */
+ psa->write(msg.handle, 2, &data[0], msg.out_size[0]);
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return status;
+}
+
+int32_t server_test_call_read_and_skip(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ int expected_data1[2] = {0xaa, 0xbb};
+ int expected_data2[4] = {0x7788, 0x2233, 0x2211, 0x50607080},
+ actual_data[4] = {0}, i;
+ psa_msg_t msg = {0};
+
+ if (val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
+ {
+ exit_graceful(msg.handle, -2, 0, 0, 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ /* msg.in_size should match with the size of psa_invec given to psa_call*/
+ if (((msg.in_size[0] != sizeof(int))) ||
+ ((msg.in_size[1] != sizeof(int))) ||
+ ((msg.in_size[2] != sizeof(uint64_t))) ||
+ ((msg.in_size[3] != sizeof(uint64_t))))
+ {
+ exit_graceful(msg.handle, -3, 0, 0, 0);
+ return VAL_STATUS_MSG_INSIZE_FAILED;
+ }
+
+ /* Full size read for invec 0 and invec 1 */
+ for (i = 0; i < 2 ; i++)
+ {
+ if ((msg.in_size[i] <= sizeof(actual_data[i])) &&
+ (psa->read(msg.handle, i, &actual_data[i], msg.in_size[i]) != msg.in_size[i]))
+ {
+ exit_graceful(msg.handle, -4, 0, 0, 0);
+ return VAL_STATUS_READ_FAILED;
+ }
+ if (actual_data[i] != expected_data1[i])
+ {
+ exit_graceful(msg.handle, -5, 1, expected_data1[i], actual_data[i]);
+ return VAL_STATUS_READ_FAILED;
+ }
+ }
+
+ /* Inbound read of 2 bytes from invec 2 */
+ if (psa->read(msg.handle, 2, &actual_data[0], 2) != 2)
+ {
+ exit_graceful(msg.handle, -6, 0, 0, 0);
+ return VAL_STATUS_READ_FAILED;
+ }
+ if (actual_data[0] != expected_data2[0])
+ {
+ exit_graceful(msg.handle, -7, 1, expected_data2[0], actual_data[0]);
+ return VAL_STATUS_READ_FAILED;
+ }
+
+ /* Inbound read of 3 bytes from invec 2 */
+ if (psa->skip(msg.handle, 2, 3) != 3)
+ {
+ exit_graceful(msg.handle, -8, 0, 0, 0);
+ return VAL_STATUS_SKIP_FAILED;
+ }
+
+ /* Check previous psa_skip has actually skipped 3 bytes */
+ if (psa->read(msg.handle, 2, &actual_data[0], 2) != 2)
+ {
+ exit_graceful(msg.handle, -9, 0, 0, 0);
+ return VAL_STATUS_READ_FAILED;
+ }
+
+ if (actual_data[0] != expected_data2[1])
+ {
+ exit_graceful(msg.handle, -10, 1, expected_data2[1], actual_data[0]);
+ return VAL_STATUS_READ_FAILED;
+ }
+
+ /* Outbound read of 3 bytes from invec 2
+ * Only one byte should be updated in buffer. Remaining space should be untouched
+ */
+ if (psa->read(msg.handle, 2, &actual_data[0], 3) != 1)
+ {
+ exit_graceful(msg.handle, -11, 0, 0, 0);
+ return VAL_STATUS_READ_FAILED;
+ }
+
+ if (actual_data[0] != expected_data2[2])
+ {
+ exit_graceful(msg.handle, -12, 1, expected_data2[2], actual_data[0]);
+ return VAL_STATUS_READ_FAILED;
+ }
+
+ actual_data[0] = 0xaa;
+
+ /* After outbound read, subsequent read or skip to invec 2 should return 0
+ * and memory buffer shouldn't be updated
+ */
+ if ((psa->read(msg.handle, 2, &actual_data[0], 3) != 0) ||
+ (psa->skip(msg.handle, 2, 3) != 0) || (actual_data[0] != 0xaa))
+ {
+ exit_graceful(msg.handle, -13, 0, 0, 0);
+ return VAL_STATUS_READ_FAILED;
+ }
+
+ /* Read of zero bytes should not read anything */
+ if ((psa->read(msg.handle, 3, &actual_data[0], 0) != 0) || (actual_data[0] != 0xaa))
+ {
+ exit_graceful(msg.handle, -14, 0, 0, 0);
+ return VAL_STATUS_READ_FAILED;
+ }
+
+ /* Skip of zero bytes should not skip anything */
+ if (psa->skip(msg.handle, 3, 0) != 0)
+ {
+ exit_graceful(msg.handle, -15, 0, 0, 0);
+ return VAL_STATUS_SKIP_FAILED;
+ }
+
+ /* Check effect of previous zero byte read and skip */
+ psa->read(msg.handle, 3, &actual_data[0], 4);
+ if (actual_data[0] != expected_data2[3])
+ {
+ exit_graceful(msg.handle, -16, 1, expected_data2[3], actual_data[0]);
+ return VAL_STATUS_READ_FAILED;
+ }
+
+ /* Outbound skip to invec 3 */
+ if (psa->skip(msg.handle, 3, 5) != 4)
+ {
+ exit_graceful(msg.handle, -17, 0, 0, 0);
+ return VAL_STATUS_SKIP_FAILED;
+ }
+ if (psa->skip(msg.handle, 3, 5) != 0)
+ {
+ exit_graceful(msg.handle, -18, 0, 0, 0);
+ return VAL_STATUS_SKIP_FAILED;
+ }
+
+ /* Since out_len is 0, msg.out_size should be 0 */
+ if ((msg.out_size[0] != 0) ||
+ (msg.out_size[1] != 0) ||
+ (msg.out_size[2] != 0) ||
+ (msg.out_size[3] != 0))
+ {
+ exit_graceful(msg.handle, -14, 0, 0, 0);
+ return VAL_STATUS_MSG_OUTSIZE_FAILED;
+ }
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return status;
+}
+
+int32_t server_test_call_and_write(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ int data[5] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee}, i;
+ psa_msg_t msg = {0};
+
+ if (val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
+ {
+ exit_graceful(msg.handle, -2, 0, 0, 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ /* msg.out_size should match with size of psa_outvec given to psa_call */
+ if (((msg.out_size[0] != sizeof(int))) ||
+ ((msg.out_size[1] != sizeof(int))) ||
+ ((msg.out_size[2] != sizeof(int))) ||
+ ((msg.out_size[3] != sizeof(int))))
+ {
+ exit_graceful(msg.handle, -3, 0, 0, 0);
+ return VAL_STATUS_MSG_OUTSIZE_FAILED;
+ }
+
+ /* Since in_len=0, all msg.in_size should be 0 */
+ if ((msg.in_size[0] != 0) ||
+ (msg.in_size[1] != 0) ||
+ (msg.in_size[2] != 0) ||
+ (msg.in_size[3] != 0))
+
+ {
+ exit_graceful(msg.handle, -4, 0, 0, 0);
+ return VAL_STATUS_MSG_INSIZE_FAILED;
+ }
+
+ for (i = 0; i < 3 ; i++)
+ {
+ psa->write(msg.handle, i, &data[i], msg.out_size[i]);
+ }
+
+ /* Zero byte write shouldn't have any effect */
+ psa->write(msg.handle, 3, &data[3], 0);
+
+ /*Using invec 3 to test write concatenation behaviour */
+ psa->write(msg.handle, 3, &data[3], 1);
+ psa->write(msg.handle, 3, &data[4], 1);
+
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return status;
+}
+
+int32_t server_test_overlapping_vectors(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ uint8_t wr_data[] = {0x22, 0x33},
+ rd_data[] = {0x0, 0x0},
+ expected_data[] = {0x11, 0x22};
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(208), status))
+ {
+ exit_graceful(msg.handle, -1, 0, 0, 0);
+ return status;
+ }
+
+ /* Performing read after write to overlapping vector. */
+ psa->write(msg.handle, 0, &wr_data[0], 1);
+ psa->read(msg.handle, 0, &rd_data[0], 1);
+
+ /* rd_data[0] should either be original value or modified value */
+ if ((rd_data[0] != expected_data[0]) && (rd_data[0] != expected_data[1]))
+ {
+ val->print(PRINT_ERROR, "\tReceived invalid data=%x\n", rd_data[0]);
+ exit_graceful(msg.handle, -2, 0, 0, 0);
+ return status;
+ }
+
+ /* Performing write after write to overlapping vector. */
+ psa->write(msg.handle, 1, &wr_data[1], 1);
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return status;
+}
+
+#else
+
int32_t server_test_psa_set_rhandle(void);
int32_t server_test_call_read_and_skip(void);
int32_t server_test_call_and_write(void);
-int32_t server_test_zero_length_invec();
+int32_t server_test_zero_length_invec(void);
int32_t server_test_zero_length_outvec(void);
int32_t server_test_overlapping_vectors(void);
@@ -118,6 +483,7 @@
status = val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
psa->reply(msg.handle, PSA_SUCCESS);
+
return status;
}
@@ -178,6 +544,7 @@
status = val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
psa->reply(msg.handle, PSA_SUCCESS);
+
return status;
}
@@ -334,6 +701,7 @@
status = val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
psa->reply(msg.handle, PSA_SUCCESS);
+
return status;
}
@@ -393,6 +761,7 @@
status = val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
psa->reply(msg.handle, PSA_SUCCESS);
+
return status;
}
@@ -524,5 +893,8 @@
status = val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
val->err_check_set(TEST_CHECKPOINT_NUM(209), status);
psa->reply(msg.handle, PSA_SUCCESS);
+
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i013/test_i013.c b/api-tests/ff/ipc/test_i013/test_i013.c
index 5bf872d..84925f9 100644
--- a/api-tests/ff/ipc/test_i013/test_i013.c
+++ b/api-tests/ff/ipc/test_i013/test_i013.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,36 @@
#include "test_i013.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i013_client_tests_list[] = {
+ NULL,
+ client_test_psa_get_with_more_than_one_signal,
+ NULL,
+};
+
+int32_t client_test_psa_get_with_more_than_one_signal(caller_security_t caller __UNUSED)
+{
+
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST, "[Check 1] Test psa_get with multiple signals\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+
+}
+
+#else
+
const client_test_t test_i013_client_tests_list[] = {
NULL,
client_test_psa_get_with_more_than_one_signal,
@@ -44,4 +74,7 @@
(void)(handle);
return VAL_STATUS_SPM_FAILED;
+
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i013/test_supp_i013.c b/api-tests/ff/ipc/test_i013/test_supp_i013.c
index 024d964..256d309 100644
--- a/api-tests/ff/ipc/test_i013/test_supp_i013.c
+++ b/api-tests/ff/ipc/test_i013/test_supp_i013.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,77 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_get_with_more_than_one_signal(void);
+
+const server_test_t test_i013_server_tests_list[] = {
+ NULL,
+ server_test_psa_get_with_more_than_one_signal,
+ NULL,
+};
+
+int32_t server_test_psa_get_with_more_than_one_signal(void)
+{
+ psa_msg_t msg = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ if ((psa->wait(PSA_WAIT_ANY, PSA_BLOCK)) & SERVER_UNSPECIFED_VERSION_SIGNAL)
+ {
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_NS))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ /* Unblock client */
+ if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+ {
+ val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ }
+ psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* multiple signals check */
+ psa->get((SERVER_UNSPECIFED_VERSION_SIGNAL | SERVER_RELAX_VERSION_SIGNAL), &msg);
+
+ /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(203), VAL_STATUS_SPM_FAILED);
+ return VAL_STATUS_SPM_FAILED;
+}
+
+#else
+
int32_t server_test_psa_get_with_more_than_one_signal(void);
const server_test_t test_i013_server_tests_list[] = {
@@ -81,9 +152,13 @@
{
val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
}
+
psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+
}
val->err_check_set(TEST_CHECKPOINT_NUM(203), VAL_STATUS_SPM_FAILED);
return VAL_STATUS_SPM_FAILED;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i014/test_i014.c b/api-tests/ff/ipc/test_i014/test_i014.c
index e01baa2..22ac59d 100644
--- a/api-tests/ff/ipc/test_i014/test_i014.c
+++ b/api-tests/ff/ipc/test_i014/test_i014.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
#include "test_i014.h"
+#if STATELESS_ROT == 1
+
const client_test_t test_i014_client_tests_list[] = {
NULL,
client_test_psa_get_called_twice,
@@ -33,7 +35,34 @@
int32_t client_test_psa_get_called_twice(caller_security_t caller __UNUSED)
{
- psa_handle_t handle = 0;
+
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST, "[Check 1] Test psa_get called twice\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
+const client_test_t test_i014_client_tests_list[] = {
+ NULL,
+ client_test_psa_get_called_twice,
+ NULL,
+};
+
+int32_t client_test_psa_get_called_twice(caller_security_t caller __UNUSED)
+{
+ psa_handle_t handle = 0;
val->print(PRINT_TEST, "[Check 1] Test psa_get called twice\n", 0);
@@ -45,3 +74,5 @@
(void)(handle);
return VAL_STATUS_SPM_FAILED;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i015/test_i015.c b/api-tests/ff/ipc/test_i015/test_i015.c
index edfc414..14b4f52 100644
--- a/api-tests/ff/ipc/test_i015/test_i015.c
+++ b/api-tests/ff/ipc/test_i015/test_i015.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
#include "test_i015.h"
+#if STATELESS_ROT == 1
+
const client_test_t test_i015_client_tests_list[] = {
NULL,
client_test_psa_get_with_non_rot_signal,
@@ -33,6 +35,34 @@
int32_t client_test_psa_get_with_non_rot_signal(caller_security_t caller __UNUSED)
{
+
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST, "[Check 1] Test psa_get with non-RoT signal\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
+const client_test_t test_i015_client_tests_list[] = {
+ NULL,
+ client_test_psa_get_with_non_rot_signal,
+ NULL,
+};
+
+int32_t client_test_psa_get_with_non_rot_signal(caller_security_t caller __UNUSED)
+{
+
psa_handle_t handle = 0;
val->print(PRINT_TEST, "[Check 1] Test psa_get with non-RoT signal\n", 0);
@@ -45,3 +75,5 @@
(void)(handle);
return VAL_STATUS_SPM_FAILED;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i016/test_i016.c b/api-tests/ff/ipc/test_i016/test_i016.c
index 943d6e3..6757692 100644
--- a/api-tests/ff/ipc/test_i016/test_i016.c
+++ b/api-tests/ff/ipc/test_i016/test_i016.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,35 @@
#include "test_i016.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i016_client_tests_list[] = {
+ NULL,
+ client_test_psa_get_with_unasserted_signal,
+ NULL,
+};
+
+int32_t client_test_psa_get_with_unasserted_signal(caller_security_t caller __UNUSED)
+{
+
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST, "[Check 1] Test psa_get with unasserted signal\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i016_client_tests_list[] = {
NULL,
client_test_psa_get_with_unasserted_signal,
@@ -45,3 +74,5 @@
(void)(handle);
return VAL_STATUS_SPM_FAILED;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i021/test_i021.c b/api-tests/ff/ipc/test_i021/test_i021.c
index 2638b76..26e6502 100644
--- a/api-tests/ff/ipc/test_i021/test_i021.c
+++ b/api-tests/ff/ipc/test_i021/test_i021.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,41 @@
#include "test_i021.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i021_client_tests_list[] = {
+ NULL,
+ client_test_irq_routing,
+ NULL,
+};
+
+int32_t client_test_irq_routing(caller_security_t caller __UNUSED)
+{
+
+ driver_test_fn_id_t driver_test_fn_id = TEST_INTR_SERVICE;
+
+ /*
+ * The interrupt related test check is captured in driver_partition.c as this is the
+ * only partition in test suite that holds the interrupt source. The interrupt test check
+ * is invoked by client by calling to DRIVER_TEST_SID RoT service of driver partition that
+ * hold the test check.
+ */
+
+ val->print(PRINT_TEST, "[Check 1] Test irq routing\n", 0);
+
+ /* Execute driver function related to TEST_INTR_SERVICE */
+ psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
+ if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, &invec, 1, NULL, 0) != PSA_SUCCESS)
+ {
+ return VAL_STATUS_SPM_FAILED;
+ }
+
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const client_test_t test_i021_client_tests_list[] = {
NULL,
client_test_irq_routing,
@@ -65,3 +100,5 @@
psa->close(handle);
return VAL_STATUS_SUCCESS;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i022/test_i022.c b/api-tests/ff/ipc/test_i022/test_i022.c
index 5778436..4fb0b90 100644
--- a/api-tests/ff/ipc/test_i022/test_i022.c
+++ b/api-tests/ff/ipc/test_i022/test_i022.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,23 @@
#include "test_i022.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i022_client_tests_list[] = {
+ NULL,
+ client_test_psa_reply_with_invalid_handle,
+ NULL,
+};
+
+int32_t client_test_psa_reply_with_invalid_handle(caller_security_t caller __UNUSED)
+{
+ val->print(PRINT_TEST, "[Check 1] Testing psa_reply with invalid handle\n", 0);
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+#else
+
const client_test_t test_i022_client_tests_list[] = {
NULL,
client_test_psa_reply_with_invalid_handle,
@@ -45,3 +62,5 @@
(void)(handle);
return VAL_STATUS_SPM_FAILED;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i022/test_supp_i022.c b/api-tests/ff/ipc/test_i022/test_supp_i022.c
index ce4b7ab..ad22896 100644
--- a/api-tests/ff/ipc/test_i022/test_supp_i022.c
+++ b/api-tests/ff/ipc/test_i022/test_supp_i022.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,8 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
int32_t server_test_psa_reply_with_invalid_handle(void);
const server_test_t test_i022_server_tests_list[] = {
@@ -33,7 +35,73 @@
int32_t server_test_psa_reply_with_invalid_handle(void)
{
- psa_msg_t msg = {0};
+ psa_msg_t msg = {0};
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+ return status;
+ }
+
+ /* Call psa_reply with INVALID_HANLDE. Call should panic */
+ psa->reply(INVALID_HANDLE, PSA_ERROR_CONNECTION_REFUSED);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_reply with invalid handle should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ status = val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return status;
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
+int32_t server_test_psa_reply_with_invalid_handle(void);
+
+const server_test_t test_i022_server_tests_list[] = {
+ NULL,
+ server_test_psa_reply_with_invalid_handle,
+ NULL,
+};
+
+int32_t server_test_psa_reply_with_invalid_handle(void)
+{
+ psa_msg_t msg = {0};
int32_t status = VAL_STATUS_SUCCESS;
/*
@@ -93,3 +161,5 @@
val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i023/test_i023.c b/api-tests/ff/ipc/test_i023/test_i023.c
index 76bdf99..db509f3 100644
--- a/api-tests/ff/ipc/test_i023/test_i023.c
+++ b/api-tests/ff/ipc/test_i023/test_i023.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,23 @@
#include "test_i023.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i023_client_tests_list[] = {
+ NULL,
+ client_test_psa_reply_with_null_handle,
+ NULL,
+};
+
+int32_t client_test_psa_reply_with_null_handle(caller_security_t caller __UNUSED)
+{
+ val->print(PRINT_TEST, "[Check 1] Testing psa_reply with invalid handle\n", 0);
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+#else
+
const client_test_t test_i023_client_tests_list[] = {
NULL,
client_test_psa_reply_with_null_handle,
@@ -45,3 +62,5 @@
(void)(handle);
return VAL_STATUS_SPM_FAILED;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i023/test_supp_i023.c b/api-tests/ff/ipc/test_i023/test_supp_i023.c
index 02cebf9..fe0189c 100644
--- a/api-tests/ff/ipc/test_i023/test_supp_i023.c
+++ b/api-tests/ff/ipc/test_i023/test_supp_i023.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,8 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
int32_t server_test_psa_reply_with_null_handle(void);
const server_test_t test_i023_server_tests_list[] = {
@@ -33,7 +35,77 @@
int32_t server_test_psa_reply_with_null_handle(void)
{
- psa_msg_t msg = {0};
+
+ psa_msg_t msg = {0};
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+ return status;
+ }
+
+ /* Test check - Call psa_reply with PSA_NULL_HANDLE. Call should panic */
+ psa->reply(PSA_NULL_HANDLE, PSA_ERROR_CONNECTION_REFUSED);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_reply with NULL handle should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ status = val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return status;
+ }
+
+ psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+
+ status = VAL_STATUS_SPM_FAILED;
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
+int32_t server_test_psa_reply_with_null_handle(void);
+
+const server_test_t test_i023_server_tests_list[] = {
+ NULL,
+ server_test_psa_reply_with_null_handle,
+ NULL,
+};
+
+int32_t server_test_psa_reply_with_null_handle(void)
+{
+
+ psa_msg_t msg = {0};
int32_t status = VAL_STATUS_SUCCESS;
/*
@@ -95,3 +167,5 @@
val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i026/test_i026.c b/api-tests/ff/ipc/test_i026/test_i026.c
index a1cb20a..7ab4fbe 100644
--- a/api-tests/ff/ipc/test_i026/test_i026.c
+++ b/api-tests/ff/ipc/test_i026/test_i026.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,89 @@
#include "test_i026.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i026_client_tests_list[] = {
+ NULL,
+ client_test_psa_call_with_iovec_more_than_max_limit,
+ NULL,
+};
+
+int32_t client_test_psa_call_with_iovec_more_than_max_limit(caller_security_t caller)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ uint8_t data = 0x11;
+ psa_status_t status_of_call;
+ boot_state_t boot_state;
+ psa_invec invec[PSA_MAX_IOVEC] = {{&data, sizeof(data)},
+ {&data, sizeof(data)},
+ {&data, sizeof(data)},
+ {&data, sizeof(data)}
+ };
+ psa_outvec outvec[1] = {{&data, sizeof(data)}};
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_call with IOVEC > PSA_MAX_IOVEC\n", 0);
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /* Setting boot.state before test check */
+ boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+ if (val->set_boot_flag(boot_state))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Test check- psa_call with IOVEC > PSA_MAX_IOVEC */
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, invec,
+ PSA_MAX_IOVEC, outvec, 1);
+ /*
+ * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+ * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+ * For SPE caller, it must panic.
+ */
+ if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+ {
+ return VAL_STATUS_SUCCESS;
+ }
+
+ /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ return status;
+}
+
+#else
+
const client_test_t test_i026_client_tests_list[] = {
NULL,
client_test_psa_call_with_iovec_more_than_max_limit,
@@ -43,7 +126,7 @@
{&data, sizeof(data)},
{&data, sizeof(data)}
};
- psa_outvec outvec[1] = {{&data, sizeof(data)}};
+ psa_outvec outvec[1] = { {&data, sizeof(data)} };
val->print(PRINT_TEST,
"[Check 1] Test psa_call with IOVEC > PSA_MAX_IOVEC\n", 0);
@@ -113,3 +196,5 @@
psa->close(handle);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i026/test_supp_i026.c b/api-tests/ff/ipc/test_i026/test_supp_i026.c
index 142b910..a9d4982 100644
--- a/api-tests/ff/ipc/test_i026/test_supp_i026.c
+++ b/api-tests/ff/ipc/test_i026/test_supp_i026.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,7 +23,9 @@
extern val_api_t *val;
extern psa_api_t *psa;
-int32_t server_test_psa_call_with_iovec_more_than_max_limit();
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_iovec_more_than_max_limit(void);
const server_test_t test_i026_server_tests_list[] = {
NULL,
@@ -31,7 +33,39 @@
NULL,
};
-int32_t server_test_psa_call_with_iovec_more_than_max_limit()
+int32_t server_test_psa_call_with_iovec_more_than_max_limit(void)
+{
+ psa_msg_t msg = {0};
+ psa_signal_t signals;
+
+wait:
+ signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+ if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+ {
+ goto wait;
+ }
+
+ if (msg.type == PSA_IPC_CALL)
+ {
+ /* Control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+ psa->reply(msg.handle, -2);
+ }
+
+ return VAL_STATUS_ERROR;
+}
+
+#else
+
+int32_t server_test_psa_call_with_iovec_more_than_max_limit(void);
+
+const server_test_t test_i026_server_tests_list[] = {
+ NULL,
+ server_test_psa_call_with_iovec_more_than_max_limit,
+ NULL,
+};
+
+int32_t server_test_psa_call_with_iovec_more_than_max_limit(void)
{
int32_t status = VAL_STATUS_SUCCESS;
psa_msg_t msg = {0};
@@ -77,3 +111,5 @@
return VAL_STATUS_ERROR;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i030/test_i030.c b/api-tests/ff/ipc/test_i030/test_i030.c
index 7f4d15b..e4861d3 100644
--- a/api-tests/ff/ipc/test_i030/test_i030.c
+++ b/api-tests/ff/ipc/test_i030/test_i030.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,35 @@
#include "test_i030.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i030_client_tests_list[] = {
+ NULL,
+ client_test_psa_read_with_null_handle,
+ NULL,
+};
+
+int32_t client_test_psa_read_with_null_handle(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_read with NULL handle\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i030_client_tests_list[] = {
NULL,
client_test_psa_read_with_null_handle,
@@ -58,3 +87,5 @@
(void)(status_of_call);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i030/test_supp_i030.c b/api-tests/ff/ipc/test_i030/test_supp_i030.c
index 5a74021..85e2914 100644
--- a/api-tests/ff/ipc/test_i030/test_supp_i030.c
+++ b/api-tests/ff/ipc/test_i030/test_supp_i030.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,84 @@
#define NUM_OF_BYTES 4
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_read_with_null_handle(void);
+
+const server_test_t test_i030_server_tests_list[] = {
+ NULL,
+ server_test_psa_read_with_null_handle,
+ NULL,
+};
+
+int32_t server_test_psa_read_with_null_handle(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ uint8_t data[NUM_OF_BYTES] = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_read with PSA_NULL_HANDLE, call should panic */
+ psa->read(PSA_NULL_HANDLE, 0, (void *)data, 0);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_read with NULL handle should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ psa->reply(msg.handle, -4);
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_read_with_null_handle(void);
const server_test_t test_i030_server_tests_list[] = {
@@ -108,5 +186,8 @@
status = ((val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
? VAL_STATUS_ERROR : status);
psa->reply(msg.handle, PSA_SUCCESS);
+
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i031/test_i031.c b/api-tests/ff/ipc/test_i031/test_i031.c
index 6cfe2e2..a3a1c5b 100644
--- a/api-tests/ff/ipc/test_i031/test_i031.c
+++ b/api-tests/ff/ipc/test_i031/test_i031.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,35 @@
#include "test_i031.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i031_client_tests_list[] = {
+ NULL,
+ client_test_psa_read_with_invalid_handle,
+ NULL,
+};
+
+int32_t client_test_psa_read_with_invalid_handle(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_read with invalid handle\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i031_client_tests_list[] = {
NULL,
client_test_psa_read_with_invalid_handle,
@@ -55,6 +84,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i031/test_supp_i031.c b/api-tests/ff/ipc/test_i031/test_supp_i031.c
index 62af645..a525d08 100644
--- a/api-tests/ff/ipc/test_i031/test_supp_i031.c
+++ b/api-tests/ff/ipc/test_i031/test_supp_i031.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,84 @@
#define NUM_OF_BYTES 4
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_read_with_invalid_handle(void);
+
+const server_test_t test_i031_server_tests_list[] = {
+ NULL,
+ server_test_psa_read_with_invalid_handle,
+ NULL,
+};
+
+int32_t server_test_psa_read_with_invalid_handle(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ uint8_t data[NUM_OF_BYTES] = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_read with INVALID_HANDLE, call should panic */
+ psa->read(INVALID_HANDLE, 0, (void *)data, 0);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_read with invalid handle should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ psa->reply(msg.handle, -4);
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_read_with_invalid_handle(void);
const server_test_t test_i031_server_tests_list[] = {
@@ -110,3 +188,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i032/test_i032.c b/api-tests/ff/ipc/test_i032/test_i032.c
index c7e9918..ac5a33b 100644
--- a/api-tests/ff/ipc/test_i032/test_i032.c
+++ b/api-tests/ff/ipc/test_i032/test_i032.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
#include "test_i032.h"
+#if STATELESS_ROT == 1
+
const client_test_t test_i032_client_tests_list[] = {
NULL,
client_test_psa_read_with_invec_equal_to_max_iovec,
@@ -34,12 +36,40 @@
int32_t client_test_psa_read_with_invec_equal_to_max_iovec(caller_security_t caller __UNUSED)
{
int32_t status = VAL_STATUS_SUCCESS;
- psa_handle_t handle = 0;
psa_status_t status_of_call;
val->print(PRINT_TEST,
"[Check 1] Test psa_read with invec_idx=PSA_MAX_IOVEC\n", 0);
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
+const client_test_t test_i032_client_tests_list[] = {
+ NULL,
+ client_test_psa_read_with_invec_equal_to_max_iovec,
+ NULL,
+};
+
+int32_t client_test_psa_read_with_invec_equal_to_max_iovec(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_read with invec_idx=PSA_MAX_IOVEC\n", 0);
+
+ psa_handle_t handle = 0;
handle = psa->connect(SERVER_UNSPECIFED_VERSION_SID, SERVER_UNSPECIFED_VERSION_VERSION);
if (!PSA_HANDLE_IS_VALID(handle))
{
@@ -55,6 +85,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i032/test_supp_i032.c b/api-tests/ff/ipc/test_i032/test_supp_i032.c
index fe94496..b9d1d36 100644
--- a/api-tests/ff/ipc/test_i032/test_supp_i032.c
+++ b/api-tests/ff/ipc/test_i032/test_supp_i032.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,84 @@
#define NUM_OF_BYTES 4
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_read_with_invec_equal_to_max_iovec(void);
+
+const server_test_t test_i032_server_tests_list[] = {
+ NULL,
+ server_test_psa_read_with_invec_equal_to_max_iovec,
+ NULL,
+};
+
+int32_t server_test_psa_read_with_invec_equal_to_max_iovec(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ uint8_t data[NUM_OF_BYTES] = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_read with invec_idx=PSA_MAX_IOVEC, call should panic */
+ psa->read(msg.handle, PSA_MAX_IOVEC, (void *)data, 0);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_read with invec_idx=PSA_MAX_IOVEC should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+ status = VAL_STATUS_SPM_FAILED;
+ psa->reply(msg.handle, -4);
+
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_read_with_invec_equal_to_max_iovec(void);
const server_test_t test_i032_server_tests_list[] = {
@@ -110,3 +188,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i033/test_i033.c b/api-tests/ff/ipc/test_i033/test_i033.c
index f83589c..dadf109 100644
--- a/api-tests/ff/ipc/test_i033/test_i033.c
+++ b/api-tests/ff/ipc/test_i033/test_i033.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,36 @@
#include "test_i033.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i033_client_tests_list[] = {
+ NULL,
+ client_test_psa_read_with_invec_greater_than_max_iovec,
+ NULL,
+};
+
+int32_t client_test_psa_read_with_invec_greater_than_max_iovec(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_read with invec_idx > PSA_MAX_IOVEC\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i033_client_tests_list[] = {
NULL,
client_test_psa_read_with_invec_greater_than_max_iovec,
@@ -46,7 +76,6 @@
val->print(PRINT_ERROR, "\tConnection failed\n", 0);
return VAL_STATUS_INVALID_HANDLE;
}
-
status_of_call = psa->call(handle, PSA_IPC_CALL, NULL, 0, NULL, 0);
/* Expectation is server test should hang and control shouldn't have come here */
@@ -55,6 +84,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i033/test_supp_i033.c b/api-tests/ff/ipc/test_i033/test_supp_i033.c
index 789de3d..fe8f220 100644
--- a/api-tests/ff/ipc/test_i033/test_supp_i033.c
+++ b/api-tests/ff/ipc/test_i033/test_supp_i033.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,84 @@
#define NUM_OF_BYTES 4
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_read_with_invec_greater_than_max_iovec(void);
+
+const server_test_t test_i033_server_tests_list[] = {
+ NULL,
+ server_test_psa_read_with_invec_greater_than_max_iovec,
+ NULL,
+};
+
+int32_t server_test_psa_read_with_invec_greater_than_max_iovec(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ uint8_t data[NUM_OF_BYTES] = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_read with invec_idx > PSA_MAX_IOVEC, call should panic */
+ psa->read(msg.handle, PSA_MAX_IOVEC + 1, (void *)data, 0);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_read with invec_idx > PSA_MAX_IOVEC should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ psa->reply(msg.handle, -4);
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_read_with_invec_greater_than_max_iovec(void);
const server_test_t test_i033_server_tests_list[] = {
@@ -110,3 +188,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i036/test_i036.c b/api-tests/ff/ipc/test_i036/test_i036.c
index bb85aea..28f93c3 100644
--- a/api-tests/ff/ipc/test_i036/test_i036.c
+++ b/api-tests/ff/ipc/test_i036/test_i036.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,36 @@
#include "test_i036.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i036_client_tests_list[] = {
+ NULL,
+ client_test_psa_skip_with_null_handle,
+ NULL,
+};
+
+int32_t client_test_psa_skip_with_null_handle(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_skip with NULL handle\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i036_client_tests_list[] = {
NULL,
client_test_psa_skip_with_null_handle,
@@ -55,6 +85,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i036/test_supp_i036.c b/api-tests/ff/ipc/test_i036/test_supp_i036.c
index cf92845..6a17a5f 100644
--- a/api-tests/ff/ipc/test_i036/test_supp_i036.c
+++ b/api-tests/ff/ipc/test_i036/test_supp_i036.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,81 @@
int32_t server_test_psa_skip_with_null_handle(void);
+#if STATELESS_ROT == 1
+
+const server_test_t test_i036_server_tests_list[] = {
+ NULL,
+ server_test_psa_skip_with_null_handle,
+ NULL,
+};
+
+int32_t server_test_psa_skip_with_null_handle(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_skip with PSA_NULL_HANDLE, call should panic */
+ psa->skip(PSA_NULL_HANDLE, 0, 0);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_skip with NULL handle should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ psa->reply(msg.handle, -4);
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
const server_test_t test_i036_server_tests_list[] = {
NULL,
server_test_psa_skip_with_null_handle,
@@ -107,3 +182,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i037/test_i037.c b/api-tests/ff/ipc/test_i037/test_i037.c
index 407232e..ba752e2 100644
--- a/api-tests/ff/ipc/test_i037/test_i037.c
+++ b/api-tests/ff/ipc/test_i037/test_i037.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,36 @@
#include "test_i037.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i037_client_tests_list[] = {
+ NULL,
+ client_test_psa_skip_with_invalid_handle,
+ NULL,
+};
+
+int32_t client_test_psa_skip_with_invalid_handle(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_skip with invalid handle\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i037_client_tests_list[] = {
NULL,
client_test_psa_skip_with_invalid_handle,
@@ -55,6 +85,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i037/test_supp_i037.c b/api-tests/ff/ipc/test_i037/test_supp_i037.c
index c7d7711..e3d0a73 100644
--- a/api-tests/ff/ipc/test_i037/test_supp_i037.c
+++ b/api-tests/ff/ipc/test_i037/test_supp_i037.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,83 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_skip_with_invalid_handle(void);
+
+const server_test_t test_i037_server_tests_list[] = {
+ NULL,
+ server_test_psa_skip_with_invalid_handle,
+ NULL,
+};
+
+int32_t server_test_psa_skip_with_invalid_handle(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_skip with INVALID_HANDLE, call should panic */
+ psa->skip(INVALID_HANDLE, 0, 0);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_skip with invalid handle should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ psa->reply(msg.handle, -4);
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_skip_with_invalid_handle(void);
const server_test_t test_i037_server_tests_list[] = {
@@ -107,3 +184,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i038/test_i038.c b/api-tests/ff/ipc/test_i038/test_i038.c
index 2a2a2e6..df8ec4a 100644
--- a/api-tests/ff/ipc/test_i038/test_i038.c
+++ b/api-tests/ff/ipc/test_i038/test_i038.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,35 @@
#include "test_i038.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i038_client_tests_list[] = {
+ NULL,
+ client_test_psa_skip_with_invec_equal_to_max_iovec,
+ NULL,
+};
+
+int32_t client_test_psa_skip_with_invec_equal_to_max_iovec(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_skip with invec_idx=PSA_MAX_IOVEC\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i038_client_tests_list[] = {
NULL,
client_test_psa_skip_with_invec_equal_to_max_iovec,
@@ -55,6 +84,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i038/test_supp_i038.c b/api-tests/ff/ipc/test_i038/test_supp_i038.c
index 3790305..850de8b 100644
--- a/api-tests/ff/ipc/test_i038/test_supp_i038.c
+++ b/api-tests/ff/ipc/test_i038/test_supp_i038.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,85 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_skip_with_invec_equal_to_max_iovec(void);
+
+const server_test_t test_i038_server_tests_list[] = {
+ NULL,
+ server_test_psa_skip_with_invec_equal_to_max_iovec,
+ NULL,
+};
+
+int32_t server_test_psa_skip_with_invec_equal_to_max_iovec(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_skip with invec_idx=PSA_MAX_IOVEC, call should panic */
+ psa->skip(msg.handle, PSA_MAX_IOVEC, 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_skip with invec_idx=PSA_MAX_IOVEC should failed but succeed\n", 0);
+
+ psa->reply(msg.handle, -4);
+
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_skip_with_invec_equal_to_max_iovec(void);
const server_test_t test_i038_server_tests_list[] = {
@@ -109,3 +188,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i039/test_i039.c b/api-tests/ff/ipc/test_i039/test_i039.c
index 26bd8a7..bee2b67 100644
--- a/api-tests/ff/ipc/test_i039/test_i039.c
+++ b/api-tests/ff/ipc/test_i039/test_i039.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,35 @@
#include "test_i039.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i039_client_tests_list[] = {
+ NULL,
+ client_test_psa_skip_with_invec_greater_than_max_iovec,
+ NULL,
+};
+
+int32_t client_test_psa_skip_with_invec_greater_than_max_iovec(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_skip with invec_idx > PSA_MAX_IOVEC\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i039_client_tests_list[] = {
NULL,
client_test_psa_skip_with_invec_greater_than_max_iovec,
@@ -55,6 +84,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i039/test_supp_i039.c b/api-tests/ff/ipc/test_i039/test_supp_i039.c
index a94076c..25a25cb 100644
--- a/api-tests/ff/ipc/test_i039/test_supp_i039.c
+++ b/api-tests/ff/ipc/test_i039/test_supp_i039.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,85 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_skip_with_invec_greater_than_max_iovec(void);
+
+const server_test_t test_i039_server_tests_list[] = {
+ NULL,
+ server_test_psa_skip_with_invec_greater_than_max_iovec,
+ NULL,
+};
+
+int32_t server_test_psa_skip_with_invec_greater_than_max_iovec(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_skip with invec_idx > PSA_MAX_IOVEC, call should panic */
+ psa->skip(msg.handle, PSA_MAX_IOVEC + 1, 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_skip with invec_idx > PSA_MAX_IOVEC should failed but succeed\n", 0);
+
+ psa->reply(msg.handle, -4);
+
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_skip_with_invec_greater_than_max_iovec(void);
const server_test_t test_i039_server_tests_list[] = {
@@ -106,6 +185,9 @@
val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
status = ((val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
? VAL_STATUS_ERROR : status);
+
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i042/test_i042.c b/api-tests/ff/ipc/test_i042/test_i042.c
index 9c8e4ce..4c14de1 100644
--- a/api-tests/ff/ipc/test_i042/test_i042.c
+++ b/api-tests/ff/ipc/test_i042/test_i042.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
#include "test_i042.h"
+#if STATELESS_ROT == 1
+
const client_test_t test_i042_client_tests_list[] = {
NULL,
client_test_psa_write_with_null_handle,
@@ -34,12 +36,39 @@
int32_t client_test_psa_write_with_null_handle(caller_security_t caller __UNUSED)
{
int32_t status = VAL_STATUS_SUCCESS;
- psa_handle_t handle = 0;
psa_status_t status_of_call;
val->print(PRINT_TEST,
"[Check 1] Test psa_write with NULL handle\n", 0);
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
+const client_test_t test_i042_client_tests_list[] = {
+ NULL,
+ client_test_psa_write_with_null_handle,
+ NULL,
+};
+
+int32_t client_test_psa_write_with_null_handle(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ psa_status_t status_of_call;
+ psa_handle_t handle = 0;
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_write with NULL handle\n", 0);
+
handle = psa->connect(SERVER_UNSPECIFED_VERSION_SID, SERVER_UNSPECIFED_VERSION_VERSION);
if (!PSA_HANDLE_IS_VALID(handle))
{
@@ -55,6 +84,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i042/test_supp_i042.c b/api-tests/ff/ipc/test_i042/test_supp_i042.c
index 09bb04f..6b233b3 100644
--- a/api-tests/ff/ipc/test_i042/test_supp_i042.c
+++ b/api-tests/ff/ipc/test_i042/test_supp_i042.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,7 +23,9 @@
extern val_api_t *val;
extern psa_api_t *psa;
-int32_t server_test_psa_write_with_null_handle();
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_write_with_null_handle(void);
const server_test_t test_i042_server_tests_list[] = {
NULL,
@@ -31,7 +33,81 @@
NULL,
};
-int32_t server_test_psa_write_with_null_handle()
+int32_t server_test_psa_write_with_null_handle(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ uint8_t data[4] = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* psa_write with PSA_NULL_HANDLE, call should panic */
+ psa->write(PSA_NULL_HANDLE, 0, (void *)data, 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ /* Resetting boot.state to catch unwanted reboot */
+ val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_write with NULL handle should failed but succeed\n", 0);
+
+ psa->reply(msg.handle, -4);
+
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
+int32_t server_test_psa_write_with_null_handle(void);
+
+const server_test_t test_i042_server_tests_list[] = {
+ NULL,
+ server_test_psa_write_with_null_handle,
+ NULL,
+};
+
+int32_t server_test_psa_write_with_null_handle(void)
{
int32_t status = VAL_STATUS_SUCCESS;
psa_msg_t msg = {0};
@@ -106,3 +182,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i043/test_i043.c b/api-tests/ff/ipc/test_i043/test_i043.c
index 1030e65..49c4e6f 100644
--- a/api-tests/ff/ipc/test_i043/test_i043.c
+++ b/api-tests/ff/ipc/test_i043/test_i043.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,35 @@
#include "test_i043.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i043_client_tests_list[] = {
+ NULL,
+ client_test_psa_write_with_invalid_handle,
+ NULL,
+};
+
+int32_t client_test_psa_write_with_invalid_handle(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_write with invalid handle\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i043_client_tests_list[] = {
NULL,
client_test_psa_write_with_invalid_handle,
@@ -55,6 +84,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i043/test_supp_i043.c b/api-tests/ff/ipc/test_i043/test_supp_i043.c
index eca5ee7..7f314e0 100644
--- a/api-tests/ff/ipc/test_i043/test_supp_i043.c
+++ b/api-tests/ff/ipc/test_i043/test_supp_i043.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,85 @@
#define NUM_OF_BYTES 4
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_write_with_invalid_handle(void);
+
+const server_test_t test_i043_server_tests_list[] = {
+ NULL,
+ server_test_psa_write_with_invalid_handle,
+ NULL,
+};
+
+int32_t server_test_psa_write_with_invalid_handle(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ uint8_t data[NUM_OF_BYTES] = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_write with INVALID_HANDLE, call should panic */
+ psa->write(INVALID_HANDLE, 0, (void *)data, 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_write with invalid handle should failed but succeed\n", 0);
+
+ psa->reply(msg.handle, -4);
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_write_with_invalid_handle(void);
const server_test_t test_i043_server_tests_list[] = {
@@ -111,3 +190,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i044/test_i044.c b/api-tests/ff/ipc/test_i044/test_i044.c
index 09050d2..bf2c5c4 100644
--- a/api-tests/ff/ipc/test_i044/test_i044.c
+++ b/api-tests/ff/ipc/test_i044/test_i044.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
#include "test_i044.h"
+#if STATELESS_ROT == 1
+
const client_test_t test_i044_client_tests_list[] = {
NULL,
client_test_psa_write_with_invec_equal_to_max_iovec,
@@ -34,12 +36,39 @@
int32_t client_test_psa_write_with_invec_equal_to_max_iovec(caller_security_t caller __UNUSED)
{
int32_t status = VAL_STATUS_SUCCESS;
- psa_handle_t handle = 0;
psa_status_t status_of_call;
val->print(PRINT_TEST,
"[Check 1] Test psa_write with invec_idx=PSA_MAX_IOVEC\n", 0);
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
+const client_test_t test_i044_client_tests_list[] = {
+ NULL,
+ client_test_psa_write_with_invec_equal_to_max_iovec,
+ NULL,
+};
+
+int32_t client_test_psa_write_with_invec_equal_to_max_iovec(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ psa_status_t status_of_call;
+ psa_handle_t handle = 0;
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_write with invec_idx=PSA_MAX_IOVEC\n", 0);
+
handle = psa->connect(SERVER_UNSPECIFED_VERSION_SID, SERVER_UNSPECIFED_VERSION_VERSION);
if (!PSA_HANDLE_IS_VALID(handle))
{
@@ -55,6 +84,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i044/test_supp_i044.c b/api-tests/ff/ipc/test_i044/test_supp_i044.c
index 6fea86e..4a55125 100644
--- a/api-tests/ff/ipc/test_i044/test_supp_i044.c
+++ b/api-tests/ff/ipc/test_i044/test_supp_i044.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,85 @@
#define NUM_OF_BYTES 4
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_write_with_invec_equal_to_max_iovec(void);
+
+const server_test_t test_i044_server_tests_list[] = {
+ NULL,
+ server_test_psa_write_with_invec_equal_to_max_iovec,
+ NULL,
+};
+
+int32_t server_test_psa_write_with_invec_equal_to_max_iovec(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ uint8_t data[NUM_OF_BYTES] = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_write with invec_idx=PSA_MAX_IOVEC, call should panic */
+ psa->write(msg.handle, PSA_MAX_IOVEC, (void *)data, 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_write with invec_idx=PSA_MAX_IOVEC should failed but succeed\n", 0);
+
+ psa->reply(msg.handle, -4);
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_write_with_invec_equal_to_max_iovec(void);
const server_test_t test_i044_server_tests_list[] = {
@@ -111,3 +190,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i045/test_i045.c b/api-tests/ff/ipc/test_i045/test_i045.c
index 774e9cd..883f81c 100644
--- a/api-tests/ff/ipc/test_i045/test_i045.c
+++ b/api-tests/ff/ipc/test_i045/test_i045.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
#include "test_i045.h"
+#if STATELESS_ROT == 1
+
const client_test_t test_i045_client_tests_list[] = {
NULL,
client_test_psa_write_with_invec_greater_than_max_iovec,
@@ -34,12 +36,39 @@
int32_t client_test_psa_write_with_invec_greater_than_max_iovec(caller_security_t caller __UNUSED)
{
int32_t status = VAL_STATUS_SUCCESS;
- psa_handle_t handle = 0;
psa_status_t status_of_call;
val->print(PRINT_TEST,
"[Check 1] Test psa_write with invec_idx > PSA_MAX_IOVEC\n", 0);
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
+const client_test_t test_i045_client_tests_list[] = {
+ NULL,
+ client_test_psa_write_with_invec_greater_than_max_iovec,
+ NULL,
+};
+
+int32_t client_test_psa_write_with_invec_greater_than_max_iovec(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ psa_status_t status_of_call;
+ psa_handle_t handle = 0;
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_write with invec_idx > PSA_MAX_IOVEC\n", 0);
+
handle = psa->connect(SERVER_UNSPECIFED_VERSION_SID, SERVER_UNSPECIFED_VERSION_VERSION);
if (!PSA_HANDLE_IS_VALID(handle))
{
@@ -55,6 +84,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i045/test_supp_i045.c b/api-tests/ff/ipc/test_i045/test_supp_i045.c
index b590405..d414a78 100644
--- a/api-tests/ff/ipc/test_i045/test_supp_i045.c
+++ b/api-tests/ff/ipc/test_i045/test_supp_i045.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,86 @@
#define NUM_OF_BYTES 4
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_write_with_invec_greater_than_max_iovec(void);
+
+const server_test_t test_i045_server_tests_list[] = {
+ NULL,
+ server_test_psa_write_with_invec_greater_than_max_iovec,
+ NULL,
+};
+
+int32_t server_test_psa_write_with_invec_greater_than_max_iovec(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ uint8_t data[NUM_OF_BYTES] = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_write with invec_idx > PSA_MAX_IOVEC, call should panic */
+ psa->write(msg.handle, PSA_MAX_IOVEC + 1, (void *)data, 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_write with invec_idx > PSA_MAX_IOVEC should failed but succeed\n", 0);
+
+ psa->reply(msg.handle, -4);
+ }
+ }
+
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_write_with_invec_greater_than_max_iovec(void);
const server_test_t test_i045_server_tests_list[] = {
@@ -105,9 +185,12 @@
}
}
+
val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
status = ((val->process_disconnect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg))
? VAL_STATUS_ERROR : status);
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i046/test_i046.c b/api-tests/ff/ipc/test_i046/test_i046.c
index 8aea6db..3f967ef 100644
--- a/api-tests/ff/ipc/test_i046/test_i046.c
+++ b/api-tests/ff/ipc/test_i046/test_i046.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
#include "test_i046.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i046_client_tests_list[] = {
+ NULL,
+ client_test_psa_write_with_size_overflow,
+ NULL,
+};
+
+int32_t client_test_psa_write_with_size_overflow(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+ uint8_t data = 0;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_write with size overflow\n", 0);
+
+ psa_outvec resp = {&data, sizeof(data)};
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, &resp, 1);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i046_client_tests_list[] = {
NULL,
client_test_psa_write_with_size_overflow,
@@ -58,6 +90,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i046/test_supp_i046.c b/api-tests/ff/ipc/test_i046/test_supp_i046.c
index d4be5e0..5d86843 100644
--- a/api-tests/ff/ipc/test_i046/test_supp_i046.c
+++ b/api-tests/ff/ipc/test_i046/test_supp_i046.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,85 @@
#define NUM_OF_BYTES 4
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_write_with_size_overflow(void);
+
+const server_test_t test_i046_server_tests_list[] = {
+ NULL,
+ server_test_psa_write_with_size_overflow,
+ NULL,
+};
+
+int32_t server_test_psa_write_with_size_overflow(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ uint8_t data[NUM_OF_BYTES] = {0};
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_write with size overflow, call should panic */
+ psa->write(msg.handle, 0, (void *)data, msg.out_size[0]+1);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_write with size overflow should failed but succeed\n", 0);
+
+ psa->reply(msg.handle, -4);
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_write_with_size_overflow(void);
const server_test_t test_i046_server_tests_list[] = {
@@ -111,3 +190,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i047/test_i047.c b/api-tests/ff/ipc/test_i047/test_i047.c
index f5d9502..e145117 100644
--- a/api-tests/ff/ipc/test_i047/test_i047.c
+++ b/api-tests/ff/ipc/test_i047/test_i047.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
#include "test_i047.h"
+#if STATELESS_ROT == 1
+
const client_test_t test_i047_client_tests_list[] = {
NULL,
client_test_psa_get_with_invalid_msg_pointer,
@@ -33,11 +35,36 @@
int32_t client_test_psa_get_with_invalid_msg_pointer(caller_security_t caller __UNUSED)
{
+
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_get with invalid msg pointer\n", 0);
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, NULL, 0);
+ (void)status_of_call;
+
+ return VAL_STATUS_SUCCESS;
+
+}
+
+#else
+
+const client_test_t test_i047_client_tests_list[] = {
+ NULL,
+ client_test_psa_get_with_invalid_msg_pointer,
+ NULL,
+};
+
+int32_t client_test_psa_get_with_invalid_msg_pointer(caller_security_t caller __UNUSED)
+{
+
psa_handle_t handle = 0;
val->print(PRINT_TEST,
"[Check 1] Test psa_get with invalid msg pointer\n", 0);
+
handle = psa->connect(SERVER_UNSPECIFED_VERSION_SID, SERVER_UNSPECIFED_VERSION_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -48,5 +75,8 @@
val->print(PRINT_ERROR, "\tpsa_connect should failed but succeed\n", 0);
(void)(handle);
+
return VAL_STATUS_SPM_FAILED;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i047/test_supp_i047.c b/api-tests/ff/ipc/test_i047/test_supp_i047.c
index 49a5337..3c74b9f 100644
--- a/api-tests/ff/ipc/test_i047/test_supp_i047.c
+++ b/api-tests/ff/ipc/test_i047/test_supp_i047.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,100 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_get_with_invalid_msg_pointer(void);
+
+const server_test_t test_i047_server_tests_list[] = {
+ NULL,
+ server_test_psa_get_with_invalid_msg_pointer,
+ NULL,
+};
+
+int32_t server_test_psa_get_with_invalid_msg_pointer(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_signal_t signals = 0;
+ psa_msg_t *invalid_msg = NULL;
+ memory_desc_t *memory_desc;
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ signals = psa->wait(SERVER_UNSPECIFED_VERSION_SIGNAL, PSA_BLOCK);
+ if ((signals & SERVER_UNSPECIFED_VERSION_SIGNAL) == 0)
+ {
+ val->print(PRINT_ERROR,
+ "psa_wait returned with invalid signal value = 0x%x\n", signals);
+ return VAL_STATUS_ERROR;
+ }
+
+ /*
+ * Selection of invalid msg pointer:
+ *
+ * if (ISOLATION_LEVEL > 1)
+ * msg_pointer = driver_mmio_region_base;
+ * else
+ * msg_pointer = NULL;
+ */
+
+ if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+ {
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ MEMORY_DRIVER_PARTITION_MMIO, 0),
+ (uint8_t **)&memory_desc,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(201), status))
+ {
+ return status;
+ }
+
+ invalid_msg = (psa_msg_t *) memory_desc->start;
+ }
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_NS))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* psa_get with invalid msg pointer, call should panic */
+ psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, invalid_msg);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_get with invalid msg pointer should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+#else
int32_t server_test_psa_get_with_invalid_msg_pointer(void);
@@ -114,5 +208,8 @@
/* Reject the connection */
psa->reply(invalid_msg->handle, PSA_ERROR_CONNECTION_REFUSED);
+
return VAL_STATUS_SPM_FAILED;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i048/test_i048.c b/api-tests/ff/ipc/test_i048/test_i048.c
index 7e11989..91aeeba 100644
--- a/api-tests/ff/ipc/test_i048/test_i048.c
+++ b/api-tests/ff/ipc/test_i048/test_i048.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,117 @@
#include "test_i048.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i048_client_tests_list[] = {
+ NULL,
+ client_test_psa_call_with_invalid_invec_pointer,
+ NULL,
+};
+
+int32_t client_test_psa_call_with_invalid_invec_pointer(caller_security_t caller)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ psa_status_t status_of_call;
+ boot_state_t boot_state;
+ memory_desc_t *memory_desc;
+ psa_invec *invalid_invec = NULL;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_call with invalid address for in_vec\n", 0);
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /*
+ * Selection of invalid invec pointer:
+ *
+ * if caller == CALLER_NONSECURE
+ * // PSA RoT pointer
+ * invec_pointer = driver_mmio_region_base;
+ * else
+ * if (ISOLATION_LEVEL > 1)
+ * // PSA RoT pointer
+ * invec_pointer = driver_mmio_region_base;
+ * else
+ * invec_pointer = NULL;
+ */
+
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ MEMORY_DRIVER_PARTITION_MMIO, 0),
+ (uint8_t **)&memory_desc,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(101), status))
+ {
+ return status;
+ }
+
+ if (caller == CALLER_NONSECURE)
+ invalid_invec = (psa_invec *) memory_desc->start;
+ else
+ {
+ if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+ invalid_invec = (psa_invec *) memory_desc->start;
+ }
+
+ /* Setting boot.state before test check */
+ boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+ if (val->set_boot_flag(boot_state))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Test check- psa_call with invalid address for in_vec */
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL,
+ invalid_invec, 1, NULL, 0);
+
+ /*
+ * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+ * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+ * For SPE caller, it must panic.
+ */
+ if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+ {
+ return VAL_STATUS_SUCCESS;
+ }
+
+ /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+ val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ return status;
+}
+
+#else
+
const client_test_t test_i048_client_tests_list[] = {
NULL,
client_test_psa_call_with_invalid_invec_pointer,
@@ -140,3 +251,4 @@
psa->close(handle);
return status;
}
+#endif
diff --git a/api-tests/ff/ipc/test_i048/test_supp_i048.c b/api-tests/ff/ipc/test_i048/test_supp_i048.c
index 29058c1..794c180 100644
--- a/api-tests/ff/ipc/test_i048/test_supp_i048.c
+++ b/api-tests/ff/ipc/test_i048/test_supp_i048.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,39 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_invalid_invec_pointer(void);
+
+const server_test_t test_i048_server_tests_list[] = {
+ NULL,
+ server_test_psa_call_with_invalid_invec_pointer,
+ NULL,
+};
+
+int32_t server_test_psa_call_with_invalid_invec_pointer(void)
+{
+ psa_msg_t msg = {0};
+ psa_signal_t signals;
+
+wait:
+ signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+ if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+ {
+ goto wait;
+ }
+
+ if (msg.type == PSA_IPC_CALL)
+ {
+ /* Control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+ psa->reply(msg.handle, -2);
+ }
+ return VAL_STATUS_ERROR;
+}
+
+#else
+
int32_t server_test_psa_call_with_invalid_invec_pointer(void);
const server_test_t test_i048_server_tests_list[] = {
@@ -77,3 +110,5 @@
return VAL_STATUS_ERROR;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i049/test_i049.c b/api-tests/ff/ipc/test_i049/test_i049.c
index becd24a..8313316 100644
--- a/api-tests/ff/ipc/test_i049/test_i049.c
+++ b/api-tests/ff/ipc/test_i049/test_i049.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,6 +24,117 @@
#endif
#include "test_i049.h"
+#include "stdio.h"
+
+#if STATELESS_ROT == 1
+
+const client_test_t test_i049_client_tests_list[] = {
+ NULL,
+ client_test_psa_call_with_invalid_outvec_pointer,
+ NULL,
+};
+
+int32_t client_test_psa_call_with_invalid_outvec_pointer(caller_security_t caller)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+ boot_state_t boot_state;
+ memory_desc_t *memory_desc;
+ psa_outvec *invalid_outvec = NULL;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_call with invalid address for outvec\n", 0);
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /*
+ * Selection of invalid outvec pointer:
+ *
+ * if caller == CALLER_NONSECURE
+ * // PSA RoT pointer
+ * outvec_pointer = driver_mmio_region_base;
+ * else
+ * if (ISOLATION_LEVEL > 1)
+ * // PSA RoT pointer
+ * outvec_pointer = driver_mmio_region_base;
+ * else
+ * outvec_pointer = NULL;
+ */
+
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ MEMORY_DRIVER_PARTITION_MMIO, 0),
+ (uint8_t **)&memory_desc,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(101), status))
+ {
+ return status;
+ }
+
+ if (caller == CALLER_NONSECURE)
+ invalid_outvec = (psa_outvec *) memory_desc->start;
+ else
+ {
+ if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+ invalid_outvec = (psa_outvec *) memory_desc->start;
+ }
+
+ /* Setting boot.state before test check */
+ boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+ if (val->set_boot_flag(boot_state))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Test check- psa_call with invalid address for outvec */
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0,
+ invalid_outvec, 1);
+
+ /*
+ * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+ * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+ * For SPE caller, it must panic.
+ */
+ if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+ {
+ return VAL_STATUS_SUCCESS;
+ }
+
+ /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+ val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ return status;
+}
+
+#else
const client_test_t test_i049_client_tests_list[] = {
NULL,
@@ -140,3 +251,5 @@
psa->close(handle);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i049/test_supp_i049.c b/api-tests/ff/ipc/test_i049/test_supp_i049.c
index 8061a00..0a53cd9 100644
--- a/api-tests/ff/ipc/test_i049/test_supp_i049.c
+++ b/api-tests/ff/ipc/test_i049/test_supp_i049.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,12 +17,47 @@
#include "val_client_defs.h"
#include "val_service_defs.h"
+#include "stdio.h"
#define val CONCAT(val, _server_sp)
#define psa CONCAT(psa, _server_sp)
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_invalid_outvec_pointer(void);
+
+const server_test_t test_i049_server_tests_list[] = {
+ NULL,
+ server_test_psa_call_with_invalid_outvec_pointer,
+ NULL,
+};
+
+int32_t server_test_psa_call_with_invalid_outvec_pointer(void)
+{
+ psa_msg_t msg = {0};
+ psa_signal_t signals;
+
+wait:
+ signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+ if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+ {
+ goto wait;
+ }
+
+ if (msg.type == PSA_IPC_CALL)
+ {
+ /* Control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+ psa->reply(msg.handle, -2);
+ }
+
+ return VAL_STATUS_ERROR;
+}
+
+#else
+
int32_t server_test_psa_call_with_invalid_outvec_pointer(void);
const server_test_t test_i049_server_tests_list[] = {
@@ -77,3 +112,5 @@
return VAL_STATUS_ERROR;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i050/test_i050.c b/api-tests/ff/ipc/test_i050/test_i050.c
index 13701a3..df986d7 100644
--- a/api-tests/ff/ipc/test_i050/test_i050.c
+++ b/api-tests/ff/ipc/test_i050/test_i050.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,118 @@
#include "test_i050.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i050_client_tests_list[] = {
+ NULL,
+ client_test_psa_call_with_invalid_invec_base,
+ NULL,
+};
+
+int32_t client_test_psa_call_with_invalid_invec_base(caller_security_t caller)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+ boot_state_t boot_state;
+ memory_desc_t *memory_desc;
+ addr_t *invalid_base = NULL;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_call with invalid psa_invec.base\n", 0);
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /*
+ * Selection of invalid invec pointer:
+ *
+ * if caller == CALLER_NONSECURE
+ * // PSA RoT pointer
+ * invalid_base = driver_mmio_region_base;
+ * else
+ * if (ISOLATION_LEVEL > 1)
+ * // PSA RoT pointer
+ * invalid_base = driver_mmio_region_base;
+ * else
+ * invalid_base = NULL;
+ */
+
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ MEMORY_DRIVER_PARTITION_MMIO, 0),
+ (uint8_t **)&memory_desc,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(101), status))
+ {
+ return status;
+ }
+
+
+ if (caller == CALLER_NONSECURE)
+ invalid_base = (addr_t *) memory_desc->start;
+ else
+ {
+ if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+ invalid_base = (addr_t *) memory_desc->start;
+ }
+
+ /* Setting boot.state before test check */
+ boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+ if (val->set_boot_flag(boot_state))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ psa_invec invec[1] = { {invalid_base, sizeof(addr_t)} };
+
+ /* Test check- psa_call with invalid address for psa_invec.base */
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, invec, 1, NULL, 0);
+
+ /*
+ * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+ * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+ * For SPE caller, it must panic.
+ */
+ if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+ {
+ return VAL_STATUS_SUCCESS;
+ }
+
+ /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+ val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ return status;
+}
+
+#else
+
const client_test_t test_i050_client_tests_list[] = {
NULL,
client_test_psa_call_with_invalid_invec_base,
@@ -96,6 +208,7 @@
return status;
}
+
if (caller == CALLER_NONSECURE)
invalid_base = (addr_t *) memory_desc->start;
else
@@ -142,3 +255,5 @@
psa->close(handle);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i050/test_supp_i050.c b/api-tests/ff/ipc/test_i050/test_supp_i050.c
index 3cd745d..d988e8c 100644
--- a/api-tests/ff/ipc/test_i050/test_supp_i050.c
+++ b/api-tests/ff/ipc/test_i050/test_supp_i050.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,40 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_invalid_invec_base(void);
+
+const server_test_t test_i050_server_tests_list[] = {
+ NULL,
+ server_test_psa_call_with_invalid_invec_base,
+ NULL,
+};
+
+int32_t server_test_psa_call_with_invalid_invec_base(void)
+{
+ psa_msg_t msg = {0};
+ psa_signal_t signals;
+
+wait:
+ signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+ if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+ {
+ goto wait;
+ }
+
+ if (msg.type == PSA_IPC_CALL)
+ {
+ /* Control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+ psa->reply(msg.handle, -2);
+ }
+
+ return VAL_STATUS_ERROR;
+}
+
+#else
+
int32_t server_test_psa_call_with_invalid_invec_base(void);
const server_test_t test_i050_server_tests_list[] = {
@@ -77,3 +111,5 @@
return VAL_STATUS_ERROR;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i051/test_i051.c b/api-tests/ff/ipc/test_i051/test_i051.c
index 3fb0d15..60805ef 100644
--- a/api-tests/ff/ipc/test_i051/test_i051.c
+++ b/api-tests/ff/ipc/test_i051/test_i051.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,118 @@
#include "test_i051.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i051_client_tests_list[] = {
+ NULL,
+ client_test_psa_call_with_invalid_outvec_base,
+ NULL,
+};
+
+int32_t client_test_psa_call_with_invalid_outvec_base(caller_security_t caller)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ psa_status_t status_of_call;
+ boot_state_t boot_state;
+ memory_desc_t *memory_desc;
+ addr_t *invalid_base = NULL;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_call with invalid psa_outvec.base\n", 0);
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /*
+ * Selection of invalid outvec pointer:
+ *
+ * if caller == CALLER_NONSECURE
+ * // PSA RoT pointer
+ * invalid_base = driver_mmio_region_base;
+ * else
+ * if (ISOLATION_LEVEL > 1)
+ * // PSA RoT pointer
+ * invalid_base = driver_mmio_region_base;
+ * else
+ * invalid_base = NULL;
+ */
+
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ MEMORY_DRIVER_PARTITION_MMIO, 0),
+ (uint8_t **)&memory_desc,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(101), status))
+ {
+ return status;
+ }
+
+ if (caller == CALLER_NONSECURE)
+ invalid_base = (addr_t *) memory_desc->start;
+ else
+ {
+ if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+ invalid_base = (addr_t *) memory_desc->start;
+ }
+
+ /* Setting boot.state before test check */
+ boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+ if (val->set_boot_flag(boot_state))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ psa_outvec outvec[1] = { {invalid_base, sizeof(addr_t)} };
+
+ /* Test check- psa_call with invalid address for psa_outvec.base */
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1);
+
+ /*
+ * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+ * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+ * For SPE caller, it must panic.
+ */
+ if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+ {
+ return VAL_STATUS_SUCCESS;
+ }
+
+ /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+ val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ return status;
+}
+
+#else
+
const client_test_t test_i051_client_tests_list[] = {
NULL,
client_test_psa_call_with_invalid_outvec_base,
@@ -142,3 +254,5 @@
psa->close(handle);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i051/test_supp_i051.c b/api-tests/ff/ipc/test_i051/test_supp_i051.c
index 01d83f1..396163d 100644
--- a/api-tests/ff/ipc/test_i051/test_supp_i051.c
+++ b/api-tests/ff/ipc/test_i051/test_supp_i051.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,40 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_invalid_outvec_base(void);
+
+const server_test_t test_i051_server_tests_list[] = {
+ NULL,
+ server_test_psa_call_with_invalid_outvec_base,
+ NULL,
+};
+
+int32_t server_test_psa_call_with_invalid_outvec_base(void)
+{
+ psa_msg_t msg = {0};
+ psa_signal_t signals;
+
+wait:
+ signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+ if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+ {
+ goto wait;
+ }
+
+ if (msg.type == PSA_IPC_CALL)
+ {
+ /* Control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+ psa->reply(msg.handle, -2);
+ }
+
+ return VAL_STATUS_ERROR;
+}
+
+#else
+
int32_t server_test_psa_call_with_invalid_outvec_base(void);
const server_test_t test_i051_server_tests_list[] = {
@@ -77,3 +111,5 @@
return VAL_STATUS_ERROR;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i052/test_i052.c b/api-tests/ff/ipc/test_i052/test_i052.c
index d8c3ef0..ba04f62 100644
--- a/api-tests/ff/ipc/test_i052/test_i052.c
+++ b/api-tests/ff/ipc/test_i052/test_i052.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,126 @@
#include "test_i052.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i052_client_tests_list[] = {
+ NULL,
+ client_test_psa_call_with_invalid_invec_end_addr,
+ NULL,
+};
+
+int32_t client_test_psa_call_with_invalid_invec_end_addr(caller_security_t caller)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+ boot_state_t boot_state;
+ memory_desc_t *memory_desc_driver, *memory_desc;
+ size_t invalid_size;
+ memory_cfg_id_t memory_cfg_id;
+ addr_t *valid_base = NULL;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_call with invalid end_addr for psa_invec\n", 0);
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /*
+ * Selection of invalid size for psa_invec:
+ *
+ * if caller == CALLER_NONSECURE
+ * valid_base = nspe_mmio_region_base;
+ * invalid_size = (driver_mmio_region_base - nspe_mmio_region_base + 1);
+ * else
+ * if (ISOLATION_LEVEL > 1)
+ * valid_base = server_mmio_region_base;
+ * invalid_size = (driver_mmio_region_base - server_mmio_region_base + 1);
+ */
+
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ MEMORY_DRIVER_PARTITION_MMIO, 0),
+ (uint8_t **)&memory_desc_driver,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(101), status))
+ {
+ return status;
+ }
+
+ if (caller == CALLER_NONSECURE)
+ memory_cfg_id = MEMORY_NSPE_MMIO;
+ else
+ memory_cfg_id = MEMORY_SERVER_PARTITION_MMIO;
+
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ memory_cfg_id, 0),
+ (uint8_t **)&memory_desc,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(102), status))
+ {
+ return status;
+ }
+
+ valid_base = (addr_t *) memory_desc->start;
+ invalid_size = (memory_desc_driver->start - memory_desc->start + 1);
+
+ /* Setting boot.state before test check */
+ boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+ if (val->set_boot_flag(boot_state))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ psa_invec invec[1] = { {valid_base, invalid_size} };
+
+ /* Test check- psa_call with invalid end_addr for psa_invec */
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, invec, 1, NULL, 0);
+
+ /*
+ * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+ * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+ * For SPE caller, it must panic.
+ */
+ if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+ {
+ return VAL_STATUS_SUCCESS;
+ }
+
+ /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+ val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ return status;
+}
+
+#else
+
const client_test_t test_i052_client_tests_list[] = {
NULL,
client_test_psa_call_with_invalid_invec_end_addr,
@@ -152,3 +272,5 @@
psa->close(handle);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i052/test_supp_i052.c b/api-tests/ff/ipc/test_i052/test_supp_i052.c
index c989cf1..818d3a0 100644
--- a/api-tests/ff/ipc/test_i052/test_supp_i052.c
+++ b/api-tests/ff/ipc/test_i052/test_supp_i052.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,39 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_invalid_invec_end_addr(void);
+
+const server_test_t test_i052_server_tests_list[] = {
+ NULL,
+ server_test_psa_call_with_invalid_invec_end_addr,
+ NULL,
+};
+
+int32_t server_test_psa_call_with_invalid_invec_end_addr(void)
+{
+ psa_msg_t msg = {0};
+ psa_signal_t signals;
+
+wait:
+ signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+ if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+ {
+ goto wait;
+ }
+
+ if (msg.type == PSA_IPC_CALL)
+ {
+ /* Control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+ psa->reply(msg.handle, -2);
+ }
+ return VAL_STATUS_ERROR;
+}
+
+#else
+
int32_t server_test_psa_call_with_invalid_invec_end_addr(void);
const server_test_t test_i052_server_tests_list[] = {
@@ -77,3 +110,5 @@
return VAL_STATUS_ERROR;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i053/test_i053.c b/api-tests/ff/ipc/test_i053/test_i053.c
index 542f809..9644563 100644
--- a/api-tests/ff/ipc/test_i053/test_i053.c
+++ b/api-tests/ff/ipc/test_i053/test_i053.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,127 @@
#include "test_i053.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i053_client_tests_list[] = {
+ NULL,
+ client_test_psa_call_with_invalid_outvec_end_addr,
+ NULL,
+};
+
+int32_t client_test_psa_call_with_invalid_outvec_end_addr(caller_security_t caller)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+ boot_state_t boot_state;
+ memory_desc_t *memory_desc_driver, *memory_desc;
+ size_t invalid_size;
+ memory_cfg_id_t memory_cfg_id;
+ addr_t *valid_base = NULL;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_call with invalid end_addr for psa_outvec\n", 0);
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /*
+ * Selection of invalid size for psa_outvec:
+ *
+ * if caller == CALLER_NONSECURE
+ * valid_base = nspe_mmio_region_base;
+ * invalid_size = (driver_mmio_region_base - nspe_mmio_region_base + 1);
+ * else
+ * if (ISOLATION_LEVEL > 1)
+ * valid_base = server_mmio_region_base;
+ * invalid_size = (driver_mmio_region_base - server_mmio_region_base + 1);
+ */
+
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ MEMORY_DRIVER_PARTITION_MMIO, 0),
+ (uint8_t **)&memory_desc_driver,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(101), status))
+ {
+ return status;
+ }
+
+ if (caller == CALLER_NONSECURE)
+ memory_cfg_id = MEMORY_NSPE_MMIO;
+ else
+ memory_cfg_id = MEMORY_SERVER_PARTITION_MMIO;
+
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ memory_cfg_id, 0),
+ (uint8_t **)&memory_desc,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(102), status))
+ {
+ return status;
+ }
+
+ valid_base = (addr_t *) memory_desc->start;
+ invalid_size = (memory_desc_driver->start - memory_desc->start + 1);
+
+ /* Setting boot.state before test check */
+ boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+ if (val->set_boot_flag(boot_state))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ psa_outvec outvec[1] = { {valid_base, invalid_size} };
+
+ /* Test check- psa_call with invalid end_addr for psa_outvec */
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1);
+
+ /*
+ * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+ * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+ * For SPE caller, it must panic.
+ */
+ if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+ {
+ return VAL_STATUS_SUCCESS;
+ }
+
+ /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+ val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i053_client_tests_list[] = {
NULL,
client_test_psa_call_with_invalid_outvec_end_addr,
@@ -153,3 +274,5 @@
(void)(status_of_call);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i053/test_supp_i053.c b/api-tests/ff/ipc/test_i053/test_supp_i053.c
index 59ad945..d5e5f6a 100644
--- a/api-tests/ff/ipc/test_i053/test_supp_i053.c
+++ b/api-tests/ff/ipc/test_i053/test_supp_i053.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,39 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_invalid_outvec_end_addr(void);
+
+const server_test_t test_i053_server_tests_list[] = {
+ NULL,
+ server_test_psa_call_with_invalid_outvec_end_addr,
+ NULL,
+};
+
+int32_t server_test_psa_call_with_invalid_outvec_end_addr(void)
+{
+ psa_msg_t msg = {0};
+ psa_signal_t signals;
+
+wait:
+ signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+ if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+ {
+ goto wait;
+ }
+
+ if (msg.type == PSA_IPC_CALL)
+ {
+ /* Control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+ psa->reply(msg.handle, -2);
+ }
+ return VAL_STATUS_ERROR;
+}
+
+#else
+
int32_t server_test_psa_call_with_invalid_outvec_end_addr(void);
const server_test_t test_i053_server_tests_list[] = {
@@ -77,3 +110,5 @@
return VAL_STATUS_ERROR;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i054/test_i054.c b/api-tests/ff/ipc/test_i054/test_i054.c
index cf05d6d..808566d 100644
--- a/api-tests/ff/ipc/test_i054/test_i054.c
+++ b/api-tests/ff/ipc/test_i054/test_i054.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,72 @@
#include "test_i054.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i054_client_tests_list[] = {
+ NULL,
+ client_test_psa_call_with_not_writable_outvec_base,
+ NULL,
+};
+
+int32_t client_test_psa_call_with_not_writable_outvec_base(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_call with not writable psa_outvec.base\n", 0);
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_S))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Using function address (code) as not writable address */
+ psa_outvec outvec[1] = { {&client_test_psa_call_with_not_writable_outvec_base, sizeof(char)} };
+
+ /* Test check- psa_call with not writable psa_outvec.base, call should panic */
+ psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1);
+
+ /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+ val->print(PRINT_ERROR, "\tpsa_call should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ return status;
+}
+
+#else
+
const client_test_t test_i054_client_tests_list[] = {
NULL,
client_test_psa_call_with_not_writable_outvec_base,
@@ -92,6 +158,8 @@
}
status = VAL_STATUS_SPM_FAILED;
- psa->close(handle);
+ psa->close(handle);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i054/test_supp_i054.c b/api-tests/ff/ipc/test_i054/test_supp_i054.c
index b76863b..fdcd2d2 100644
--- a/api-tests/ff/ipc/test_i054/test_supp_i054.c
+++ b/api-tests/ff/ipc/test_i054/test_supp_i054.c
@@ -23,6 +23,8 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
int32_t server_test_psa_call_with_not_writable_outvec_base(void);
const server_test_t test_i054_server_tests_list[] = {
@@ -33,10 +35,50 @@
int32_t server_test_psa_call_with_not_writable_outvec_base(void)
{
- int32_t status = VAL_STATUS_SUCCESS;
psa_msg_t msg = {0};
psa_signal_t signals;
+wait:
+ signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+ if (signals & SERVER_UNSPECIFED_VERSION_SIGNAL)
+ {
+ if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+ {
+ goto wait;
+ }
+
+ if (msg.type == PSA_IPC_CALL)
+ {
+ /* Control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+ psa->reply(msg.handle, -2);
+ }
+ }
+ else
+ {
+ val->print(PRINT_ERROR, "\tpsa_wait returned with invalid signal value = 0x%x\n", signals);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_ERROR;
+}
+
+#else
+
+int32_t server_test_psa_call_with_not_writable_outvec_base(void);
+
+const server_test_t test_i054_server_tests_list[] = {
+ NULL,
+ server_test_psa_call_with_not_writable_outvec_base,
+ NULL,
+};
+
+int32_t server_test_psa_call_with_not_writable_outvec_base(void)
+{
+ psa_msg_t msg = {0};
+ psa_signal_t signals;
+
+ int32_t status = VAL_STATUS_SUCCESS;
status = val->process_connect_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
if (val->err_check_set(TEST_CHECKPOINT_NUM(201), status))
{
@@ -77,3 +119,5 @@
return VAL_STATUS_ERROR;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i055/test_i055.c b/api-tests/ff/ipc/test_i055/test_i055.c
index cbec364..2ed9a95 100644
--- a/api-tests/ff/ipc/test_i055/test_i055.c
+++ b/api-tests/ff/ipc/test_i055/test_i055.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
#include "test_i055.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i055_client_tests_list[] = {
+ NULL,
+ client_test_psa_read_with_invalid_buffer_addr,
+ NULL,
+};
+
+int32_t client_test_psa_read_with_invalid_buffer_addr(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ uint8_t data = 0x11;
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_read with invalid buffer addr\n", 0);
+
+ psa_invec invec[1] = { {&data, sizeof(data)} };
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, invec, 1, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i055_client_tests_list[] = {
NULL,
client_test_psa_read_with_invalid_buffer_addr,
@@ -48,7 +80,9 @@
return VAL_STATUS_INVALID_HANDLE;
}
+
psa_invec invec[1] = {{&data, sizeof(data)}};
+
status_of_call = psa->call(handle, PSA_IPC_CALL, invec, 1, NULL, 0);
/* Expectation is server test should hang and control shouldn't have come here */
@@ -57,6 +91,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i055/test_supp_i055.c b/api-tests/ff/ipc/test_i055/test_supp_i055.c
index 406f416..1aa23e9 100644
--- a/api-tests/ff/ipc/test_i055/test_supp_i055.c
+++ b/api-tests/ff/ipc/test_i055/test_supp_i055.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,110 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_read_with_invalid_buffer_addr(void);
+
+const server_test_t test_i055_server_tests_list[] = {
+ NULL,
+ server_test_psa_read_with_invalid_buffer_addr,
+ NULL,
+};
+
+int32_t server_test_psa_read_with_invalid_buffer_addr(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ void *buffer = NULL;
+ memory_desc_t *memory_desc;
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /*
+ * Selection of invalid buffer addr:
+ *
+ * if (ISOLATION_LEVEL > 1)
+ * buffer = driver_mmio_region_base;
+ * else
+ * buffer = NULL;
+ */
+
+ if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+ {
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ MEMORY_DRIVER_PARTITION_MMIO, 0),
+ (uint8_t **)&memory_desc,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+ return status;
+ }
+
+ buffer = (void *) memory_desc->start;
+ }
+
+ /* Serve psa_call */
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(204), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_read with invalid buffer addr, call should panic */
+ psa->read(msg.handle, 0, (void *)buffer, msg.in_size[0]);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_read with invalid buffer should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ psa->reply(msg.handle, -4);
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(205), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_read_with_invalid_buffer_addr(void);
const server_test_t test_i055_server_tests_list[] = {
@@ -135,3 +239,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i056/test_i056.c b/api-tests/ff/ipc/test_i056/test_i056.c
index 291e0d0..9871d65 100644
--- a/api-tests/ff/ipc/test_i056/test_i056.c
+++ b/api-tests/ff/ipc/test_i056/test_i056.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
#include "test_i056.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i056_client_tests_list[] = {
+ NULL,
+ client_test_psa_read_with_not_writable_buffer_addr,
+ NULL,
+};
+
+int32_t client_test_psa_read_with_not_writable_buffer_addr(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ uint8_t data = 0x11;
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_read with invalid buffer addr\n", 0);
+
+ psa_invec invec[1] = { {&data, sizeof(data)} };
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, invec, 1, NULL, 0);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i056_client_tests_list[] = {
NULL,
client_test_psa_read_with_not_writable_buffer_addr,
@@ -49,6 +81,7 @@
}
psa_invec invec[1] = {{&data, sizeof(data)}};
+
status_of_call = psa->call(handle, PSA_IPC_CALL, invec, 1, NULL, 0);
/* Expectation is server test should hang and control shouldn't have come here */
@@ -57,6 +90,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i056/test_supp_i056.c b/api-tests/ff/ipc/test_i056/test_supp_i056.c
index b0fd4a2..9791c60 100644
--- a/api-tests/ff/ipc/test_i056/test_supp_i056.c
+++ b/api-tests/ff/ipc/test_i056/test_supp_i056.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,88 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_read_with_not_writable_buffer_addr(void);
+
+const server_test_t test_i056_server_tests_list[] = {
+ NULL,
+ server_test_psa_read_with_not_writable_buffer_addr,
+ NULL,
+};
+
+int32_t server_test_psa_read_with_not_writable_buffer_addr(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ void *buffer = NULL;
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /* Set buffer to point to not writable location (Code memory) */
+ buffer = (void *) &server_test_psa_read_with_not_writable_buffer_addr;
+
+ /* Serve psa_call */
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_read with not writable buffer addr, call should panic */
+ psa->read(msg.handle, 0, (void *)buffer, msg.in_size[0]);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_read with not writable buffer should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ psa->reply(msg.handle, -4);
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(204), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_read_with_not_writable_buffer_addr(void);
const server_test_t test_i056_server_tests_list[] = {
@@ -89,7 +171,6 @@
}
else
{
-
/* Test check- psa_read with not writable buffer addr, call should panic */
psa->read(msg.handle, 0, (void *)buffer, msg.in_size[0]);
@@ -114,3 +195,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i057/test_i057.c b/api-tests/ff/ipc/test_i057/test_i057.c
index 95c265a..b092704 100644
--- a/api-tests/ff/ipc/test_i057/test_i057.c
+++ b/api-tests/ff/ipc/test_i057/test_i057.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
#include "test_i057.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i057_client_tests_list[] = {
+ NULL,
+ client_test_psa_write_with_invalid_buffer_addr,
+ NULL,
+};
+
+int32_t client_test_psa_write_with_invalid_buffer_addr(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ uint8_t data = 0x11;
+ psa_status_t status_of_call;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_write with invalid buffer addr\n", 0);
+
+ psa_outvec outvec[1] = { {&data, sizeof(data)} };
+
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1);
+
+ /* Expectation is server test should hang and control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ (void)(status_of_call);
+ return status;
+}
+
+#else
+
const client_test_t test_i057_client_tests_list[] = {
NULL,
client_test_psa_write_with_invalid_buffer_addr,
@@ -49,6 +81,7 @@
}
psa_outvec outvec[1] = {{&data, sizeof(data)}};
+
status_of_call = psa->call(handle, PSA_IPC_CALL, NULL, 0, outvec, 1);
/* Expectation is server test should hang and control shouldn't have come here */
@@ -57,6 +90,9 @@
status = VAL_STATUS_SPM_FAILED;
psa->close(handle);
+
(void)(status_of_call);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i057/test_supp_i057.c b/api-tests/ff/ipc/test_i057/test_supp_i057.c
index d00ed25..0eb5f70 100644
--- a/api-tests/ff/ipc/test_i057/test_supp_i057.c
+++ b/api-tests/ff/ipc/test_i057/test_supp_i057.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,110 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_write_with_invalid_buffer_addr(void);
+
+const server_test_t test_i057_server_tests_list[] = {
+ NULL,
+ server_test_psa_write_with_invalid_buffer_addr,
+ NULL,
+};
+
+int32_t server_test_psa_write_with_invalid_buffer_addr(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+ void *buffer = NULL;
+ memory_desc_t *memory_desc;
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /*
+ * Selection of invalid buffer addr:
+ *
+ * if (ISOLATION_LEVEL > 1)
+ * buffer = driver_mmio_region_base;
+ * else
+ * buffer = NULL;
+ */
+
+ if (PLATFORM_PSA_ISOLATION_LEVEL > LEVEL1)
+ {
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ MEMORY_DRIVER_PARTITION_MMIO, 0),
+ (uint8_t **)&memory_desc,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, PSA_ERROR_CONNECTION_REFUSED);
+ return status;
+ }
+
+ buffer = (void *) memory_desc->start;
+ }
+
+ /* Server psa_call */
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ psa->reply(msg.handle, -2);
+ }
+ else
+ {
+ /* Setting boot.state before test check */
+ status = val->set_boot_flag(BOOT_EXPECTED_NS);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(204), status))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ psa->reply(msg.handle, -3);
+ }
+ else
+ {
+ /* Test check- psa_write with invalid buffer addr, call should panic */
+ psa->write(msg.handle, 0, (void *)buffer, msg.out_size[0]);
+
+ /* shouldn't have reached here */
+ val->print(PRINT_ERROR,
+ "\tpsa_write with invalid buffer should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+ psa->reply(msg.handle, -4);
+ }
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(205), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_write_with_invalid_buffer_addr(void);
const server_test_t test_i057_server_tests_list[] = {
@@ -135,3 +239,5 @@
psa->reply(msg.handle, PSA_SUCCESS);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i058/test_i058.c b/api-tests/ff/ipc/test_i058/test_i058.c
index 6ffdd77..4277a1e 100644
--- a/api-tests/ff/ipc/test_i058/test_i058.c
+++ b/api-tests/ff/ipc/test_i058/test_i058.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,65 @@
#include "test_i058.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i058_client_tests_list[] = {
+ NULL,
+ client_test_psa_doorbell_signal,
+ NULL,
+};
+
+int32_t client_test_psa_doorbell_signal(caller_security_t caller __UNUSED)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+#ifndef NONSECURE_TEST_BUILD
+ psa_signal_t signals = 0;
+#endif
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test PSA_DOORBELL signal\n", 0);
+
+#ifndef NONSECURE_TEST_BUILD
+ /* Wait for doorball notification */
+ signals = psa_wait(PSA_DOORBELL, PSA_BLOCK);
+
+ /* Is this doorbell signal? */
+ if ((signals & PSA_DOORBELL) == 0)
+ {
+ status = VAL_STATUS_INVALID_HANDLE;
+ val->print(PRINT_ERROR, "\tpsa_wait didn't receive doorbell signal\n", 0);
+ }
+
+ /*
+ * Wait for doorball notification again to check -
+ * Doorbell should remain asserted until psa_clear is called.
+ */
+ signals = psa_wait(PSA_DOORBELL, PSA_BLOCK);
+
+ /* Is this doorbell signal? */
+ if ((signals & PSA_DOORBELL) == 0)
+ {
+ status = VAL_STATUS_INVALID_HANDLE;
+ val->print(PRINT_ERROR, "\tDoorbell signal cleared without calling psa_clear\n", 0);
+ }
+
+ /* Clear the doorbell signal */
+ psa_clear();
+
+ /* Is doorbell signal cleared? */
+ signals = psa_wait(PSA_DOORBELL, PSA_POLL);
+ if ((signals & PSA_DOORBELL) != 0)
+ {
+ status = VAL_STATUS_INVALID_HANDLE;
+ val->print(PRINT_ERROR, "\tpsa_clear didn't clear doorbell signal\n", 0);
+ }
+#endif
+
+ return status;
+}
+
+#else
+
const client_test_t test_i058_client_tests_list[] = {
NULL,
client_test_psa_doorbell_signal,
@@ -88,3 +147,5 @@
psa->close(handle);
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i058/test_supp_i058.c b/api-tests/ff/ipc/test_i058/test_supp_i058.c
index 21218b0..f84497d 100644
--- a/api-tests/ff/ipc/test_i058/test_supp_i058.c
+++ b/api-tests/ff/ipc/test_i058/test_supp_i058.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,38 @@
extern val_api_t *val;
extern psa_api_t *psa;
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_doorbell_signal(void);
+
+const server_test_t test_i058_server_tests_list[] = {
+ NULL,
+ server_test_psa_doorbell_signal,
+ NULL,
+};
+
+int32_t server_test_psa_doorbell_signal(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ if (msg.client_id > 0)
+ {
+ /* Doorbell signal to client partititon */
+ psa->notify(msg.client_id);
+ }
+ else
+ {
+ status = VAL_STATUS_SPM_FAILED;
+ val->print(PRINT_ERROR, "Caller is from non-secure\n", 0);
+ }
+
+ val->err_check_set(TEST_CHECKPOINT_NUM(202), status);
+ return status;
+}
+
+#else
+
int32_t server_test_psa_doorbell_signal(void);
const server_test_t test_i058_server_tests_list[] = {
@@ -66,3 +98,5 @@
return status;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i063/test_i063.c b/api-tests/ff/ipc/test_i063/test_i063.c
index 644aa65..4a03410 100644
--- a/api-tests/ff/ipc/test_i063/test_i063.c
+++ b/api-tests/ff/ipc/test_i063/test_i063.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,8 @@
#include "test_i063.h"
+#if STATELESS_ROT == 1
+
const client_test_t test_i063_client_tests_list[] = {
NULL,
client_test_psa_wait_signal_mask,
@@ -33,6 +35,24 @@
int32_t client_test_psa_wait_signal_mask(caller_security_t caller __UNUSED)
{
+
+
+ val->print(PRINT_TEST, "[Check 1] Test psa_wait signal mask\n", 0);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
+const client_test_t test_i063_client_tests_list[] = {
+ NULL,
+ client_test_psa_wait_signal_mask,
+ NULL,
+};
+
+int32_t client_test_psa_wait_signal_mask(caller_security_t caller __UNUSED)
+{
+
psa_handle_t handle = 0;
val->print(PRINT_TEST, "[Check 1] Test psa_wait signal mask\n", 0);
@@ -52,6 +72,7 @@
val->print(PRINT_ERROR, "psa_connect failed -2\n", 0);
return VAL_STATUS_INVALID_HANDLE;
}
-
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i064/test_i064.c b/api-tests/ff/ipc/test_i064/test_i064.c
index e627fc3..104a72e 100644
--- a/api-tests/ff/ipc/test_i064/test_i064.c
+++ b/api-tests/ff/ipc/test_i064/test_i064.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
#include "test_i064.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i064_client_tests_list[] = {
+ NULL,
+ client_test_psa_eoi_with_non_intr_signal,
+ NULL,
+};
+
+int32_t client_test_psa_eoi_with_non_intr_signal(caller_security_t caller __UNUSED)
+{
+ driver_test_fn_id_t driver_test_fn_id = TEST_PSA_EOI_WITH_NON_INTR_SIGNAL;
+
+ /*
+ * The interrupt related test check is captured in driver_partition.c as this is the
+ * only partition in test suite that holds the interrupt source. The interrupt test check
+ * is invoked by client by calling to DRIVER_TEST_SID RoT service of driver partition that
+ * hold the test check.
+ */
+
+ val->print(PRINT_TEST, "[Check 1] Test psa_eoi with non-interrupt signal\n", 0);
+
+ /* Execute driver function related to TEST_PSA_EOI_WITH_NON_INTR_SIGNAL */
+ psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
+ psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, &invec, 1, NULL, 0);
+
+ /* The expectation is that driver partition get panic and control never reaches here. */
+ return VAL_STATUS_SPM_FAILED;
+}
+
+#else
+
const client_test_t test_i064_client_tests_list[] = {
NULL,
client_test_psa_eoi_with_non_intr_signal,
@@ -45,6 +77,7 @@
val->print(PRINT_TEST, "[Check 1] Test psa_eoi with non-interrupt signal\n", 0);
+
/* Connect to DRIVER_TEST_SID */
handle = psa->connect(DRIVER_TEST_SID, DRIVER_TEST_VERSION);
if (!PSA_HANDLE_IS_VALID(handle))
@@ -55,6 +88,7 @@
/* Execute driver function related to TEST_PSA_EOI_WITH_NON_INTR_SIGNAL */
psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
psa->call(handle, PSA_IPC_CALL, &invec, 1, NULL, 0);
psa->close(handle);
@@ -62,3 +96,5 @@
/* The expectation is that driver partition get panic and control never reaches here. */
return VAL_STATUS_SPM_FAILED;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i065/test_i065.c b/api-tests/ff/ipc/test_i065/test_i065.c
index 518dce4..6f0434e 100644
--- a/api-tests/ff/ipc/test_i065/test_i065.c
+++ b/api-tests/ff/ipc/test_i065/test_i065.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
#include "test_i065.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i065_client_tests_list[] = {
+ NULL,
+ client_test_psa_eoi_with_unasserted_signal,
+ NULL,
+};
+
+int32_t client_test_psa_eoi_with_unasserted_signal(caller_security_t caller __UNUSED)
+{
+ driver_test_fn_id_t driver_test_fn_id = TEST_PSA_EOI_WITH_UNASSERTED_SIGNAL;
+
+ /*
+ * The interrupt related test check is captured in driver_partition.c as this is the
+ * only partition in test suite that holds the interrupt source. The interrupt test check
+ * is invoked by client by calling to DRIVER_TEST_SID RoT service of driver partition that
+ * hold the test check.
+ */
+
+ val->print(PRINT_TEST, "[Check 1] Test psa_eoi with multiple signal\n", 0);
+
+ /* Execute driver function related to TEST_PSA_EOI_WITH_UNASSERTED_SIGNAL */
+ psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
+ psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, &invec, 1, NULL, 0);
+
+ /* The expectation is that driver partition get panic and control never reaches here. */
+ return VAL_STATUS_SPM_FAILED;
+}
+
+#else
+
const client_test_t test_i065_client_tests_list[] = {
NULL,
client_test_psa_eoi_with_unasserted_signal,
@@ -55,6 +87,7 @@
/* Execute driver function related to TEST_PSA_EOI_WITH_UNASSERTED_SIGNAL */
psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
psa->call(handle, PSA_IPC_CALL, &invec, 1, NULL, 0);
psa->close(handle);
@@ -62,3 +95,5 @@
/* The expectation is that driver partition get panic and control never reaches here. */
return VAL_STATUS_SPM_FAILED;
}
+
+ #endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i066/test_i066.c b/api-tests/ff/ipc/test_i066/test_i066.c
index dc602ba..ddfa6b3 100644
--- a/api-tests/ff/ipc/test_i066/test_i066.c
+++ b/api-tests/ff/ipc/test_i066/test_i066.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,38 @@
#include "test_i066.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i066_client_tests_list[] = {
+ NULL,
+ client_test_psa_eoi_with_multiple_signals,
+ NULL,
+};
+
+int32_t client_test_psa_eoi_with_multiple_signals(caller_security_t caller __UNUSED)
+{
+ driver_test_fn_id_t driver_test_fn_id = TEST_PSA_EOI_WITH_MULTIPLE_SIGNALS;
+
+ /*
+ * The interrupt related test check is captured in driver_partition.c as this is the
+ * only partition in test suite that holds the interrupt source. The interrupt test check
+ * is invoked by client by calling to DRIVER_TEST_SID RoT service of driver partition that
+ * hold the test check.
+ */
+
+ val->print(PRINT_TEST, "[Check 1] Test psa_eoi with multiple signals\n", 0);
+
+ /* Execute driver function related to TEST_PSA_EOI_WITH_MULTIPLE_SIGNALS */
+ psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
+ psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, &invec, 1, NULL, 0);
+
+ /* The expectation is that driver partition get panic and control never reaches here. */
+ return VAL_STATUS_SPM_FAILED;
+}
+
+#else
+
const client_test_t test_i066_client_tests_list[] = {
NULL,
client_test_psa_eoi_with_multiple_signals,
@@ -55,6 +87,7 @@
/* Execute driver function related to TEST_PSA_EOI_WITH_MULTIPLE_SIGNALS */
psa_invec invec = {&driver_test_fn_id, sizeof(driver_test_fn_id)};
+
psa->call(handle, PSA_IPC_CALL, &invec, 1, NULL, 0);
psa->close(handle);
@@ -62,3 +95,5 @@
/* The expectation is that driver partition get panic and control never reaches here. */
return VAL_STATUS_SPM_FAILED;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i072/test_i072.c b/api-tests/ff/ipc/test_i072/test_i072.c
index ec77eb0..9f09884 100644
--- a/api-tests/ff/ipc/test_i072/test_i072.c
+++ b/api-tests/ff/ipc/test_i072/test_i072.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,95 @@
#include "test_i072.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i072_client_tests_list[] = {
+ NULL,
+ client_test_nspe_read_app_rot_variable,
+ client_test_nspe_write_app_rot_variable,
+ NULL,
+};
+
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_app_rot_variable(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint32_t data = 0x1234;
+
+ val->print(PRINT_TEST, "[Check 1] Test NSPE reading APP-RoT data\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read Application RoT global variable address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint32_t *)app_rot_addr;
+
+ /* Did read ignore? */
+ if (data == 0x1234)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_app_rot_variable(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint32_t data = 0x1234;
+
+ val->print(PRINT_TEST, "[Check 2] Test NSPE writing APP-RoT data\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_NS))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Write Application RoT global variable address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint32_t *)app_rot_addr = (uint32_t)data;
+
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const client_test_t test_i072_client_tests_list[] = {
NULL,
client_test_nspe_read_app_rot_variable,
@@ -54,6 +143,7 @@
val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
psa->close(handle);
+
return VAL_STATUS_SUCCESS;
}
@@ -123,5 +213,8 @@
val->print(PRINT_ERROR, "\tExpected connection to fail but succeed\n", 0);
return VAL_STATUS_INVALID_HANDLE;
}
+
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i072/test_supp_i072.c b/api-tests/ff/ipc/test_i072/test_supp_i072.c
index 636f477..665ee31 100644
--- a/api-tests/ff/ipc/test_i072/test_supp_i072.c
+++ b/api-tests/ff/ipc/test_i072/test_supp_i072.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -31,6 +31,68 @@
/* Application RoT data region */
volatile uint32_t g_test_i072 = DATA_VALUE;
+#if STATELESS_ROT == 1
+
+const server_test_t test_i072_server_tests_list[] = {
+ NULL,
+ server_test_nspe_read_app_rot_variable,
+ server_test_nspe_write_app_rot_variable,
+ NULL,
+};
+
+static int32_t send_secure_partition_address(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ volatile uint32_t *addr = &g_test_i072;
+ psa_msg_t msg = {0};
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ return status;
+ }
+
+ val->print(PRINT_DEBUG, "\tAPP-ROT: Passing 0x%x to NSPE\n", (int)&g_test_i072);
+
+ /* Send Application RoT data address - global variable */
+ psa->write(msg.handle, 0, (void *)&addr, sizeof(addr));
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_nspe_read_app_rot_variable(void)
+{
+ return send_secure_partition_address();
+}
+
+int32_t server_test_nspe_write_app_rot_variable(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+
+ status = send_secure_partition_address();
+ if (VAL_ERROR(status))
+ return status;
+
+ /* Reached here means there could be write succeed or ignored */
+ if (g_test_i072 == DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const server_test_t test_i072_server_tests_list[] = {
NULL,
server_test_nspe_read_app_rot_variable,
@@ -72,6 +134,7 @@
return status;
}
psa->reply(msg.handle, PSA_SUCCESS);
+
return VAL_STATUS_SUCCESS;
}
@@ -114,3 +177,5 @@
}
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i073/test_i073.c b/api-tests/ff/ipc/test_i073/test_i073.c
index 99e6448..b3891b5 100644
--- a/api-tests/ff/ipc/test_i073/test_i073.c
+++ b/api-tests/ff/ipc/test_i073/test_i073.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,95 @@
#include "test_i073.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i073_client_tests_list[] = {
+ NULL,
+ client_test_nspe_read_app_rot_stack,
+ client_test_nspe_write_app_rot_stack,
+ NULL,
+};
+
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+ /* Get App-RoT address */
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_app_rot_stack(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint32_t data = 0x1234;
+
+ val->print(PRINT_TEST, "[Check 1] Test NSPE reading APP-RoT stack\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read Application RoT stack address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint32_t *)app_rot_addr;
+
+ /* Did read ignore? */
+ if (data == 0x1234)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_app_rot_stack(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint32_t data = 0x1234;
+
+ val->print(PRINT_TEST, "[Check 2] Test NSPE writing APP-RoT stack\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_NS))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Write Application RoT stack address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint32_t *)app_rot_addr = (uint32_t)data;
+
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const client_test_t test_i073_client_tests_list[] = {
NULL,
client_test_nspe_read_app_rot_stack,
@@ -54,6 +143,7 @@
val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
psa->close(handle);
+
return VAL_STATUS_SUCCESS;
}
@@ -123,5 +213,8 @@
val->print(PRINT_ERROR, "\tExpected connection to fail but succeed\n", 0);
return VAL_STATUS_INVALID_HANDLE;
}
+
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i073/test_supp_i073.c b/api-tests/ff/ipc/test_i073/test_supp_i073.c
index 0a0900d..28b0fcf 100644
--- a/api-tests/ff/ipc/test_i073/test_supp_i073.c
+++ b/api-tests/ff/ipc/test_i073/test_supp_i073.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,6 +28,76 @@
#define DATA_VALUE 0x5467
+#if STATELESS_ROT == 1
+
+const server_test_t test_i073_server_tests_list[] = {
+ NULL,
+ server_test_nspe_read_app_rot_stack,
+ server_test_nspe_write_app_rot_stack,
+ NULL,
+};
+
+static int32_t send_secure_partition_address(addr_t *stack)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ return status;
+ }
+
+ val->print(PRINT_DEBUG, "\tAPP-ROT: Passing 0x%x to NSPE\n", (int)stack);
+
+ /* Send Application RoT stack address */
+ psa->write(msg.handle, 0, (void *)&stack, sizeof(uint32_t));
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_nspe_read_app_rot_stack(void)
+{
+ /* Application RoT stack - local variable */
+ uint32_t l_test_i073 = DATA_VALUE;
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ status = send_secure_partition_address(&l_test_i073);
+
+ /* Dummy print to avoid compiler optimisation on local variable */
+ val->print(PRINT_INFO, "\tStack data 0x%x\n", l_test_i073);
+ return status;
+}
+
+int32_t server_test_nspe_write_app_rot_stack(void)
+{
+ /* Application RoT stack - local variable */
+ uint32_t l_test_i073 = DATA_VALUE;
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ status = send_secure_partition_address(&l_test_i073);
+ if (VAL_ERROR(status))
+ return status;
+
+ /* Reached here means there could be write succeed or ignored */
+ if (l_test_i073 == DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const server_test_t test_i073_server_tests_list[] = {
NULL,
server_test_nspe_read_app_rot_stack,
@@ -68,6 +138,7 @@
return status;
}
psa->reply(msg.handle, PSA_SUCCESS);
+
return VAL_STATUS_SUCCESS;
}
@@ -120,3 +191,5 @@
}
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i074/test_i074.c b/api-tests/ff/ipc/test_i074/test_i074.c
index 85bbdbb..6042bb6 100644
--- a/api-tests/ff/ipc/test_i074/test_i074.c
+++ b/api-tests/ff/ipc/test_i074/test_i074.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,6 +29,112 @@
#define DATA_VALUE 0x12
#define BUFFER_SIZE 0x4
+#if STATELESS_ROT == 1
+
+const client_test_t test_i074_client_tests_list[] = {
+ NULL,
+ client_test_nspe_read_app_rot_heap,
+ client_test_nspe_write_app_rot_heap,
+ NULL,
+};
+
+#ifdef SP_HEAP_MEM_SUPP
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+
+ /* Get App-RoT address */
+ psa_outvec outvec[1] = { {addr, BUFFER_SIZE} };
+ if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_app_rot_heap(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint8_t data = DATA_VALUE;
+
+ val->print(PRINT_TEST, "[Check 1] Test NSPE reading APP-RoT heap\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read Application RoT heap address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint8_t *)app_rot_addr;
+
+ /* Did read ignore? */
+ if (data == DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_app_rot_heap(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint8_t data = DATA_VALUE;
+
+ val->print(PRINT_TEST, "[Check 2] Test NSPE writing APP-RoT heap\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_NS))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Write Application RoT heap address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint8_t *)app_rot_addr = (uint8_t)data;
+
+ return VAL_STATUS_SUCCESS;
+}
+#else
+int32_t client_test_nspe_read_app_rot_heap(caller_security_t caller __UNUSED)
+{
+ val->print(PRINT_TEST, "[Check 1] Test NSPE reading APP-RoT heap\n", 0);
+ val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+ return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+
+int32_t client_test_nspe_write_app_rot_heap(caller_security_t caller __UNUSED)
+{
+ val->print(PRINT_TEST, "[Check 2] Test NSPE writing APP-RoT heap\n", 0);
+ val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+ return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+#endif
+
+#else
+
const client_test_t test_i074_client_tests_list[] = {
NULL,
client_test_nspe_read_app_rot_heap,
@@ -59,6 +165,7 @@
val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
psa->close(handle);
+
return VAL_STATUS_SUCCESS;
}
@@ -128,6 +235,7 @@
val->print(PRINT_ERROR, "\tExpected connection to fail but succeed\n", 0);
return VAL_STATUS_INVALID_HANDLE;
}
+
return VAL_STATUS_SUCCESS;
}
#else
@@ -145,3 +253,5 @@
return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
}
#endif
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i074/test_supp_i074.c b/api-tests/ff/ipc/test_i074/test_supp_i074.c
index d5c84bf..c296a6b 100644
--- a/api-tests/ff/ipc/test_i074/test_supp_i074.c
+++ b/api-tests/ff/ipc/test_i074/test_supp_i074.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,6 +34,97 @@
#define DATA_VALUE_ORG 0x11
#define BUFFER_SIZE 0x4
+#if STATELESS_ROT == 1
+
+const server_test_t test_i074_server_tests_list[] = {
+ NULL,
+ server_test_nspe_read_app_rot_heap,
+ server_test_nspe_write_app_rot_heap,
+ NULL,
+};
+
+#ifdef SP_HEAP_MEM_SUPP
+static int32_t send_secure_partition_address(uint8_t *heap)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ return status;
+ }
+
+ val->print(PRINT_DEBUG, "\tAPP-ROT: Passing 0x%x to NSPE\n", (int)heap);
+
+ /* Send Application RoT heap address */
+ psa->write(msg.handle, 0, (void *)&heap, sizeof(BUFFER_SIZE));
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_nspe_read_app_rot_heap(void)
+{
+ /* Application RoT heap buffer */
+ uint8_t *buffer;
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ buffer = (uint8_t *)malloc(sizeof(uint8_t) * BUFFER_SIZE);
+ memset((uint8_t *)buffer, DATA_VALUE_ORG, BUFFER_SIZE);
+
+ status = send_secure_partition_address(buffer);
+ free(buffer);
+
+ return status;
+}
+
+int32_t server_test_nspe_write_app_rot_heap(void)
+{
+ /* Application RoT heap buffer */
+ uint8_t *buffer;
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ buffer = (uint8_t *)malloc(sizeof(uint8_t) * BUFFER_SIZE);
+ memset((uint8_t *)buffer, DATA_VALUE_ORG, BUFFER_SIZE);
+
+ status = send_secure_partition_address(buffer);
+ if (VAL_ERROR(status))
+ return status;
+
+ /* Reached here means there could be write succeed or ignored */
+ if (buffer[0] == DATA_VALUE_ORG)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ free(buffer);
+ return VAL_STATUS_SUCCESS;
+}
+#else
+
+int32_t server_test_nspe_read_app_rot_heap(void)
+{
+ return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+
+int32_t server_test_nspe_write_app_rot_heap(void)
+{
+ return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+#endif
+
+#else
+
const server_test_t test_i074_server_tests_list[] = {
NULL,
server_test_nspe_read_app_rot_heap,
@@ -75,6 +166,7 @@
return status;
}
psa->reply(msg.handle, PSA_SUCCESS);
+
return VAL_STATUS_SUCCESS;
}
@@ -146,3 +238,5 @@
return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
}
#endif
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i075/test_i075.c b/api-tests/ff/ipc/test_i075/test_i075.c
index fc5dcce..5c7f4d0 100644
--- a/api-tests/ff/ipc/test_i075/test_i075.c
+++ b/api-tests/ff/ipc/test_i075/test_i075.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,93 @@
#define DATA_VALUE 0x1234
+#if STATELESS_ROT == 1
+
+const client_test_t test_i075_client_tests_list[] = {
+ NULL,
+ client_test_nspe_read_app_rot_mmio,
+ client_test_nspe_write_app_rot_mmio,
+ NULL,
+};
+
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_app_rot_mmio(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint32_t data = DATA_VALUE;
+
+ val->print(PRINT_TEST, "[Check 1] Test NSPE reading APP-RoT mmio\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read Application RoT mmio address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint32_t *)app_rot_addr;
+
+ /* Did read ignore? */
+ if (data == DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_app_rot_mmio(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint32_t data = DATA_VALUE;
+
+ val->print(PRINT_TEST, "[Check 2] Test NSPE writing APP-RoT mmio\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_NS))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Write Application RoT mmio address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint32_t *)app_rot_addr = (uint32_t)data;
+
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const client_test_t test_i075_client_tests_list[] = {
NULL,
client_test_nspe_read_app_rot_mmio,
@@ -56,6 +143,7 @@
val->print(PRINT_DEBUG, "\tNSPE: Accessing address 0x%x\n", *addr);
psa->close(handle);
+
return VAL_STATUS_SUCCESS;
}
@@ -125,5 +213,8 @@
val->print(PRINT_ERROR, "\tExpected connection to fail but succeed\n", 0);
return VAL_STATUS_INVALID_HANDLE;
}
+
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i075/test_supp_i075.c b/api-tests/ff/ipc/test_i075/test_supp_i075.c
index 8b094d5..3f56a5a 100644
--- a/api-tests/ff/ipc/test_i075/test_supp_i075.c
+++ b/api-tests/ff/ipc/test_i075/test_supp_i075.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,6 +28,103 @@
#define DATA_VALUE 0x5467
+#if STATELESS_ROT == 1
+
+const server_test_t test_i075_server_tests_list[] = {
+ NULL,
+ server_test_nspe_read_app_rot_mmio,
+ server_test_nspe_write_app_rot_mmio,
+ NULL,
+};
+
+static int32_t get_mmio_addr(addr_t *addr)
+{
+ memory_desc_t *memory_desc;
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ /* Get APP-ROT MMIO address */
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ MEMORY_SERVER_PARTITION_MMIO, 0),
+ (uint8_t **)&memory_desc,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(201), status))
+ {
+ return status;
+ }
+
+ *addr = memory_desc->start;
+ return VAL_STATUS_SUCCESS;
+}
+
+static int32_t send_secure_partition_address(addr_t *addr)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ psa->reply(msg.handle, -2);
+ return status;
+ }
+
+ val->print(PRINT_DEBUG, "\tAPP-ROT: Passing 0x%x to NSPE\n", (int)*addr);
+
+ /* Send Application RoT mmio address */
+ psa->write(msg.handle, 0, (void *)addr, sizeof(uint32_t));
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_nspe_read_app_rot_mmio(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ addr_t app_rot_addr;
+
+ status = get_mmio_addr(&app_rot_addr);
+ if (VAL_ERROR(status))
+ return status;
+
+ /* Initialise mmio address */
+ *(uint32_t *)app_rot_addr = (uint32_t)DATA_VALUE;
+
+ return send_secure_partition_address(&app_rot_addr);
+}
+
+int32_t server_test_nspe_write_app_rot_mmio(void)
+{
+ addr_t app_rot_addr;
+ int32_t status = VAL_STATUS_SUCCESS;
+
+
+ status = get_mmio_addr(&app_rot_addr);
+ if (VAL_ERROR(status))
+ return status;
+
+ /* Initialise mmio address */
+ *(uint32_t *)app_rot_addr = (uint32_t)DATA_VALUE;
+ status = send_secure_partition_address(&app_rot_addr);
+ if (VAL_ERROR(status))
+ return status;
+
+ /* Reached here means there could be write succeed or ignored */
+ if (*(uint32_t *)app_rot_addr == (uint32_t)DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const server_test_t test_i075_server_tests_list[] = {
NULL,
server_test_nspe_read_app_rot_mmio,
@@ -146,3 +243,5 @@
}
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i076/test_i076.c b/api-tests/ff/ipc/test_i076/test_i076.c
index 485c451..b4e9a0a 100644
--- a/api-tests/ff/ipc/test_i076/test_i076.c
+++ b/api-tests/ff/ipc/test_i076/test_i076.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,8 @@
#define DATA_VALUE1 0x1234
+#if STATELESS_ROT == 1
+
const client_test_t test_i076_client_tests_list[] = {
NULL,
client_test_nspe_read_psa_rot_variable,
@@ -34,7 +36,107 @@
NULL,
};
-static int32_t get_secure_partition_address(psa_handle_t *handle,
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
+ addr_t *addr,
+ driver_test_fn_id_t test_fn_id)
+{
+ psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+ if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+ {
+ return VAL_STATUS_CALL_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_psa_rot_variable(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint32_t data = DATA_VALUE1;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 1] Test NSPE reading PSA-RoT data\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_DATA_RD)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read PSA RoT global variable address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint32_t *)psa_rot_addr;
+
+ /* Did read ignore? */
+ if (data == DATA_VALUE1)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_psa_rot_variable(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint32_t data = DATA_VALUE1;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 2] Test NSPE writing PSA-RoT data\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_DATA_WR)))
+ return VAL_STATUS_ERROR;
+
+ /* Write PSA RoT global variable address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint32_t *)psa_rot_addr = (uint32_t)data;
+
+ /* Handshake with driver to decide write status */
+ if (VAL_ERROR(get_driver_status(&handle)))
+ {
+ return VAL_STATUS_DRIVER_FN_FAILED;
+ }
+
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
+const client_test_t test_i076_client_tests_list[] = {
+ NULL,
+ client_test_nspe_read_psa_rot_variable,
+ client_test_nspe_write_psa_rot_variable,
+ NULL,
+};
+
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
addr_t *addr,
driver_test_fn_id_t test_fn_id)
{
@@ -53,7 +155,6 @@
val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
return VAL_STATUS_CALL_FAILED;
}
-
return VAL_STATUS_SUCCESS;
}
@@ -140,5 +241,8 @@
}
close_driver_fn(&handle);
+
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i077/test_i077.c b/api-tests/ff/ipc/test_i077/test_i077.c
index 42f204b..10837f3 100644
--- a/api-tests/ff/ipc/test_i077/test_i077.c
+++ b/api-tests/ff/ipc/test_i077/test_i077.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,8 @@
#define DATA_VALUE1 0x1234
+#if STATELESS_ROT == 1
+
const client_test_t test_i077_client_tests_list[] = {
NULL,
client_test_nspe_read_psa_rot_stack,
@@ -34,7 +36,110 @@
NULL,
};
-static int32_t get_secure_partition_address(psa_handle_t *handle,
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
+ addr_t *addr,
+ driver_test_fn_id_t test_fn_id)
+{
+ /* Execute driver function related to TEST_ISOLATION_PSA_ROT_DATA_RD */
+ psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ return VAL_STATUS_SUCCESS;
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+ if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+ {
+ return VAL_STATUS_CALL_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_psa_rot_stack(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint32_t data = DATA_VALUE1;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 1] Test NSPE reading PSA-RoT stack\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_STACK_RD)))
+ return VAL_STATUS_ERROR;
+
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read PSA RoT stack address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint32_t *)psa_rot_addr;
+
+ /* Did read ignore? */
+ if (data == DATA_VALUE1)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_psa_rot_stack(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint32_t data = DATA_VALUE1;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 2] Test NSPE writing PSA-RoT stack\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_STACK_WR)))
+ return VAL_STATUS_ERROR;
+
+ /* Write PSA RoT stack address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint32_t *)psa_rot_addr = (uint32_t)data;
+
+ /* Handshake with driver to decide write status */
+ if (VAL_ERROR(get_driver_status(&handle)))
+ {
+ return VAL_STATUS_DRIVER_FN_FAILED;
+ }
+
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
+const client_test_t test_i077_client_tests_list[] = {
+ NULL,
+ client_test_nspe_read_psa_rot_stack,
+ client_test_nspe_write_psa_rot_stack,
+ NULL,
+};
+
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
addr_t *addr,
driver_test_fn_id_t test_fn_id)
{
@@ -55,6 +160,7 @@
}
return VAL_STATUS_SUCCESS;
+
}
static int32_t get_driver_status(psa_handle_t *handle)
@@ -71,7 +177,6 @@
psa->close(*handle);
}
-
int32_t client_test_nspe_read_psa_rot_stack(caller_security_t caller __UNUSED)
{
addr_t psa_rot_addr;
@@ -141,5 +246,8 @@
}
close_driver_fn(&handle);
+
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i078/test_i078.c b/api-tests/ff/ipc/test_i078/test_i078.c
index 2e257d9..595a2a5 100644
--- a/api-tests/ff/ipc/test_i078/test_i078.c
+++ b/api-tests/ff/ipc/test_i078/test_i078.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,6 +29,129 @@
#define DATA_VALUE 0x12
#define BUFFER_SIZE 0x4
+#if STATELESS_ROT == 1
+
+const client_test_t test_i078_client_tests_list[] = {
+ NULL,
+ client_test_nspe_read_psa_rot_heap,
+ client_test_nspe_write_psa_rot_heap,
+ NULL,
+};
+
+#ifdef SP_HEAP_MEM_SUPP
+static int32_t get_secure_partition_address(psa_handle_t *handle,
+ addr_t *addr,
+ driver_test_fn_id_t test_fn_id)
+{
+ /* Execute driver function related to TEST_ISOLATION_PSA_ROT_DATA_RD */
+ psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ return VAL_STATUS_SUCCESS;
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+ if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+ {
+ return VAL_STATUS_CALL_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+
+int32_t client_test_nspe_read_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint8_t data = DATA_VALUE;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 1] Test NSPE reading PSA-RoT heap\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_HEAP_RD)))
+ return VAL_STATUS_ERROR;
+
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read PSA RoT heap address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint8_t *)psa_rot_addr;
+
+ /* Did read ignore? */
+ if (data == DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint8_t data = DATA_VALUE;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 2] Test NSPE writing PSA-RoT heap\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_HEAP_WR)))
+ return VAL_STATUS_ERROR;
+
+ /* Write PSA RoT heap address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint8_t *)psa_rot_addr = (uint8_t)data;
+
+ /* Handshake with driver to decide write status */
+ if (VAL_ERROR(get_driver_status(&handle)))
+ {
+ return VAL_STATUS_DRIVER_FN_FAILED;
+ }
+
+ return VAL_STATUS_SUCCESS;
+}
+#else
+int32_t client_test_nspe_read_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+ val->print(PRINT_TEST, "[Check 1] Test NSPE reading PSA-RoT heap\n", 0);
+ val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+ return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+
+int32_t client_test_nspe_write_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+ val->print(PRINT_TEST, "[Check 2] Test NSPE writing PSA-RoT heap\n", 0);
+ val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+ return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+#endif
+
+
+#else
+
const client_test_t test_i078_client_tests_list[] = {
NULL,
client_test_nspe_read_psa_rot_heap,
@@ -143,6 +266,7 @@
}
close_driver_fn(&handle);
+
return VAL_STATUS_SUCCESS;
}
#else
@@ -160,3 +284,6 @@
return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
}
#endif
+
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i079/test_i079.c b/api-tests/ff/ipc/test_i079/test_i079.c
index 995e850..d98f946 100644
--- a/api-tests/ff/ipc/test_i079/test_i079.c
+++ b/api-tests/ff/ipc/test_i079/test_i079.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,110 @@
#define DATA_VALUE 0x1234
+#if STATELESS_ROT == 1
+
+const client_test_t test_i079_client_tests_list[] = {
+ NULL,
+ client_test_nspe_read_psa_rot_mmio,
+ client_test_nspe_write_psa_rot_mmio,
+ NULL,
+};
+
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
+ addr_t *addr,
+ driver_test_fn_id_t test_fn_id)
+{
+ /* Execute driver function related to TEST_ISOLATION_PSA_ROT_DATA_RD */
+ psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ return VAL_STATUS_SUCCESS;
+
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+ if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+ {
+ return VAL_STATUS_CALL_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_nspe_read_psa_rot_mmio(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint32_t data = DATA_VALUE;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 1] Test NSPE reading PSA-RoT mmio\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_MMIO_RD)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read PSA RoT mmio address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint32_t *)psa_rot_addr;
+
+ /* Did read ignore? */
+ if (data == DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_nspe_write_psa_rot_mmio(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint32_t data = DATA_VALUE;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 2] Test NSPE writing PSA-RoT mmio\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_MMIO_WR)))
+ return VAL_STATUS_ERROR;
+
+ /* Write PSA RoT mmio address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint32_t *)psa_rot_addr = (uint32_t)data;
+
+ /* Handshake with driver to decide write status */
+ if (VAL_ERROR(get_driver_status(&handle)))
+ {
+ return VAL_STATUS_DRIVER_FN_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const client_test_t test_i079_client_tests_list[] = {
NULL,
client_test_nspe_read_psa_rot_mmio,
@@ -83,9 +187,7 @@
&psa_rot_addr,
TEST_ISOLATION_PSA_ROT_MMIO_RD)))
return VAL_STATUS_ERROR;
-
close_driver_fn(&handle);
-
/* Setting boot.state before test check */
if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
{
@@ -138,7 +240,8 @@
close_driver_fn(&handle);
return VAL_STATUS_DRIVER_FN_FAILED;
}
-
close_driver_fn(&handle);
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i080/test_i080.c b/api-tests/ff/ipc/test_i080/test_i080.c
index 1fd25f6..abce5b0 100644
--- a/api-tests/ff/ipc/test_i080/test_i080.c
+++ b/api-tests/ff/ipc/test_i080/test_i080.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,109 @@
#define DATA_VALUE1 0x1234
+#if STATELESS_ROT == 1
+
+const client_test_t test_i080_client_tests_list[] = {
+ NULL,
+ client_test_app_rot_read_psa_rot_variable,
+ client_test_app_rot_write_psa_rot_variable,
+ NULL,
+};
+
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
+ addr_t *addr,
+ driver_test_fn_id_t test_fn_id)
+{
+ /* Execute driver function related to TEST_ISOLATION_PSA_ROT_* */
+ psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ return VAL_STATUS_SUCCESS;
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+ if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+ {
+ return VAL_STATUS_CALL_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_app_rot_read_psa_rot_variable(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint32_t data = DATA_VALUE1;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 1] Test APP-RoT reading PSA-RoT data\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_DATA_RD)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read PSA RoT global variable address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint32_t *)psa_rot_addr;
+
+ /* Did read ignore? */
+ if (data == DATA_VALUE1)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_app_rot_write_psa_rot_variable(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint32_t data = DATA_VALUE1;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 2] Test APP-RoT writing PSA-RoT data\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_DATA_WR)))
+ return VAL_STATUS_ERROR;
+
+ /* Write PSA RoT global variable address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint32_t *)psa_rot_addr = (uint32_t)data;
+
+ /* Handshake with driver to decide write status */
+ if (VAL_ERROR(get_driver_status(&handle)))
+ {
+ return VAL_STATUS_DRIVER_FN_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const client_test_t test_i080_client_tests_list[] = {
NULL,
client_test_app_rot_read_psa_rot_variable,
@@ -138,7 +241,8 @@
close_driver_fn(&handle);
return VAL_STATUS_DRIVER_FN_FAILED;
}
-
close_driver_fn(&handle);
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i081/test_i081.c b/api-tests/ff/ipc/test_i081/test_i081.c
index 5f12593..3e53183 100644
--- a/api-tests/ff/ipc/test_i081/test_i081.c
+++ b/api-tests/ff/ipc/test_i081/test_i081.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,111 @@
#define DATA_VALUE1 0x1234
+#if STATELESS_ROT == 1
+
+const client_test_t test_i081_client_tests_list[] = {
+ NULL,
+ client_test_app_rot_read_psa_rot_stack,
+ client_test_app_rot_write_psa_rot_stack,
+ NULL,
+};
+
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
+ addr_t *addr,
+ driver_test_fn_id_t test_fn_id)
+{
+ /* Execute driver function related to TEST_ISOLATION_PSA_ROT_DATA_RD */
+ psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ return VAL_STATUS_SUCCESS;
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+ if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+ {
+ return VAL_STATUS_CALL_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_app_rot_read_psa_rot_stack(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint32_t data = DATA_VALUE1;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 1] Test APP-RoT reading PSA-RoT stack\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_STACK_RD)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read PSA RoT stack address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint32_t *)psa_rot_addr;
+
+ /* Did read ignore? */
+ if (data == DATA_VALUE1)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_app_rot_write_psa_rot_stack(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint32_t data = DATA_VALUE1;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 2] Test APP-RoT writing PSA-RoT stack\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_STACK_WR)))
+ return VAL_STATUS_ERROR;
+
+ /* Write PSA RoT stack address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint32_t *)psa_rot_addr = (uint32_t)data;
+
+ /* Handshake with driver to decide write status */
+ if (VAL_ERROR(get_driver_status(&handle)))
+ {
+ return VAL_STATUS_DRIVER_FN_FAILED;
+ }
+
+
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const client_test_t test_i081_client_tests_list[] = {
NULL,
client_test_app_rot_read_psa_rot_stack,
@@ -141,5 +246,8 @@
}
close_driver_fn(&handle);
+
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i082/test_i082.c b/api-tests/ff/ipc/test_i082/test_i082.c
index 6e56975..e6651cc 100644
--- a/api-tests/ff/ipc/test_i082/test_i082.c
+++ b/api-tests/ff/ipc/test_i082/test_i082.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,6 +29,125 @@
#define DATA_VALUE 0x12
#define BUFFER_SIZE 0x4
+#if STATELESS_ROT == 1
+
+const client_test_t test_i082_client_tests_list[] = {
+ NULL,
+ client_test_app_rot_read_psa_rot_heap,
+ client_test_app_rot_write_psa_rot_heap,
+ NULL,
+};
+
+#ifdef SP_HEAP_MEM_SUPP
+static int32_t get_secure_partition_address(psa_handle_t *handle,
+ addr_t *addr,
+ driver_test_fn_id_t test_fn_id)
+{
+ /* Execute driver function related to TEST_ISOLATION_PSA_ROT_DATA_RD */
+ psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ return VAL_STATUS_SUCCESS;
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+ if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+ {
+ return VAL_STATUS_CALL_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_app_rot_read_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint8_t data = DATA_VALUE;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 1] Test APP-RoT reading PSA-RoT heap\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_HEAP_RD)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read PSA RoT heap address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint8_t *)psa_rot_addr;
+
+ /* Did read ignore? */
+ if (data == DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_app_rot_write_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint8_t data = DATA_VALUE;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 2] Test APP-RoT writing PSA-RoT heap\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_HEAP_WR)))
+ return VAL_STATUS_ERROR;
+
+ /* Write PSA RoT heap address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint8_t *)psa_rot_addr = (uint8_t)data;
+
+ /* Handshake with driver to decide write status */
+ if (VAL_ERROR(get_driver_status(&handle)))
+ {
+ return VAL_STATUS_DRIVER_FN_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+#else
+int32_t client_test_app_rot_read_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+ val->print(PRINT_TEST, "[Check 1] Test APP-RoT reading PSA-RoT heap\n", 0);
+ val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+ return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+
+int32_t client_test_app_rot_write_psa_rot_heap(caller_security_t caller __UNUSED)
+{
+ val->print(PRINT_TEST, "[Check 2] Test APP-RoT writing PSA-RoT heap\n", 0);
+ val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+ return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+#endif
+
+#else
+
const client_test_t test_i082_client_tests_list[] = {
NULL,
client_test_app_rot_read_psa_rot_heap,
@@ -87,7 +206,7 @@
TEST_ISOLATION_PSA_ROT_HEAP_RD)))
return VAL_STATUS_ERROR;
- close_driver_fn(&handle);
+ close_driver_fn(&handle);
/* Setting boot.state before test check */
if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
@@ -160,3 +279,5 @@
return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
}
#endif
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i083/test_i083.c b/api-tests/ff/ipc/test_i083/test_i083.c
index 477f91e..8c1bd7f 100644
--- a/api-tests/ff/ipc/test_i083/test_i083.c
+++ b/api-tests/ff/ipc/test_i083/test_i083.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,118 @@
#define DATA_VALUE 0x1234
+#if STATELESS_ROT == 1
+
+const client_test_t test_i083_client_tests_list[] = {
+ NULL,
+ client_test_app_rot_read_psa_rot_mmio,
+ client_test_app_rot_write_psa_rot_mmio,
+ NULL,
+};
+
+static int32_t get_secure_partition_address(__attribute__((unused)) psa_handle_t *handle,
+ addr_t *addr,
+ driver_test_fn_id_t test_fn_id)
+{
+
+ /* Execute driver function related to TEST_ISOLATION_PSA_ROT_DATA_RD */
+ psa_invec invec[1] = { {&test_fn_id, sizeof(test_fn_id)} };
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(DRIVER_TEST_HANDLE, PSA_IPC_CALL, invec, 1, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ return VAL_STATUS_SUCCESS;
+
+}
+
+static int32_t get_driver_status(psa_handle_t *handle)
+{
+ if (psa->call(*handle, PSA_IPC_CALL, NULL, 0, NULL, 0) != PSA_SUCCESS)
+ {
+ return VAL_STATUS_CALL_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_app_rot_read_psa_rot_mmio(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint32_t data = DATA_VALUE;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 1] Test APP-RoT reading PSA-RoT mmio\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_MMIO_RD)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read PSA RoT mmio address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint32_t *)psa_rot_addr;
+
+ /* Did read ignore? */
+ if (data == DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_app_rot_write_psa_rot_mmio(caller_security_t caller __UNUSED)
+{
+ addr_t psa_rot_addr;
+ uint32_t data = DATA_VALUE;
+ psa_handle_t handle = 0;
+
+ val->print(PRINT_TEST, "[Check 2] Test APP-RoT writing PSA-RoT mmio\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&handle,
+ &psa_rot_addr,
+ TEST_ISOLATION_PSA_ROT_MMIO_WR)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_S))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Write PSA RoT mmio address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint32_t *)psa_rot_addr = (uint32_t)data;
+
+ /* Handshake with driver to decide write status */
+ if (VAL_ERROR(get_driver_status(&handle)))
+ {
+ return VAL_STATUS_DRIVER_FN_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const client_test_t test_i083_client_tests_list[] = {
NULL,
client_test_app_rot_read_psa_rot_mmio,
@@ -55,6 +167,7 @@
}
return VAL_STATUS_SUCCESS;
+
}
static int32_t get_driver_status(psa_handle_t *handle)
@@ -127,6 +240,13 @@
TEST_ISOLATION_PSA_ROT_MMIO_WR)))
return VAL_STATUS_ERROR;
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_S))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
/* Write PSA RoT mmio address.
* This should generate internal fault or ignore the write.
*/
@@ -142,3 +262,5 @@
close_driver_fn(&handle);
return VAL_STATUS_SUCCESS;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i084/test_i084.c b/api-tests/ff/ipc/test_i084/test_i084.c
index 50afc94..023b88c 100644
--- a/api-tests/ff/ipc/test_i084/test_i084.c
+++ b/api-tests/ff/ipc/test_i084/test_i084.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,95 @@
#include "test_i084.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i084_client_tests_list[] = {
+ NULL,
+ client_test_sp_read_other_sp_variable,
+ client_test_sp_write_other_sp_variable,
+ NULL,
+};
+
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+ /* Get App-RoT address */
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ val->print(PRINT_DEBUG, "\tClient SP: Accessing address 0x%x\n", *addr);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_sp_read_other_sp_variable(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint32_t data = 0x1234;
+
+ val->print(PRINT_TEST, "[Check 1] Test SP reading other SP data\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read Application RoT global variable address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint32_t *)app_rot_addr;
+
+ /* Did read ignore? */
+ if (data == 0x1234)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_sp_write_other_sp_variable(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint32_t data = 0x1234;
+
+ val->print(PRINT_TEST, "[Check 2] Test SP writing other SP data\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_NS))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Write Application RoT global variable address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint32_t *)app_rot_addr = (uint32_t)data;
+
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const client_test_t test_i084_client_tests_list[] = {
NULL,
client_test_sp_read_other_sp_variable,
@@ -125,3 +214,5 @@
}
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i084/test_supp_i084.c b/api-tests/ff/ipc/test_i084/test_supp_i084.c
index 5362919..9e33823 100644
--- a/api-tests/ff/ipc/test_i084/test_supp_i084.c
+++ b/api-tests/ff/ipc/test_i084/test_supp_i084.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -31,6 +31,68 @@
/* Application RoT data region */
volatile uint32_t g_test_i084 = DATA_VALUE;
+#if STATELESS_ROT == 1
+
+const server_test_t test_i084_server_tests_list[] = {
+ NULL,
+ server_test_sp_read_other_sp_variable,
+ server_test_sp_write_other_sp_variable,
+ NULL,
+};
+
+static int32_t send_secure_partition_address(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ volatile uint32_t *addr = &g_test_i084;
+ psa_msg_t msg = {0};
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ return status;
+ }
+
+ val->print(PRINT_DEBUG, "\tServer SP: Passing 0x%x to Client SP\n", (int)&g_test_i084);
+
+ /* Send Application RoT data address - global variable */
+ psa->write(msg.handle, 0, (void *)&addr, sizeof(addr));
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_sp_read_other_sp_variable(void)
+{
+ return send_secure_partition_address();
+}
+
+int32_t server_test_sp_write_other_sp_variable(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+
+
+ status = send_secure_partition_address();
+ if (VAL_ERROR(status))
+ return status;
+
+ /* Reached here means there could be write succeed or ignored */
+ if (g_test_i084 == DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const server_test_t test_i084_server_tests_list[] = {
NULL,
server_test_sp_read_other_sp_variable,
@@ -114,3 +176,5 @@
}
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i085/test_i085.c b/api-tests/ff/ipc/test_i085/test_i085.c
index 9a3647e..f672fdd 100644
--- a/api-tests/ff/ipc/test_i085/test_i085.c
+++ b/api-tests/ff/ipc/test_i085/test_i085.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,96 @@
#include "test_i085.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i085_client_tests_list[] = {
+ NULL,
+ client_test_sp_read_other_sp_stack,
+ client_test_sp_write_other_sp_stack,
+ NULL,
+};
+
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+ /* Get App-RoT address */
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ val->print(PRINT_DEBUG, "\tClient SP: Accessing address 0x%x\n", *addr);
+
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_sp_read_other_sp_stack(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint32_t data = 0x1234;
+
+ val->print(PRINT_TEST, "[Check 1] Test SP reading other SP stack\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read Application RoT stack address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint32_t *)app_rot_addr;
+
+ /* Did read ignore? */
+ if (data == 0x1234)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_sp_write_other_sp_stack(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint32_t data = 0x1234;
+
+ val->print(PRINT_TEST, "[Check 2] Test SP writing other SP stack\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_NS))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Write Application RoT stack address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint32_t *)app_rot_addr = (uint32_t)data;
+
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const client_test_t test_i085_client_tests_list[] = {
NULL,
client_test_sp_read_other_sp_stack,
@@ -125,3 +215,5 @@
}
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i085/test_supp_i085.c b/api-tests/ff/ipc/test_i085/test_supp_i085.c
index bf0541a..7c47b49 100644
--- a/api-tests/ff/ipc/test_i085/test_supp_i085.c
+++ b/api-tests/ff/ipc/test_i085/test_supp_i085.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,6 +28,77 @@
#define DATA_VALUE 0x5467
+#if STATELESS_ROT == 1
+
+const server_test_t test_i085_server_tests_list[] = {
+ NULL,
+ server_test_sp_read_other_sp_stack,
+ server_test_sp_write_other_sp_stack,
+ NULL,
+};
+
+static int32_t send_secure_partition_address(addr_t *stack)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ return status;
+ }
+
+ val->print(PRINT_DEBUG, "\tServer SP: Passing 0x%x to Client SP\n", (int)stack);
+
+ /* Send Application RoT stack address */
+ psa->write(msg.handle, 0, (void *)&stack, sizeof(addr_t));
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_sp_read_other_sp_stack(void)
+{
+ /* Application RoT stack - local variable */
+ uint32_t l_test_i085 = DATA_VALUE;
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ status = send_secure_partition_address(&l_test_i085);
+
+ /* Dummy print to avoid compiler optimisation on local variable */
+ val->print(PRINT_INFO, "\tData value 0x%x\n", l_test_i085);
+ return status;
+}
+
+int32_t server_test_sp_write_other_sp_stack(void)
+{
+ /* Application RoT stack - local variable */
+ uint32_t l_test_i085 = DATA_VALUE;
+ int32_t status = VAL_STATUS_SUCCESS;
+
+
+ status = send_secure_partition_address(&l_test_i085);
+ if (VAL_ERROR(status))
+ return status;
+
+ /* Reached here means there could be write succeed or ignored */
+ if (l_test_i085 == DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const server_test_t test_i085_server_tests_list[] = {
NULL,
server_test_sp_read_other_sp_stack,
@@ -120,3 +191,5 @@
}
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i086/test_i086.c b/api-tests/ff/ipc/test_i086/test_i086.c
index 2cb9ce6..2c2fcaa 100644
--- a/api-tests/ff/ipc/test_i086/test_i086.c
+++ b/api-tests/ff/ipc/test_i086/test_i086.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,6 +29,110 @@
#define DATA_VALUE 0x12
#define BUFFER_SIZE 0x4
+#if STATELESS_ROT == 1
+
+const client_test_t test_i086_client_tests_list[] = {
+ NULL,
+ client_test_sp_read_other_sp_heap,
+ client_test_sp_write_other_sp_heap,
+ NULL,
+};
+
+#ifdef SP_HEAP_MEM_SUPP
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+ psa_outvec outvec[1] = { {addr, BUFFER_SIZE} };
+ if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ val->print(PRINT_DEBUG, "\tClient SP: Accessing address 0x%x\n", *addr);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t client_test_sp_read_other_sp_heap(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint8_t data = DATA_VALUE;
+
+ val->print(PRINT_TEST, "[Check 1] Test SP reading other SP heap\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read Application RoT heap address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint8_t *)app_rot_addr;
+
+ /* Did read ignore? */
+ if (data == DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_sp_write_other_sp_heap(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint8_t data = DATA_VALUE;
+
+ val->print(PRINT_TEST, "[Check 2] Test SP writing other SP heap\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_NS))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Write Application RoT heap address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint8_t *)app_rot_addr = (uint8_t)data;
+ return VAL_STATUS_SUCCESS;
+
+}
+#else
+int32_t client_test_sp_read_other_sp_heap(caller_security_t caller __UNUSED)
+{
+ val->print(PRINT_TEST, "[Check 1] Test SP reading other SP heap\n", 0);
+ val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+ return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+
+int32_t client_test_sp_write_other_sp_heap(caller_security_t caller __UNUSED)
+{
+ val->print(PRINT_TEST, "[Check 2] Test SP writing other SP heap\n", 0);
+ val->print(PRINT_ERROR, "\tSkipping test as heap memory not supported\n", 0);
+ return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+#endif
+
+#else
+
const client_test_t test_i086_client_tests_list[] = {
NULL,
client_test_sp_read_other_sp_heap,
@@ -129,6 +233,7 @@
return VAL_STATUS_INVALID_HANDLE;
}
return VAL_STATUS_SUCCESS;
+
}
#else
int32_t client_test_sp_read_other_sp_heap(caller_security_t caller __UNUSED)
@@ -145,3 +250,5 @@
return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
}
#endif
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i086/test_supp_i086.c b/api-tests/ff/ipc/test_i086/test_supp_i086.c
index 2d48686..0b20c05 100644
--- a/api-tests/ff/ipc/test_i086/test_supp_i086.c
+++ b/api-tests/ff/ipc/test_i086/test_supp_i086.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,6 +34,97 @@
#define DATA_VALUE_ORG 0x11
#define BUFFER_SIZE 0x4
+#if STATELESS_ROT == 1
+
+const server_test_t test_i086_server_tests_list[] = {
+ NULL,
+ server_test_sp_read_other_sp_heap,
+ server_test_sp_write_other_sp_heap,
+ NULL,
+};
+
+#ifdef SP_HEAP_MEM_SUPP
+static int32_t send_secure_partition_address(uint8_t *heap)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(202), status))
+ {
+ psa->reply(msg.handle, -2);
+ return status;
+ }
+
+ val->print(PRINT_DEBUG, "\tServer SP: Passing 0x%x to Client SP\n", (int)heap);
+
+ /* Send Application RoT heap address */
+ psa->write(msg.handle, 0, (void *)&heap, sizeof(BUFFER_SIZE));
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_sp_read_other_sp_heap(void)
+{
+ /* Application RoT heap buffer */
+ uint8_t *buffer;
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ buffer = (uint8_t *)malloc(sizeof(uint8_t) * BUFFER_SIZE);
+ memset((uint8_t *)buffer, DATA_VALUE_ORG, BUFFER_SIZE);
+
+ status = send_secure_partition_address(buffer);
+ free(buffer);
+
+ return status;
+}
+
+int32_t server_test_sp_write_other_sp_heap(void)
+{
+ /* Application RoT heap buffer */
+ uint8_t *buffer;
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ buffer = (uint8_t *)malloc(sizeof(uint8_t) * BUFFER_SIZE);
+ memset((uint8_t *)buffer, DATA_VALUE_ORG, BUFFER_SIZE);
+
+ status = send_secure_partition_address(buffer);
+ if (VAL_ERROR(status))
+ return status;
+
+ /* Reached here means there could be write succeed or ignored */
+ if (buffer[0] == DATA_VALUE_ORG)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ free(buffer);
+ return VAL_STATUS_SUCCESS;
+}
+#else
+
+int32_t server_test_sp_read_other_sp_heap(void)
+{
+ return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+
+int32_t server_test_sp_write_other_sp_heap(void)
+{
+ return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
+}
+#endif
+
+#else
+
const server_test_t test_i086_server_tests_list[] = {
NULL,
server_test_sp_read_other_sp_heap,
@@ -75,6 +166,7 @@
return status;
}
psa->reply(msg.handle, PSA_SUCCESS);
+
return VAL_STATUS_SUCCESS;
}
@@ -146,3 +238,5 @@
return RESULT_SKIP(VAL_STATUS_HEAP_NOT_AVAILABLE);
}
#endif
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i087/test_i087.c b/api-tests/ff/ipc/test_i087/test_i087.c
index 90d39cb..864d444 100644
--- a/api-tests/ff/ipc/test_i087/test_i087.c
+++ b/api-tests/ff/ipc/test_i087/test_i087.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +27,8 @@
#define DATA_VALUE 0x1234
+#if STATELESS_ROT == 1
+
const client_test_t test_i087_client_tests_list[] = {
NULL,
client_test_sp_read_other_sp_mmio,
@@ -36,6 +38,97 @@
static int32_t get_secure_partition_address(addr_t *addr)
{
+ /* Get App-RoT address */
+ psa_outvec outvec[1] = { {addr, sizeof(addr_t)} };
+ if (psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, PSA_IPC_CALL, NULL, 0, outvec, 1) != PSA_SUCCESS)
+ {
+ val->print(PRINT_ERROR, "\tmsg request failed\n", 0);
+ return VAL_STATUS_CALL_FAILED;
+ }
+
+ val->print(PRINT_DEBUG, "\tClient SP: Accessing address 0x%x\n", *addr);
+
+ return VAL_STATUS_SUCCESS;
+
+}
+
+int32_t client_test_sp_read_other_sp_mmio(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint32_t data = DATA_VALUE;
+
+ val->print(PRINT_TEST, "[Check 1] Test SP reading other SP mmio\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_REENTER_TEST))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Read Application RoT mmio address.
+ * This should generate internal fault or ignore the read.
+ */
+ data = *(uint32_t *)app_rot_addr;
+
+ /* Did read ignore? */
+ if (data == DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected read to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ return VAL_STATUS_SPM_FAILED;
+}
+
+int32_t client_test_sp_write_other_sp_mmio(caller_security_t caller __UNUSED)
+{
+ addr_t app_rot_addr;
+ uint32_t data = DATA_VALUE;
+
+ val->print(PRINT_TEST, "[Check 2] Test SP writing other SP mmio\n", 0);
+
+ if (VAL_ERROR(get_secure_partition_address(&app_rot_addr)))
+ return VAL_STATUS_ERROR;
+
+ /* Setting boot.state before test check */
+ if (val->set_boot_flag(BOOT_EXPECTED_NS))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Write Application RoT mmio address.
+ * This should generate internal fault or ignore the write.
+ */
+ *(uint32_t *)app_rot_addr = (uint32_t)data;
+
+ return VAL_STATUS_SUCCESS;
+
+
+}
+
+#else
+
+const client_test_t test_i087_client_tests_list[] = {
+ NULL,
+ client_test_sp_read_other_sp_mmio,
+ client_test_sp_write_other_sp_mmio,
+ NULL,
+};
+
+static int32_t get_secure_partition_address(addr_t *addr)
+{
+
psa_handle_t handle = 0;
handle = psa->connect(SERVER_UNSPECIFED_VERSION_SID, SERVER_UNSPECIFED_VERSION_VERSION);
@@ -126,4 +219,7 @@
return VAL_STATUS_INVALID_HANDLE;
}
return VAL_STATUS_SUCCESS;
+
+
}
+ #endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i087/test_supp_i087.c b/api-tests/ff/ipc/test_i087/test_supp_i087.c
index 0eedb5e..3fd6eac 100644
--- a/api-tests/ff/ipc/test_i087/test_supp_i087.c
+++ b/api-tests/ff/ipc/test_i087/test_supp_i087.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,6 +28,100 @@
#define DATA_VALUE 0x5467
+#if STATELESS_ROT == 1
+
+const server_test_t test_i087_server_tests_list[] = {
+ NULL,
+ server_test_sp_read_other_sp_mmio,
+ server_test_sp_write_other_sp_mmio,
+ NULL,
+};
+
+static int32_t get_mmio_addr(addr_t *addr)
+{
+ memory_desc_t *memory_desc;
+ int32_t status = VAL_STATUS_SUCCESS;
+
+ /* Get APP-ROT MMIO address */
+ status = val->target_get_config(TARGET_CONFIG_CREATE_ID(GROUP_MEMORY,
+ MEMORY_SERVER_PARTITION_MMIO, 0),
+ (uint8_t **)&memory_desc,
+ (uint32_t *)sizeof(memory_desc_t));
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(201), status))
+ {
+ return status;
+ }
+
+ *addr = memory_desc->start;
+ return VAL_STATUS_SUCCESS;
+}
+
+static int32_t send_secure_partition_address(addr_t *addr)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_msg_t msg = {0};
+
+ status = val->process_call_request(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg);
+ if (val->err_check_set(TEST_CHECKPOINT_NUM(203), status))
+ {
+ psa->reply(msg.handle, -2);
+ return status;
+ }
+
+ val->print(PRINT_DEBUG, "\tServer SP: Passing 0x%x to Client SP\n", (int)*addr);
+
+ /* Send Application RoT mmio address */
+ psa->write(msg.handle, 0, (void *)addr, sizeof(addr_t));
+ psa->reply(msg.handle, PSA_SUCCESS);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+int32_t server_test_sp_read_other_sp_mmio(void)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ addr_t app_rot_addr;
+
+ status = get_mmio_addr(&app_rot_addr);
+ if (VAL_ERROR(status))
+ return status;
+
+ return send_secure_partition_address(&app_rot_addr);
+}
+
+int32_t server_test_sp_write_other_sp_mmio(void)
+{
+ addr_t app_rot_addr;
+ int32_t status = VAL_STATUS_SUCCESS;
+
+
+ status = get_mmio_addr(&app_rot_addr);
+ if (VAL_ERROR(status))
+ return status;
+
+ /* Initialise mmio address */
+ *(uint32_t *)app_rot_addr = (uint32_t)DATA_VALUE;
+ status = send_secure_partition_address(&app_rot_addr);
+ if (VAL_ERROR(status))
+ return status;
+
+ /* Reached here means there could be write succeed or ignored */
+ if (*(uint32_t *)app_rot_addr == (uint32_t)DATA_VALUE)
+ return VAL_STATUS_SUCCESS;
+
+ val->print(PRINT_ERROR, "\tExpected write to fault but it didn't\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+ return VAL_STATUS_SUCCESS;
+}
+
+#else
+
const server_test_t test_i087_server_tests_list[] = {
NULL,
server_test_sp_read_other_sp_mmio,
@@ -143,3 +237,5 @@
}
return VAL_STATUS_SUCCESS;
}
+
+#endif
\ No newline at end of file
diff --git a/api-tests/ff/ipc/test_i090/test_i090.c b/api-tests/ff/ipc/test_i090/test_i090.c
index f7e9bfe..249f52f 100644
--- a/api-tests/ff/ipc/test_i090/test_i090.c
+++ b/api-tests/ff/ipc/test_i090/test_i090.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,6 +25,83 @@
#include "test_i090.h"
+#if STATELESS_ROT == 1
+
+const client_test_t test_i090_client_tests_list[] = {
+ NULL,
+ client_test_psa_call_with_neg_type,
+ NULL,
+};
+
+int32_t client_test_psa_call_with_neg_type(caller_security_t caller)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ psa_status_t status_of_call;
+ boot_state_t boot_state;
+
+ val->print(PRINT_TEST,
+ "[Check 1] Test psa_call with negative type\n", 0);
+
+ /*
+ * This test checks for the PROGRAMMER ERROR condition for the PSA API. API's respond to
+ * PROGRAMMER ERROR could be either to return appropriate status code or panic the caller.
+ * When a Secure Partition panics, the SPE cannot continue normal execution, as defined
+ * in this specification. The behavior of the SPM following a Secure Partition panic is
+ * IMPLEMENTATION DEFINED- Arm recommends that the SPM causes the system to restart in
+ * this situation. Refer PSA-FF for more information on panic.
+ * For the cases where, SPM cannot capable to reboot the system (just hangs or power down),
+ * a watchdog timer set by val_test_init can reboot the system on timeout event. This will
+ * tests continuity and able to jump to next tests. Therefore, each test who checks for
+ * PROGRAMMER ERROR condition, expects system to get reset either by SPM or watchdog set by
+ * the test harness function.
+ *
+ * If programmed timeout value isn't sufficient for your system, it can be reconfigured using
+ * timeout entries available in target.cfg.
+ *
+ * To decide, a reboot happened as intended by test scenario or it happended
+ * due to other reasons, test is setting a boot signature into non-volatile memory before and
+ * after targeted test check. After a reboot, these boot signatures are being read by the
+ * VAL APIs to decide test status.
+ */
+
+ /* Setting boot.state before test check */
+ boot_state = (caller == CALLER_NONSECURE) ? BOOT_EXPECTED_NS : BOOT_EXPECTED_S;
+ if (val->set_boot_flag(boot_state))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag before check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ /* Test check- psa_call with negative type */
+ status_of_call = psa->call(SERVER_UNSPECIFED_VERSION_HANDLE, -1, NULL, 0, NULL, 0);
+
+ /*
+ * If the caller is in the NSPE, it is IMPLEMENTATION DEFINED whether
+ * a PROGRAMMER ERROR will panic or return PSA_ERROR_PROGRAMMER_ERROR.
+ * For SPE caller, it must panic.
+ */
+ if (caller == CALLER_NONSECURE && status_of_call == PSA_ERROR_PROGRAMMER_ERROR)
+ {
+ return VAL_STATUS_SUCCESS;
+ }
+
+ /* If PROGRAMMER ERROR results into panic then control shouldn't have reached here */
+ val->print(PRINT_ERROR, "\tCall should failed but succeed\n", 0);
+
+ /* Resetting boot.state to catch unwanted reboot */
+ if (val->set_boot_flag(BOOT_EXPECTED_BUT_FAILED))
+ {
+ val->print(PRINT_ERROR, "\tFailed to set boot flag after check\n", 0);
+ return VAL_STATUS_ERROR;
+ }
+
+ status = VAL_STATUS_SPM_FAILED;
+
+ return status;
+}
+
+#else
+
const client_test_t test_i090_client_tests_list[] = {
NULL,
client_test_psa_call_with_neg_type,
@@ -106,3 +183,5 @@
psa->close(handle);
return status;
}
+
+#endif
diff --git a/api-tests/ff/ipc/test_i090/test_supp_i090.c b/api-tests/ff/ipc/test_i090/test_supp_i090.c
index 7295b59..3570c2b 100644
--- a/api-tests/ff/ipc/test_i090/test_supp_i090.c
+++ b/api-tests/ff/ipc/test_i090/test_supp_i090.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,7 +23,9 @@
extern val_api_t *val;
extern psa_api_t *psa;
-int32_t server_test_psa_call_with_neg_type();
+#if STATELESS_ROT == 1
+
+int32_t server_test_psa_call_with_neg_type(void);
const server_test_t test_i090_server_tests_list[] = {
NULL,
@@ -31,7 +33,38 @@
NULL,
};
-int32_t server_test_psa_call_with_neg_type()
+int32_t server_test_psa_call_with_neg_type(void)
+{
+ psa_msg_t msg = {0};
+ psa_signal_t signals;
+
+wait:
+ signals = psa->wait(PSA_WAIT_ANY, PSA_BLOCK);
+ if (psa->get(SERVER_UNSPECIFED_VERSION_SIGNAL, &msg) != PSA_SUCCESS)
+ {
+ goto wait;
+ }
+ if (msg.type == PSA_IPC_CALL)
+ {
+ /* Control shouldn't have come here */
+ val->print(PRINT_ERROR, "\tControl shouldn't have reached here\n", 0);
+ psa->reply(msg.handle, -2);
+ }
+
+ return VAL_STATUS_ERROR;
+}
+
+#else
+
+int32_t server_test_psa_call_with_neg_type(void);
+
+const server_test_t test_i090_server_tests_list[] = {
+ NULL,
+ server_test_psa_call_with_neg_type,
+ NULL,
+};
+
+int32_t server_test_psa_call_with_neg_type(void)
{
int32_t status = VAL_STATUS_SUCCESS;
psa_msg_t msg = {0};
@@ -77,3 +110,5 @@
return VAL_STATUS_ERROR;
}
+
+#endif
diff --git a/api-tests/ff/partition/client_partition.c b/api-tests/ff/partition/client_partition.c
index 7ecea52..ae6b40f 100644
--- a/api-tests/ff/partition/client_partition.c
+++ b/api-tests/ff/partition/client_partition.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2019, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -97,11 +97,13 @@
/* Server_partition requests client to connect to SERVER_SECURE_CONNECT_ONLY_SID */
else if (signals & PSA_DOORBELL)
{
+#if STATELESS_ROT != 1
if (psa_connect(SERVER_SECURE_CONNECT_ONLY_SID, SERVER_SECURE_CONNECT_ONLY_VERSION)
!= PSA_ERROR_CONNECTION_REFUSED)
{
val_print(PRINT_ERROR, "psa_connect failed \n", 0);
}
+#endif
psa_clear();
}
else
diff --git a/api-tests/ff/partition/driver_partition.c b/api-tests/ff/partition/driver_partition.c
index 956e370..8823fc2 100644
--- a/api-tests/ff/partition/driver_partition.c
+++ b/api-tests/ff/partition/driver_partition.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,10 +16,15 @@
**/
#include "val_driver_service_apis.h"
-
#define DATA_VALUE 0x1111
#define BUFFER_SIZE 4
+#if SPEC_VERSION == 11
+
+#define DRIVER_UART_INTR_SIG DRIVER_UART_INTR_SIG_SIGNAL
+
+#endif
+
uint32_t g_psa_rot_data = DATA_VALUE;
int32_t driver_test_psa_eoi_with_non_intr_signal(void);
@@ -352,6 +357,7 @@
int32_t driver_test_psa_eoi_with_multiple_signals(void)
{
+ psa_irq_enable(DRIVER_UART_INTR_SIG);
/*
* To test psa_eoi for multiple signals, one of signal should asserted first.
* Otherwise, check can false pass with psa_eoi_with_unasserted_signal.
@@ -398,7 +404,9 @@
int32_t driver_test_irq_routing(void)
{
+
psa_signal_t signals = 0;
+ psa_irq_enable(DRIVER_UART_INTR_SIG);
/* Assert interrupt signal assigned to driver partition */
val_generate_interrupt();
@@ -406,6 +414,7 @@
/* Wait for DRIVER_UART_INTR_SIG signal */
signals = psa_wait(DRIVER_UART_INTR_SIG, PSA_BLOCK);
+
if (signals & DRIVER_UART_INTR_SIG)
{
/* Received DRIVER_UART_INTR_SIG signal, now process it */
diff --git a/api-tests/platform/targets/common/nspe/crypto/pal_crypto_intf.c b/api-tests/platform/targets/common/nspe/crypto/pal_crypto_intf.c
index 34ef721..7d8e633 100644
--- a/api-tests/platform/targets/common/nspe/crypto/pal_crypto_intf.c
+++ b/api-tests/platform/targets/common/nspe/crypto/pal_crypto_intf.c
@@ -60,17 +60,14 @@
size_t nonce_length;
const uint8_t *additional_data;
size_t additional_data_length;
+#if HOST_GCC_MISSING_CRYPTO_1_0 == 0
uint8_t *output1;
size_t output_size1, *p_output_length1;
-
+#endif
switch (type)
{
- case PAL_CRYPTO_AEAD_ABORT:
- aead_operation = va_arg(valist, psa_aead_operation_t *);
- return psa_aead_abort(aead_operation);
- break;
case PAL_CRYPTO_AEAD_DECRYPT:
key = va_arg(valist, psa_key_id_t);
alg = va_arg(valist, psa_algorithm_t);
@@ -95,14 +92,6 @@
output_size,
p_output_length);
break;
- case PAL_CRYPTO_AEAD_DECRYPT_SETUP:
- aead_operation = va_arg(valist, psa_aead_operation_t *);
- key = va_arg(valist, psa_key_id_t);
- alg = va_arg(valist, psa_algorithm_t);
- return psa_aead_decrypt_setup(aead_operation,
- key,
- alg);
- break;
case PAL_CRYPTO_AEAD_ENCRYPT:
key = va_arg(valist, psa_key_id_t);
alg = va_arg(valist, psa_algorithm_t);
@@ -127,7 +116,12 @@
output_size,
p_output_length);
break;
- case PAL_CRYPTO_AEAD_ENCRYPT_SETUP:
+#if HOST_GCC_MISSING_CRYPTO_1_0 == 0
+ case PAL_CRYPTO_AEAD_ABORT:
+ aead_operation = va_arg(valist, psa_aead_operation_t *);
+ return psa_aead_abort(aead_operation);
+ break;
+ case PAL_CRYPTO_AEAD_DECRYPT_SETUP:
aead_operation = va_arg(valist, psa_aead_operation_t *);
key = va_arg(valist, psa_key_id_t);
alg = va_arg(valist, psa_algorithm_t);
@@ -135,6 +129,14 @@
key,
alg);
break;
+ case PAL_CRYPTO_AEAD_ENCRYPT_SETUP:
+ aead_operation = va_arg(valist, psa_aead_operation_t *);
+ key = va_arg(valist, psa_key_id_t);
+ alg = va_arg(valist, psa_algorithm_t);
+ return psa_aead_encrypt_setup(aead_operation,
+ key,
+ alg);
+ break;
case PAL_CRYPTO_AEAD_FINISH:
aead_operation = va_arg(valist, psa_aead_operation_t *);
output = va_arg(valist, uint8_t *);
@@ -161,13 +163,6 @@
output_size,
p_output_length);
break;
- case PAL_CRYPTO_AEAD_OPERATION_INIT:
- aead_operation = va_arg(valist, psa_aead_operation_t *);
- aead_operation_temp = psa_aead_operation_init();
- memcpy((void *)aead_operation, (void *)&aead_operation_temp,
- sizeof(psa_aead_operation_t));
- return 0;
- break;
case PAL_CRYPTO_AEAD_SET_LENGTHS:
aead_operation = va_arg(valist, psa_aead_operation_t *);
input_length = va_arg(valist, size_t);
@@ -220,6 +215,14 @@
input,
input_length);
break;
+#endif
+ case PAL_CRYPTO_AEAD_OPERATION_INIT:
+ aead_operation = va_arg(valist, psa_aead_operation_t *);
+ aead_operation_temp = psa_aead_operation_init();
+ memcpy((void *)aead_operation, (void *)&aead_operation_temp,
+ sizeof(psa_aead_operation_t));
+ return 0;
+ break;
case PAL_CRYPTO_ASYMMETRIC_DECRYPT:
key = va_arg(valist, psa_key_id_t);
alg = va_arg(valist, psa_algorithm_t);
@@ -264,6 +267,7 @@
cipher_operation = va_arg(valist, psa_cipher_operation_t *);
return psa_cipher_abort(cipher_operation);
break;
+#if HOST_GCC_MISSING_CRYPTO_1_0 == 0
case PAL_CRYPTO_CIPHER_DECRYPT:
key = va_arg(valist, psa_key_id_t);
alg = va_arg(valist, psa_algorithm_t);
@@ -280,6 +284,7 @@
output_size,
p_output_length);
break;
+#endif
case PAL_CRYPTO_CIPHER_DECRYPT_SETUP:
cipher_operation = va_arg(valist, psa_cipher_operation_t *);
key = va_arg(valist, psa_key_id_t);
@@ -288,6 +293,7 @@
key,
alg);
break;
+#if HOST_GCC_MISSING_CRYPTO_1_0 == 0
case PAL_CRYPTO_CIPHER_ENCRYPT:
key = va_arg(valist, psa_key_id_t);
alg = va_arg(valist, psa_algorithm_t);
@@ -304,6 +310,7 @@
output_size,
p_output_length);
break;
+#endif
case PAL_CRYPTO_CIPHER_ENCRYPT_SETUP:
cipher_operation = va_arg(valist, psa_cipher_operation_t *);
key = va_arg(valist, psa_key_id_t);
@@ -692,6 +699,7 @@
input,
input_length);
break;
+#if HOST_GCC_MISSING_CRYPTO_1_0 == 0
case PAL_CRYPTO_MAC_VERIFY:
key = va_arg(valist, psa_key_id_t);
alg = va_arg(valist, psa_algorithm_t);
@@ -706,6 +714,7 @@
input1,
input_length1);
break;
+#endif
case PAL_CRYPTO_MAC_VERIFY_FINISH:
mac_operation = va_arg(valist, psa_mac_operation_t *);
input = va_arg(valist, const uint8_t *);
diff --git a/api-tests/platform/targets/tgt_dev_apis_linux/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_linux/nspe/pal_config.h
index 4b1f3f3..6112ba7 100755
--- a/api-tests/platform/targets/tgt_dev_apis_linux/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_linux/nspe/pal_config.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -60,7 +60,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/pal_config.h
index eae2f8e..e3fb297 100644
--- a/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_stdc/nspe/pal_config.h
@@ -59,7 +59,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/pal_config.h
index c9a3597..304ee56 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an521/nspe/pal_config.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/pal_config.h
index c9a3597..304ee56 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an524/nspe/pal_config.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_an539/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_an539/nspe/pal_config.h
index 59ff02a..089a0c9 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_an539/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_an539/nspe/pal_config.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_config.h
index c9a3597..304ee56 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_config.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/pal_config.h
index c9a3597..304ee56 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_b1/nspe/pal_config.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_s1/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_s1/nspe/pal_config.h
index 59ff02a..089a0c9 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_s1/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_s1/nspe/pal_config.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_nrf/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_nrf/nspe/pal_config.h
index 5871659..b05dcba 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_nrf/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_nrf/nspe/pal_config.h
@@ -49,7 +49,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_psoc64/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_psoc64/nspe/pal_config.h
index ffb6a26..58aca3a 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_psoc64/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_psoc64/nspe/pal_config.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_stm32l562e_dk/nspe/pal_config.h b/api-tests/platform/targets/tgt_dev_apis_tfm_stm32l562e_dk/nspe/pal_config.h
index c9a3597..304ee56 100644
--- a/api-tests/platform/targets/tgt_dev_apis_tfm_stm32l562e_dk/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_dev_apis_tfm_stm32l562e_dk/nspe/pal_config.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,7 +48,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_config.h b/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_config.h
index 0c956f5..e5578d9 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_config.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -44,7 +44,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_driver_ipc_intf.c b/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_driver_ipc_intf.c
index ba4b84b..dbc87a9 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_driver_ipc_intf.c
+++ b/api-tests/platform/targets/tgt_ff_tfm_an521/nspe/pal_driver_ipc_intf.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,7 +24,6 @@
**/
int pal_uart_init_ns(uint32_t uart_base_addr)
{
- psa_handle_t print_handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
uart_fn_type_t uart_fn = UART_INIT;
@@ -32,13 +31,21 @@
{&uart_base_addr, sizeof(uart_base_addr)},
{NULL, 0}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data, 3, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t print_handle = 0;
print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
if (PSA_HANDLE_IS_VALID(print_handle))
{
- status_of_call = psa_call(print_handle, 0, data, 3, NULL, 0);
- psa_close(print_handle);
- if (status_of_call != PSA_SUCCESS)
- return PAL_STATUS_ERROR;
+ status_of_call = psa_call(print_handle, 0, data, 3, NULL, 0);
+ psa_close(print_handle);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
return PAL_STATUS_SUCCESS;
}
@@ -46,6 +53,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -59,7 +67,6 @@
{
int string_len = 0;
const char *p = str;
- psa_handle_t print_handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
uart_fn_type_t uart_fn = UART_PRINT;
@@ -72,7 +79,14 @@
psa_invec data1[3] = {{&uart_fn, sizeof(uart_fn)},
{str, string_len+1},
{&data, sizeof(data)}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data1, 3, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t print_handle = 0;
print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
if (PSA_HANDLE_IS_VALID(print_handle))
{
@@ -87,6 +101,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -99,7 +114,6 @@
int pal_wd_timer_init_ns(addr_t base_addr, uint32_t time_us, uint32_t timer_tick_us)
{
wd_param_t wd_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
wd_param.wd_fn_type = WD_INIT_SEQ;
@@ -108,6 +122,15 @@
wd_param.wd_timer_tick_us = timer_tick_us;
psa_invec invec[1] = {{&wd_param, sizeof(wd_param)}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -122,6 +145,8 @@
{
return PAL_STATUS_ERROR;
}
+#endif
+
}
/**
@@ -132,7 +157,6 @@
int pal_wd_timer_enable_ns(addr_t base_addr)
{
wd_param_t wd_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
wd_param.wd_fn_type = WD_ENABLE_SEQ;
@@ -141,6 +165,14 @@
wd_param.wd_timer_tick_us = 0;
psa_invec invec[1] = {{&wd_param, sizeof(wd_param)}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -155,6 +187,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -165,7 +198,6 @@
int pal_wd_timer_disable_ns(addr_t base_addr)
{
wd_param_t wd_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
wd_param.wd_fn_type = WD_DISABLE_SEQ;
@@ -173,6 +205,14 @@
wd_param.wd_time_us = 0;
wd_param.wd_timer_tick_us = 0;
psa_invec invec[1] = {{&wd_param, sizeof(wd_param)}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
@@ -188,6 +228,8 @@
{
return PAL_STATUS_ERROR;
}
+#endif
+
}
/**
@@ -201,7 +243,6 @@
int pal_nvmem_read_ns(addr_t base, uint32_t offset, void *buffer, int size)
{
nvmem_param_t nvmem_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
nvmem_param.nvmem_fn_type = NVMEM_READ;
@@ -210,7 +251,14 @@
nvmem_param.size = size;
psa_invec invec[1] = {{&nvmem_param, sizeof(nvmem_param)}};
psa_outvec outvec[1] = {{buffer, size}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 1, outvec, 1);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -225,6 +273,8 @@
{
return PAL_STATUS_ERROR;
}
+#endif
+
}
/**
@@ -238,7 +288,7 @@
int pal_nvmem_write_ns(addr_t base, uint32_t offset, void *buffer, int size)
{
nvmem_param_t nvmem_param;
- psa_handle_t handle = 0;
+
psa_status_t status_of_call = PSA_SUCCESS;
nvmem_param.nvmem_fn_type = NVMEM_WRITE;
@@ -246,7 +296,14 @@
nvmem_param.offset = offset;
nvmem_param.size = size;
psa_invec invec[2] = {{&nvmem_param, sizeof(nvmem_param)}, {buffer, size}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 2, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -261,6 +318,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_config.h b/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_config.h
index 0c956f5..e5578d9 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_config.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -44,7 +44,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_driver_ipc_intf.c b/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_driver_ipc_intf.c
index ba4b84b..9f8b708 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_driver_ipc_intf.c
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_a/nspe/pal_driver_ipc_intf.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2019-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,7 +24,6 @@
**/
int pal_uart_init_ns(uint32_t uart_base_addr)
{
- psa_handle_t print_handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
uart_fn_type_t uart_fn = UART_INIT;
@@ -32,6 +31,14 @@
{&uart_base_addr, sizeof(uart_base_addr)},
{NULL, 0}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data, 3, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t print_handle = 0;
print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
if (PSA_HANDLE_IS_VALID(print_handle))
{
@@ -46,6 +53,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -59,7 +67,6 @@
{
int string_len = 0;
const char *p = str;
- psa_handle_t print_handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
uart_fn_type_t uart_fn = UART_PRINT;
@@ -73,6 +80,14 @@
{str, string_len+1},
{&data, sizeof(data)}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data1, 3, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t print_handle = 0;
print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
if (PSA_HANDLE_IS_VALID(print_handle))
{
@@ -87,6 +102,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -99,7 +115,6 @@
int pal_wd_timer_init_ns(addr_t base_addr, uint32_t time_us, uint32_t timer_tick_us)
{
wd_param_t wd_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
wd_param.wd_fn_type = WD_INIT_SEQ;
@@ -108,6 +123,14 @@
wd_param.wd_timer_tick_us = timer_tick_us;
psa_invec invec[1] = {{&wd_param, sizeof(wd_param)}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -122,6 +145,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -132,7 +156,6 @@
int pal_wd_timer_enable_ns(addr_t base_addr)
{
wd_param_t wd_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
wd_param.wd_fn_type = WD_ENABLE_SEQ;
@@ -141,6 +164,14 @@
wd_param.wd_timer_tick_us = 0;
psa_invec invec[1] = {{&wd_param, sizeof(wd_param)}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -155,6 +186,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -165,7 +197,6 @@
int pal_wd_timer_disable_ns(addr_t base_addr)
{
wd_param_t wd_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
wd_param.wd_fn_type = WD_DISABLE_SEQ;
@@ -174,6 +205,14 @@
wd_param.wd_timer_tick_us = 0;
psa_invec invec[1] = {{&wd_param, sizeof(wd_param)}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -188,6 +227,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -201,7 +241,6 @@
int pal_nvmem_read_ns(addr_t base, uint32_t offset, void *buffer, int size)
{
nvmem_param_t nvmem_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
nvmem_param.nvmem_fn_type = NVMEM_READ;
@@ -211,6 +250,14 @@
psa_invec invec[1] = {{&nvmem_param, sizeof(nvmem_param)}};
psa_outvec outvec[1] = {{buffer, size}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 1, outvec, 1);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -225,6 +272,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -238,7 +286,6 @@
int pal_nvmem_write_ns(addr_t base, uint32_t offset, void *buffer, int size)
{
nvmem_param_t nvmem_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
nvmem_param.nvmem_fn_type = NVMEM_WRITE;
@@ -247,6 +294,14 @@
nvmem_param.size = size;
psa_invec invec[2] = {{&nvmem_param, sizeof(nvmem_param)}, {buffer, size}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 2, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -261,6 +316,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_config.h b/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_config.h
index 5dc14f1..7957254 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_config.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2020-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -44,7 +44,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_driver_ipc_intf.c b/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_driver_ipc_intf.c
index 7c3b02f..47768d7 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_driver_ipc_intf.c
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_b1/nspe/pal_driver_ipc_intf.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,7 +24,6 @@
**/
int pal_uart_init_ns(uint32_t uart_base_addr)
{
- psa_handle_t print_handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
uart_fn_type_t uart_fn = UART_INIT;
@@ -32,6 +31,14 @@
{&uart_base_addr, sizeof(uart_base_addr)},
{NULL, 0} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data, 3, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t print_handle = 0;
print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
if (PSA_HANDLE_IS_VALID(print_handle))
{
@@ -46,6 +53,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -59,7 +67,6 @@
{
int string_len = 0;
const char *p = str;
- psa_handle_t print_handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
uart_fn_type_t uart_fn = UART_PRINT;
@@ -73,6 +80,14 @@
{str, string_len+1},
{&data, sizeof(data)} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data1, 3, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t print_handle = 0;
print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
if (PSA_HANDLE_IS_VALID(print_handle))
{
@@ -87,6 +102,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -99,7 +115,6 @@
int pal_wd_timer_init_ns(addr_t base_addr, uint32_t time_us, uint32_t timer_tick_us)
{
wd_param_t wd_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
wd_param.wd_fn_type = WD_INIT_SEQ;
@@ -108,6 +123,15 @@
wd_param.wd_timer_tick_us = timer_tick_us;
psa_invec invec[1] = {{&wd_param, sizeof(wd_param)} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -122,6 +146,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -132,7 +157,6 @@
int pal_wd_timer_enable_ns(addr_t base_addr)
{
wd_param_t wd_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
wd_param.wd_fn_type = WD_ENABLE_SEQ;
@@ -141,6 +165,14 @@
wd_param.wd_timer_tick_us = 0;
psa_invec invec[1] = {{&wd_param, sizeof(wd_param)} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -155,6 +187,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -165,7 +198,6 @@
int pal_wd_timer_disable_ns(addr_t base_addr)
{
wd_param_t wd_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
wd_param.wd_fn_type = WD_DISABLE_SEQ;
@@ -174,6 +206,14 @@
wd_param.wd_timer_tick_us = 0;
psa_invec invec[1] = {{&wd_param, sizeof(wd_param)} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -188,6 +228,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -201,7 +242,6 @@
int pal_nvmem_read_ns(addr_t base, uint32_t offset, void *buffer, int size)
{
nvmem_param_t nvmem_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
nvmem_param.nvmem_fn_type = NVMEM_READ;
@@ -210,7 +250,14 @@
nvmem_param.size = size;
psa_invec invec[1] = {{&nvmem_param, sizeof(nvmem_param)} };
psa_outvec outvec[1] = {{buffer, size} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 1, outvec, 1);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -225,6 +272,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -238,7 +286,6 @@
int pal_nvmem_write_ns(addr_t base, uint32_t offset, void *buffer, int size)
{
nvmem_param_t nvmem_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
nvmem_param.nvmem_fn_type = NVMEM_WRITE;
@@ -246,7 +293,14 @@
nvmem_param.offset = offset;
nvmem_param.size = size;
psa_invec invec[2] = {{&nvmem_param, sizeof(nvmem_param)}, {buffer, size} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 2, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -261,6 +315,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_b1/target.cfg b/api-tests/platform/targets/tgt_ff_tfm_musca_b1/target.cfg
index 2e5ac7f..f9ac826 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_b1/target.cfg
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_b1/target.cfg
@@ -28,11 +28,11 @@
watchdog.0.size = 0xFFF;
watchdog.0.intr_id = 0xFF;
watchdog.0.permission = TYPE_READ_WRITE;
-watchdog.0.num_of_tick_per_micro_sec = 0x3; //(sys_feq/1000000)
-watchdog.0.timeout_in_micro_sec_low = 0xF4240; //1.0 sec : 1 * 1000 * 1000
-watchdog.0.timeout_in_micro_sec_medium = 0x1E8480; //2.0 sec : 2 * 1000 * 1000
-watchdog.0.timeout_in_micro_sec_high = 0x4C4B40; //5.0 sec : 5 * 1000 * 1000
-watchdog.0.timeout_in_micro_sec_crypto = 0x1312D00; //18.0 sec : 18 * 1000 * 1000
+watchdog.0.num_of_tick_per_micro_sec = 0x3; //(sys_feq/1000000)
+watchdog.0.timeout_in_micro_sec_low = 20000000; //20.0 sec : 20 * 1000 * 1000
+watchdog.0.timeout_in_micro_sec_medium = 20000000; //20.0 sec : 20 * 1000 * 1000
+watchdog.0.timeout_in_micro_sec_high = 20000000; //20.0 sec : 20 * 1000 * 1000
+watchdog.0.timeout_in_micro_sec_crypto = 20000000; //20.0 sec : 20 * 1000 * 1000
// Range of 1KB Non-volatile memory to preserve data over reset. Ex, NVRAM and FLASH
nvmem.num =1;
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_config.h b/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_config.h
index d0b8ac0..fc2eed3 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_config.h
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_config.h
@@ -44,7 +44,7 @@
#define CRYPTO_VERSION_BETA3
/* Use hardcoded public key */
-//#define PLATFORM_OVERRIDE_ATTEST_PK
+#define PLATFORM_OVERRIDE_ATTEST_PK
/*
* Include of PSA defined Header files
diff --git a/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_driver_ipc_intf.c b/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_driver_ipc_intf.c
index bcf7ccf..47768d7 100644
--- a/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_driver_ipc_intf.c
+++ b/api-tests/platform/targets/tgt_ff_tfm_musca_s1/nspe/pal_driver_ipc_intf.c
@@ -24,7 +24,6 @@
**/
int pal_uart_init_ns(uint32_t uart_base_addr)
{
- psa_handle_t print_handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
uart_fn_type_t uart_fn = UART_INIT;
@@ -32,6 +31,14 @@
{&uart_base_addr, sizeof(uart_base_addr)},
{NULL, 0} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data, 3, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t print_handle = 0;
print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
if (PSA_HANDLE_IS_VALID(print_handle))
{
@@ -46,6 +53,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -59,7 +67,6 @@
{
int string_len = 0;
const char *p = str;
- psa_handle_t print_handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
uart_fn_type_t uart_fn = UART_PRINT;
@@ -73,6 +80,14 @@
{str, string_len+1},
{&data, sizeof(data)} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data1, 3, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t print_handle = 0;
print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
if (PSA_HANDLE_IS_VALID(print_handle))
{
@@ -87,6 +102,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -99,7 +115,6 @@
int pal_wd_timer_init_ns(addr_t base_addr, uint32_t time_us, uint32_t timer_tick_us)
{
wd_param_t wd_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
wd_param.wd_fn_type = WD_INIT_SEQ;
@@ -108,6 +123,15 @@
wd_param.wd_timer_tick_us = timer_tick_us;
psa_invec invec[1] = {{&wd_param, sizeof(wd_param)} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -122,6 +146,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -132,7 +157,6 @@
int pal_wd_timer_enable_ns(addr_t base_addr)
{
wd_param_t wd_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
wd_param.wd_fn_type = WD_ENABLE_SEQ;
@@ -141,6 +165,14 @@
wd_param.wd_timer_tick_us = 0;
psa_invec invec[1] = {{&wd_param, sizeof(wd_param)} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -155,6 +187,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -165,7 +198,6 @@
int pal_wd_timer_disable_ns(addr_t base_addr)
{
wd_param_t wd_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
wd_param.wd_fn_type = WD_DISABLE_SEQ;
@@ -174,6 +206,14 @@
wd_param.wd_timer_tick_us = 0;
psa_invec invec[1] = {{&wd_param, sizeof(wd_param)} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_WATCHDOG_HANDLE, 0, invec, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_WATCHDOG_SID, DRIVER_WATCHDOG_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -188,6 +228,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -201,7 +242,6 @@
int pal_nvmem_read_ns(addr_t base, uint32_t offset, void *buffer, int size)
{
nvmem_param_t nvmem_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
nvmem_param.nvmem_fn_type = NVMEM_READ;
@@ -210,7 +250,14 @@
nvmem_param.size = size;
psa_invec invec[1] = {{&nvmem_param, sizeof(nvmem_param)} };
psa_outvec outvec[1] = {{buffer, size} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 1, outvec, 1);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -225,6 +272,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
@@ -238,7 +286,6 @@
int pal_nvmem_write_ns(addr_t base, uint32_t offset, void *buffer, int size)
{
nvmem_param_t nvmem_param;
- psa_handle_t handle = 0;
psa_status_t status_of_call = PSA_SUCCESS;
nvmem_param.nvmem_fn_type = NVMEM_WRITE;
@@ -246,7 +293,14 @@
nvmem_param.offset = offset;
nvmem_param.size = size;
psa_invec invec[2] = {{&nvmem_param, sizeof(nvmem_param)}, {buffer, size} };
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 2, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ return PAL_STATUS_ERROR;
+ return PAL_STATUS_SUCCESS;
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -261,6 +315,7 @@
{
return PAL_STATUS_ERROR;
}
+#endif
}
/**
diff --git a/api-tests/tools/cmake/compiler/HOST_GCC.cmake b/api-tests/tools/cmake/compiler/HOST_GCC.cmake
index 35c9d54..2071b12 100644
--- a/api-tests/tools/cmake/compiler/HOST_GCC.cmake
+++ b/api-tests/tools/cmake/compiler/HOST_GCC.cmake
@@ -1,5 +1,5 @@
#/** @file
-# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
+# * Copyright (c) 2019-2021, Arm Limited or its affiliates. All rights reserved.
# * SPDX-License-Identifier : Apache-2.0
# *
# * Licensed under the Apache License, Version 2.0 (the "License");
@@ -50,3 +50,4 @@
set(CMAKE_C_FLAGS "-g -Wall -Werror -Werror -std=c99")
message(STATUS "[PSA] : ${_LNG} compiler used '${CMAKE_${_LNG}_COMPILER}'")
endforeach()
+add_definitions(-DHOST_GCC_MISSING_CRYPTO_1_0=1)
diff --git a/api-tests/tools/utils/README.md b/api-tests/tools/utils/README.md
index a22f14d..01adabe 100644
--- a/api-tests/tools/utils/README.md
+++ b/api-tests/tools/utils/README.md
@@ -4,9 +4,34 @@
Prerequisites :
Python 3.7 with Tkinter Package
-Execution : python log_analysis_tool.py
-
This Directory contain script for analysis of log result.
-It wil take test logs as input and display results in tree format.
-1. By double clicking on TEST it will show detail description of that test.
-2. Right click of the parent node of tree and select summary option it will show summary result of that node.
+Log Analysis Tool wil take test logs as input and display results in tree format. It will show the tests accroding to the APIs.
+
+## How to execute:
+```
+python log_analysis_tool.py
+```
+
+By running the script GUI will be open.
+
+## How to use GUI Tool:
+1. When GUI is opened on top left side Menu option will come.
+
+2. From Menu there will be 3 submenu options.
+ Select Log File: For selecting single test suite log file.
+ Select Log Folder: For selecting folder for multiple test suite files.
+ Exit: For exiting from GUI Tool.
+ Note: While selecting make sure you have only log files in selected folder and not more than one log file for one test suite.
+
+3. The test suite tree node will be generated. User can expand and collapse the nodes.
+
+4. By double clicking on TEST node, it will show detail description of that test on right hand side of window.
+
+5. By right clicking on any node, menu will be open. This menu will contain three options.
+ Summary: Display summary result of the node on the right hand side window.
+ Expand: For expanding all nodes for all level from current expanding level.
+ Collapse: For collapsing all nodes for all level from current collapsing level.
+ Note: The node which has not any leaf nodes will not perform any of right click menu functionality.
+
+
+*Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.*
diff --git a/api-tests/val/nspe/val_dispatcher.c b/api-tests/val/nspe/val_dispatcher.c
index 4a256b9..57de976 100644
--- a/api-tests/val/nspe/val_dispatcher.c
+++ b/api-tests/val/nspe/val_dispatcher.c
@@ -33,7 +33,7 @@
@param - None
@return - None
**/
-static void val_print_api_version(void)
+__attribute__((unused)) static void val_print_api_version(void)
{
#ifdef CRYPTO
val_print(PRINT_ALWAYS, " %d.", PSA_CRYPTO_API_VERSION_MAJOR);
@@ -228,7 +228,7 @@
{
val_print(PRINT_ALWAYS, "\nRunning.. ", 0);
val_print(PRINT_ALWAYS, val_get_comp_name(test_id), 0);
- val_print_api_version();
+ // val_print_api_version();
val_print(PRINT_ALWAYS, "\n******************************************\n", 0);
}
diff --git a/api-tests/val/nspe/val_entry.h b/api-tests/val/nspe/val_entry.h
index b8d6b6f..ba333ef 100644
--- a/api-tests/val/nspe/val_entry.h
+++ b/api-tests/val/nspe/val_entry.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,7 +21,7 @@
#include "val_framework.h"
#define PSA_ACS_MAJOR_VER 1
-#define PSA_ACS_MINOR_VER 1
+#define PSA_ACS_MINOR_VER 2
/**
@brief - PSA Test Suite C main function, does VAL init and calls test dispatcher
diff --git a/api-tests/val/nspe/val_framework.c b/api-tests/val/nspe/val_framework.c
index 9e7df32..ec6b1cc 100644
--- a/api-tests/val/nspe/val_framework.c
+++ b/api-tests/val/nspe/val_framework.c
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2020, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -154,8 +154,14 @@
{
/* Handshake with server tests */
test_info.block_num = i;
+#if STATELESS_ROT == 1
+ status = val_execute_secure_test_func(&handle, test_info,
+ SERVER_TEST_DISPATCHER_HANDLE);
+ handle = (int32_t)SERVER_TEST_DISPATCHER_HANDLE;
+#else
status = val_execute_secure_test_func(&handle, test_info,
SERVER_TEST_DISPATCHER_SID);
+#endif
if (VAL_ERROR(status))
{
val_set_status(RESULT_FAIL(status));
@@ -258,7 +264,12 @@
}
/* switch to secure client */
+#if STATELESS_ROT == 1
+ status = val_execute_secure_test_func(&handle, test_info, CLIENT_TEST_DISPATCHER_HANDLE);
+ handle = (int32_t)CLIENT_TEST_DISPATCHER_HANDLE;
+#else
status = val_execute_secure_test_func(&handle, test_info, CLIENT_TEST_DISPATCHER_SID);
+#endif
if (VAL_ERROR(status))
{
goto exit;
@@ -299,12 +310,25 @@
@param - sid : RoT service to be connected. Partition dispatcher sid
@return - val_status_t
**/
-val_status_t val_execute_secure_test_func(psa_handle_t *handle, test_info_t test_info, uint32_t sid)
+val_status_t val_execute_secure_test_func(__attribute__((unused)) psa_handle_t *handle,
+ test_info_t test_info, uint32_t sid)
{
uint32_t test_data;
val_status_t status = VAL_STATUS_SUCCESS;
psa_status_t status_of_call = PSA_SUCCESS;
+#if STATELESS_ROT == 1
+ test_data = ((uint32_t)(test_info.test_num) | ((uint32_t)(test_info.block_num) << BLOCK_NUM_POS)
+ | ((uint32_t)(TEST_EXECUTE_FUNC) << ACTION_POS));
+ psa_invec data[1] = { {&test_data, sizeof(test_data)} };
+ status_of_call = psa_call(sid, 0, data, 1, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ {
+ status = VAL_STATUS_CALL_FAILED;
+ val_print(PRINT_ERROR, "Call to dispatch SF failed. Status=%x\n", status_of_call);
+ }
+ return status;
+#else
*handle = psa_connect(sid, 1);
if (*handle > 0)
{
@@ -327,6 +351,7 @@
}
return status;
+#endif
}
/**
@@ -352,8 +377,9 @@
status = VAL_STATUS_CALL_FAILED;
val_print(PRINT_ERROR, "Call to dispatch SF failed. Status=%x\n", status_of_call);
}
-
+#if STATELESS_ROT != 1
psa_close(*handle);
+#endif
return status;
}
#endif
diff --git a/api-tests/val/spe/val_partition_common.h b/api-tests/val/spe/val_partition_common.h
index 0b1d6be..f52c340 100644
--- a/api-tests/val/spe/val_partition_common.h
+++ b/api-tests/val/spe/val_partition_common.h
@@ -1,5 +1,5 @@
/** @file
- * Copyright (c) 2018-2019, Arm Limited or its affiliates. All rights reserved.
+ * Copyright (c) 2018-2021, Arm Limited or its affiliates. All rights reserved.
* SPDX-License-Identifier : Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -102,7 +102,7 @@
{
int string_len = 0;
char *p = string;
- psa_handle_t print_handle = 0;
+
psa_status_t status_of_call = PSA_SUCCESS;
val_status_t status = VAL_STATUS_SUCCESS;
uart_fn_type_t uart_fn = UART_PRINT;
@@ -117,8 +117,17 @@
string_len++;
p++;
}
-
psa_invec data1[3] = {{&uart_fn, sizeof(uart_fn)}, {string, string_len+1}, {&data, sizeof(data)}};
+#if STATELESS_ROT == 1
+
+ status_of_call = psa_call(DRIVER_UART_HANDLE, 0, data1, 3, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ {
+ status = VAL_STATUS_CALL_FAILED;
+ }
+ return status;
+#else
+ psa_handle_t print_handle = 0;
print_handle = psa_connect(DRIVER_UART_SID, DRIVER_UART_VERSION);
if (PSA_HANDLE_IS_VALID(print_handle))
@@ -135,6 +144,7 @@
}
psa_close(print_handle);
return status;
+#endif
}
/**
@@ -332,7 +342,12 @@
/* Handshake with server tests */
test_info.block_num = i;
+#if STATELESS_ROT == 1
+ status = val_execute_secure_test_func(&handle, test_info, SERVER_TEST_DISPATCHER_HANDLE);
+ handle = (int32_t)SERVER_TEST_DISPATCHER_HANDLE;
+#else
status = val_execute_secure_test_func(&handle, test_info, SERVER_TEST_DISPATCHER_SID);
+#endif
if (VAL_ERROR(status))
{
val_print(PRINT_ERROR, "[Check %d] START\n", i);
@@ -379,14 +394,26 @@
@param - sid : RoT service to be connected. Partition dispatcher sid
@return - val_status_t
**/
-STATIC_DECLARE val_status_t val_execute_secure_test_func(psa_handle_t *handle,
- test_info_t test_info,
- uint32_t sid)
+STATIC_DECLARE val_status_t val_execute_secure_test_func
+ (__attribute__((unused)) psa_handle_t *handle, test_info_t test_info, uint32_t sid)
{
uint32_t test_data;
val_status_t status = VAL_STATUS_SUCCESS;
psa_status_t status_of_call = PSA_SUCCESS;
+#if STATELESS_ROT == 1
+ test_data = ((uint32_t)(test_info.test_num) | ((uint32_t)(test_info.block_num) << BLOCK_NUM_POS)
+ | ((uint32_t)(TEST_EXECUTE_FUNC) << ACTION_POS));
+ psa_invec data[1] = { {&test_data, sizeof(test_data)} };
+ status_of_call = psa_call(sid, 0, data, 1, NULL, 0);
+
+ if (status_of_call != PSA_SUCCESS)
+ {
+ status = VAL_STATUS_CALL_FAILED;
+ val_print(PRINT_ERROR, "Call to dispatch SF failed. Status=%x\n", status_of_call);
+ }
+ return status;
+#else
*handle = psa_connect(sid, 1);
if (*handle < 0)
@@ -408,6 +435,7 @@
psa_close(*handle);
}
return status;
+#endif
}
/**
@@ -433,8 +461,9 @@
status = VAL_STATUS_CALL_FAILED;
val_print(PRINT_ERROR, "Call to dispatch SF failed. Status=%x\n", status_of_call);
}
-
+#if STATELESS_ROT != 1
psa_close(*handle);
+#endif
return status;
}
@@ -471,7 +500,7 @@
STATIC_DECLARE val_status_t val_nvmem_write(uint32_t offset, void *buffer, int size)
{
nvmem_param_t nvmem_param;
- psa_handle_t handle = 0;
+
psa_status_t status_of_call = PSA_SUCCESS;
val_status_t status = VAL_STATUS_SUCCESS;
memory_desc_t *memory_desc;
@@ -491,6 +520,16 @@
nvmem_param.size = size;
psa_invec invec[2] = {{&nvmem_param, sizeof(nvmem_param)}, {buffer, size}};
+#if STATELESS_ROT == 1
+ status_of_call = psa_call(DRIVER_NVMEM_HANDLE, 0, invec, 2, NULL, 0);
+ if (status_of_call != PSA_SUCCESS)
+ {
+ return VAL_STATUS_CALL_FAILED;
+ }
+ return VAL_STATUS_SUCCESS;
+
+#else
+ psa_handle_t handle = 0;
handle = psa_connect(DRIVER_NVMEM_SID, DRIVER_NVMEM_VERSION);
if (PSA_HANDLE_IS_VALID(handle))
{
@@ -507,6 +546,7 @@
}
psa_close(handle);
return VAL_STATUS_SUCCESS;
+#endif
}
/**
diff --git a/secure-debug/CMakeLists.txt b/secure-debug/CMakeLists.txt
new file mode 100644
index 0000000..8266ccb
--- /dev/null
+++ b/secure-debug/CMakeLists.txt
@@ -0,0 +1,221 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+
+# Set the minimum required version of CMake for the project
+cmake_minimum_required(VERSION 3.10)
+# cmake_policy
+cmake_policy(SET CMP0057 NEW)
+PROJECT (psa_adac_tests)
+
+# Find python interpreter version 3 or greater
+find_package(PythonInterp 3 REQUIRED)
+
+get_filename_component(PSA_ROOT_DIR . ABSOLUTE)
+include(${PSA_ROOT_DIR}/tools/cmake/common/Utils.cmake)
+
+set(CMAKE_C_STANDARD 99)
+set(CMAKE_C_EXTENSIONS Off)
+set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_CXX_EXTENSIONS Off)
+
+if(NOT DEFINED RDDI_LIB)
+ set(DEPENDS_INC_PATH ${CMAKE_SOURCE_DIR}/platform/native/include)
+else()
+ set(DEPENDS_INC_PATH ${CMAKE_SOURCE_DIR}/platform/rddi/include)
+
+ if(WIN32)
+ set(DEPENDS_LIB_PATH ${CMAKE_SOURCE_DIR}/depends/rddi/win_32-x86_64)
+ else()
+ set(DEPENDS_LIB_PATH ${CMAKE_SOURCE_DIR}/depends/rddi/linux-x86_64)
+ endif()
+endif()
+
+if(NOT DEFINED PSA_ADAC_ROOT)
+ get_filename_component(PSA_ADAC_ROOT ${CMAKE_SOURCE_DIR}/psa-adac ABSOLUTE)
+endif()
+include(${PSA_ADAC_ROOT}/cmake/psa_adac.cmake OPTIONAL)
+
+configure_file(${PSA_ADAC_ROOT}/psa-adac/core/include/psa_adac_config.h.in psa_adac_config.h)
+include_directories (
+ ${DEPENDS_INC_PATH}
+ ${CMAKE_BINARY_DIR}
+ ${PSA_ADAC_ROOT}/psa-adac/core/include
+ ${PSA_ADAC_ROOT}/ports/include
+ )
+
+set(MBEDTLS_CONFIG_FILE "${PSA_ADAC_ROOT}/ports/crypto/manager-crypto-config.h")
+add_compile_options(-DMBEDTLS_CONFIG_FILE="${MBEDTLS_CONFIG_FILE}")
+if (UNIX)
+ add_compile_options(-fPIC -fpic)
+else ()
+ # Silence warning about standard C APIs not being secure.
+ add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
+endif ()
+
+# Generate ADAC LIB
+add_subdirectory(${PSA_ADAC_ROOT}/psa-adac/core adac_core)
+add_subdirectory(${PSA_ADAC_ROOT}/psa-adac/sdm adac_sdm)
+add_subdirectory(${PSA_ADAC_ROOT}/ports/crypto/psa-crypto psa_adac_psa_crypto)
+
+set(ADAC_LIBS psa_adac_sdm psa_adac_core psa_adac_psa_crypto mbedcrypto)
+
+if(NOT DEFINED TFM_PROFILE)
+ message(STATUS "[PSA] : Building Default profile")
+list(APPEND PSA_SUITES #PSA_SUITES
+ "ADAC"
+)
+endif()
+
+# list of VERBOSE options
+list(APPEND PSA_VERBOSE_OPTIONS 1 2 3 4 5)
+
+message(STATUS "[PSA] : ----------Process input arguments- start-------------")
+
+# Check for TARGET command line argument
+_check_arguments("TARGET")
+# Check for SUITE command line argument
+_check_arguments("SUITE")
+
+string(TOLOWER ${SUITE} SUITE_LOWER)
+
+# Check for valid targets
+_get_sub_dir_list(PSA_TARGET_LIST ${PSA_ROOT_DIR}/platform)
+if(NOT ${TARGET} IN_LIST PSA_TARGET_LIST)
+ message(FATAL_ERROR "[PSA] : Error: Unsupported value for -DTARGET=${TARGET}, supported targets are : ${PSA_TARGET_LIST}")
+else()
+ message(STATUS "[PSA] : TARGET is set to ${TARGET}")
+endif()
+
+# Check for the presence of required test suite directories
+if(NOT IS_DIRECTORY ${PSA_ROOT_DIR}/tests)
+ message(STATUS "[PSA] : Error: Could not find architecture test suite directories in psa root path ${PSA_ROOT_DIR}")
+endif()
+
+# Check for valid suite cmake argument passed
+if(NOT ${SUITE} IN_LIST PSA_SUITES)
+ message(FATAL_ERROR "[PSA] : Error: Unsupported value for -DSUITE=${SUITE}, select one from supported suites which are : ${PSA_SUITES}")
+else()
+ message(STATUS "[PSA] : SUITE is set to ${SUITE}")
+endif()
+
+# Project variables
+set(ADAC_HOST_VAL_LIB psa_adac_val)
+set(ADAC_HOST_PAL_LIB psa_adac_pal)
+set(TEST_COMBINE_LIB test_combine)
+set(ADAC_HOST_EXE psa_adac_test)
+
+set(PSA_SUITE_DIR ${PSA_ROOT_DIR}/tests/${SUITE_LOWER})
+set(PSA_TESTLIST_GENERATOR ${PSA_ROOT_DIR}/tools/scripts/gen_tests_list.py)
+set(TESTSUITE_DB ${PSA_SUITE_DIR}/testsuite.db)
+set(PSA_TESTLIST_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SUITE_LOWER}_testlist.txt)
+set(PSA_TEST_ENTRY_LIST_INC ${CMAKE_CURRENT_BINARY_DIR}/test_entry_list.inc)
+set(PSA_TEST_ENTRY_FUN_DECLARE_INC ${CMAKE_CURRENT_BINARY_DIR}/test_entry_fn_declare_list.inc)
+
+# Check for VERBOSE
+if(NOT DEFINED VERBOSE)
+ set(VERBOSE 3 CACHE INTERNAL "Default VERBOSE value" FORCE)
+ message(STATUS "[PSA] : Defaulting VERBOSE to ${VERBOSE}")
+else()
+ if(NOT ${VERBOSE} IN_LIST PSA_VERBOSE_OPTIONS)
+ message(FATAL_ERROR "[PSA] : Error: Unsupported value for -DVERBOSE=${VERBOSE}, supported values are : ${PSA_VERBOSE_OPTIONS}")
+ endif()
+ message(STATUS "[PSA] : VERBOSE is set to ${VERBOSE}")
+endif()
+
+if(NOT DEFINED SUITE_TEST_RANGE)
+ set(SUITE_TEST_RANGE_MIN None)
+ set(SUITE_TEST_RANGE_MAX None)
+else()
+ list(LENGTH SUITE_TEST_RANGE SUITE_TEST_RANGE_LENGTH)
+ if(${SUITE_TEST_RANGE_LENGTH} GREATER "2")
+ message(FATAL_ERROR "[PSA] : -DSUITE_TEST_RANGE=<...> value error! accepts two "
+ " numbers in quotes separated with ';'")
+ endif()
+ if(${SUITE_TEST_RANGE_LENGTH} EQUAL "2")
+ list(GET SUITE_TEST_RANGE 0 SUITE_TEST_RANGE_MIN)
+ list(GET SUITE_TEST_RANGE 1 SUITE_TEST_RANGE_MAX)
+ message(STATUS "[PSA] : Testing (${SUITE_TEST_RANGE_MIN}, ${SUITE_TEST_RANGE_MAX}) of ${SUITE} suite")
+ endif()
+ if(${SUITE_TEST_RANGE_LENGTH} EQUAL "1")
+ set(SUITE_TEST_RANGE_MIN ${SUITE_TEST_RANGE})
+ set(SUITE_TEST_RANGE_MAX ${SUITE_TEST_RANGE})
+ message(STATUS "[PSA] : Testing ${SUITE_TEST_RANGE_MIN} of ${SUITE} suite")
+ endif()
+endif()
+
+message(STATUS "[PSA] : ----------Process input arguments- complete-------------")
+
+# Create PSA clean list
+list(APPEND PSA_CLEAN_LIST
+ ${PSA_TESTLIST_FILE}
+ ${PSA_TEST_ENTRY_LIST_INC}
+ ${PSA_TEST_ENTRY_FUN_DECLARE_INC}
+)
+
+# Process testsuite.db
+message(STATUS "[PSA] : Creating testlist.txt 'available at ${PSA_TESTLIST_FILE}'")
+execute_process(COMMAND ${PYTHON_EXECUTABLE} ${PSA_TESTLIST_GENERATOR}
+ ${SUITE_LOWER}
+ ${TESTSUITE_DB}
+ ${PSA_TESTLIST_FILE}
+ ${PSA_TEST_ENTRY_LIST_INC}
+ ${PSA_TEST_ENTRY_FUN_DECLARE_INC}
+ ${SUITE_TEST_RANGE_MIN}
+ ${SUITE_TEST_RANGE_MAX})
+
+# Creating CMake list variable from file
+file(READ ${PSA_TESTLIST_FILE} PSA_TEST_LIST)
+if(NOT PSA_TEST_LIST)
+ message(FATAL_ERROR "[PSA] : Invalid test number!")
+endif()
+string(REGEX REPLACE "\n" ";" PSA_TEST_LIST "${PSA_TEST_LIST}")
+
+# Global macro to identify the PSA test suite cmake build
+add_definitions(-D${SUITE})
+add_definitions(-DVERBOSE=${VERBOSE})
+add_definitions(-D${TARGET})
+
+# Build PAL LIB
+if(NOT DEFINED RDDI_LIB)
+ add_subdirectory(${CMAKE_SOURCE_DIR}/platform/native)
+ set(ADAC_HOST_PAL_LIB platform_native)
+else()
+ add_subdirectory(${CMAKE_SOURCE_DIR}/platform/csapbcom)
+ set(ADAC_HOST_PAL_LIB csapbcom)
+endif()
+
+# Generate VAL LIB
+include(${CMAKE_SOURCE_DIR}/val/val.cmake)
+
+# Build test
+include(${PSA_SUITE_DIR}/suite.cmake)
+
+#add_dependencies(${TEST_COMBINE_LIB} ${ADAC_HOST_VAL_LIB} ${ADAC_HOST_PAL_LIB} ${ADAC_LIBS})
+add_executable(${ADAC_HOST_EXE} ${SUITE_CC_SOURCE})
+target_include_directories(${ADAC_HOST_EXE} PRIVATE
+ ${CMAKE_SOURCE_DIR}/val/include
+ )
+target_link_libraries (${ADAC_HOST_EXE} ${TEST_COMBINE_LIB}
+ ${ADAC_HOST_VAL_LIB}
+ ${ADAC_HOST_PAL_LIB}
+ ${ADAC_LIBS}
+ )
+
+# Include the files for make clean
+foreach(clean_item ${PSA_CLEAN_LIST})
+ set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${clean_item})
+endforeach()
+
diff --git a/secure-debug/README.md b/secure-debug/README.md
new file mode 100644
index 0000000..8947afa
--- /dev/null
+++ b/secure-debug/README.md
@@ -0,0 +1,157 @@
+
+# PSA Secure Debug : Arm ADAC Test Suite
+
+## Introduction
+
+### ADAC Specification
+
+The ADAC specification defines the protocol that allows a target to securely authenticate a debug host. The specification targets software-only layers that sit above the physical debug link.
+
+The ADAC specification can be obtained at [ADAC specification](https://developer.arm.com/documentation/den0101/0000).
+
+### ADAC test suite
+
+The ADAC test suite checks if a device-side implementation conforms to the behavior described in the ADAC specification. The tests are self-checking, portable C-based tests with directed stimulus. The tests are expected to run on the host platform only. The tests drive the commands from the host platform via the debug link and verify the response obtained from the target platform.
+
+The tests are available as open source. The tests and the corresponding abstraction layers are available with an Apache v2.0 license allowing for external contribution.
+
+## Release details
+ - Release Version - 0.5
+ - Code Quality: Alpha <br />
+ The suite is in development. This indicates that the suite contains tests that has not been validated on any hardware platform. Please use this opportunity to suggest enhancements and point out errors.
+
+ - The ADAC tests are written for version Beta of the [ADAC specification](https://developer.arm.com/documentation/den0101/0000).
+ - This test suite is not a substitute for design verification.
+
+## Layers
+
+ADAC tests use a layered software-stack approach to enable porting across different test platforms. The constituents of the layered stack are:
+ - Test suite
+ - Validation Abstraction Layer (VAL)
+ - Platform Abstraction Layer (PAL)
+
+These tests are written on top of Validation Abstraction Layer (VAL) and Platform Abstraction Layer (PAL).
+
+The abstraction layers provide platform information and runtime environment to enable execution of the tests.
+
+In this release, PAL implementation uses unix sockets as the link layer for sending commands and receiving responses.
+
+Partners can also write their own abstraction layer implementations to allow ADAC tests to be run in other host platforms and support the debug link layer.
+
+## Scenarios
+
+The mapping of the rules in the specification to the test cases and the steps followed in the tests are mentioned in the [Scenario document](docs/psa_adac_scenarios.md) present in the docs/ folder.
+
+## Getting started
+
+
+Follow the instructions in the subsequent sections to get a copy of the source code on your local machine and build the tests. <br />
+See User guide document to get details on the steps involved in porting the test suite to your platform.
+This test suite is provided as a separate directory within the psa-arch-tests repository.
+
+### Prerequisites
+
+Before starting the test suite build, ensure that the following requirements are met:
+
+- Host Operating System : Ubuntu 16.04.4, RHEL 7, Windows 10
+- Scripting tools : Python 3.7.1
+- Other open-source tools : GNUARM 6.3.1, GCC 5.4.0 32-Bit (Linux Host), mingw 6.3.0 32-Bit (Windows Host)
+ CMake 3.1 or later
+
+
+## Download source
+To download the master branch of the repository, type the following command:
+
+ git clone https://github.com/ARM-software/psa-arch-tests.git
+
+To download the master branch of the psa-adac repository, type the following command:
+
+ git clone git@github.com:ARMmbed/psa-adac.git
+
+Note:
+ To obtain the access to the psa-adac repository and some of its dependent submodules, Arm Licensees may contact Arm through their partner managers.
+
+
+## Porting steps
+
+Refer to the [Porting Guide](docs/porting_guide_adac_host.md) document for porting steps for your host platform.
+Refer to the [User Guide](docs/Arm_Authenticated_Debug_Access_Control_Test_Suite_User_Guide.pdf) document in the docs folder for additional details.
+
+## Build steps
+
+To build ADAC test suite for a given host platform, execute the following commands: <br/>
+~~~
+ cd psa-arch-tests/secure-debug
+ git clone git@github.com:ARMmbed/psa-adac.git --recurse-submodules
+ mkdir <host_build_dir>
+ cd <host_build_dir>
+ cmake ../ -G<generator-name> -DTARGET=<target-name> -DCOMPILER=<compiler-selection> -DSUITE=<suite-selection>
+ where:
+ - <generator-name> "Unix Makefiles" - to generate Makefiles for Linux and Cygwin
+ "MinGW Makefiles" - to generate Makefiles for cmd.exe on Windows
+ - <target-name> target to build, as created in the platform/board directory
+ - <compiler-selection> GNU
+ Defaults to GNU if not specified
+ - <suite-selection> ADAC - specify the ADAC suite
+
+ To build project
+ cmake --build .
+ To clean
+ cmake --build . -- clean
+
+ For example:
+ cmake ../ -G"Unix Makefiles" -DTARGET=native -DSUITE=ADAC
+ cmake --build .
+~~~
+
+Note:
+ It is recommended to build each different build configurations in separate directories.
+
+### Build output
+The following ADAC test suite build outputs are available under host build directory, as created.
+
+ - psa_adac_test executable
+ - val and platform layer libraries
+
+## Test Suite Execution
+
+The current release provides a reference implementation of ADAC target which communicates with the host platform using unix sockets. In order to execute the test suite, please follow the steps below:
+
+ cd psa-arch-tests/secure-debug/psa-adac
+ make native
+
+To launch the target to run as a server instance, run the target executable in another terminal as shown:
+
+ cd psa-arch-tests/secure-debug/psa-adac
+ ./build/native/Debug/psa_adac_server coms.socket tools/test/resources/chains/chain.EcdsaP256-0
+
+To run the test suite, execute the following command from your host build directory <host_build_dir>:
+
+ ./psa_adac_test ../psa-adac/tools/test/resources/keys/EcdsaP256Key-0.pem \../psa-adac/tools/test/resources/chains/chain.EcdsaP256-0 ../psa-adac/coms.socket
+
+Note:
+ - Please look at the psa-adac directory for details about other target platforms.
+ - The keys and the certificate credentials for a supported cryptosystem can be generated using the tools provided in the psa-adac repository.
+ - The test suite is designed to run once per supported cryptosystem. Partners must ensure that the device must be provisioned with the correct certificates installed in the device's RoT.
+
+
+## Security implication
+
+ADAC test suite may run at higher privilege level. An attacker can utilize these tests to elevate privilege which can potentially reveal the platform secure attests. To prevent such security vulnerabilities into the production system, it is strongly recommended that ADAC test suite is run on development platforms. If it is run on production system, make sure system is scrubbed after running the test suite.
+
+## License
+
+Arm ADAC Architecture test suite is distributed under Apache v2.0 License.
+The psa-adac code repository is distributed under BSD-3-Clause License.
+
+
+## Feedback, contributions, and support
+
+ - For feedback, use the GitHub Issue Tracker that is associated with this repository.
+ - For support, send an email to support-psa-arch-tests@arm.com with details.
+ - Arm licensees can contact Arm directly through their partner managers.
+ - Arm welcomes code contributions through GitHub pull requests.
+
+--------------
+
+*Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.*
diff --git a/secure-debug/depends/rddi/linux-x86_64/README.txt b/secure-debug/depends/rddi/linux-x86_64/README.txt
new file mode 100644
index 0000000..80b9a82
--- /dev/null
+++ b/secure-debug/depends/rddi/linux-x86_64/README.txt
@@ -0,0 +1,6 @@
+This directory should include Linux x86_64 RDDI redistributables.
+
+These can be found in:
+- <Arm DS Install Directory>/sw/debugger/RDDI/redistributables/linux-x86_64/<compiler choice>/rel/
+
+<compiler choice>: Choose a compiler which matches your host system
diff --git a/secure-debug/depends/rddi/win_32-x86_64/README.txt b/secure-debug/depends/rddi/win_32-x86_64/README.txt
new file mode 100644
index 0000000..f78ccd8
--- /dev/null
+++ b/secure-debug/depends/rddi/win_32-x86_64/README.txt
@@ -0,0 +1,12 @@
+This directory should include Windows x86_64 RDDI redistributable and development libraries.
+
+Redistributables can be found in:
+- <Arm DS Install Directory>/sw/debugger/RDDI/redistributables/win_32-x86_64/<compiler choice>/rel/
+
+Development libraries can be found in:
+- <Arm DS Install Directory>/sw/debugger/RDDI/lib/win_32-x86_64/<compiler choice>/rel/
+
+<compiler choice>: Choose a compiler which matches your host system
+ Example compilers:
+ cl-16.00.40219.01 = Microsoft Visual Studio 2010
+ cl-19.00.24215.1 = Microsoft Visual Studio 2015 Update 3
diff --git a/secure-debug/docs/Arm_Authenticated_Debug_Access_Control_Test_Suite_User_Guide.pdf b/secure-debug/docs/Arm_Authenticated_Debug_Access_Control_Test_Suite_User_Guide.pdf
new file mode 100644
index 0000000..532a4ac
--- /dev/null
+++ b/secure-debug/docs/Arm_Authenticated_Debug_Access_Control_Test_Suite_User_Guide.pdf
Binary files differ
diff --git a/secure-debug/docs/porting_guide_adac_host.md b/secure-debug/docs/porting_guide_adac_host.md
new file mode 100644
index 0000000..07f1c03
--- /dev/null
+++ b/secure-debug/docs/porting_guide_adac_host.md
@@ -0,0 +1,36 @@
+
+# Porting Guide: ADAC Test Suite
+-----------------------------------------------------
+
+## Introduction
+The ADAC test suite contains the *Platform Abstraction Layer* (PAL) which abstracts platform-specific information from the tests. You must implement and port the PAL interface functions to your host platform.
+
+This document provides the porting steps and the list of PAL APIs.
+
+## Porting steps
+
+### Adding a new target
+
+ 1. Create a new directory in **platform/<platform_name>**. For reference, see the existing platform **native** directory.
+ 2. Execute `cp -rf platform/native/ platform/<platform_name>/`.
+ 3. Update **platform/<platform_name>/CMakeLists.txt** appropriately to select the correct instances of PAL files for compilation.
+ 4. Refer to the **List of PAL APIs** section to view the list of PAL APIs that must be ported for your target platform. These API definitions are available in **val/include/pal_interfaces.h**. These APIs are written for native target platform. You can reuse the code if it works for your platform. Otherwise, you must port them for your platform-specific peripherals.
+ 5. The main.c requires path to the key and certificate chain that point to the host credentials. This must be provided as command-line arguments. You can provide debug link layer specific parameters as additional command-line arguments.
+ 6. If you want to use a pre-built debug communication interface, create a new directory under the depends directory and list your shared libraries within it. A placeholder for RDDI libraries is provided. You can then link these libraries to your platform.
+
+## List of PAL APIs
+Since the test suite is agnostic to various system platforms, you must port the following PAL APIs before building the tests. Implement these functions for your host platform. <br/>
+
+| No | Prototype | Description | Parameters |
+|----|-------------------------------------------------------|-----------------------------------------------------------------------------|-------------------------------------------------------------------------|
+| 01 | int pal_print(char *str, int32_t data); | Parses the input string and writes bytes into the message interface | str : Input String<br/>data : Value for format specifier<br/> |
+| 02 | int request_packet_send(request_packet_t *packet); | Writes the ADAC command frame into the communication buffer for transmit | request packet<br/> |
+| 03 | response_packet_t *response_packet_receive(); | Reads the ADAC command response from the communication buffer | None<br/> |
+| 04 | int pal_system_reset(void) | Resets the system and disconnects from device | None |
+
+## License
+Arm PSA test suite is distributed under Apache v2.0 License.
+
+--------------
+
+*Copyright (c) 2021 Arm Limited and Contributors. All rights reserved.*
diff --git a/secure-debug/docs/psa_adac_scenarios.md b/secure-debug/docs/psa_adac_scenarios.md
new file mode 100644
index 0000000..8d8fcae
--- /dev/null
+++ b/secure-debug/docs/psa_adac_scenarios.md
@@ -0,0 +1,28 @@
+# PSA ADAC Scenarios
+
+| Scenario ID | Section | Description | Test Cases |
+|-------------|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|
+| S_ADAC_001 | Commands | Verify that the following commands are recognized by the target and do not return SDP_INVALID_COMMAND status.<br />1. Discovery<br/>2. Authentication Start<br\>3. Authentication Response<br/>4. Close Session<br/>5. Lock Debug<br/> | TBD <br/> |
+| S_ADAC_002 | Commands | Send two authentication start commands back-to-back and verify that the challenge vector obtained in the response is different. | test_a001 <br/> |
+| S_ADAC_003 | Commands | Use discovery command to query the target for supported response fragment formats. Check that the following response fragments are supported: <br\>1. 0x200 token_adac<br\>2. 0x201 cert_adac<br\>| TBD <br/> |
+| S_ADAC_004 | Commands | Issue invalid response fragment as part of Authentication response and check that the target responds with SDP_FAILURE status.| TBD <br/> |
+| S_ADAC_005 | Commands | Issue a different command after starting the Authentication response command and check that the target responds with SDP_FAILURE status. | TBD <br/> |
+| S_ADAC_006 | Commands | Verify that for a multiple fragment Authentication response request, the device responds with a SDP_MORE_DATA_NEEDED status code after each response fragment.| TBD <br/> |
+| S_ADAC_007 | Commands | Check that the Close Session command always returns a SDP_SUCCESS status.| TBD <br/> |
+| S_ADAC_008 | Constraints| Provide a leaf certificate before a root certificate and verify that an error response is generated by the target.| TBD <br/> |
+| S_ADAC_009 | Constraints| Check that a certificate is rejected due to each of the following scope-limiting feature:1. Role<br/>2. Lifecycle<br/>| TBD <br/> |
+| S_ADAC_010 | Constraints| Check that if two or more distinct non-neutral values are present in the certificate chain, a failure response is obtained.| TBD <br/> |
+| S_ADAC_011 | Constraints| Request a permission value (perm_req) via authentication token which is denied due to a restrictive perm_mask field. Check that the authentication response is successful.| TBD <br/> |
+| S_ADAC_012 | Constraints| Request access to software partition with no software partition ID listed in the certificate chain. Check that success status is reported.| TBD <br/> |
+
+## Note
+
+1. The list of identified scenarios are not exhaustive and is subject to change.<br/>
+2. Some of the listed scenarios could be descoped or classified as testing limitation.<br />
+
+# License
+Arm PSA test suite is distributed under Apache v2.0 License.
+
+--------------
+
+*Copyright (c) 2021 Arm Limited and Contributors. All rights reserved.*
diff --git a/secure-debug/platform/native/CMakeLists.txt b/secure-debug/platform/native/CMakeLists.txt
new file mode 100644
index 0000000..a517d01
--- /dev/null
+++ b/secure-debug/platform/native/CMakeLists.txt
@@ -0,0 +1,31 @@
+#/** @file
+# * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+
+# Set the minimum required version of CMake for the project
+cmake_minimum_required(VERSION 3.10)
+PROJECT (platform_native)
+
+include_directories(
+ ${CMAKE_SOURCE_DIR}/platform/native/include
+ )
+
+add_library(platform_native STATIC)
+target_sources(platform_native PUBLIC
+ ${CMAKE_SOURCE_DIR}/platform/native/src/pal_interfaces.c
+ ${CMAKE_SOURCE_DIR}/platform/native/src/unix_msg.c
+ ${CMAKE_SOURCE_DIR}/platform/native/src/main.c
+ )
+target_link_libraries(platform_native mbedcrypto)
diff --git a/secure-debug/platform/native/include/pal_common.h b/secure-debug/platform/native/include/pal_common.h
new file mode 100644
index 0000000..c88dcf5
--- /dev/null
+++ b/secure-debug/platform/native/include/pal_common.h
@@ -0,0 +1,37 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+#ifndef _PAL_COMMON_H_
+#define _PAL_COMMON_H_
+#include <platform.h>
+#include <stddef.h>
+/**
+ * @brief - Initialise the host-side channel for communication with device.
+ * @param - ctx Hook for platform-specific descriptor
+ * buffer Pointer to memory used for TX/RX
+ * buffer_size Size of allocated memory for TX/RX
+ * @return - SUCCESS/FAILURE
+**/
+int msg_interface_init(void *ctx, uint8_t buffer[], size_t size);
+
+/**
+ * @brief - Release the host-side channel for communication with device.
+ * @param - ctx Hook for platform-specific descriptor
+ * @return - SUCCESS/FAILURE
+**/
+int msg_interface_free(void *ctx);
+
+#endif
diff --git a/secure-debug/platform/native/include/platform.h b/secure-debug/platform/native/include/platform.h
new file mode 100644
index 0000000..2df84d9
--- /dev/null
+++ b/secure-debug/platform/native/include/platform.h
@@ -0,0 +1,37 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#ifndef PSA_ADAC_PLATFORM_H
+#define PSA_ADAC_PLATFORM_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+#ifdef PSA_ADAC_PLATFORM_CONFIG_FILE
+#include PSA_ADAC_PLATFORM_CONFIG_FILE
+#else
+#include <psa_adac_platform.h>
+#endif
+
+#ifndef PSA_ADAC_PLATFORM_BANNER
+#define PSA_ADAC_PLATFORM_BANNER "PSA ADAC "
+#endif
+
+void platform_init(void);
+void psa_adac_platform_init(void);
+
+#endif //PSA_ADAC_PLATFORM_H
diff --git a/secure-debug/platform/native/include/psa_adac_platform.h b/secure-debug/platform/native/include/psa_adac_platform.h
new file mode 100644
index 0000000..5e4e272
--- /dev/null
+++ b/secure-debug/platform/native/include/psa_adac_platform.h
@@ -0,0 +1,23 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#ifndef PSA_ADAC_NATIVE_PSA_ADAC_PLATFORM_H
+#define PSA_ADAC_NATIVE_PSA_ADAC_PLATFORM_H
+
+#define PSA_ADAC_MANAGER_IMPLICIT_TRANSPORT
+
+#endif //PSA_ADAC_NATIVE_PSA_ADAC_PLATFORM_H
diff --git a/secure-debug/platform/native/include/unix_msg.h b/secure-debug/platform/native/include/unix_msg.h
new file mode 100644
index 0000000..a21a165
--- /dev/null
+++ b/secure-debug/platform/native/include/unix_msg.h
@@ -0,0 +1,41 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#ifndef PSA_ADAC_UNIX_MSG_H
+#define PSA_ADAC_UNIX_MSG_H
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#if !defined(_MSC_VER)
+#include <sys/types.h>
+#else // !defined(_MSC_VER)
+#include <BaseTsd.h>
+typedef SSIZE_T ssize_t;
+#endif // !defined(_MSC_VER)
+
+bool unix_socket_init(void);
+
+int unix_socket_server(const char *path);
+int unix_socket_client(const char *path);
+
+void unix_socket_close(int fd);
+
+ssize_t nwrite(int fd, const uint8_t *buf, size_t count);
+ssize_t nread(int fd, uint8_t *buf, size_t count);
+
+#endif //PSA_ADAC_UNIX_MSG_H
diff --git a/secure-debug/platform/native/src/main.c b/secure-debug/platform/native/src/main.c
new file mode 100644
index 0000000..86c563f
--- /dev/null
+++ b/secure-debug/platform/native/src/main.c
@@ -0,0 +1,57 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "pal_common.h"
+#include "unix_msg.h"
+
+int32_t val_entry(void);
+
+/**
+ @brief - PSA C main function, used for generating host-side test binaries.
+ @param - argc : the number of command line arguments.
+ argv : array containing command line arguments.
+ @return - error status
+**/
+extern uint8_t buffer[4096];
+uint8_t buffer[4096];
+char *key_file, *chain_file;
+
+int main(int argc, char *argv[])
+{
+ if (argc < 4) {
+ printf("Usage:\n\tpsa_adac_test <keyfile> <chainfile> <socket>\n\n");
+ exit(-1);
+ }
+
+ key_file = argv[1];
+ chain_file = argv[2];
+ char *socket_path = argv[3];
+ int fd;
+
+ fd = unix_socket_client(socket_path);
+ if (-1 == fd)
+ exit(-1);
+
+ msg_interface_init((void *) &fd, buffer, sizeof(buffer));
+
+ return val_entry();
+
+ msg_interface_free(NULL);
+ return 0;
+}
diff --git a/secure-debug/platform/native/src/pal_interfaces.c b/secure-debug/platform/native/src/pal_interfaces.c
new file mode 100644
index 0000000..9c33a5a
--- /dev/null
+++ b/secure-debug/platform/native/src/pal_interfaces.c
@@ -0,0 +1,245 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#include <psa_adac.h>
+#include <psa_adac_debug.h>
+#include "unix_msg.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if !defined(_MSC_VER)
+ #include <unistd.h>
+#else // !defined(_MSC_VER)
+ #include <io.h>
+
+ // Disable warning about POSIX function names.
+ #pragma warning(disable : 4996)
+#endif // !defined(_MSC_VER)
+
+int static_buffer_msg_init(uint8_t *buffer, size_t size);
+int static_buffer_msg_release(void);
+
+#define PAL_STATUS_UNSUPPORTED_FUNC 0xFF
+
+typedef enum {
+ PAL_STATUS_SUCCESS = 0x0,
+ PAL_STATUS_ERROR = 0x80
+} pal_status_t;
+
+enum {
+ BUFFER_UNINITIALIZED = 0,
+ BUFFER_EMPTY,
+ BUFFER_REQUEST,
+ BUFFER_RESPONSE
+};
+static size_t static_buffer_size;
+static uint8_t *static_buffer_pointer;
+static uint8_t static_buffer_status = BUFFER_UNINITIALIZED;
+static int _fd;
+
+
+int pal_print(const char *str, int32_t data)
+{
+ if (printf(str, data) < 0)
+ {
+ return PAL_STATUS_ERROR;
+ }
+ return PAL_STATUS_SUCCESS;
+}
+
+void pal_terminate_simulation(void)
+{
+ ;
+}
+
+int pal_system_reset(void)
+{
+ return PAL_STATUS_UNSUPPORTED_FUNC;
+}
+
+int static_buffer_msg_init(uint8_t *buffer, size_t size)
+{
+ int ret = -1;
+
+ if (static_buffer_status == BUFFER_UNINITIALIZED) {
+ static_buffer_size = size;
+ static_buffer_pointer = buffer;
+ static_buffer_status = BUFFER_EMPTY;
+ ret = 0;
+ }
+ return ret;
+}
+
+int static_buffer_msg_release(void)
+{
+ int ret = -1;
+
+ if (static_buffer_status == BUFFER_EMPTY) {
+ static_buffer_size = 0;
+ static_buffer_pointer = NULL;
+ static_buffer_status = BUFFER_UNINITIALIZED;
+ ret = 0;
+ }
+ return ret;
+}
+
+request_packet_t *request_packet_build(uint16_t command, uint8_t *data, size_t data_size)
+{
+ request_packet_t *request = NULL;
+
+ if ((static_buffer_status == BUFFER_EMPTY) &&
+ (data_size <= (static_buffer_size - sizeof(request_packet_t)))) {
+ request = (request_packet_t *) static_buffer_pointer;
+ request->command = command;
+ request->data_count = data_size / 4UL;
+ (void) memcpy((void *) request->data, (void *) data, data_size);
+ static_buffer_status = BUFFER_REQUEST;
+ }
+ return request;
+}
+
+request_packet_t *request_packet_lock(size_t *max_data_size)
+{
+ request_packet_t *request = NULL;
+
+ if (static_buffer_status == BUFFER_EMPTY) {
+ if (max_data_size != NULL)
+ *max_data_size = static_buffer_size - sizeof(response_packet_t);
+
+ request = (request_packet_t *) static_buffer_pointer;
+ static_buffer_status = BUFFER_REQUEST;
+ }
+ return request;
+}
+
+int request_packet_release(request_packet_t *packet)
+{
+ int ret = -1;
+
+ if (static_buffer_status == BUFFER_REQUEST) {
+ static_buffer_status = BUFFER_EMPTY;
+ ret = 0;
+ }
+ return ret;
+}
+
+response_packet_t *response_packet_lock(size_t *max_data_size)
+{
+ response_packet_t *response = NULL;
+
+ if (static_buffer_status == BUFFER_EMPTY) {
+ if (max_data_size != NULL)
+ *max_data_size = static_buffer_size - sizeof(response_packet_t);
+
+ response = (response_packet_t *) static_buffer_pointer;
+ static_buffer_status = BUFFER_RESPONSE;
+ }
+ return response;
+}
+
+int response_packet_release(response_packet_t *packet)
+{
+ int ret = -1;
+
+ if (static_buffer_status == BUFFER_RESPONSE) {
+ static_buffer_status = BUFFER_EMPTY;
+ ret = 0;
+ }
+ return ret;
+}
+
+int msg_interface_init(void *ctx, uint8_t buffer[], size_t buffer_size)
+{
+ unix_socket_init();
+
+ if (ctx == NULL)
+ return -1;
+
+ _fd = *((int *) ctx);
+ return static_buffer_msg_init(buffer, buffer_size);
+}
+
+int msg_interface_free(void *ctx)
+{
+ unix_socket_close(_fd);
+ _fd = -1;
+ return static_buffer_msg_release();
+}
+
+static int message_receive(int fd, uint8_t buffer[], size_t max, size_t *size)
+{
+ if (nread(fd, buffer, sizeof(request_packet_t)) != sizeof(request_packet_t)) {
+ PSA_ADAC_LOG_ERR("transport_unix", "Error receiving message header\n");
+ return -1;
+ }
+ request_packet_t *p = (request_packet_t *) buffer;
+
+ if (4 + p->data_count * 4 > max) {
+ PSA_ADAC_LOG_ERR("transport_unix", "Message would overflow buffer (%d > %d)\n",
+ 4 + p->data_count * 4, (int) max);
+ return -1;
+ }
+ if (p->data_count) {
+ if (nread(fd, (uint8_t *) p->data, p->data_count * 4) != p->data_count * 4) {
+ PSA_ADAC_LOG_ERR("transport_unix", "Error receiving message body\n");
+ return -1;
+ }
+ }
+ //PSA_ADAC_LOG_DUMP("msg", "receive", buffer, 4 + p->data_count * 4);
+ return 0;
+}
+
+static int message_send(int fd, uint8_t buffer[], size_t size)
+{
+ //PSA_ADAC_LOG_DUMP("msg", "send", buffer, size);
+ return nwrite(fd, (uint8_t *) buffer, size) == size ? 0 : -1;
+}
+
+int request_packet_send(request_packet_t *packet)
+{
+ if (packet == NULL)
+ return -1;
+
+ size_t size = sizeof(request_packet_t) + 4 * packet->data_count;
+
+ return message_send(_fd, (uint8_t *) packet, size);
+}
+
+response_packet_t *response_packet_receive()
+{
+ size_t max = 0;
+ response_packet_t *r = response_packet_lock(&max);
+
+ if (r != NULL) {
+ if (message_receive(_fd, (uint8_t *) r, max, NULL) == 0)
+ return r;
+
+ PSA_ADAC_LOG_ERR("transport_unix", "Error Receiving Response");
+ response_packet_release(r);
+ } else {
+ PSA_ADAC_LOG_ERR("transport_unix", "Error Locking Response");
+ }
+ return NULL;
+}
+
+void psa_adac_platform_init(void)
+{
+ ;
+}
+
diff --git a/secure-debug/platform/native/src/unix_msg.c b/secure-debug/platform/native/src/unix_msg.c
new file mode 100644
index 0000000..9a6e301
--- /dev/null
+++ b/secure-debug/platform/native/src/unix_msg.c
@@ -0,0 +1,156 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#include "unix_msg.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#if !defined(_MSC_VER)
+ #include <unistd.h>
+ #include <sys/socket.h>
+ #include <sys/un.h>
+#else // !defined(_MSC_VER)
+ #include <WinSock2.h>
+ #include <afunix.h>
+ #include <io.h>
+
+ // Disable warning about POSIX function names.
+ #pragma warning(disable : 4996)
+#endif // !defined(_MSC_VER)
+
+void unix_socket_close(int fd)
+{
+ if (fd != -1) {
+#if defined(_MSC_VER)
+ closesocket(fd);
+#else
+ close(fd);
+#endif
+ }
+}
+
+bool unix_socket_init(void)
+{
+#if defined(_MSC_VER)
+ static bool did_init_winsock;
+
+ did_init_winsock = false;
+ if (!did_init_winsock) {
+ WSADATA wsa_data = { 0 };
+
+ int result = WSAStartup(MAKEWORD(2, 2), &wsa_data);
+
+ if (result != 0) {
+ printf("WSAStartup failed with error: %d\n", result);
+ return false;
+ }
+ }
+#endif
+ return true;
+}
+
+int unix_socket_server(const char *path)
+{
+ struct sockaddr_un addr;
+ int fd;
+
+ fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (fd == -1) {
+ perror("Error while calling socket()");
+ goto error;
+ }
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
+
+ if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) != 0) {
+ perror("Error while calling bind()");
+ goto error;
+ }
+
+ if (listen(fd, 1) == -1) {
+ perror("Error while calling listen()");
+ goto error;
+ }
+ return fd;
+
+error:
+ unix_socket_close(fd);
+ return -1;
+}
+
+int unix_socket_client(const char *path)
+{
+ struct sockaddr_un addr;
+ int fd;
+
+ fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (fd == -1) {
+ perror("Error while calling socket()");
+ goto error;
+ }
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
+
+ if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
+ perror("Error while calling connect()");
+ goto error;
+ }
+ return fd;
+
+error:
+ unix_socket_close(fd);
+ return -1;
+}
+
+ssize_t nwrite(int fd, const uint8_t *buf, size_t count)
+{
+ const char *ptr = (const char *) buf;
+ ssize_t t;
+ size_t left = count;
+
+ while (left) {
+ t = send(fd, ptr, left, 0);
+ if (t < 0)
+ return -1;
+ left -= t;
+ ptr += t;
+ }
+ return count;
+}
+
+ssize_t nread(int fd, uint8_t *buf, size_t count)
+{
+ char *ptr = (char *) buf; /* Removes warning on pointer operation */
+ ssize_t t = 0;
+ size_t left = count;
+
+ while (left) {
+ t = recv(fd, ptr, left, 0);
+ if (t < 0)
+ return -1;
+ left -= t;
+ ptr += t;
+ }
+ return count;
+}
diff --git a/secure-debug/tests/adac/suite.cmake b/secure-debug/tests/adac/suite.cmake
new file mode 100644
index 0000000..167d305
--- /dev/null
+++ b/secure-debug/tests/adac/suite.cmake
@@ -0,0 +1,41 @@
+#/** @file
+# * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+foreach(test ${PSA_TEST_LIST})
+ include(${PSA_SUITE_DIR}/${test}/test.cmake)
+ foreach(source_file ${CC_SOURCE})
+ list(APPEND SUITE_CC_SOURCE
+ ${PSA_SUITE_DIR}/${test}/${source_file}
+ )
+ endforeach()
+ unset(CC_SOURCE)
+endforeach()
+
+add_definitions(${CC_OPTIONS})
+add_library(${TEST_COMBINE_LIB} STATIC ${SUITE_CC_SOURCE})
+
+# Test related Include directories
+foreach(test ${PSA_TEST_LIST})
+ target_include_directories(${TEST_COMBINE_LIB} PRIVATE ${PSA_SUITE_DIR}/${test})
+endforeach()
+
+target_include_directories(${TEST_COMBINE_LIB} PRIVATE
+ ${CMAKE_BINARY_DIR}
+ ${PSA_ROOT_DIR}/val/include
+ ${PSA_ROOT_DIR}/platform/${TARGET}/include
+)
+target_link_libraries(${TEST_COMBINE_LIB} mbedcrypto)
diff --git a/secure-debug/tests/adac/test_a001/test.cmake b/secure-debug/tests/adac/test_a001/test.cmake
new file mode 100644
index 0000000..c38649e
--- /dev/null
+++ b/secure-debug/tests/adac/test_a001/test.cmake
@@ -0,0 +1,21 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+list(APPEND CC_SOURCE
+ test_a001.c
+)
+list(APPEND CC_OPTIONS )
diff --git a/secure-debug/tests/adac/test_a001/test_a001.c b/secure-debug/tests/adac/test_a001/test_a001.c
new file mode 100644
index 0000000..66f878e
--- /dev/null
+++ b/secure-debug/tests/adac/test_a001/test_a001.c
@@ -0,0 +1,86 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#include <psa_adac.h>
+#include <val_adac.h>
+#include "val_interfaces.h"
+
+#include "test_a001.h"
+
+#define TEST_NUM VAL_CREATE_TEST_ID(VAL_SECURE_DEBUG_BASE, 1)
+#define TEST_DESC "Testing ADAC Protocol Host API| UT: psa_challenge\n"
+TEST_PUBLISH(TEST_NUM, test_entry);
+
+void test_entry(val_api_t *val_api)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ val_api_t *val = NULL;
+
+ val = val_api;
+
+ /* test init */
+ val->test_init(TEST_NUM, TEST_DESC);
+ val_adac_host_init();
+
+ uint8_t challenge1[CHALLENGE_SIZE], challenge2[CHALLENGE_SIZE], i;
+
+ request_packet_t *request;
+ response_packet_t *response;
+
+ if (PSA_SUCCESS != val_issue_command(SDP_AUTH_START_CMD, request, NULL, 0))
+ goto test_fail_exit;
+
+ response = val_await_response();
+ if (PSA_SUCCESS != val_parse_response(SDP_AUTH_START_CMD, response))
+ goto test_fail_exit;
+
+ psa_auth_challenge_t *challenge = (psa_auth_challenge_t *) response->data;
+
+ *challenge1 = (uint8_t)(challenge->challenge_vector);
+ response_packet_release(response);
+
+ if (PSA_SUCCESS != val_issue_command(SDP_AUTH_START_CMD, request, NULL, 0))
+ goto test_fail_exit;
+
+ response = val_await_response();
+ if (PSA_SUCCESS != val_parse_response(SDP_AUTH_START_CMD, response))
+ goto test_fail_exit;
+
+ challenge = (psa_auth_challenge_t *) response->data;
+
+ *challenge2 = (uint8_t)(challenge->challenge_vector);
+ response_packet_release(response);
+
+ for (i = 0; i < CHALLENGE_SIZE; i++) {
+ if (challenge1[i] != challenge2[i])
+ break;
+ }
+
+ if (i == CHALLENGE_SIZE) {
+ val->print(PRINT_ERROR, "Challenge response obtained is not unique\n", 0);
+ goto test_fail_exit;
+ } else {
+ val->print(PRINT_INFO, "Challenge response obtained is unique\n", 0);
+ goto test_end;
+ }
+
+test_fail_exit:
+ val_set_status(RESULT_FAIL(VAL_STATUS_TEST_FAILED));
+test_end:
+ val->test_exit();
+}
+
diff --git a/secure-debug/tests/adac/test_a001/test_a001.h b/secure-debug/tests/adac/test_a001/test_a001.h
new file mode 100644
index 0000000..5212fed
--- /dev/null
+++ b/secure-debug/tests/adac/test_a001/test_a001.h
@@ -0,0 +1,26 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+#ifndef _TEST_A001_TESTS_H_
+#define _TEST_A001_TESTS_H_
+
+#define test_entry CONCAT(test_entry_, a001)
+
+extern val_api_t *val;
+extern char *key_file;
+extern char *chain_file;
+
+#endif /* _TEST_A001_TESTS_H_ */
diff --git a/secure-debug/tests/adac/test_a002/test.cmake b/secure-debug/tests/adac/test_a002/test.cmake
new file mode 100644
index 0000000..c6318e9
--- /dev/null
+++ b/secure-debug/tests/adac/test_a002/test.cmake
@@ -0,0 +1,21 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+list(APPEND CC_SOURCE
+ test_a002.c
+)
+list(APPEND CC_OPTIONS )
diff --git a/secure-debug/tests/adac/test_a002/test_a002.c b/secure-debug/tests/adac/test_a002/test_a002.c
new file mode 100644
index 0000000..dabbc34
--- /dev/null
+++ b/secure-debug/tests/adac/test_a002/test_a002.c
@@ -0,0 +1,124 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#include <psa_adac.h>
+#include <val_adac.h>
+#include "val_interfaces.h"
+
+#include "test_a002.h"
+
+#define TEST_NUM VAL_CREATE_TEST_ID(VAL_SECURE_DEBUG_BASE, 2)
+#define TEST_DESC "Testing ADAC Protocol Host API| UT: psa_connect\n"
+TEST_PUBLISH(TEST_NUM, test_entry);
+
+void test_entry(val_api_t *val_api)
+{
+ int32_t status = VAL_STATUS_SUCCESS;
+ val_api_t *val = NULL;
+
+ val = val_api;
+
+ /* test init */
+ val->test_init(TEST_NUM, TEST_DESC);
+ val_adac_host_init();
+
+ uint8_t *chain = NULL;
+ size_t chain_size = 0;
+
+ if (PSA_SUCCESS != val_load_certificate_chain(chain_file, &chain, &chain_size))
+ goto test_fail_exit;
+
+ psa_tlv_t *exts[MAX_EXTENSIONS];
+ size_t exts_count = 0;
+ uint8_t key_type;
+
+ if (PSA_SUCCESS != val_infer_cryptosystem((uint32_t *) chain, chain_size, exts,
+ &exts_count, &key_type)) {
+ goto test_fail_exit;
+ }
+
+ request_packet_t *request;
+
+ if (PSA_SUCCESS != val_issue_command(SDP_DISCOVERY_CMD, request, NULL, 0))
+ goto test_fail_exit;
+
+ response_packet_t *response;
+
+ response = val_await_response();
+ if (PSA_SUCCESS != val_parse_response(SDP_DISCOVERY_CMD, response))
+ goto test_fail_exit;
+
+ if (!val_check_cryptosystem_support(response, key_type))
+ goto test_fail_exit;
+
+ response_packet_release(response);
+
+ psa_key_handle_t handle;
+ uint8_t *key = NULL;
+ size_t key_size = 0;
+
+ if (PSA_SUCCESS != val_get_private_key(key_file, &key_type, &handle, &key, &key_size))
+ goto test_fail_exit;
+
+ if (PSA_SUCCESS != val_issue_command(SDP_AUTH_START_CMD, request, NULL, 0))
+ goto test_fail_exit;
+
+ response = val_await_response();
+ if (PSA_SUCCESS != val_parse_response(SDP_AUTH_START_CMD, response))
+ goto test_fail_exit;
+
+ psa_auth_challenge_t *challenge = (psa_auth_challenge_t *) response->data;
+
+ uint8_t *token = NULL;
+ size_t token_size = 0;
+
+ if (PSA_SUCCESS != val_sign_token(challenge->challenge_vector,
+ sizeof(challenge->challenge_vector),
+ key_type, NULL, 0, &token, &token_size,
+ handle, key, key_size)) {
+ goto test_fail_exit;
+ }
+ response_packet_release(response);
+
+ if (PSA_SUCCESS != val_send_certificate(exts, exts_count))
+ goto test_fail_exit;
+
+ val->print(PRINT_INFO, "Sending token\n", 0);
+ if (PSA_SUCCESS != val_issue_command(SDP_AUTH_RESPONSE_CMD, request,
+ (uint8_t *)token, token_size)) {
+ goto test_fail_exit;
+ }
+
+ val->print(PRINT_INFO, "Receiving token_authentication response\n", 0);
+ response = val_await_response();
+ if (PSA_SUCCESS != val_parse_response(SDP_AUTH_RESPONSE_CMD, response))
+ goto test_fail_exit;
+
+ if (response->status == SDP_SUCCESS)
+ val->print(PRINT_INFO, "Target unlocked successfully\n", 0);
+ else
+ goto test_fail_exit;
+
+ response_packet_release(response);
+ goto test_end;
+
+test_fail_exit:
+ val_set_status(RESULT_FAIL(VAL_STATUS_TEST_FAILED));
+test_end:
+ val->test_exit();
+}
+
diff --git a/secure-debug/tests/adac/test_a002/test_a002.h b/secure-debug/tests/adac/test_a002/test_a002.h
new file mode 100644
index 0000000..da5f094
--- /dev/null
+++ b/secure-debug/tests/adac/test_a002/test_a002.h
@@ -0,0 +1,26 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+#ifndef _TEST_A002_TESTS_H_
+#define _TEST_A002_TESTS_H_
+
+#define test_entry CONCAT(test_entry_, a002)
+
+extern val_api_t *val;
+extern char *key_file;
+extern char *chain_file;
+
+#endif /* _TEST_A002_TESTS_H_ */
diff --git a/secure-debug/tests/adac/testsuite.db b/secure-debug/tests/adac/testsuite.db
new file mode 100644
index 0000000..9695860
--- /dev/null
+++ b/secure-debug/tests/adac/testsuite.db
@@ -0,0 +1,26 @@
+#/** @file
+# * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+
+#List of tests to be compiled and run as part of initial_attestation suite
+
+(START)
+
+test_a001
+test_a002
+
+(END)
diff --git a/secure-debug/tools/cmake/common/CMakeSettings.cmake b/secure-debug/tools/cmake/common/CMakeSettings.cmake
new file mode 100644
index 0000000..e709dc0
--- /dev/null
+++ b/secure-debug/tools/cmake/common/CMakeSettings.cmake
@@ -0,0 +1,25 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+#Stop built in CMakeDetermine<lang>.cmake scripts to run.
+set (CMAKE_C_COMPILER_ID_RUN 1)
+#Stop cmake run compiler tests.
+set (CMAKE_C_COMPILER_FORCED true)
+
+set(CMAKE_STATIC_LIBRARY_PREFIX "")
+set(CMAKE_STATIC_LIBRARY_SUFFIX ".a")
+set(CMAKE_SHARED_LIBRARY_SUFFIX "")
diff --git a/secure-debug/tools/cmake/common/Utils.cmake b/secure-debug/tools/cmake/common/Utils.cmake
new file mode 100644
index 0000000..6013fef
--- /dev/null
+++ b/secure-debug/tools/cmake/common/Utils.cmake
@@ -0,0 +1,37 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+# Function to CMake arguments
+function(_check_arguments)
+ foreach(_ARG IN LISTS ARGV)
+ if(NOT DEFINED ${_ARG})
+ message(FATAL_ERROR "[PSA] : ${_ARG} is not passed! Please specify -D${_ARG}=<...> to CMake.")
+ endif()
+ endforeach()
+endfunction(_check_arguments)
+
+# Function to get all the folders inside given parent directory
+function(_get_sub_dir_list result parent_dir)
+ file(GLOB parent_dir_items RELATIVE ${parent_dir} ${parent_dir}/*)
+ set(dir_list "")
+ foreach(item ${parent_dir_items})
+ if(IS_DIRECTORY ${parent_dir}/${item})
+ list(APPEND dir_list ${item})
+ endif()
+ endforeach()
+ set(${result} ${dir_list} PARENT_SCOPE)
+endfunction(_get_sub_dir_list)
diff --git a/secure-debug/tools/cmake/compiler/ARMCLANG.cmake b/secure-debug/tools/cmake/compiler/ARMCLANG.cmake
new file mode 100644
index 0000000..c6a8b0d
--- /dev/null
+++ b/secure-debug/tools/cmake/compiler/ARMCLANG.cmake
@@ -0,0 +1,63 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+set(CMAKE_SYSTEM_NAME Generic)
+set(CMKE_SYSTEM_PROCESSOR ARM)
+
+set(_C_TOOLCHAIN_NAME armclang)
+
+if(WIN32)
+ if (NOT DEFINED ARMCLANG_PATH)
+ set(ARMCLANG_PATH "C:" CACHE PATH "Install directory for ARMCLANG Compiler")
+ endif()
+else(WIN32)
+ if (NOT DEFINED ARMCLANG_PATH)
+ set(ARMCLANG_PATH "/" CACHE PATH "Install directory for ARMCLANG Compiler")
+ endif()
+endif(WIN32)
+
+find_program(
+ _C_TOOLCHAIN_PATH
+ ${_C_TOOLCHAIN_NAME}
+ PATHS env PATH
+ HINTS ${ARMCLANG_PATH}
+ HINTS bin
+)
+
+if(_C_TOOLCHAIN_PATH STREQUAL "_C_TOOLCHAIN_PATH-NOTFOUND")
+ message(FATAL_ERROR "[PSA] : Couldn't find ${_C_TOOLCHAIN_NAME}."
+ " Either put ${_C_TOOLCHAIN_NAME} on the PATH or set ARMCLANG_PATH set properly.")
+endif()
+
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+
+foreach(_LNG IN ITEMS "C" "ASM")
+ set(CMAKE_${_LNG}_COMPILER ${_C_TOOLCHAIN_PATH})
+ message(STATUS "[PSA] : ${_LNG} compiler used '${CMAKE_${_LNG}_COMPILER}'")
+endforeach()
+
+if(${CPU_ARCH} STREQUAL armv7m)
+ set(TARGET_SWITCH "-march=armv7-m")
+elseif(${CPU_ARCH} STREQUAL armv8m_ml)
+ set(TARGET_SWITCH "-march=armv8-m.main -mcmse")
+elseif(${CPU_ARCH} STREQUAL armv8m_bl)
+ set(TARGET_SWITCH "-march=armv8-m.base -mcmse")
+endif()
+
+set(CMAKE_C_FLAGS "--target=arm-arm-none-eabi ${TARGET_SWITCH} -g -Wall -Werror -Wextra -fshort-enums -fshort-wchar -funsigned-char -fdata-sections -ffunction-sections -mno-unaligned-access -mfpu=none")
+set(CMAKE_ASM_FLAGS "${TARGET_SWITCH} -mthumb")
+set(CMAKE_EXE_LINKER_FLAGS "--strict --map --symbols --xref --info=summarysizes,sizes,totals,unused,veneers --diag_warning=L6204")
diff --git a/secure-debug/tools/cmake/compiler/GNUARM.cmake b/secure-debug/tools/cmake/compiler/GNUARM.cmake
new file mode 100644
index 0000000..3bd8347
--- /dev/null
+++ b/secure-debug/tools/cmake/compiler/GNUARM.cmake
@@ -0,0 +1,63 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+set(CMAKE_SYSTEM_NAME Generic)
+set(CMKE_SYSTEM_PROCESSOR ARM)
+
+set(_C_TOOLCHAIN_NAME arm-none-eabi-gcc)
+
+if(WIN32)
+ if (NOT DEFINED GNUARM_PATH)
+ set(GNUARM_PATH "C:" CACHE PATH "Install directory for GNUARM Compiler")
+ endif()
+else(WIN32)
+ if (NOT DEFINED GNUARM_PATH)
+ set(GNUARM_PATH "/" CACHE PATH "Install directory for GNUARM Compiler")
+ endif()
+endif(WIN32)
+
+find_program(
+ _C_TOOLCHAIN_PATH
+ ${_C_TOOLCHAIN_NAME}
+ PATHS env PATH
+ HINTS ${GNUARM_PATH}
+ HINTS bin
+)
+
+if(_C_TOOLCHAIN_PATH STREQUAL "_C_TOOLCHAIN_PATH-NOTFOUND")
+ message(FATAL_ERROR "[PSA] : Couldn't find ${_C_TOOLCHAIN_NAME}."
+ " Either put ${_C_TOOLCHAIN_NAME} on the PATH or set GNUARM_PATH set properly.")
+endif()
+
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+
+foreach(_LNG IN ITEMS "C" "ASM")
+ set(CMAKE_${_LNG}_COMPILER ${_C_TOOLCHAIN_PATH})
+ message(STATUS "[PSA] : ${_LNG} compiler used '${CMAKE_${_LNG}_COMPILER}'")
+endforeach()
+
+if(${CPU_ARCH} STREQUAL armv7m)
+ set(TARGET_SWITCH "-march=armv7-m")
+elseif(${CPU_ARCH} STREQUAL armv8m_ml)
+ set(TARGET_SWITCH "-march=armv8-m.main -mcmse")
+elseif(${CPU_ARCH} STREQUAL armv8m_bl)
+ set(TARGET_SWITCH "-march=armv8-m.base -mcmse")
+endif()
+
+set(CMAKE_C_FLAGS "${TARGET_SWITCH} -g -Wall -Werror -Wextra -fdata-sections -ffunction-sections -mno-unaligned-access")
+set(CMAKE_ASM_FLAGS "${TARGET_SWITCH} -mthumb")
+set(CMAKE_EXE_LINKER_FLAGS "-Xlinker --fatal-warnings -Xlinker --gc-sections -z max-page-size=0x400 -lgcc -lc -lnosys")
diff --git a/secure-debug/tools/cmake/compiler/HOST_GCC.cmake b/secure-debug/tools/cmake/compiler/HOST_GCC.cmake
new file mode 100644
index 0000000..5b43cb0
--- /dev/null
+++ b/secure-debug/tools/cmake/compiler/HOST_GCC.cmake
@@ -0,0 +1,52 @@
+#/** @file
+# * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+set(CMAKE_SYSTEM_NAME Generic)
+set(CMKE_SYSTEM_PROCESSOR x86_64)
+
+set(_C_TOOLCHAIN_NAME gcc)
+
+if(WIN32)
+ if (NOT DEFINED HOST_GCC_PATH)
+ set(HOST_GCC_PATH "C:" CACHE PATH "Install directory for Host GCC Compiler")
+ endif()
+else(WIN32)
+ if (NOT DEFINED HOST_GCC_PATH)
+ set(HOST_GCC_PATH "/" CACHE PATH "Install directory for Host GCC Compiler")
+ endif()
+endif(WIN32)
+
+find_program(
+ _C_TOOLCHAIN_PATH
+ ${_C_TOOLCHAIN_NAME}
+ PATHS env PATH
+ HINTS ${HOST_GCC_PATH}
+ HINTS bin
+)
+
+if(_C_TOOLCHAIN_PATH STREQUAL "_C_TOOLCHAIN_PATH-NOTFOUND")
+ message(FATAL_ERROR "[PSA] : Couldn't find ${_C_TOOLCHAIN_NAME}."
+ " Either put ${_C_TOOLCHAIN_NAME} on the PATH or set GNUARM_PATH set properly.")
+endif()
+
+set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
+
+foreach(_LNG IN ITEMS "C" "ASM")
+ set(CMAKE_${_LNG}_COMPILER ${_C_TOOLCHAIN_PATH})
+ set(CMAKE_C_FLAGS "-g -Wall -Werror -Werror -std=c99")
+ message(STATUS "[PSA] : ${_LNG} compiler used '${CMAKE_${_LNG}_COMPILER}'")
+endforeach()
diff --git a/secure-debug/tools/scripts/gen_tests_list.py b/secure-debug/tools/scripts/gen_tests_list.py
new file mode 100644
index 0000000..2bd0ab3
--- /dev/null
+++ b/secure-debug/tools/scripts/gen_tests_list.py
@@ -0,0 +1,87 @@
+#!/usr/bin/python
+#/** @file
+# * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+import sys
+
+if (len(sys.argv) != 8):
+ print("\nScript requires following inputs")
+ print("\narg1 : <INPUT SUITE identifier>")
+ print("\narg2 : <INPUT testsuite.db file>")
+ print("\narg3 : <OUTPUT testlist file>")
+ print("\narg4 : <OUTPUT test_entry_list>")
+ print("\narg5 : <OUTPUT test_entry_fn_declare_list>")
+ print("\narg6 : <OUTPUT Suite test start number")
+ print("\narg7 : <OUTPUT Suite test end number")
+ sys.exit(1)
+
+suite = sys.argv[1]
+testsuite_db_file = sys.argv[2]
+testlist_file = sys.argv[3]
+test_entry_list = sys.argv[4]
+test_entry_fn_declare_list = sys.argv[5]
+if sys.argv[6] != "None":
+ suite_test_start_number = int(sys.argv[6])
+else:
+ suite_test_start_number = 0
+if sys.argv[7] != "None":
+ suite_test_end_number = int(sys.argv[7])
+else:
+ suite_test_end_number = sys.maxsize
+
+# Dictionary to hold the mapping between suite and the base number
+suite_with_base_dict = {"adac":4}
+
+def gen_test_list():
+ """
+ Read the input testsuite.db file and generates the output file with list of tests
+ """
+ with open(testlist_file, mode='w') as o_f:
+ with open(testsuite_db_file, mode='r') as i_f:
+ for line in i_f:
+ if (('test_' == line[0:5]) and
+ (int(line[6:9]) >= suite_test_start_number) and
+ (int(line[6:9]) <= suite_test_end_number)):
+ o_f.write(line)
+
+def gen_test_entry_info():
+ """
+ Generate inc files
+ """
+ test_num = 0
+ uniq_test_string = ''
+ max_test_per_suite = 200
+ suite_base = 0
+
+ if (suite not in suite_with_base_dict.keys()):
+ print("\nProvide a valid SUITE identifier")
+ sys.exit()
+
+ with open(test_entry_list, mode='w') as o_f1, \
+ open(test_entry_fn_declare_list, mode='w') as o_f2,\
+ open(testlist_file, mode='r') as i_f:
+ for line in i_f:
+ line = line.strip()
+ test_num = int(line[6:9]) + (max_test_per_suite * suite_with_base_dict[suite])
+ uniq_test_string = line[5:9]
+ o_f1.write("\t{%d, &test_entry_%s},\n" %(test_num, uniq_test_string))
+ o_f2.write("void test_entry_%s(val_api_t *val_api);\n" %(uniq_test_string))
+ print("Test entry symbol list:\n\t%s,\n\t%s" %(test_entry_list, test_entry_fn_declare_list))
+
+# Call routines
+gen_test_list()
+gen_test_entry_info()
diff --git a/secure-debug/val/include/pal_interfaces.h b/secure-debug/val/include/pal_interfaces.h
new file mode 100644
index 0000000..9f7390f
--- /dev/null
+++ b/secure-debug/val/include/pal_interfaces.h
@@ -0,0 +1,93 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+#ifndef _PAL_INTERFACES_H_
+#define _PAL_INTERFACES_H_
+
+#include <stdarg.h>
+#include <psa_adac.h>
+
+/**
+ * @brief - This function parses the input string and writes bytes into logger TX FIFO
+ * @param - str : Input String
+ * - data : Value for format specifier
+ * @return - SUCCESS/FAILURE
+**/
+
+int pal_print(const char *str, int32_t data);
+
+/**
+ * @brief - Terminates the simulation at the end of all tests completion.
+ * By default, it put cpus into power down mode.
+ * @param - void
+ * @return - void
+**/
+void pal_terminate_simulation(void);
+
+/**
+ * @brief - Resets the system.
+ * @param - void
+ * @return - SUCCESS/FAILURE
+**/
+int pal_system_reset(void);
+
+request_packet_t *request_packet_lock(size_t *max_data_size);
+
+/**
+ * @brief - Reserve the communication buffer memory for receive packet.
+ * @param - max_data_size Valid size of command frame
+ * @return - Pointer to the command frame to be read
+**/
+response_packet_t *response_packet_lock(size_t *max_data_size);
+
+/**
+ * @brief - Release the lock held by transmit packet.
+ * @param - packet Most recent command frame sent
+ * @return - SUCCESS/FAILURE
+**/
+int request_packet_release(request_packet_t *packet);
+
+/**
+ * @brief - Release the lock held by receive packet.
+ * @param - packet Most recent response packet received
+ * @return - SUCCESS/FAILURE
+**/
+int response_packet_release(response_packet_t *packet);
+
+/**
+ * @brief - Construct the Request packet for the specified ADAC command.
+ * @param - command ADAC command
+ * data Pointer to payload
+ * data_size Size of the command payload
+ * @return - Pointer to the command frame to be written
+**/
+request_packet_t *request_packet_build(uint16_t command, uint8_t *data, size_t data_size);
+
+/**
+ * @brief - Write the Request packet into the communication buffer for transmit.
+ * @param - packet Request packet built for dispatch
+ * @return - SUCCESS/FAILURE
+**/
+int request_packet_send(request_packet_t *packet);
+
+/**
+ * @brief - Read the Response packet from the communication buffer.
+ * @param - None
+ * @return - Response packet received from target.
+**/
+response_packet_t *response_packet_receive();
+
+#endif
diff --git a/secure-debug/val/include/val.h b/secure-debug/val/include/val.h
new file mode 100644
index 0000000..8ac9a98
--- /dev/null
+++ b/secure-debug/val/include/val.h
@@ -0,0 +1,332 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#ifndef _VAL_COMMON_H_
+#define _VAL_COMMON_H_
+
+#include <string.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <stdarg.h>
+
+typedef uint8_t bool_t;
+typedef uintptr_t addr_t;
+typedef uint32_t test_id_t;
+typedef uint32_t block_id_t;
+typedef char char8_t;
+typedef uint32_t cfg_id_t;
+
+/* Print verbosity = TEST */
+#ifndef VERBOSE
+#define VERBOSE 9
+#endif
+
+#ifndef VAL_NSPE_BUILD
+#define STATIC_DECLARE static
+#else
+#define STATIC_DECLARE
+#endif
+
+#ifndef __WEAK
+#define __WEAK __attribute__((weak))
+#endif
+
+#ifndef __UNUSED
+#define __UNUSED __attribute__((unused))
+#endif
+
+#ifndef TRUE
+#define TRUE 0
+#endif
+#ifndef FALSE
+#define FALSE 1
+#endif
+
+#define _CONCAT(A, B) A##B
+#define CONCAT(A, B) _CONCAT(A, B)
+
+/* test status defines */
+#define TEST_START 0x01
+#define TEST_END 0x02
+#define TEST_PASS 0x04
+#define TEST_FAIL 0x08
+#define TEST_SKIP 0x10
+#define TEST_PENDING 0x20
+
+#define TEST_NUM_BIT 32
+#define TEST_STATE_BIT 8
+#define TEST_STATUS_BIT 0
+
+#define TEST_NUM_MASK 0xFFFFFFFF
+#define TEST_STATE_MASK 0xFF
+#define TEST_STATUS_MASK 0xFF
+
+#define RESULT_START(status) (((TEST_START) << TEST_STATE_BIT) | ((status) << TEST_STATUS_BIT))
+#define RESULT_END(status) (((TEST_END) << TEST_STATE_BIT) | ((status) << TEST_STATUS_BIT))
+#define RESULT_PASS(status) (((TEST_PASS) << TEST_STATE_BIT) | ((status) << TEST_STATUS_BIT))
+#define RESULT_FAIL(status) (((TEST_FAIL) << TEST_STATE_BIT) | ((status) << TEST_STATUS_BIT))
+#define RESULT_SKIP(status) (((TEST_SKIP) << TEST_STATE_BIT) | ((status) << TEST_STATUS_BIT))
+#define RESULT_PENDING(status) (((TEST_PENDING) << TEST_STATE_BIT) | ((status) << TEST_STATUS_BIT))
+
+#define IS_TEST_FAIL(status) (((status >> TEST_STATE_BIT) & TEST_STATE_MASK) == TEST_FAIL)
+#define IS_TEST_PASS(status) (((status >> TEST_STATE_BIT) & TEST_STATE_MASK) == TEST_PASS)
+#define IS_TEST_SKIP(status) (((status >> TEST_STATE_BIT) & TEST_STATE_MASK) == TEST_SKIP)
+#define IS_TEST_PENDING(status) (((status >> TEST_STATE_BIT) & TEST_STATE_MASK) == TEST_PENDING)
+#define IS_TEST_START(status) (((status >> TEST_STATE_BIT) & TEST_STATE_MASK) == TEST_START)
+#define IS_TEST_END(status) (((status >> TEST_STATE_BIT) & TEST_STATE_MASK) == TEST_END)
+#define VAL_ERROR(status) ((status & TEST_STATUS_MASK) ? 1 : 0)
+
+
+
+/* Test Defines */
+#define TEST_PUBLISH(test_id, entry) \
+ const val_test_info_t __attribute__((section(".acs_test_info"))) \
+ CONCAT(acs_test_info, entry) = {test_id, entry}
+
+#define VAL_MAX_TEST_PER_COMP 200
+#define VAL_SECURE_DEBUG_BASE 4
+
+
+#define VAL_GET_COMP_NUM(test_id) \
+ ((test_id - (test_id % VAL_MAX_TEST_PER_COMP)) / VAL_MAX_TEST_PER_COMP)
+#define VAL_GET_TEST_NUM(test_id) (test_id % VAL_MAX_TEST_PER_COMP)
+#define VAL_CREATE_TEST_ID(comp, num) ((comp*VAL_MAX_TEST_PER_COMP) + num)
+
+#define TEST_FIELD(num1, num2) (num2 << 8 | num1)
+#define GET_TEST_ISOLATION_LEVEL(num) (num & 0x3)
+#define GET_WD_TIMOUT_TYPE(num) ((num >> 8) & 0x7)
+
+#define TEST_CHECKPOINT_NUM(n) n
+#define TEST(n) n
+#define BLOCK(n) n
+
+#define BLOCK_NUM_POS 8
+#define ACTION_POS 16
+#define GET_TEST_NUM(n) (0xff & n)
+#define GET_BLOCK_NUM(n) ((n >> BLOCK_NUM_POS) & 0xff)
+
+#define GET_ACTION_NUM(n) ((n >> ACTION_POS) & 0xff)
+#define TEST_EXECUTE_FUNC 1
+#define TEST_RETURN_RESULT 2
+#define INVALID_HANDLE 0x1234DEAD
+
+#define VAL_NVMEM_BLOCK_SIZE 4
+#define VAL_NVMEM_OFFSET(nvmem_idx) (nvmem_idx * VAL_NVMEM_BLOCK_SIZE)
+
+#define UART_INIT_SIGN 0xff
+#define UART_PRINT_SIGN 0xfe
+
+#define TEST_PANIC() \
+ do { \
+ } while (1)
+
+#define TEST_ASSERT_EQUAL(arg1, arg2, checkpoint) \
+ do { \
+ if ((arg1) != arg2) \
+ { \
+ val->print(PRINT_ERROR, "\tFailed at Checkpoint: %d\n", checkpoint); \
+ val->print(PRINT_ERROR, "\tActual: %d\n", arg1); \
+ val->print(PRINT_ERROR, "\tExpected: %d\n", arg2); \
+ return 1; \
+ } \
+ } while (0)
+
+#define TEST_ASSERT_DUAL(arg1, status1, status2, checkpoint) \
+ do { \
+ if ((arg1) != status1 && (arg1) != status2) \
+ { \
+ val->print(PRINT_ERROR, "\tFailed at Checkpoint: %d\n", checkpoint); \
+ val->print(PRINT_ERROR, "\tActual: %d\n", arg1); \
+ val->print(PRINT_ERROR, "\tExpected: %d", status1); \
+ val->print(PRINT_ERROR, "or %d\n", status2); \
+ return 1; \
+ } \
+ } while (0)
+
+#define TEST_ASSERT_NOT_EQUAL(arg1, arg2, checkpoint) \
+ do { \
+ if ((arg1) == arg2) \
+ { \
+ val->print(PRINT_ERROR, "\tFailed at Checkpoint: %d\n", checkpoint); \
+ val->print(PRINT_ERROR, "\tValue: %d\n", arg1); \
+ return 1; \
+ } \
+ } while (0)
+
+#define TEST_ASSERT_MEMCMP(buf1, buf2, size, checkpoint) \
+ do { \
+ if (memcmp(buf1, buf2, size)) \
+ { \
+ val->print(PRINT_ERROR, "\tFailed at Checkpoint: %d : ", checkpoint); \
+ val->print(PRINT_ERROR, "Unequal data in compared buffers\n", 0); \
+ return 1; \
+ } \
+ } while (0)
+
+#define TEST_ASSERT_RANGE(arg1, range1, range2, checkpoint) \
+ do { \
+ if ((arg1) < range1 || (arg1) > range2) \
+ { \
+ val->print(PRINT_ERROR, "\tFailed at Checkpoint: %d\n", checkpoint); \
+ val->print(PRINT_ERROR, "\tActual: %d\n", arg1); \
+ val->print(PRINT_ERROR, "\tExpected range: %d to ", range1); \
+ val->print(PRINT_ERROR, "%d", range2); \
+ return 1; \
+ } \
+ } while (0)
+
+/* enums */
+typedef enum {
+ CALLER_NONSECURE = 0x0,
+ CALLER_SECURE = 0x1,
+} caller_security_t;
+
+typedef enum {
+ TEST_ISOLATION_L1 = 0x1,
+ TEST_ISOLATION_L2 = 0x2,
+ TEST_ISOLATION_L3 = 0x3,
+} test_isolation_level_t;
+
+typedef enum {
+ LEVEL1 = 0x1,
+ LEVEL2,
+ LEVEL3,
+} isolation_level_t;
+
+typedef enum {
+ /* VAL uses this boot flag to mark first time boot of the system */
+ BOOT_UNKNOWN = 0x1,
+ /* VAL/Test uses this boot flag to catch any unwanted system reboot - SIM ERROR Cases*/
+ BOOT_NOT_EXPECTED = 0x2,
+ /* Test performs panic check for non-secure test run and expect reboot */
+ BOOT_EXPECTED_NS = 0x3,
+ /* Test performs panic check for secure test run and expect reboot */
+ BOOT_EXPECTED_S = 0x4,
+ /* Test expects reboot but it didn't happen */
+ BOOT_EXPECTED_BUT_FAILED = 0x5,
+ /* Test expects reboot for secure/non-secure test run. If reboot happens,
+ * re-enter the same test and execute the next check function
+ */
+ BOOT_EXPECTED_REENTER_TEST = 0x6,
+ /* Test expect reboot for the test run. If reboot happens,
+ * re-enter the same test and continue executing the same check function
+ */
+ BOOT_EXPECTED_CONT_TEST_EXEC = 0x7,
+} boot_state_t;
+
+typedef enum {
+ NV_BOOT = 0x0,
+ NV_TEST_ID_PREVIOUS = 0x1,
+ NV_TEST_ID_CURRENT = 0x2,
+ NV_TEST_CNT = 0x3,
+ NV_TEST_DATA1 = 0x4,
+ NV_TEST_DATA2 = 0x5,
+ NV_TEST_DATA3 = 0x6,
+} nvmem_index_t;
+
+/* enums to report test sub-state */
+typedef enum {
+ VAL_STATUS_SUCCESS = 0x0,
+ VAL_STATUS_INVALID = 0x10,
+ VAL_STATUS_ERROR = 0x11,
+ VAL_STATUS_NOT_FOUND = 0x12,
+ VAL_STATUS_LOAD_ERROR = 0x13,
+ VAL_STATUS_INSUFFICIENT_SIZE = 0x14,
+ VAL_STATUS_CONNECTION_FAILED = 0x15,
+ VAL_STATUS_CALL_FAILED = 0x16,
+ VAL_STATUS_READ_FAILED = 0x17,
+ VAL_STATUS_WRITE_FAILED = 0x18,
+ VAL_STATUS_ISOLATION_LEVEL_NOT_SUPP = 0x19,
+ VAL_STATUS_INIT_FAILED = 0x1A,
+ VAL_STATUS_SPM_FAILED = 0x1B,
+ VAL_STATUS_SPM_UNEXPECTED_BEH = 0x1C,
+ VAL_STATUS_FRAMEWORK_VERSION_FAILED = 0x1D,
+ VAL_STATUS_VERSION_API_FAILED = 0x1E,
+ VAL_STATUS_INVALID_HANDLE = 0x1F,
+ VAL_STATUS_INVALID_MSG_TYPE = 0x20,
+ VAL_STATUS_WRONG_IDENTITY = 0x21,
+ VAL_STATUS_MSG_INSIZE_FAILED = 0x22,
+ VAL_STATUS_MSG_OUTSIZE_FAILED = 0x23,
+ VAL_STATUS_SKIP_FAILED = 0x24,
+ VAL_STATUS_CRYPTO_FAILURE = 0x25,
+ VAL_STATUS_INVALID_SIZE = 0x26,
+ VAL_STATUS_DATA_MISMATCH = 0x27,
+ VAL_STATUS_BOOT_EXPECTED_BUT_FAILED = 0x28,
+ VAL_STATUS_INIT_ALREADY_DONE = 0x29,
+ VAL_STATUS_HEAP_NOT_AVAILABLE = 0x2A,
+ VAL_STATUS_UNSUPPORTED = 0x2B,
+ VAL_STATUS_DRIVER_FN_FAILED = 0x2C,
+ VAL_STATUS_NO_TESTS = 0X2D,
+ VAL_STATUS_TEST_FAILED = 0x2E,
+ VAL_STATUS_ERROR_MAX = INT_MAX,
+} val_status_t;
+
+/* verbosity enums */
+typedef enum {
+ PRINT_INFO = 1,
+ PRINT_DEBUG = 2,
+ PRINT_TEST = 3,
+ PRINT_WARN = 4,
+ PRINT_ERROR = 5,
+ PRINT_ALWAYS = 9
+} print_verbosity_t;
+
+/* Driver test function id enums */
+typedef enum {
+ TEST_PSA_EOI_WITH_NON_INTR_SIGNAL = 1,
+ TEST_PSA_EOI_WITH_MULTIPLE_SIGNALS = 2,
+ TEST_PSA_EOI_WITH_UNASSERTED_SIGNAL = 3,
+ TEST_INTR_SERVICE = 4,
+ TEST_ISOLATION_PSA_ROT_DATA_RD = 5,
+ TEST_ISOLATION_PSA_ROT_DATA_WR = 6,
+ TEST_ISOLATION_PSA_ROT_STACK_RD = 7,
+ TEST_ISOLATION_PSA_ROT_STACK_WR = 8,
+ TEST_ISOLATION_PSA_ROT_HEAP_RD = 9,
+ TEST_ISOLATION_PSA_ROT_HEAP_WR = 10,
+ TEST_ISOLATION_PSA_ROT_MMIO_RD = 11,
+ TEST_ISOLATION_PSA_ROT_MMIO_WR = 12,
+} driver_test_fn_id_t;
+
+/* typedef's */
+typedef struct {
+ boot_state_t state;
+} boot_t;
+
+typedef struct {
+ uint32_t pass_cnt:8;
+ uint32_t skip_cnt:8;
+ uint32_t fail_cnt:8;
+ uint32_t sim_error_cnt:8;
+} test_count_t;
+
+typedef struct {
+ uint16_t test_num;
+ uint8_t block_num;
+} test_info_t;
+
+
+/* struture to capture test state */
+typedef struct {
+ uint16_t reserved;
+ uint8_t state;
+ uint8_t status;
+} test_status_buffer_t;
+
+typedef int32_t (*client_test_t)(caller_security_t caller);
+typedef int32_t (*server_test_t)(void);
+#endif /* VAL_COMMON_H */
diff --git a/secure-debug/val/include/val_adac.h b/secure-debug/val/include/val_adac.h
new file mode 100644
index 0000000..6086df9
--- /dev/null
+++ b/secure-debug/val/include/val_adac.h
@@ -0,0 +1,51 @@
+/** @file
+ * Copyright (c) 2021, Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#ifndef _VAL_ADAC_H_
+#define _VAL_ADAC_H_
+#include <psa_adac.h>
+
+/** \brief Token header
+ *
+ */
+typedef struct {
+ uint16_t type;
+ uint8_t *data;
+ size_t size;
+} adac_command_frame_t;
+
+void val_adac_host_init(void);
+psa_status_t val_load_certificate_chain(const char *chain_file, uint8_t **chain,
+ size_t *chain_size);
+psa_status_t val_infer_cryptosystem(uint32_t *chain, size_t chain_size, psa_tlv_t **extns_list,
+ size_t *extns_count, uint8_t *key_system);
+psa_status_t val_get_private_key(const char *key_file, uint8_t *type, psa_key_handle_t *handle,
+ uint8_t **key_ptr, size_t *size);
+request_packet_t *val_construct_command(uint16_t command, uint8_t *data, size_t data_size);
+psa_status_t val_issue_command(uint32_t command, request_packet_t *packet,
+ uint8_t *data, size_t data_size);
+response_packet_t *val_await_response(void);
+psa_status_t val_parse_response(uint32_t command, response_packet_t *packet);
+
+psa_status_t val_sign_token(uint8_t challenge[], size_t challenge_size, uint8_t signature_type,
+ uint8_t exts[], size_t exts_size, uint8_t *fragment[],
+ size_t *fragment_size, psa_key_handle_t handle,
+ uint8_t *key, size_t key_size);
+psa_status_t val_send_certificate(psa_tlv_t **extns_list, size_t extns_count);
+int val_check_cryptosystem_support(response_packet_t *packet, uint8_t key_system);
+
+#endif /* _VAL_ADAC_H_ */
diff --git a/secure-debug/val/include/val_dispatcher.h b/secure-debug/val/include/val_dispatcher.h
new file mode 100644
index 0000000..1419387
--- /dev/null
+++ b/secure-debug/val/include/val_dispatcher.h
@@ -0,0 +1,70 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#ifndef _VAL_DISPATCHER_H_
+#define _VAL_DISPATCHER_H_
+
+#include "val.h"
+
+#define ELF_IDENT 16
+#define VAL_INVALID_TEST_ID 0xffffffff
+#define VAL_TEST_START_MARKER 0xfaceface
+#define VAL_TEST_END_MARKER 0xc3c3c3c3
+
+/* typedef's */
+typedef uint32_t elf32_word;
+typedef int32_t elf32_sword;
+typedef uint16_t elf32_half;
+typedef uint32_t elf32_off;
+typedef uint32_t elf32_addr;
+
+typedef struct {
+ unsigned char e_ident[ELF_IDENT]; /* ident bytes */
+ elf32_half e_type; /* file type */
+ elf32_half e_machine; /* target machine */
+ elf32_word e_version; /* file version */
+ elf32_addr e_entry; /* start address */
+ elf32_off e_phoff; /* phdr file offset */
+ elf32_off e_shoff; /* shdr file offset */
+ elf32_word e_flags; /* file flags */
+ elf32_half e_ehsize; /* sizeof ehdr */
+ elf32_half e_phentsize; /* sizeof phdr */
+ elf32_half e_phnum; /* number phdrs */
+ elf32_half e_shentsize; /* sizeof shdr */
+ elf32_half e_shnum; /* number shdrs */
+ elf32_half e_shstrndx; /* shdr string index */
+} elf_header_t;
+
+typedef struct {
+ elf32_word p_type; /* Segment type */
+ elf32_off p_offset; /* Segment file offset */
+ elf32_addr p_vaddr; /* Segment virtual address */
+ elf32_addr p_paddr; /* Segment physical address */
+ elf32_word p_filesz; /* Segment size in file */
+ elf32_word p_memsz; /* Segment size in memory */
+ elf32_word p_flags; /* Segment flags */
+ elf32_word p_align; /* Segment alignment */
+} elf_pheader_t;
+
+typedef struct {
+ uint32_t start_marker;
+ test_id_t test_id;
+ uint32_t elf_size;
+} test_header_t;
+
+int32_t val_dispatcher(test_id_t test_id_prev);
+#endif
diff --git a/secure-debug/val/include/val_entry.h b/secure-debug/val/include/val_entry.h
new file mode 100644
index 0000000..f4d173f
--- /dev/null
+++ b/secure-debug/val/include/val_entry.h
@@ -0,0 +1,32 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#ifndef _VAL_ENTRY_H_
+#define _VAL_ENTRY_H_
+
+#include "val_framework.h"
+
+#define PSA_ACS_MAJOR_VER 1
+#define PSA_ACS_MINOR_VER 2
+
+/**
+ @brief - PSA Test Suite C main function, does VAL init and calls test dispatcher
+ @param - None
+ @return - int32_t
+**/
+extern int32_t val_entry(void);
+#endif
diff --git a/secure-debug/val/include/val_framework.h b/secure-debug/val/include/val_framework.h
new file mode 100644
index 0000000..5d53cbb
--- /dev/null
+++ b/secure-debug/val/include/val_framework.h
@@ -0,0 +1,33 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+
+#ifndef _VAL_INFRA_H_
+#define _VAL_INFRA_H_
+
+#include "val.h"
+#include "val_interfaces.h"
+
+/* prototypes */
+uint32_t val_report_status(void);
+val_status_t val_set_status(uint32_t status);
+uint32_t val_get_status(void);
+val_status_t val_err_check_set(uint32_t checkpoint, val_status_t status);
+void val_test_init(uint32_t test_num, char8_t *desc);
+void val_test_exit(void);
+
+#endif
diff --git a/secure-debug/val/include/val_interfaces.h b/secure-debug/val/include/val_interfaces.h
new file mode 100644
index 0000000..eca9a63
--- /dev/null
+++ b/secure-debug/val/include/val_interfaces.h
@@ -0,0 +1,79 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#ifndef _VAL_INTERFACES_H_
+#define _VAL_INTERFACES_H_
+
+#include "val.h"
+#include "pal_interfaces.h"
+
+/* typedef's */
+typedef struct {
+ val_status_t (*print) (print_verbosity_t verbosity,
+ const char *string, int32_t data);
+ val_status_t (*set_status) (uint32_t status);
+ uint32_t (*get_status) (void);
+ void (*test_init) (uint32_t test_num, char8_t *desc);
+ void (*test_exit) (void);
+ val_status_t (*err_check_set) (uint32_t checkpoint, val_status_t status);
+} val_api_t;
+
+typedef void (*test_fptr_t)(val_api_t *val);
+
+typedef struct {
+ test_id_t test_id;
+ test_fptr_t entry_addr;
+} val_test_info_t;
+
+typedef enum {
+ VAL_TEST_IDX0 = 0x0,
+ VAL_TEST_IDX1 = 0x1,
+ VAL_TEST_IDX2 = 0x2,
+ VAL_TEST_IDX3 = 0x3,
+ VAL_TEST_IDX4 = 0x4,
+ VAL_TEST_IDX5 = 0x5,
+ VAL_TEST_IDX6 = 0x6,
+ VAL_TEST_IDX7 = 0x7,
+ VAL_TEST_IDX8 = 0x8,
+ VAL_TEST_IDX9 = 0x9,
+ VAL_TEST_IDX10 = 0xA,
+ VAL_TEST_IDX11 = 0xB,
+ VAL_TEST_IDX12 = 0xC,
+ VAL_TEST_IDX13 = 0xD,
+ VAL_TEST_IDX14 = 0xE,
+ VAL_TEST_IDX15 = 0xF,
+ VAL_TEST_IDX16 = 0x10,
+ VAL_TEST_IDX17 = 0x11,
+ VAL_TEST_IDX18 = 0x12,
+ VAL_TEST_IDX19 = 0x13,
+ VAL_TEST_IDX20 = 0x14,
+ VAL_TEST_IDX21 = 0x15,
+ VAL_TEST_IDX22 = 0x16,
+ VAL_TEST_IDX23 = 0x17,
+ VAL_TEST_IDX24 = 0x18,
+ VAL_TEST_IDX25 = 0x19,
+ VAL_TEST_IDX26 = 0x1A,
+ VAL_TEST_IDX27 = 0x1B,
+ VAL_TEST_IDX28 = 0x1C,
+ VAL_TEST_IDX29 = 0x1D,
+ VAL_TEST_IDX30 = 0x1E,
+} val_test_index_t;
+
+#include "test_entry_fn_declare_list.inc"
+
+void test_entry(val_api_t *val);
+#endif
diff --git a/secure-debug/val/include/val_peripherals.h b/secure-debug/val/include/val_peripherals.h
new file mode 100644
index 0000000..d5fa4e9
--- /dev/null
+++ b/secure-debug/val/include/val_peripherals.h
@@ -0,0 +1,26 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#ifndef _VAL_PERIPHERALS_H_
+#define _VAL_PERIPHERALS_H_
+
+#include "val.h"
+
+val_status_t val_logger_init(void);
+val_status_t val_print(print_verbosity_t verbosity, const char *string, int32_t data);
+
+#endif
diff --git a/secure-debug/val/src/val_adac.c b/secure-debug/val/src/val_adac.c
new file mode 100644
index 0000000..53f02d1
--- /dev/null
+++ b/secure-debug/val/src/val_adac.c
@@ -0,0 +1,332 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#include <val_adac.h>
+#include <psa_adac_cryptosystems.h>
+#include <psa_adac_sdm.h>
+#include <psa_adac_debug.h>
+#include <pal_interfaces.h>
+
+void val_adac_host_init(void)
+{
+ psa_adac_platform_init();
+ psa_crypto_init();
+}
+
+psa_status_t val_load_certificate_chain(const char *chain_file, uint8_t **chain, size_t *chain_size)
+{
+ int ret_val;
+ psa_status_t r = PSA_SUCCESS;
+
+ if (chain_file == NULL) {
+ printf("Error:Path not found\n");
+ r = PSA_ERROR_INVALID_ARGUMENT;
+ return r;
+ }
+ ret_val = load_trust_chain(chain_file, chain, chain_size);
+ if (ret_val != 0) {
+ printf("Error loading trust chain (%s)\n", chain_file);
+ r = PSA_ERROR_GENERIC_ERROR;
+ }
+ return r;
+}
+
+psa_status_t val_infer_cryptosystem(uint32_t *chain, size_t chain_size, psa_tlv_t **extns_list,
+ size_t *extns_count, uint8_t *key_system)
+{
+ int ret_val;
+ psa_status_t r = PSA_SUCCESS;
+ uint8_t key_type;
+ size_t count, i;
+ psa_tlv_t *current_extn;
+
+ ret_val = split_tlv_static(chain, chain_size, extns_list, MAX_EXTENSIONS, extns_count);
+ if (ret_val != 0) {
+ PSA_ADAC_LOG_ERR("host", "Error parsing trust chain\n");
+ r = PSA_ERROR_GENERIC_ERROR;
+ return r;
+ }
+ count = *extns_count;
+ if (count > MAX_EXTENSIONS) {
+ printf("Error:Extension count exceeded maximum allowed\n");
+ r = PSA_ERROR_NOT_PERMITTED;
+ return r;
+ }
+
+ PSA_ADAC_LOG_INFO("host", "Found %zu certificates\n", count);
+ for (i = 0; i < count; i++) {
+ current_extn = extns_list[i];
+ if ((current_extn)->type_id == 0x0201)
+ key_type = ((certificate_header_t *) current_extn->value)->key_type;
+ }
+ *key_system = key_type;
+ PSA_ADAC_LOG_INFO("host", "Cryptosystem detected: %d\n", key_type);
+ return r;
+}
+
+psa_status_t val_get_private_key(const char *key_file, uint8_t *type, psa_key_handle_t *handle,
+ uint8_t **key_ptr, size_t *size)
+{
+ int ret_val;
+ psa_status_t r = PSA_SUCCESS;
+ uint8_t key_type = *type;
+
+ if (key_file == NULL) {
+ printf("Error:Path not found\n");
+ r = PSA_ERROR_INVALID_ARGUMENT;
+ return r;
+ }
+
+ switch (key_type) {
+ case ECDSA_P256_SHA256:
+ case ECDSA_P521_SHA512:
+ case RSA_3072_SHA256:
+ case RSA_4096_SHA256:
+ case ED_25519_SHA512:
+ case ED_448_SHAKE256:
+ case SM_SM2_SM3:
+ ret_val = import_private_key(key_file, type, handle);
+ if (ret_val != 0) {
+ printf("Error importing private key (%s)\n", key_file);
+ r = PSA_ERROR_GENERIC_ERROR;
+ } else {
+ key_ptr = NULL;
+ size = 0;
+ }
+ break;
+
+ case CMAC_AES:
+ case HMAC_SHA256:
+ ret_val = load_secret_key(key_file, key_type, key_ptr, size);
+ if (ret_val != 0) {
+ printf("Error importing secret key (%s)\n", key_file);
+ r = PSA_ERROR_GENERIC_ERROR;
+ } else {
+ handle = NULL;
+ }
+ break;
+
+ default:
+ printf("Error: unsupported key type (0x%x)\n", key_type);
+ r = PSA_ERROR_NOT_SUPPORTED;
+ }
+ return r;
+}
+
+request_packet_t *val_construct_command(uint16_t cmd_type, uint8_t *data, size_t data_size)
+{
+ request_packet_t *packet = NULL;
+
+ switch (cmd_type) {
+ case SDP_RESUME_BOOT_CMD:
+ case SDP_LOCK_DEBUG_CMD:
+ case SDP_DISCOVERY_CMD:
+ case SDP_AUTH_START_CMD:
+ packet = request_packet_build(cmd_type, NULL, 0);
+ break;
+ case SDP_AUTH_RESPONSE_CMD:
+ if (data == NULL || data_size == 0) {
+ printf("Error: No payload specified\n");
+ break;
+ }
+ packet = request_packet_build((uint16_t)cmd_type, data, data_size);
+ break;
+ default:
+ //TO DO: Callback for vendor specific command construction
+ printf("Error: Unrecognized command. ID=(0x%x)\n", cmd_type);
+ }
+ return packet;
+}
+
+psa_status_t val_issue_command(uint32_t command, request_packet_t *packet,
+ uint8_t *data, size_t data_size)
+{
+ int ret_val;
+ psa_status_t r = PSA_SUCCESS;
+
+ packet = val_construct_command((uint16_t)command, data, data_size);
+
+ if (packet == NULL) {
+ printf("Command construction failed\n");
+ r = PSA_ERROR_GENERIC_ERROR;
+ return r;
+ }
+
+ switch (command) {
+ case SDP_DISCOVERY_CMD:
+ printf("Sending discovery request\n");
+ break;
+ case SDP_AUTH_START_CMD:
+ printf("Sending challenge request\n");
+ break;
+ case SDP_AUTH_RESPONSE_CMD:
+ printf("Sending authentication response\n");
+ break;
+ case SDP_RESUME_BOOT_CMD:
+ printf("Sending close session command\n");
+ break;
+ case SDP_LOCK_DEBUG_CMD:
+ printf("Sending lock debug request\n");
+ default:
+ //TO DO: Vendor specific message
+ printf("Error: Unrecognized command. ID=(0x%x)\n", command);
+ r = PSA_ERROR_NOT_SUPPORTED;
+ }
+ ret_val = request_packet_send(packet);
+ if (ret_val < 0)
+ r = PSA_ERROR_GENERIC_ERROR;
+
+ request_packet_release(packet);
+ return r;
+}
+
+response_packet_t *val_await_response(void)
+{
+ return response_packet_receive();
+}
+
+psa_status_t val_parse_response(uint32_t command, response_packet_t *packet)
+{
+ int ret_val;
+ psa_status_t r = PSA_SUCCESS;
+ size_t i;
+ psa_tlv_t *tlv;
+ psa_auth_challenge_t *challenge;
+
+ if (packet == NULL) {
+ printf("Error: Target response not obtained\n");
+ r = PSA_ERROR_COMMUNICATION_FAILURE;
+ return r;
+ }
+
+ switch (command) {
+ case SDP_DISCOVERY_CMD:
+ printf("Receiving discovery response...\n");
+ for (i = 0; (i + 4) < (packet->data_count * 4);) {
+ tlv = (psa_tlv_t *) (((uint8_t *)packet->data) + i);
+ i += sizeof(psa_tlv_t) + tlv->length_in_bytes;
+ }
+ break;
+ case SDP_AUTH_START_CMD:
+ printf("Receiving challenge\n");
+ printf("status = 0x%04x, data_count = %d\n", packet->status, packet->data_count);
+ if (packet->data_count * 4 != sizeof(psa_auth_challenge_t)) {
+ r = PSA_ERROR_GENERIC_ERROR;
+ return r;
+ }
+ challenge = (psa_auth_challenge_t *) packet->data;
+ PSA_ADAC_LOG_DUMP("host", "challenge", challenge->challenge_vector,
+ sizeof(challenge->challenge_vector));
+ break;
+ case SDP_AUTH_RESPONSE_CMD:
+ case SDP_RESUME_BOOT_CMD:
+ case SDP_LOCK_DEBUG_CMD:
+ printf("status = 0x%04x, data_count = %d\n", packet->status, packet->data_count);
+ break;
+ default:
+ r = PSA_ERROR_NOT_SUPPORTED;
+ }
+ return r;
+}
+
+psa_status_t val_sign_token(uint8_t challenge[], size_t challenge_size, uint8_t signature_type,
+ uint8_t exts[], size_t exts_size, uint8_t *fragment[],
+ size_t *fragment_size, psa_key_handle_t handle,
+ uint8_t *key, size_t key_size)
+{
+ psa_status_t r;
+
+ r = psa_adac_sign_token(challenge, challenge_size, signature_type, exts, exts_size,
+ fragment, fragment_size, handle, key, key_size);
+ if (r == PSA_SUCCESS) {
+ PSA_ADAC_LOG_DUMP("host", "token", *fragment, *fragment_size);
+ } else {
+ PSA_ADAC_LOG_ERR("host", "Error signing token\n");
+ r = PSA_ERROR_GENERIC_ERROR;
+ }
+ return r;
+}
+
+psa_status_t val_send_certificate(psa_tlv_t **extns_list, size_t extns_count)
+{
+ request_packet_t *request;
+ response_packet_t *response;
+ psa_status_t r;
+ uint8_t *payload;
+ size_t i, payload_size;
+ psa_tlv_t *current_extn;
+
+ for (size_t i = 0; i < extns_count; i++) {
+ current_extn = extns_list[i];
+ if (current_extn->type_id == 0x0201) {
+ payload = (uint8_t *)current_extn;
+ payload_size = current_extn->length_in_bytes + sizeof(psa_tlv_t);
+
+ printf("Sending Certificate\n");
+ r = val_issue_command(SDP_AUTH_RESPONSE_CMD, request, payload, payload_size);
+ if (r != PSA_SUCCESS)
+ return r;
+
+ printf("Receiving token_authentication response\n");
+ response = val_await_response();
+ r = val_parse_response(SDP_AUTH_RESPONSE_CMD, response);
+ if (r != PSA_SUCCESS)
+ return r;
+
+ if (response->status == SDP_NEED_MORE_DATA)
+ response_packet_release(response);
+ }
+ }
+ if (response->status != SDP_NEED_MORE_DATA) {
+ PSA_ADAC_LOG_ERR("host", "Unexpected response status %x\n", response->status);
+ r = PSA_ERROR_GENERIC_ERROR;
+ return r;
+ }
+ response_packet_release(response);
+ return r;
+}
+
+int val_check_cryptosystem_support(response_packet_t *packet, uint8_t key_system)
+{
+ int found = 0, j;
+ size_t i = 0;
+ psa_tlv_t *tlv;
+ uint8_t *key_support_types = NULL;
+
+ while ((i + 4) < (packet->data_count * 4)) {
+ tlv = (psa_tlv_t *) (((uint8_t *)packet->data) + i);
+ if (tlv->type_id == 0x0102) {
+ key_support_types = tlv->value;
+ for (j = 0; j < (tlv->length_in_bytes); j++) {
+ if (*(key_support_types+j) == key_system) {
+ found = 1;
+ break;
+ }
+ }
+ }
+ i += sizeof(psa_tlv_t) + tlv->length_in_bytes;
+ }
+
+ if (key_support_types == NULL)
+ printf("Cryptosystem Type ID not found in target's response\n");
+ else if (!found)
+ printf("Cryptosystem not supported by target\n");
+ else
+ printf("Cryptosystem supported by target\n");
+
+ return found;
+}
diff --git a/secure-debug/val/src/val_dispatcher.c b/secure-debug/val/src/val_dispatcher.c
new file mode 100644
index 0000000..86426cc
--- /dev/null
+++ b/secure-debug/val/src/val_dispatcher.c
@@ -0,0 +1,222 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#include "val_framework.h"
+#include "val_dispatcher.h"
+#include "val_interfaces.h"
+#include "val_peripherals.h"
+
+
+extern val_api_t val_api;
+
+/* gloabls */
+addr_t g_test_info_addr;
+
+/**
+ @brief - This function prints PSA_{SUITE}_API_VERSION_MAJOR
+ PSA_{SUITE}_API_VERSION_MINOR details.
+ @param - None
+ @return - None
+**/
+static void val_print_api_version(void)
+{
+#ifdef CRYPTO
+ val_print(PRINT_ALWAYS, " %d.", PSA_CRYPTO_API_VERSION_MAJOR);
+ val_print(PRINT_ALWAYS, "%d", PSA_CRYPTO_API_VERSION_MINOR);
+#endif
+#ifdef INTERNAL_TRUSTED_STORAGE
+ val_print(PRINT_ALWAYS, " %d.", PSA_ITS_API_VERSION_MAJOR);
+ val_print(PRINT_ALWAYS, "%d", PSA_ITS_API_VERSION_MINOR);
+#endif
+#ifdef PROTECTED_STORAGE
+ val_print(PRINT_ALWAYS, " %d.", PSA_PS_API_VERSION_MAJOR);
+ val_print(PRINT_ALWAYS, "%d", PSA_PS_API_VERSION_MINOR);
+#endif
+#ifdef STORAGE
+ val_print(PRINT_ALWAYS, " ITS %d.", PSA_ITS_API_VERSION_MAJOR);
+ val_print(PRINT_ALWAYS, "%d", PSA_ITS_API_VERSION_MINOR);
+ val_print(PRINT_ALWAYS, " and PS %d.", PSA_PS_API_VERSION_MAJOR);
+ val_print(PRINT_ALWAYS, "%d", PSA_PS_API_VERSION_MINOR);
+#endif
+#ifdef INITIAL_ATTESTATION
+ val_print(PRINT_ALWAYS, " %d.", PSA_INITIAL_ATTEST_API_VERSION_MAJOR);
+ val_print(PRINT_ALWAYS, "%d", PSA_INITIAL_ATTEST_API_VERSION_MINOR);
+#endif
+}
+
+/**
+ @brief - This function reads the test ELFs from RAM or secondary storage and loads into
+ system memory
+ @param - test_id : Returns the current test ID
+ - test_id_prev : Previous test ID.
+ @return - Error code
+**/
+val_status_t val_test_load(test_id_t *test_id, test_id_t test_id_prev)
+{
+ int i;
+ val_test_info_t test_list[] = {
+#include "test_entry_list.inc"
+ {VAL_INVALID_TEST_ID, NULL}
+ };
+
+ for (i = 0; i < (int)(sizeof(test_list)/sizeof(test_list[0])); i++)
+ {
+ if (test_id_prev == VAL_INVALID_TEST_ID)
+ {
+ *test_id = test_list[i].test_id;
+ g_test_info_addr = (addr_t) test_list[i].entry_addr;
+ return VAL_STATUS_SUCCESS;
+ }
+ else if (test_id_prev == test_list[i].test_id)
+ {
+ *test_id = test_list[i+1].test_id;
+ g_test_info_addr = (addr_t) test_list[i+1].entry_addr;
+ return VAL_STATUS_SUCCESS;
+ }
+ else if (test_list[i].test_id == VAL_INVALID_TEST_ID)
+ {
+ val_print(PRINT_DEBUG, "\n\nNo more valid tests found. Exiting.", 0);
+ *test_id = VAL_INVALID_TEST_ID;
+ return VAL_STATUS_SUCCESS;
+ }
+ }
+
+ *test_id = VAL_INVALID_TEST_ID;
+ val_print(PRINT_ERROR, "\n\nError: No more valid tests found. Exiting.", 0);
+ return VAL_STATUS_LOAD_ERROR;
+}
+
+/**
+ @brief - This function reads the function pointer addresses for
+ test_entry
+ @param - paddr : Returns the Test function address
+ @return - Returns val_status_t
+**/
+val_status_t val_get_test_entry_addr(addr_t *paddr)
+{
+ *paddr = g_test_info_addr;
+ return VAL_STATUS_SUCCESS;
+}
+
+/**
+ @brief - Execute the function pointer which was given to us by the test
+ @param - void
+**/
+void val_execute_test_fn(void)
+{
+ test_fptr_t fn_ptr;
+ addr_t addr;
+
+ val_get_test_entry_addr(&addr);
+ fn_ptr = (test_fptr_t)addr;
+ fn_ptr(&val_api);
+ return;
+}
+
+/*
+ @brief - Reads the pre-defined component name against given test_id
+ @param - test_id : Current Test ID
+ @return - Component name
+*/
+char *val_get_comp_name(test_id_t test_id)
+{
+ switch (VAL_GET_COMP_NUM(test_id))
+ {
+ case VAL_SECURE_DEBUG_BASE:
+ return "Secure Debug Suite";
+ default:
+ return "Unknown Suite";
+ }
+}
+
+/**
+ @brief - This function is responsible for setting up VAL infrastructure.
+ Loads test one by one from combine binary and calls test_entry
+ function of each test image.
+ @return - 0 if success Or error code for the failure.
+**/
+int32_t val_dispatcher(test_id_t test_id_prev)
+{
+
+ test_id_t test_id;
+ val_status_t status;
+ boot_t boot;
+ test_count_t test_count = {0,};
+ uint32_t test_result;
+
+ do
+ {
+ status = val_test_load(&test_id, test_id_prev);
+
+ if (VAL_ERROR(status))
+ {
+ return status;
+ }
+ else if (test_id == VAL_INVALID_TEST_ID)
+ {
+ break;
+ }
+ if (VAL_GET_COMP_NUM(test_id_prev) != VAL_GET_COMP_NUM(test_id))
+ {
+ val_print(PRINT_ALWAYS, "\nRunning.. ", 0);
+ val_print(PRINT_ALWAYS, val_get_comp_name(test_id), 0);
+ val_print(PRINT_ALWAYS, "\n******************************\n", 0);
+ }
+
+ val_execute_test_fn();
+
+ test_result = val_report_status();
+
+ switch (test_result)
+ {
+ case TEST_PASS:
+ test_count.pass_cnt += 1;
+ break;
+ case TEST_FAIL:
+ test_count.fail_cnt += 1;
+ break;
+ case TEST_SKIP:
+ test_count.skip_cnt += 1;
+ break;
+ case TEST_PENDING:
+ test_count.sim_error_cnt += 1;
+ break;
+ }
+
+ test_id_prev = test_id;
+ } while (1);
+
+ val_print(PRINT_ALWAYS, "\n************ ", 0);
+ val_print(PRINT_ALWAYS, val_get_comp_name(test_id_prev), 0);
+ val_print(PRINT_ALWAYS, " Report **********\n", 0);
+ val_print(PRINT_ALWAYS, "TOTAL TESTS : %d\n", test_count.pass_cnt + test_count.fail_cnt
+ + test_count.skip_cnt + test_count.sim_error_cnt);
+ val_print(PRINT_ALWAYS, "TOTAL PASSED : %d\n", test_count.pass_cnt);
+ val_print(PRINT_ALWAYS, "TOTAL SIM ERROR : %d\n", test_count.sim_error_cnt);
+ val_print(PRINT_ALWAYS, "TOTAL FAILED : %d\n", test_count.fail_cnt);
+ val_print(PRINT_ALWAYS, "TOTAL SKIPPED : %d\n", test_count.skip_cnt);
+ val_print(PRINT_ALWAYS, "******************************************\n", 0);
+
+ return (test_count.fail_cnt > 0) ? VAL_STATUS_TEST_FAILED : VAL_STATUS_SUCCESS;
+}
+
+
+
+
+
+
+
diff --git a/secure-debug/val/src/val_entry.c b/secure-debug/val/src/val_entry.c
new file mode 100644
index 0000000..1d13bcb
--- /dev/null
+++ b/secure-debug/val/src/val_entry.c
@@ -0,0 +1,64 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#include "val_entry.h"
+#include "val_framework.h"
+#include "val_peripherals.h"
+#include "val_dispatcher.h"
+
+int32_t val_entry(void);
+
+/**
+ @brief - PSA C main function, does VAL init and calls test dispatcher
+ @param - None
+ @return - status - error code
+**/
+int32_t val_entry(void)
+{
+ test_id_t test_id = VAL_INVALID_TEST_ID;
+ int32_t status;
+
+ status = val_logger_init();
+ if (VAL_ERROR(status))
+ {
+ goto exit;
+ }
+
+ /* Compliance header print */
+ if (test_id == VAL_INVALID_TEST_ID)
+ {
+ val_print(PRINT_ALWAYS, "\n***** PSA Architecture Test Suite - Version %d.",
+ PSA_ACS_MAJOR_VER);
+ val_print(PRINT_ALWAYS, "%d *****\n", PSA_ACS_MINOR_VER);
+ }
+
+ /* Call dispatcher routine*/
+ status = val_dispatcher(test_id);
+
+exit:
+ val_print(PRINT_ALWAYS, "\nEntering standby.. \n", 0);
+
+ pal_terminate_simulation();
+
+ return status;
+}
+
+//int main()
+//{
+// val_entry();
+// return 0;
+//}
diff --git a/secure-debug/val/src/val_framework.c b/secure-debug/val/src/val_framework.c
new file mode 100644
index 0000000..2a700b4
--- /dev/null
+++ b/secure-debug/val/src/val_framework.c
@@ -0,0 +1,172 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#include "val_framework.h"
+#include "val_interfaces.h"
+#include "val_dispatcher.h"
+#include "val_peripherals.h"
+#include "pal_interfaces.h"
+
+
+extern val_api_t val_api;
+
+
+/* globals */
+test_status_buffer_t g_status_buffer;
+
+/**
+ @brief - Parses input status for a given test and
+ outputs appropriate information on the console
+ @return - Test state
+**/
+uint32_t val_report_status(void)
+{
+ uint32_t status, state;
+
+ status = val_get_status();
+
+ state = (status >> TEST_STATE_BIT) & TEST_STATE_MASK;
+ status = status & TEST_STATUS_MASK;
+
+ switch (state)
+ {
+ case TEST_START:
+ state = TEST_FAIL;
+ val_print(PRINT_ALWAYS, "\nTEST RESULT: FAILED (Error Code=0x%x)\n",
+ VAL_STATUS_INIT_FAILED);
+ break;
+
+ case TEST_END:
+ state = TEST_PASS;
+ val_print(PRINT_ALWAYS, "\nTEST RESULT: PASSED\n", 0);
+ break;
+
+ case TEST_FAIL:
+ val_print(PRINT_ALWAYS, "\nTEST RESULT: FAILED (Error Code=0x%x)\n", status);
+ break;
+
+ case TEST_SKIP:
+ state = TEST_SKIP;
+ val_print(PRINT_ALWAYS, "\nTEST RESULT: SKIPPED (Skip Code=0x%x)\n", status);
+ break;
+
+ case TEST_PENDING:
+ val_print(PRINT_ALWAYS, "\nTEST RESULT: SIM ERROR (Error Code=0x%x)\n", status);
+ break;
+
+ default:
+ state = TEST_FAIL;
+ val_print(PRINT_ALWAYS, "\nTEST RESULT: FAILED(Error Code=0x%x)\n", VAL_STATUS_INVALID);
+ break;
+
+ }
+
+ val_print(PRINT_ALWAYS, "\n******************************************\n", 0);
+ return state;
+}
+
+/**
+ @brief - Records the state and status of test
+ @return - val_status_t
+**/
+val_status_t val_set_status(uint32_t status)
+{
+ g_status_buffer.state = ((status >> TEST_STATE_BIT) & TEST_STATE_MASK);
+ g_status_buffer.status = (status & TEST_STATUS_MASK);
+
+ return VAL_STATUS_SUCCESS;
+}
+
+/**
+ @brief - Updates the state and status for a given test
+ @return - test status
+**/
+uint32_t val_get_status(void)
+{
+ return ((g_status_buffer.state) << TEST_STATE_BIT) | (g_status_buffer.status);
+}
+
+/*
+ @brief - This function checks if the input status argument is an error.
+ On error, we print the checkpoint value and set the status.
+ @param - checkpoint : Test debug checkpoint
+ - val_status_t : Test status
+ @return - returns the input status back to the program.
+*/
+
+val_status_t val_err_check_set(uint32_t checkpoint, val_status_t status)
+{
+ if (VAL_ERROR(status)) {
+ val_print(PRINT_ERROR, "\tCheckpoint %d : ", checkpoint);
+ val_print(PRINT_ERROR, "Error Code=0x%x \n", status);
+ val_set_status(RESULT_FAIL(status));
+ } else {
+ status = (val_get_status() & TEST_STATUS_MASK);
+ if (VAL_ERROR(status)) {
+ val_print(PRINT_ERROR, "\tCheckpoint %d : ", checkpoint);
+ val_print(PRINT_ERROR, "Error Code=0x%x \n", status);
+ } else {
+ val_print(PRINT_DEBUG, "\tCheckpoint %d \n", checkpoint);
+ }
+ }
+ return status;
+}
+
+/**
+ @brief This API prints the test number, description and
+ sets the test state to TEST_START on successful execution.
+ @param test_num :unique number identifying this test
+ @param desc :brief description of the test
+ @param test_bitfield :Addition test info such as
+ - test isolation level requirement
+ - Watchdog timeout type
+ @return void
+**/
+
+void val_test_init(uint32_t test_num, char8_t *desc)
+{
+ val_status_t status = VAL_STATUS_SUCCESS;
+
+ /*global init*/
+ g_status_buffer.state = TEST_FAIL;
+ g_status_buffer.status = VAL_STATUS_INVALID;
+
+ val_print(PRINT_ALWAYS, "\nTEST: %d | DESCRIPTION: ", test_num);
+ val_print(PRINT_ALWAYS, desc, 0);
+
+ val_set_status(RESULT_START(status));
+ return;
+}
+
+/**
+ @brief This API sets the test state to TEST_END if test is successfully passed.
+ @param none
+ @return none
+**/
+
+void val_test_exit(void)
+{
+ val_status_t status = VAL_STATUS_SUCCESS;
+
+ status = val_get_status();
+
+ /* return if test skipped or failed */
+ if (IS_TEST_FAIL(status) || IS_TEST_SKIP(status))
+ return;
+ else
+ val_set_status(RESULT_END(VAL_STATUS_SUCCESS));
+}
diff --git a/secure-debug/val/src/val_interfaces.c b/secure-debug/val/src/val_interfaces.c
new file mode 100644
index 0000000..63c041d
--- /dev/null
+++ b/secure-debug/val/src/val_interfaces.c
@@ -0,0 +1,32 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+
+#include "val_framework.h"
+#include "val_interfaces.h"
+#include "val_peripherals.h"
+
+/*VAL APIs to be used by test */
+const val_api_t val_api = {
+ .print = val_print,
+ .set_status = val_set_status,
+ .get_status = val_get_status,
+ .test_init = val_test_init,
+ .test_exit = val_test_exit,
+ .err_check_set = val_err_check_set,
+};
+
diff --git a/secure-debug/val/src/val_peripherals.c b/secure-debug/val/src/val_peripherals.c
new file mode 100644
index 0000000..e804485
--- /dev/null
+++ b/secure-debug/val/src/val_peripherals.c
@@ -0,0 +1,55 @@
+/** @file
+ * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+**/
+
+#include "val_peripherals.h"
+#include "pal_interfaces.h"
+#include "val_framework.h"
+
+/* Global */
+uint32_t is_logger_init_done = 0;
+
+/*
+ @brief - Initialize UART.
+ This is client interface API of secure partition UART INIT API.
+ @param - None
+ @return - val_status_t
+*/
+val_status_t val_logger_init(void)
+{
+ is_logger_init_done = 1;
+ return VAL_STATUS_SUCCESS;
+}
+
+/**
+ @brief - Print module. This is client interface API of secure partition
+ val_print_sf API for nspe world
+ @param - verbosity: Print verbosity level
+ - string : Input string
+ - data : Value for format specifier
+ @return - val_status_t
+**/
+val_status_t val_print(print_verbosity_t verbosity, const char *string, int32_t data)
+{
+ if ((is_logger_init_done == 0) && (verbosity < VERBOSE))
+ {
+ return VAL_STATUS_SUCCESS;
+ }
+ return pal_print(string, data);
+}
+
+
+
diff --git a/secure-debug/val/val.cmake b/secure-debug/val/val.cmake
new file mode 100644
index 0000000..665db48
--- /dev/null
+++ b/secure-debug/val/val.cmake
@@ -0,0 +1,42 @@
+#/** @file
+# * Copyright (c) 2021 Arm Limited or its affiliates. All rights reserved.
+# * SPDX-License-Identifier : Apache-2.0
+# *
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+#**/
+
+if(NOT DEFINED PSA_ADAC_ROOT)
+ get_filename_component(PSA_ADAC_ROOT ${CMAKE_SOURCE_DIR}/psa-adac ABSOLUTE)
+endif()
+
+# Listing all the sources from val
+list(APPEND VAL_SRC_C
+ ${CMAKE_SOURCE_DIR}/val/src/val_entry.c
+ ${CMAKE_SOURCE_DIR}/val/src/val_adac.c
+ ${CMAKE_SOURCE_DIR}/val/src/val_dispatcher.c
+ ${CMAKE_SOURCE_DIR}/val/src/val_framework.c
+ ${CMAKE_SOURCE_DIR}/val/src/val_interfaces.c
+ ${CMAKE_SOURCE_DIR}/val/src/val_peripherals.c
+)
+
+# Create VAL library
+add_library(${ADAC_HOST_VAL_LIB} STATIC ${VAL_SRC_C})
+
+target_include_directories(${ADAC_HOST_VAL_LIB} PRIVATE
+ ${CMAKE_SOURCE_DIR}/val/include
+ ${CMAKE_BINARY_DIR}
+ ${PSA_ADAC_ROOT}/psa-adac/core/include
+ ${PSA_ADAC_ROOT}/psa-adac/sdm/include
+ )
+
+target_link_libraries(${ADAC_HOST_VAL_LIB} mbedcrypto)