aboutsummaryrefslogtreecommitdiff
path: root/tftf
diff options
context:
space:
mode:
authorJimmy Brisson <jimmy.brisson@arm.com>2020-06-23 15:25:05 -0500
committerZelalem <zelalem.aweke@arm.com>2021-03-08 15:47:11 -0600
commitc4f3eee9634e214eb95a98c829a7617328ce02e5 (patch)
treea0cfd90091ba48e8fe4e8c2548d6aa2812c9f3c7 /tftf
parente30228aebedda69f3de8d43a9f2afdec4c384e3e (diff)
downloadtf-a-tests-c4f3eee9634e214eb95a98c829a7617328ce02e5.tar.gz
Add tests for TRNG SMCs
This adds some tests that are valid for all TRNG implemenations. Specifically, it tests that the Version, Features, and RND calls conform to the spec. Note that UUID is omitted from testing as there is not a value that it can return that's outside of the spec. Change-Id: I68aa2673538f64d2a9401415b8d0de1fdedc3ad4 Signed-off-by: Jimmy Brisson <jimmy.brisson@arm.com> Signed-off-by: Zelalem Aweke <zelalem.aweke@arm.com>
Diffstat (limited to 'tftf')
-rw-r--r--tftf/framework/framework.mk3
-rw-r--r--tftf/tests/runtime_services/standard_service/trng/api_tests/test_trng.c150
-rw-r--r--tftf/tests/tests-standard.mk3
-rw-r--r--tftf/tests/tests-standard.xml4
-rw-r--r--tftf/tests/tests-trng.mk7
-rw-r--r--tftf/tests/tests-trng.xml25
6 files changed, 189 insertions, 3 deletions
diff --git a/tftf/framework/framework.mk b/tftf/framework/framework.mk
index 4ca1d4258..8ec18ea9a 100644
--- a/tftf/framework/framework.mk
+++ b/tftf/framework/framework.mk
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2018-2020, Arm Limited. All rights reserved.
+# Copyright (c) 2018-2021, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
@@ -62,6 +62,7 @@ FRAMEWORK_SOURCES += \
lib/sdei/sdei.c \
lib/smc/${ARCH}/asm_smc.S \
lib/smc/${ARCH}/smc.c \
+ lib/trng/trng.c \
lib/trusted_os/trusted_os.c \
lib/utils/mp_printf.c \
lib/utils/uuid.c \
diff --git a/tftf/tests/runtime_services/standard_service/trng/api_tests/test_trng.c b/tftf/tests/runtime_services/standard_service/trng/api_tests/test_trng.c
new file mode 100644
index 000000000..f2f46570c
--- /dev/null
+++ b/tftf/tests/runtime_services/standard_service/trng/api_tests/test_trng.c
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2021, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch_helpers.h>
+#include <assert.h>
+#include <debug.h>
+#include <platform.h>
+#include <psci.h>
+#include <smccc.h>
+#include <string.h>
+#include <errno.h>
+#include <tftf_lib.h>
+#include <trng.h>
+
+/*
+ * @Test_Aim@ exercise TRNG Version SMC.
+ *
+ * This test should exercise the trng version call. Versions before 1.0 don't
+ * exsit, so should fail. This should also skip if TRNG is not implemented.
+ */
+test_result_t test_trng_version(void)
+{
+ int32_t version = tftf_trng_version();
+
+ if (version > 0 && version < TRNG_VERSION(1, 0)) {
+ return TEST_RESULT_FAIL;
+ }
+ if (version < 0 && version == TRNG_E_NOT_SUPPORTED) {
+ return TEST_RESULT_SKIPPED;
+ }
+ return TEST_RESULT_SUCCESS;
+}
+
+/*
+ * @Test_Aim@ Verify that TRNG reports implemented functions.
+ *
+ * Check that TRNG Fetures reports that the TRNG extension:
+ * - reports implementing functions that we know for sure exist, such as TRNG
+ * Features itself
+ * - reports not implementing functions that are part of other standards
+ */
+test_result_t test_trng_features(void)
+{
+ int32_t version = tftf_trng_version();
+
+ if (version < 0 && version == TRNG_E_NOT_SUPPORTED) {
+ return TEST_RESULT_SKIPPED;
+ }
+ if (!tftf_trng_feature_implemented(SMC_TRNG_FEATURES)) {
+ return TEST_RESULT_FAIL;
+ }
+ if (tftf_trng_feature_implemented(SMC_PSCI_SYSTEM_RESET)) {
+ return TEST_RESULT_FAIL;
+ }
+ return TEST_RESULT_SUCCESS;
+}
+
+/*
+ * @Test_Aim@ TRNG_RND Meets the Zero-fill requirements of the spec
+ */
+#ifndef __aarch64__
+test_result_t test_trng_rnd(void)
+{
+ int32_t version = tftf_trng_version();
+ smc_ret_values rnd_out;
+
+ if (version < 0 && version == TRNG_E_NOT_SUPPORTED) {
+ return TEST_RESULT_SKIPPED;
+ }
+ if (!tftf_trng_feature_implemented(SMC_TRNG_RND)) {
+ return TEST_RESULT_SKIPPED;
+ }
+ rnd_out = tftf_trng_rnd(U(0));
+ if (rnd_out.ret0 != TRNG_E_INVALID_PARAMS) {
+ ERROR("RND 0 returned 0x%x\n", (uint32_t) rnd_out.ret0);
+ return TEST_RESULT_FAIL;
+ }
+ rnd_out = tftf_trng_rnd(U(1024));
+ if (rnd_out.ret0 != TRNG_E_INVALID_PARAMS) {
+ ERROR("RND 1024 returned 0x%x\n", (uint32_t) rnd_out.ret0);
+ return TEST_RESULT_FAIL;
+ }
+ rnd_out = tftf_trng_rnd(U(1));
+ if (rnd_out.ret0 == TRNG_E_NO_ENTOPY) {
+ WARN("There is not a single bit of entropy\n");
+ return TEST_RESULT_SKIPPED;
+ }
+ if ((rnd_out.ret1 & 0xFFFFFFFF) != 0) {
+ ERROR("non-zero w1 value 0x%x\n", (uint32_t) rnd_out.ret1);
+ return TEST_RESULT_FAIL;
+ }
+ if ((rnd_out.ret2 & 0xFFFFFFFF) != 0) {
+ ERROR("non-zero w2 value 0x%x\n", (uint32_t) rnd_out.ret2);
+ return TEST_RESULT_FAIL;
+ }
+ if ((rnd_out.ret3 & 0xFFFFFFFE) != 0) {
+ /* Note: there's an "E" here ^, because we asked for the least
+ * significant bit to be random by passing a "1" to the RND function
+ */
+ ERROR("Unexpected w3 value 0x%x\n", (uint32_t) rnd_out.ret3);
+ return TEST_RESULT_FAIL;
+ }
+ return TEST_RESULT_SUCCESS;
+}
+
+#else
+test_result_t test_trng_rnd(void)
+{
+ int32_t version = tftf_trng_version();
+ smc_ret_values rnd_out;
+
+ if (version < 0 && version == TRNG_E_NOT_SUPPORTED) {
+ return TEST_RESULT_SKIPPED;
+ }
+ if (!tftf_trng_feature_implemented(SMC_TRNG_RND)) {
+ return TEST_RESULT_SKIPPED;
+ }
+ rnd_out = tftf_trng_rnd(U(0));
+ if (rnd_out.ret0 != TRNG_E_INVALID_PARAMS) {
+ ERROR("RND 0 returned 0x%lx\n", rnd_out.ret0);
+ return TEST_RESULT_FAIL;
+ }
+ rnd_out = tftf_trng_rnd(U(1024));
+ if (rnd_out.ret0 != TRNG_E_INVALID_PARAMS) {
+ ERROR("RND 1024 returned 0x%lx\n", rnd_out.ret0);
+ return TEST_RESULT_FAIL;
+ }
+ rnd_out = tftf_trng_rnd(U(1));
+ if (rnd_out.ret0 == TRNG_E_NO_ENTOPY) {
+ WARN("There is not a single bit of entropy\n");
+ return TEST_RESULT_SKIPPED;
+ }
+ if ((rnd_out.ret1 & 0xFFFFFFFFFFFFFFFF) != 0) {
+ ERROR("non-zero x1 value 0x%lx\n", rnd_out.ret1);
+ return TEST_RESULT_FAIL;
+ }
+ if ((rnd_out.ret2 & 0xFFFFFFFFFFFFFFFF) != 0) {
+ ERROR("non-zero x2 value 0x%lx\n", rnd_out.ret2);
+ return TEST_RESULT_FAIL;
+ }
+ if ((rnd_out.ret3 & 0xFFFFFFFFFFFFFFFE) != 0) {
+ ERROR("Unexpected x3 value 0x%lx\n", rnd_out.ret3);
+ return TEST_RESULT_FAIL;
+ }
+ return TEST_RESULT_SUCCESS;
+}
+#endif
diff --git a/tftf/tests/tests-standard.mk b/tftf/tests/tests-standard.mk
index 97d530fdf..c6c9029f3 100644
--- a/tftf/tests/tests-standard.mk
+++ b/tftf/tests/tests-standard.mk
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2018-2019, Arm Limited. All rights reserved.
+# Copyright (c) 2018-2021, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
@@ -19,6 +19,7 @@ TESTS_MAKEFILE := $(addprefix tftf/tests/, \
tests-spm.mk \
tests-template.mk \
tests-tftf-validation.mk \
+ tests-trng.mk \
tests-tsp.mk \
tests-uncontainable.mk \
tests-debugfs.mk \
diff --git a/tftf/tests/tests-standard.xml b/tftf/tests/tests-standard.xml
index 0bebbef67..8c66cdaf0 100644
--- a/tftf/tests/tests-standard.xml
+++ b/tftf/tests/tests-standard.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (c) 2018-2019, Arm Limited. All rights reserved.
+ Copyright (c) 2018-2021, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-3-Clause
-->
@@ -14,6 +14,7 @@
<!ENTITY tests-psci SYSTEM "tests-psci.xml">
<!ENTITY tests-sdei SYSTEM "tests-sdei.xml">
<!ENTITY tests-rt-instr SYSTEM "tests-runtime-instrumentation.xml">
+ <!ENTITY tests-trng SYSTEM "tests-trng.xml">
<!ENTITY tests-tsp SYSTEM "tests-tsp.xml">
<!ENTITY tests-el3-pstate SYSTEM "tests-el3-power-state.xml">
<!ENTITY tests-state-switch SYSTEM "tests-arm-state-switch.xml">
@@ -32,6 +33,7 @@
&tests-psci;
&tests-sdei;
&tests-rt-instr;
+ &tests-trng;
&tests-tsp;
&tests-el3-pstate;
&tests-state-switch;
diff --git a/tftf/tests/tests-trng.mk b/tftf/tests/tests-trng.mk
new file mode 100644
index 000000000..d2842964e
--- /dev/null
+++ b/tftf/tests/tests-trng.mk
@@ -0,0 +1,7 @@
+#
+# Copyright (c) 2021, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+TESTS_SOURCES += tftf/tests/runtime_services/standard_service/trng/api_tests/test_trng.c
diff --git a/tftf/tests/tests-trng.xml b/tftf/tests/tests-trng.xml
new file mode 100644
index 000000000..72f1fd076
--- /dev/null
+++ b/tftf/tests/tests-trng.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ Copyright (c) 2021, Arm Limited. All rights reserved.
+
+ SPDX-License-Identifier: BSD-3-Clause
+-->
+
+<testsuites>
+ <!--
+ The "template" testsuite aims at providing template test code as a
+ starting point for developing new tests. These tests don't do anything
+ useful in terms of testing.
+ -->
+ <testsuite name="TRNG" description="True Random Number Generator">
+ <testcase name="Version" function="test_trng_version" />
+ <testcase name="Features" function="test_trng_features" />
+ <!--
+ Note: the UUID function is not testable, as it's correct if it
+ returns _any_ value in W0-W3.
+ -->
+ <testcase name="RND" function="test_trng_rnd" />
+ </testsuite>
+
+</testsuites>