mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2025-08-01 10:06:53 +03:00
Add PSA threaded init tests
Signed-off-by: Paul Elliott <paul.elliott@arm.com>
This commit is contained in:
@ -10,6 +10,9 @@ deinit_without_init:0
|
|||||||
PSA deinit twice
|
PSA deinit twice
|
||||||
deinit_without_init:1
|
deinit_without_init:1
|
||||||
|
|
||||||
|
PSA threaded init checks
|
||||||
|
psa_threaded_init:100
|
||||||
|
|
||||||
No random without init
|
No random without init
|
||||||
validate_module_init_generate_random:0
|
validate_module_init_generate_random:0
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/* BEGIN_HEADER */
|
/* BEGIN_HEADER */
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "psa_crypto_core.h"
|
||||||
/* Some tests in this module configure entropy sources. */
|
/* Some tests in this module configure entropy sources. */
|
||||||
#include "psa_crypto_invasive.h"
|
#include "psa_crypto_invasive.h"
|
||||||
|
|
||||||
@ -112,6 +113,59 @@ static void custom_entropy_init(mbedtls_entropy_context *ctx)
|
|||||||
|
|
||||||
#endif /* !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) */
|
#endif /* !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) */
|
||||||
|
|
||||||
|
#if defined MBEDTLS_THREADING_PTHREAD
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int do_init;
|
||||||
|
} thread_psa_init_ctx_t;
|
||||||
|
|
||||||
|
static void *thread_psa_init_function(void *ctx)
|
||||||
|
{
|
||||||
|
thread_psa_init_ctx_t *init_context = (thread_psa_init_ctx_t *) ctx;
|
||||||
|
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
|
||||||
|
uint8_t random[10] = { 0 };
|
||||||
|
|
||||||
|
if (init_context->do_init) {
|
||||||
|
PSA_ASSERT(psa_crypto_init());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If this is a test only thread, then we can assume PSA is being started
|
||||||
|
* up on another thread and thus we cannot know whether the following tests
|
||||||
|
* will be successful or not. These checks are still useful, however even
|
||||||
|
* without checking the return codes as they may show up race conditions on
|
||||||
|
* the flags they check under TSAN.*/
|
||||||
|
|
||||||
|
/* Test getting if drivers are initialised. */
|
||||||
|
int can_do = psa_can_do_hash(PSA_ALG_NONE);
|
||||||
|
|
||||||
|
if (init_context->do_init) {
|
||||||
|
TEST_ASSERT(can_do == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
|
||||||
|
|
||||||
|
/* Test getting global_data.rng_state. */
|
||||||
|
status = mbedtls_psa_crypto_configure_entropy_sources(NULL, NULL);
|
||||||
|
|
||||||
|
if (init_context->do_init) {
|
||||||
|
/* Bad state due to entropy sources already being setup in
|
||||||
|
* psa_crypto_init() */
|
||||||
|
TEST_EQUAL(status, PSA_ERROR_BAD_STATE);
|
||||||
|
}
|
||||||
|
#endif /* !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) */
|
||||||
|
|
||||||
|
/* Test using the PSA RNG ony if we know PSA is up and running. */
|
||||||
|
if (init_context->do_init) {
|
||||||
|
status = psa_generate_random(random, sizeof(random));
|
||||||
|
|
||||||
|
TEST_EQUAL(status, PSA_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif /* defined MBEDTLS_THREADING_PTHREAD */
|
||||||
|
|
||||||
/* END_HEADER */
|
/* END_HEADER */
|
||||||
|
|
||||||
/* BEGIN_DEPENDENCIES
|
/* BEGIN_DEPENDENCIES
|
||||||
@ -154,6 +208,67 @@ void deinit_without_init(int count)
|
|||||||
}
|
}
|
||||||
/* END_CASE */
|
/* END_CASE */
|
||||||
|
|
||||||
|
/* BEGIN_CASE depends_on:MBEDTLS_THREADING_PTHREAD */
|
||||||
|
void psa_threaded_init(int arg_thread_count)
|
||||||
|
{
|
||||||
|
thread_psa_init_ctx_t init_context;
|
||||||
|
thread_psa_init_ctx_t init_context_2;
|
||||||
|
|
||||||
|
size_t thread_count = (size_t) arg_thread_count;
|
||||||
|
mbedtls_test_thread_t *threads = NULL;
|
||||||
|
|
||||||
|
TEST_CALLOC(threads, sizeof(mbedtls_test_thread_t) * thread_count);
|
||||||
|
|
||||||
|
init_context.do_init = 1;
|
||||||
|
|
||||||
|
/* Test initialising PSA and testing certain protected globals on multiple
|
||||||
|
* threads. */
|
||||||
|
for (size_t i = 0; i < thread_count; i++) {
|
||||||
|
TEST_EQUAL(
|
||||||
|
mbedtls_test_thread_create(&threads[i],
|
||||||
|
thread_psa_init_function,
|
||||||
|
(void *) &init_context),
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < thread_count; i++) {
|
||||||
|
TEST_EQUAL(mbedtls_test_thread_join(&threads[i]), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
PSA_DONE();
|
||||||
|
|
||||||
|
init_context_2.do_init = 0;
|
||||||
|
|
||||||
|
/* Test initialising PSA whilst also testing flags on other threads. */
|
||||||
|
for (size_t i = 0; i < thread_count; i++) {
|
||||||
|
|
||||||
|
if (i & 1) {
|
||||||
|
|
||||||
|
TEST_EQUAL(
|
||||||
|
mbedtls_test_thread_create(&threads[i],
|
||||||
|
thread_psa_init_function,
|
||||||
|
(void *) &init_context),
|
||||||
|
0);
|
||||||
|
} else {
|
||||||
|
TEST_EQUAL(
|
||||||
|
mbedtls_test_thread_create(&threads[i],
|
||||||
|
thread_psa_init_function,
|
||||||
|
(void *) &init_context_2),
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < thread_count; i++) {
|
||||||
|
TEST_EQUAL(mbedtls_test_thread_join(&threads[i]), 0);
|
||||||
|
}
|
||||||
|
exit:
|
||||||
|
|
||||||
|
PSA_DONE();
|
||||||
|
|
||||||
|
mbedtls_free(threads);
|
||||||
|
}
|
||||||
|
/* END_CASE */
|
||||||
|
|
||||||
/* BEGIN_CASE */
|
/* BEGIN_CASE */
|
||||||
void validate_module_init_generate_random(int count)
|
void validate_module_init_generate_random(int count)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user