diff options
Diffstat (limited to 'tftf/tests')
-rw-r--r-- | tftf/tests/runtime_services/standard_service/trng/api_tests/test_trng.c | 150 | ||||
-rw-r--r-- | tftf/tests/tests-standard.mk | 3 | ||||
-rw-r--r-- | tftf/tests/tests-standard.xml | 4 | ||||
-rw-r--r-- | tftf/tests/tests-trng.mk | 7 | ||||
-rw-r--r-- | tftf/tests/tests-trng.xml | 25 |
5 files changed, 187 insertions, 2 deletions
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> |