mirror of
https://github.com/cuberite/polarssl.git
synced 2025-09-30 08:56:50 -04:00
Merge pull request #8924 from Ryan-Everett-arm/threading-same-key-tests
Add testing for concurrently loading/using/destroying the same key
This commit is contained in:
commit
44ccc8764b
@ -123,6 +123,9 @@
|
|||||||
* \param input2 The first input to pass.
|
* \param input2 The first input to pass.
|
||||||
* \param input2_length The length of \p input2 in bytes.
|
* \param input2_length The length of \p input2 in bytes.
|
||||||
* \param capacity The capacity to set.
|
* \param capacity The capacity to set.
|
||||||
|
* \param key_destroyable If set to 1, a failure due to the key not existing
|
||||||
|
* or the key being destroyed mid-operation will only
|
||||||
|
* be reported if the error code is unexpected.
|
||||||
*
|
*
|
||||||
* \return \c 1 on success, \c 0 on failure.
|
* \return \c 1 on success, \c 0 on failure.
|
||||||
*/
|
*/
|
||||||
@ -132,7 +135,7 @@ int mbedtls_test_psa_setup_key_derivation_wrap(
|
|||||||
psa_algorithm_t alg,
|
psa_algorithm_t alg,
|
||||||
const unsigned char *input1, size_t input1_length,
|
const unsigned char *input1, size_t input1_length,
|
||||||
const unsigned char *input2, size_t input2_length,
|
const unsigned char *input2, size_t input2_length,
|
||||||
size_t capacity);
|
size_t capacity, int key_destroyable);
|
||||||
|
|
||||||
/** Perform a key agreement using the given key pair against its public key
|
/** Perform a key agreement using the given key pair against its public key
|
||||||
* using psa_raw_key_agreement().
|
* using psa_raw_key_agreement().
|
||||||
@ -143,12 +146,15 @@ int mbedtls_test_psa_setup_key_derivation_wrap(
|
|||||||
*
|
*
|
||||||
* \param alg A key agreement algorithm compatible with \p key.
|
* \param alg A key agreement algorithm compatible with \p key.
|
||||||
* \param key A key that allows key agreement with \p alg.
|
* \param key A key that allows key agreement with \p alg.
|
||||||
|
* \param key_destroyable If set to 1, a failure due to the key not existing
|
||||||
|
* or the key being destroyed mid-operation will only
|
||||||
|
* be reported if the error code is unexpected.
|
||||||
*
|
*
|
||||||
* \return \c 1 on success, \c 0 on failure.
|
* \return \c 1 on success, \c 0 on failure.
|
||||||
*/
|
*/
|
||||||
psa_status_t mbedtls_test_psa_raw_key_agreement_with_self(
|
psa_status_t mbedtls_test_psa_raw_key_agreement_with_self(
|
||||||
psa_algorithm_t alg,
|
psa_algorithm_t alg,
|
||||||
mbedtls_svc_key_id_t key);
|
mbedtls_svc_key_id_t key, int key_destroyable);
|
||||||
|
|
||||||
/** Perform a key agreement using the given key pair against its public key
|
/** Perform a key agreement using the given key pair against its public key
|
||||||
* using psa_key_derivation_raw_key().
|
* using psa_key_derivation_raw_key().
|
||||||
@ -162,12 +168,15 @@ psa_status_t mbedtls_test_psa_raw_key_agreement_with_self(
|
|||||||
* \p key.
|
* \p key.
|
||||||
* \param key A key pair object that is suitable for a key
|
* \param key A key pair object that is suitable for a key
|
||||||
* agreement with \p operation.
|
* agreement with \p operation.
|
||||||
|
* \param key_destroyable If set to 1, a failure due to the key not existing
|
||||||
|
* or the key being destroyed mid-operation will only
|
||||||
|
* be reported if the error code is unexpected.
|
||||||
*
|
*
|
||||||
* \return \c 1 on success, \c 0 on failure.
|
* \return \c 1 on success, \c 0 on failure.
|
||||||
*/
|
*/
|
||||||
psa_status_t mbedtls_test_psa_key_agreement_with_self(
|
psa_status_t mbedtls_test_psa_key_agreement_with_self(
|
||||||
psa_key_derivation_operation_t *operation,
|
psa_key_derivation_operation_t *operation,
|
||||||
mbedtls_svc_key_id_t key);
|
mbedtls_svc_key_id_t key, int key_destroyable);
|
||||||
|
|
||||||
/** Perform sanity checks on the given key representation.
|
/** Perform sanity checks on the given key representation.
|
||||||
*
|
*
|
||||||
@ -209,18 +218,34 @@ int mbedtls_test_psa_exported_key_sanity_check(
|
|||||||
* ```
|
* ```
|
||||||
* if( ! exercise_key( ... ) ) goto exit;
|
* if( ! exercise_key( ... ) ) goto exit;
|
||||||
* ```
|
* ```
|
||||||
|
* To use this function for multi-threaded tests where the key
|
||||||
|
* may be destroyed at any point: call this function with key_destroyable set
|
||||||
|
* to 1, while another thread calls psa_destroy_key on the same key;
|
||||||
|
* this will test whether destroying the key in use leads to any corruption.
|
||||||
*
|
*
|
||||||
* \param key The key to exercise. It should be capable of performing
|
* There cannot be a set of concurrent calls:
|
||||||
* \p alg.
|
* `mbedtls_test_psa_exercise_key(ki,...)` such that each ki is a unique
|
||||||
* \param usage The usage flags to assume.
|
* persistent key not loaded into any key slot, and i is greater than the
|
||||||
* \param alg The algorithm to exercise.
|
* number of free key slots.
|
||||||
|
* This is because such scenarios can lead to unsupported
|
||||||
|
* `PSA_ERROR_INSUFFICIENT_MEMORY` return codes.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* \param key The key to exercise. It should be capable of performing
|
||||||
|
* \p alg.
|
||||||
|
* \param usage The usage flags to assume.
|
||||||
|
* \param alg The algorithm to exercise.
|
||||||
|
* \param key_destroyable If set to 1, a failure due to the key not existing
|
||||||
|
* or the key being destroyed mid-operation will only
|
||||||
|
* be reported if the error code is unexpected.
|
||||||
*
|
*
|
||||||
* \retval 0 The key failed the smoke tests.
|
* \retval 0 The key failed the smoke tests.
|
||||||
* \retval 1 The key passed the smoke tests.
|
* \retval 1 The key passed the smoke tests.
|
||||||
*/
|
*/
|
||||||
int mbedtls_test_psa_exercise_key(mbedtls_svc_key_id_t key,
|
int mbedtls_test_psa_exercise_key(mbedtls_svc_key_id_t key,
|
||||||
psa_key_usage_t usage,
|
psa_key_usage_t usage,
|
||||||
psa_algorithm_t alg);
|
psa_algorithm_t alg,
|
||||||
|
int key_destroyable);
|
||||||
|
|
||||||
psa_key_usage_t mbedtls_test_psa_usage_to_exercise(psa_key_type_t type,
|
psa_key_usage_t mbedtls_test_psa_usage_to_exercise(psa_key_type_t type,
|
||||||
psa_algorithm_t alg);
|
psa_algorithm_t alg);
|
||||||
|
@ -38,7 +38,8 @@ static int lifetime_is_dynamic_secure_element(psa_key_lifetime_t lifetime)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int check_key_attributes_sanity(mbedtls_svc_key_id_t key)
|
static int check_key_attributes_sanity(mbedtls_svc_key_id_t key,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
int ok = 0;
|
int ok = 0;
|
||||||
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
||||||
@ -46,8 +47,13 @@ static int check_key_attributes_sanity(mbedtls_svc_key_id_t key)
|
|||||||
mbedtls_svc_key_id_t id;
|
mbedtls_svc_key_id_t id;
|
||||||
psa_key_type_t type;
|
psa_key_type_t type;
|
||||||
size_t bits;
|
size_t bits;
|
||||||
|
psa_status_t status = psa_get_key_attributes(key, &attributes);
|
||||||
PSA_ASSERT(psa_get_key_attributes(key, &attributes));
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
psa_reset_key_attributes(&attributes);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
lifetime = psa_get_key_lifetime(&attributes);
|
lifetime = psa_get_key_lifetime(&attributes);
|
||||||
id = psa_get_key_id(&attributes);
|
id = psa_get_key_id(&attributes);
|
||||||
type = psa_get_key_type(&attributes);
|
type = psa_get_key_type(&attributes);
|
||||||
@ -66,17 +72,20 @@ static int check_key_attributes_sanity(mbedtls_svc_key_id_t key)
|
|||||||
(MBEDTLS_SVC_KEY_ID_GET_KEY_ID(id) <= PSA_KEY_ID_USER_MAX));
|
(MBEDTLS_SVC_KEY_ID_GET_KEY_ID(id) <= PSA_KEY_ID_USER_MAX));
|
||||||
}
|
}
|
||||||
#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
|
#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
|
||||||
/* randomly-generated 64-bit constant, should never appear in test data */
|
/* MBEDTLS_PSA_CRYPTO_SE_C does not support thread safety. */
|
||||||
psa_key_slot_number_t slot_number = 0xec94d4a5058a1a21;
|
if (key_destroyable == 0) {
|
||||||
psa_status_t status = psa_get_key_slot_number(&attributes, &slot_number);
|
/* randomly-generated 64-bit constant, should never appear in test data */
|
||||||
if (lifetime_is_dynamic_secure_element(lifetime)) {
|
psa_key_slot_number_t slot_number = 0xec94d4a5058a1a21;
|
||||||
/* Mbed TLS currently always exposes the slot number to
|
status = psa_get_key_slot_number(&attributes, &slot_number);
|
||||||
* applications. This is not mandated by the PSA specification
|
if (lifetime_is_dynamic_secure_element(lifetime)) {
|
||||||
* and may change in future versions. */
|
/* Mbed TLS currently always exposes the slot number to
|
||||||
TEST_EQUAL(status, 0);
|
* applications. This is not mandated by the PSA specification
|
||||||
TEST_ASSERT(slot_number != 0xec94d4a5058a1a21);
|
* and may change in future versions. */
|
||||||
} else {
|
TEST_EQUAL(status, 0);
|
||||||
TEST_EQUAL(status, PSA_ERROR_INVALID_ARGUMENT);
|
TEST_ASSERT(slot_number != 0xec94d4a5058a1a21);
|
||||||
|
} else {
|
||||||
|
TEST_EQUAL(status, PSA_ERROR_INVALID_ARGUMENT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -110,20 +119,27 @@ exit:
|
|||||||
|
|
||||||
static int exercise_mac_key(mbedtls_svc_key_id_t key,
|
static int exercise_mac_key(mbedtls_svc_key_id_t key,
|
||||||
psa_key_usage_t usage,
|
psa_key_usage_t usage,
|
||||||
psa_algorithm_t alg)
|
psa_algorithm_t alg,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
|
psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
|
||||||
const unsigned char input[] = "foo";
|
const unsigned char input[] = "foo";
|
||||||
unsigned char mac[PSA_MAC_MAX_SIZE] = { 0 };
|
unsigned char mac[PSA_MAC_MAX_SIZE] = { 0 };
|
||||||
size_t mac_length = sizeof(mac);
|
size_t mac_length = sizeof(mac);
|
||||||
|
psa_status_t status = PSA_SUCCESS;
|
||||||
/* Convert wildcard algorithm to exercisable algorithm */
|
/* Convert wildcard algorithm to exercisable algorithm */
|
||||||
if (alg & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) {
|
if (alg & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) {
|
||||||
alg = PSA_ALG_TRUNCATED_MAC(alg, PSA_MAC_TRUNCATED_LENGTH(alg));
|
alg = PSA_ALG_TRUNCATED_MAC(alg, PSA_MAC_TRUNCATED_LENGTH(alg));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usage & PSA_KEY_USAGE_SIGN_HASH) {
|
if (usage & PSA_KEY_USAGE_SIGN_HASH) {
|
||||||
PSA_ASSERT(psa_mac_sign_setup(&operation, key, alg));
|
status = psa_mac_sign_setup(&operation, key, alg);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
PSA_ASSERT(psa_mac_abort(&operation));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
PSA_ASSERT(psa_mac_update(&operation,
|
PSA_ASSERT(psa_mac_update(&operation,
|
||||||
input, sizeof(input)));
|
input, sizeof(input)));
|
||||||
PSA_ASSERT(psa_mac_sign_finish(&operation,
|
PSA_ASSERT(psa_mac_sign_finish(&operation,
|
||||||
@ -136,7 +152,13 @@ static int exercise_mac_key(mbedtls_svc_key_id_t key,
|
|||||||
(usage & PSA_KEY_USAGE_SIGN_HASH ?
|
(usage & PSA_KEY_USAGE_SIGN_HASH ?
|
||||||
PSA_SUCCESS :
|
PSA_SUCCESS :
|
||||||
PSA_ERROR_INVALID_SIGNATURE);
|
PSA_ERROR_INVALID_SIGNATURE);
|
||||||
PSA_ASSERT(psa_mac_verify_setup(&operation, key, alg));
|
status = psa_mac_verify_setup(&operation, key, alg);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
PSA_ASSERT(psa_mac_abort(&operation));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
PSA_ASSERT(psa_mac_update(&operation,
|
PSA_ASSERT(psa_mac_update(&operation,
|
||||||
input, sizeof(input)));
|
input, sizeof(input)));
|
||||||
TEST_EQUAL(psa_mac_verify_finish(&operation, mac, mac_length),
|
TEST_EQUAL(psa_mac_verify_finish(&operation, mac, mac_length),
|
||||||
@ -152,7 +174,8 @@ exit:
|
|||||||
|
|
||||||
static int exercise_cipher_key(mbedtls_svc_key_id_t key,
|
static int exercise_cipher_key(mbedtls_svc_key_id_t key,
|
||||||
psa_key_usage_t usage,
|
psa_key_usage_t usage,
|
||||||
psa_algorithm_t alg)
|
psa_algorithm_t alg,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
|
psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
|
||||||
unsigned char iv[PSA_CIPHER_IV_MAX_SIZE] = { 0 };
|
unsigned char iv[PSA_CIPHER_IV_MAX_SIZE] = { 0 };
|
||||||
@ -164,13 +187,20 @@ static int exercise_cipher_key(mbedtls_svc_key_id_t key,
|
|||||||
size_t ciphertext_length = sizeof(ciphertext);
|
size_t ciphertext_length = sizeof(ciphertext);
|
||||||
unsigned char decrypted[sizeof(ciphertext)];
|
unsigned char decrypted[sizeof(ciphertext)];
|
||||||
size_t part_length;
|
size_t part_length;
|
||||||
|
psa_status_t status = PSA_SUCCESS;
|
||||||
|
|
||||||
PSA_ASSERT(psa_get_key_attributes(key, &attributes));
|
PSA_ASSERT(psa_get_key_attributes(key, &attributes));
|
||||||
key_type = psa_get_key_type(&attributes);
|
key_type = psa_get_key_type(&attributes);
|
||||||
iv_length = PSA_CIPHER_IV_LENGTH(key_type, alg);
|
iv_length = PSA_CIPHER_IV_LENGTH(key_type, alg);
|
||||||
|
|
||||||
if (usage & PSA_KEY_USAGE_ENCRYPT) {
|
if (usage & PSA_KEY_USAGE_ENCRYPT) {
|
||||||
PSA_ASSERT(psa_cipher_encrypt_setup(&operation, key, alg));
|
status = psa_cipher_encrypt_setup(&operation, key, alg);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
PSA_ASSERT(psa_cipher_abort(&operation));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
if (iv_length != 0) {
|
if (iv_length != 0) {
|
||||||
PSA_ASSERT(psa_cipher_generate_iv(&operation,
|
PSA_ASSERT(psa_cipher_generate_iv(&operation,
|
||||||
iv, sizeof(iv),
|
iv, sizeof(iv),
|
||||||
@ -188,12 +218,17 @@ static int exercise_cipher_key(mbedtls_svc_key_id_t key,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (usage & PSA_KEY_USAGE_DECRYPT) {
|
if (usage & PSA_KEY_USAGE_DECRYPT) {
|
||||||
psa_status_t status;
|
|
||||||
int maybe_invalid_padding = 0;
|
int maybe_invalid_padding = 0;
|
||||||
if (!(usage & PSA_KEY_USAGE_ENCRYPT)) {
|
if (!(usage & PSA_KEY_USAGE_ENCRYPT)) {
|
||||||
maybe_invalid_padding = !PSA_ALG_IS_STREAM_CIPHER(alg);
|
maybe_invalid_padding = !PSA_ALG_IS_STREAM_CIPHER(alg);
|
||||||
}
|
}
|
||||||
PSA_ASSERT(psa_cipher_decrypt_setup(&operation, key, alg));
|
status = psa_cipher_decrypt_setup(&operation, key, alg);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
PSA_ASSERT(psa_cipher_abort(&operation));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
if (iv_length != 0) {
|
if (iv_length != 0) {
|
||||||
PSA_ASSERT(psa_cipher_set_iv(&operation,
|
PSA_ASSERT(psa_cipher_set_iv(&operation,
|
||||||
iv, iv_length));
|
iv, iv_length));
|
||||||
@ -227,7 +262,8 @@ exit:
|
|||||||
|
|
||||||
static int exercise_aead_key(mbedtls_svc_key_id_t key,
|
static int exercise_aead_key(mbedtls_svc_key_id_t key,
|
||||||
psa_key_usage_t usage,
|
psa_key_usage_t usage,
|
||||||
psa_algorithm_t alg)
|
psa_algorithm_t alg,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
unsigned char nonce[PSA_AEAD_NONCE_MAX_SIZE] = { 0 };
|
unsigned char nonce[PSA_AEAD_NONCE_MAX_SIZE] = { 0 };
|
||||||
size_t nonce_length;
|
size_t nonce_length;
|
||||||
@ -237,6 +273,7 @@ static int exercise_aead_key(mbedtls_svc_key_id_t key,
|
|||||||
unsigned char ciphertext[48] = "(wabblewebblewibblewobblewubble)";
|
unsigned char ciphertext[48] = "(wabblewebblewibblewobblewubble)";
|
||||||
size_t ciphertext_length = sizeof(ciphertext);
|
size_t ciphertext_length = sizeof(ciphertext);
|
||||||
size_t plaintext_length = sizeof(ciphertext);
|
size_t plaintext_length = sizeof(ciphertext);
|
||||||
|
psa_status_t status = PSA_SUCCESS;
|
||||||
|
|
||||||
/* Convert wildcard algorithm to exercisable algorithm */
|
/* Convert wildcard algorithm to exercisable algorithm */
|
||||||
if (alg & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) {
|
if (alg & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) {
|
||||||
@ -248,12 +285,17 @@ static int exercise_aead_key(mbedtls_svc_key_id_t key,
|
|||||||
nonce_length = PSA_AEAD_NONCE_LENGTH(key_type, alg);
|
nonce_length = PSA_AEAD_NONCE_LENGTH(key_type, alg);
|
||||||
|
|
||||||
if (usage & PSA_KEY_USAGE_ENCRYPT) {
|
if (usage & PSA_KEY_USAGE_ENCRYPT) {
|
||||||
PSA_ASSERT(psa_aead_encrypt(key, alg,
|
status = psa_aead_encrypt(key, alg,
|
||||||
nonce, nonce_length,
|
nonce, nonce_length,
|
||||||
NULL, 0,
|
NULL, 0,
|
||||||
plaintext, sizeof(plaintext),
|
plaintext, sizeof(plaintext),
|
||||||
ciphertext, sizeof(ciphertext),
|
ciphertext, sizeof(ciphertext),
|
||||||
&ciphertext_length));
|
&ciphertext_length);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usage & PSA_KEY_USAGE_DECRYPT) {
|
if (usage & PSA_KEY_USAGE_DECRYPT) {
|
||||||
@ -261,13 +303,17 @@ static int exercise_aead_key(mbedtls_svc_key_id_t key,
|
|||||||
(usage & PSA_KEY_USAGE_ENCRYPT ?
|
(usage & PSA_KEY_USAGE_ENCRYPT ?
|
||||||
PSA_SUCCESS :
|
PSA_SUCCESS :
|
||||||
PSA_ERROR_INVALID_SIGNATURE);
|
PSA_ERROR_INVALID_SIGNATURE);
|
||||||
TEST_EQUAL(psa_aead_decrypt(key, alg,
|
status = psa_aead_decrypt(key, alg,
|
||||||
nonce, nonce_length,
|
nonce, nonce_length,
|
||||||
NULL, 0,
|
NULL, 0,
|
||||||
ciphertext, ciphertext_length,
|
ciphertext, ciphertext_length,
|
||||||
plaintext, sizeof(plaintext),
|
plaintext, sizeof(plaintext),
|
||||||
&plaintext_length),
|
&plaintext_length);
|
||||||
verify_status);
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
TEST_ASSERT(status == verify_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -291,7 +337,8 @@ static int can_sign_or_verify_message(psa_key_usage_t usage,
|
|||||||
|
|
||||||
static int exercise_signature_key(mbedtls_svc_key_id_t key,
|
static int exercise_signature_key(mbedtls_svc_key_id_t key,
|
||||||
psa_key_usage_t usage,
|
psa_key_usage_t usage,
|
||||||
psa_algorithm_t alg)
|
psa_algorithm_t alg,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
/* If the policy allows signing with any hash, just pick one. */
|
/* If the policy allows signing with any hash, just pick one. */
|
||||||
psa_algorithm_t hash_alg = PSA_ALG_SIGN_GET_HASH(alg);
|
psa_algorithm_t hash_alg = PSA_ALG_SIGN_GET_HASH(alg);
|
||||||
@ -305,6 +352,7 @@ static int exercise_signature_key(mbedtls_svc_key_id_t key,
|
|||||||
TEST_FAIL("No hash algorithm for hash-and-sign testing");
|
TEST_FAIL("No hash algorithm for hash-and-sign testing");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
psa_status_t status = PSA_SUCCESS;
|
||||||
|
|
||||||
if (usage & (PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH) &&
|
if (usage & (PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_VERIFY_HASH) &&
|
||||||
PSA_ALG_IS_SIGN_HASH(alg)) {
|
PSA_ALG_IS_SIGN_HASH(alg)) {
|
||||||
@ -321,10 +369,15 @@ static int exercise_signature_key(mbedtls_svc_key_id_t key,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (usage & PSA_KEY_USAGE_SIGN_HASH) {
|
if (usage & PSA_KEY_USAGE_SIGN_HASH) {
|
||||||
PSA_ASSERT(psa_sign_hash(key, alg,
|
status = psa_sign_hash(key, alg,
|
||||||
payload, payload_length,
|
payload, payload_length,
|
||||||
signature, sizeof(signature),
|
signature, sizeof(signature),
|
||||||
&signature_length));
|
&signature_length);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usage & PSA_KEY_USAGE_VERIFY_HASH) {
|
if (usage & PSA_KEY_USAGE_VERIFY_HASH) {
|
||||||
@ -332,10 +385,14 @@ static int exercise_signature_key(mbedtls_svc_key_id_t key,
|
|||||||
(usage & PSA_KEY_USAGE_SIGN_HASH ?
|
(usage & PSA_KEY_USAGE_SIGN_HASH ?
|
||||||
PSA_SUCCESS :
|
PSA_SUCCESS :
|
||||||
PSA_ERROR_INVALID_SIGNATURE);
|
PSA_ERROR_INVALID_SIGNATURE);
|
||||||
TEST_EQUAL(psa_verify_hash(key, alg,
|
status = psa_verify_hash(key, alg,
|
||||||
payload, payload_length,
|
payload, payload_length,
|
||||||
signature, signature_length),
|
signature, signature_length);
|
||||||
verify_status);
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
TEST_ASSERT(status == verify_status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,10 +403,15 @@ static int exercise_signature_key(mbedtls_svc_key_id_t key,
|
|||||||
size_t signature_length = sizeof(signature);
|
size_t signature_length = sizeof(signature);
|
||||||
|
|
||||||
if (usage & PSA_KEY_USAGE_SIGN_MESSAGE) {
|
if (usage & PSA_KEY_USAGE_SIGN_MESSAGE) {
|
||||||
PSA_ASSERT(psa_sign_message(key, alg,
|
status = psa_sign_message(key, alg,
|
||||||
message, message_length,
|
message, message_length,
|
||||||
signature, sizeof(signature),
|
signature, sizeof(signature),
|
||||||
&signature_length));
|
&signature_length);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usage & PSA_KEY_USAGE_VERIFY_MESSAGE) {
|
if (usage & PSA_KEY_USAGE_VERIFY_MESSAGE) {
|
||||||
@ -357,10 +419,14 @@ static int exercise_signature_key(mbedtls_svc_key_id_t key,
|
|||||||
(usage & PSA_KEY_USAGE_SIGN_MESSAGE ?
|
(usage & PSA_KEY_USAGE_SIGN_MESSAGE ?
|
||||||
PSA_SUCCESS :
|
PSA_SUCCESS :
|
||||||
PSA_ERROR_INVALID_SIGNATURE);
|
PSA_ERROR_INVALID_SIGNATURE);
|
||||||
TEST_EQUAL(psa_verify_message(key, alg,
|
status = psa_verify_message(key, alg,
|
||||||
message, message_length,
|
message, message_length,
|
||||||
signature, signature_length),
|
signature, signature_length);
|
||||||
verify_status);
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
TEST_ASSERT(status == verify_status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -372,7 +438,8 @@ exit:
|
|||||||
|
|
||||||
static int exercise_asymmetric_encryption_key(mbedtls_svc_key_id_t key,
|
static int exercise_asymmetric_encryption_key(mbedtls_svc_key_id_t key,
|
||||||
psa_key_usage_t usage,
|
psa_key_usage_t usage,
|
||||||
psa_algorithm_t alg)
|
psa_algorithm_t alg,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
unsigned char plaintext[PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE] =
|
unsigned char plaintext[PSA_ASYMMETRIC_DECRYPT_OUTPUT_MAX_SIZE] =
|
||||||
"Hello, world...";
|
"Hello, world...";
|
||||||
@ -380,22 +447,30 @@ static int exercise_asymmetric_encryption_key(mbedtls_svc_key_id_t key,
|
|||||||
"(wabblewebblewibblewobblewubble)";
|
"(wabblewebblewibblewobblewubble)";
|
||||||
size_t ciphertext_length = sizeof(ciphertext);
|
size_t ciphertext_length = sizeof(ciphertext);
|
||||||
size_t plaintext_length = 16;
|
size_t plaintext_length = 16;
|
||||||
|
psa_status_t status = PSA_SUCCESS;
|
||||||
if (usage & PSA_KEY_USAGE_ENCRYPT) {
|
if (usage & PSA_KEY_USAGE_ENCRYPT) {
|
||||||
PSA_ASSERT(psa_asymmetric_encrypt(key, alg,
|
status = psa_asymmetric_encrypt(key, alg,
|
||||||
plaintext, plaintext_length,
|
plaintext, plaintext_length,
|
||||||
NULL, 0,
|
NULL, 0,
|
||||||
ciphertext, sizeof(ciphertext),
|
ciphertext, sizeof(ciphertext),
|
||||||
&ciphertext_length));
|
&ciphertext_length);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usage & PSA_KEY_USAGE_DECRYPT) {
|
if (usage & PSA_KEY_USAGE_DECRYPT) {
|
||||||
psa_status_t status =
|
status = psa_asymmetric_decrypt(key, alg,
|
||||||
psa_asymmetric_decrypt(key, alg,
|
ciphertext, ciphertext_length,
|
||||||
ciphertext, ciphertext_length,
|
NULL, 0,
|
||||||
NULL, 0,
|
plaintext, sizeof(plaintext),
|
||||||
plaintext, sizeof(plaintext),
|
&plaintext_length);
|
||||||
&plaintext_length);
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
TEST_ASSERT(status == PSA_SUCCESS ||
|
TEST_ASSERT(status == PSA_SUCCESS ||
|
||||||
((usage & PSA_KEY_USAGE_ENCRYPT) == 0 &&
|
((usage & PSA_KEY_USAGE_ENCRYPT) == 0 &&
|
||||||
(status == PSA_ERROR_INVALID_ARGUMENT ||
|
(status == PSA_ERROR_INVALID_ARGUMENT ||
|
||||||
@ -414,16 +489,22 @@ int mbedtls_test_psa_setup_key_derivation_wrap(
|
|||||||
psa_algorithm_t alg,
|
psa_algorithm_t alg,
|
||||||
const unsigned char *input1, size_t input1_length,
|
const unsigned char *input1, size_t input1_length,
|
||||||
const unsigned char *input2, size_t input2_length,
|
const unsigned char *input2, size_t input2_length,
|
||||||
size_t capacity)
|
size_t capacity, int key_destroyable)
|
||||||
{
|
{
|
||||||
PSA_ASSERT(psa_key_derivation_setup(operation, alg));
|
PSA_ASSERT(psa_key_derivation_setup(operation, alg));
|
||||||
|
psa_status_t status = PSA_SUCCESS;
|
||||||
if (PSA_ALG_IS_HKDF(alg)) {
|
if (PSA_ALG_IS_HKDF(alg)) {
|
||||||
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
||||||
PSA_KEY_DERIVATION_INPUT_SALT,
|
PSA_KEY_DERIVATION_INPUT_SALT,
|
||||||
input1, input1_length));
|
input1, input1_length));
|
||||||
PSA_ASSERT(psa_key_derivation_input_key(operation,
|
status = psa_key_derivation_input_key(operation,
|
||||||
PSA_KEY_DERIVATION_INPUT_SECRET,
|
PSA_KEY_DERIVATION_INPUT_SECRET,
|
||||||
key));
|
key);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
||||||
PSA_KEY_DERIVATION_INPUT_INFO,
|
PSA_KEY_DERIVATION_INPUT_INFO,
|
||||||
input2,
|
input2,
|
||||||
@ -432,13 +513,23 @@ int mbedtls_test_psa_setup_key_derivation_wrap(
|
|||||||
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
||||||
PSA_KEY_DERIVATION_INPUT_SALT,
|
PSA_KEY_DERIVATION_INPUT_SALT,
|
||||||
input1, input1_length));
|
input1, input1_length));
|
||||||
PSA_ASSERT(psa_key_derivation_input_key(operation,
|
status = psa_key_derivation_input_key(operation,
|
||||||
PSA_KEY_DERIVATION_INPUT_SECRET,
|
PSA_KEY_DERIVATION_INPUT_SECRET,
|
||||||
key));
|
key);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
} else if (PSA_ALG_IS_HKDF_EXPAND(alg)) {
|
} else if (PSA_ALG_IS_HKDF_EXPAND(alg)) {
|
||||||
PSA_ASSERT(psa_key_derivation_input_key(operation,
|
status = psa_key_derivation_input_key(operation,
|
||||||
PSA_KEY_DERIVATION_INPUT_SECRET,
|
PSA_KEY_DERIVATION_INPUT_SECRET,
|
||||||
key));
|
key);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
||||||
PSA_KEY_DERIVATION_INPUT_INFO,
|
PSA_KEY_DERIVATION_INPUT_INFO,
|
||||||
input2,
|
input2,
|
||||||
@ -448,9 +539,14 @@ int mbedtls_test_psa_setup_key_derivation_wrap(
|
|||||||
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
||||||
PSA_KEY_DERIVATION_INPUT_SEED,
|
PSA_KEY_DERIVATION_INPUT_SEED,
|
||||||
input1, input1_length));
|
input1, input1_length));
|
||||||
PSA_ASSERT(psa_key_derivation_input_key(operation,
|
status = psa_key_derivation_input_key(operation,
|
||||||
PSA_KEY_DERIVATION_INPUT_SECRET,
|
PSA_KEY_DERIVATION_INPUT_SECRET,
|
||||||
key));
|
key);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
||||||
PSA_KEY_DERIVATION_INPUT_LABEL,
|
PSA_KEY_DERIVATION_INPUT_LABEL,
|
||||||
input2, input2_length));
|
input2, input2_length));
|
||||||
@ -462,9 +558,14 @@ int mbedtls_test_psa_setup_key_derivation_wrap(
|
|||||||
PSA_KEY_DERIVATION_INPUT_SALT,
|
PSA_KEY_DERIVATION_INPUT_SALT,
|
||||||
input2,
|
input2,
|
||||||
input2_length));
|
input2_length));
|
||||||
PSA_ASSERT(psa_key_derivation_input_key(operation,
|
status = psa_key_derivation_input_key(operation,
|
||||||
PSA_KEY_DERIVATION_INPUT_PASSWORD,
|
PSA_KEY_DERIVATION_INPUT_PASSWORD,
|
||||||
key));
|
key);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
} else if (alg == PSA_ALG_TLS12_ECJPAKE_TO_PMS) {
|
} else if (alg == PSA_ALG_TLS12_ECJPAKE_TO_PMS) {
|
||||||
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
PSA_ASSERT(psa_key_derivation_input_bytes(operation,
|
||||||
PSA_KEY_DERIVATION_INPUT_SECRET,
|
PSA_KEY_DERIVATION_INPUT_SECRET,
|
||||||
@ -486,7 +587,8 @@ exit:
|
|||||||
|
|
||||||
static int exercise_key_derivation_key(mbedtls_svc_key_id_t key,
|
static int exercise_key_derivation_key(mbedtls_svc_key_id_t key,
|
||||||
psa_key_usage_t usage,
|
psa_key_usage_t usage,
|
||||||
psa_algorithm_t alg)
|
psa_algorithm_t alg,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
|
psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
|
||||||
unsigned char input1[] = "Input 1";
|
unsigned char input1[] = "Input 1";
|
||||||
@ -500,14 +602,20 @@ static int exercise_key_derivation_key(mbedtls_svc_key_id_t key,
|
|||||||
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, key, alg,
|
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, key, alg,
|
||||||
input1, input1_length,
|
input1, input1_length,
|
||||||
input2, input2_length,
|
input2, input2_length,
|
||||||
capacity)) {
|
capacity, key_destroyable)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
PSA_ASSERT(psa_key_derivation_output_bytes(&operation,
|
psa_status_t status = psa_key_derivation_output_bytes(&operation,
|
||||||
output,
|
output,
|
||||||
capacity));
|
capacity);
|
||||||
PSA_ASSERT(psa_key_derivation_abort(&operation));
|
if (key_destroyable && status == PSA_ERROR_BAD_STATE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
PSA_ASSERT(psa_key_derivation_abort(&operation));
|
||||||
|
} else {
|
||||||
|
PSA_ASSERT(status);
|
||||||
|
PSA_ASSERT(psa_key_derivation_abort(&operation));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -520,31 +628,45 @@ exit:
|
|||||||
* private key against its own public key. */
|
* private key against its own public key. */
|
||||||
psa_status_t mbedtls_test_psa_key_agreement_with_self(
|
psa_status_t mbedtls_test_psa_key_agreement_with_self(
|
||||||
psa_key_derivation_operation_t *operation,
|
psa_key_derivation_operation_t *operation,
|
||||||
mbedtls_svc_key_id_t key)
|
mbedtls_svc_key_id_t key, int key_destroyable)
|
||||||
{
|
{
|
||||||
psa_key_type_t private_key_type;
|
psa_key_type_t private_key_type;
|
||||||
psa_key_type_t public_key_type;
|
psa_key_type_t public_key_type;
|
||||||
size_t key_bits;
|
size_t key_bits;
|
||||||
uint8_t *public_key = NULL;
|
uint8_t *public_key = NULL;
|
||||||
size_t public_key_length;
|
size_t public_key_length;
|
||||||
/* Return GENERIC_ERROR if something other than the final call to
|
|
||||||
* psa_key_derivation_key_agreement fails. This isn't fully satisfactory,
|
|
||||||
* but it's good enough: callers will report it as a failed test anyway. */
|
|
||||||
psa_status_t status = PSA_ERROR_GENERIC_ERROR;
|
|
||||||
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
||||||
|
|
||||||
PSA_ASSERT(psa_get_key_attributes(key, &attributes));
|
psa_status_t status = psa_get_key_attributes(key, &attributes);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
psa_reset_key_attributes(&attributes);
|
||||||
|
return PSA_SUCCESS;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
|
|
||||||
private_key_type = psa_get_key_type(&attributes);
|
private_key_type = psa_get_key_type(&attributes);
|
||||||
key_bits = psa_get_key_bits(&attributes);
|
key_bits = psa_get_key_bits(&attributes);
|
||||||
public_key_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(private_key_type);
|
public_key_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(private_key_type);
|
||||||
public_key_length = PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(public_key_type, key_bits);
|
public_key_length = PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(public_key_type, key_bits);
|
||||||
TEST_CALLOC(public_key, public_key_length);
|
TEST_CALLOC(public_key, public_key_length);
|
||||||
PSA_ASSERT(psa_export_public_key(key, public_key, public_key_length,
|
status = psa_export_public_key(key, public_key, public_key_length,
|
||||||
&public_key_length));
|
&public_key_length);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
status = PSA_SUCCESS;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
|
|
||||||
status = psa_key_derivation_key_agreement(
|
status = psa_key_derivation_key_agreement(
|
||||||
operation, PSA_KEY_DERIVATION_INPUT_SECRET, key,
|
operation, PSA_KEY_DERIVATION_INPUT_SECRET, key,
|
||||||
public_key, public_key_length);
|
public_key, public_key_length);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
status = PSA_SUCCESS;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
exit:
|
exit:
|
||||||
/*
|
/*
|
||||||
* Key attributes may have been returned by psa_get_key_attributes()
|
* Key attributes may have been returned by psa_get_key_attributes()
|
||||||
@ -560,7 +682,8 @@ exit:
|
|||||||
* private key against its own public key. */
|
* private key against its own public key. */
|
||||||
psa_status_t mbedtls_test_psa_raw_key_agreement_with_self(
|
psa_status_t mbedtls_test_psa_raw_key_agreement_with_self(
|
||||||
psa_algorithm_t alg,
|
psa_algorithm_t alg,
|
||||||
mbedtls_svc_key_id_t key)
|
mbedtls_svc_key_id_t key,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
psa_key_type_t private_key_type;
|
psa_key_type_t private_key_type;
|
||||||
psa_key_type_t public_key_type;
|
psa_key_type_t public_key_type;
|
||||||
@ -569,25 +692,39 @@ psa_status_t mbedtls_test_psa_raw_key_agreement_with_self(
|
|||||||
size_t public_key_length;
|
size_t public_key_length;
|
||||||
uint8_t output[1024];
|
uint8_t output[1024];
|
||||||
size_t output_length;
|
size_t output_length;
|
||||||
/* Return GENERIC_ERROR if something other than the final call to
|
|
||||||
* psa_key_derivation_key_agreement fails. This isn't fully satisfactory,
|
|
||||||
* but it's good enough: callers will report it as a failed test anyway. */
|
|
||||||
psa_status_t status = PSA_ERROR_GENERIC_ERROR;
|
|
||||||
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
||||||
|
|
||||||
PSA_ASSERT(psa_get_key_attributes(key, &attributes));
|
psa_status_t status = psa_get_key_attributes(key, &attributes);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
psa_reset_key_attributes(&attributes);
|
||||||
|
return PSA_SUCCESS;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
|
|
||||||
private_key_type = psa_get_key_type(&attributes);
|
private_key_type = psa_get_key_type(&attributes);
|
||||||
key_bits = psa_get_key_bits(&attributes);
|
key_bits = psa_get_key_bits(&attributes);
|
||||||
public_key_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(private_key_type);
|
public_key_type = PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(private_key_type);
|
||||||
public_key_length = PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(public_key_type, key_bits);
|
public_key_length = PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(public_key_type, key_bits);
|
||||||
TEST_CALLOC(public_key, public_key_length);
|
TEST_CALLOC(public_key, public_key_length);
|
||||||
PSA_ASSERT(psa_export_public_key(key,
|
status = psa_export_public_key(key,
|
||||||
public_key, public_key_length,
|
public_key, public_key_length,
|
||||||
&public_key_length));
|
&public_key_length);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
status = PSA_SUCCESS;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
|
|
||||||
status = psa_raw_key_agreement(alg, key,
|
status = psa_raw_key_agreement(alg, key,
|
||||||
public_key, public_key_length,
|
public_key, public_key_length,
|
||||||
output, sizeof(output), &output_length);
|
output, sizeof(output), &output_length);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
status = PSA_SUCCESS;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
if (status == PSA_SUCCESS) {
|
if (status == PSA_SUCCESS) {
|
||||||
TEST_ASSERT(output_length <=
|
TEST_ASSERT(output_length <=
|
||||||
PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE(private_key_type,
|
PSA_RAW_KEY_AGREEMENT_OUTPUT_SIZE(private_key_type,
|
||||||
@ -609,14 +746,16 @@ exit:
|
|||||||
|
|
||||||
static int exercise_raw_key_agreement_key(mbedtls_svc_key_id_t key,
|
static int exercise_raw_key_agreement_key(mbedtls_svc_key_id_t key,
|
||||||
psa_key_usage_t usage,
|
psa_key_usage_t usage,
|
||||||
psa_algorithm_t alg)
|
psa_algorithm_t alg,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
int ok = 0;
|
int ok = 0;
|
||||||
|
|
||||||
if (usage & PSA_KEY_USAGE_DERIVE) {
|
if (usage & PSA_KEY_USAGE_DERIVE) {
|
||||||
/* We need two keys to exercise key agreement. Exercise the
|
/* We need two keys to exercise key agreement. Exercise the
|
||||||
* private key against its own public key. */
|
* private key against its own public key. */
|
||||||
PSA_ASSERT(mbedtls_test_psa_raw_key_agreement_with_self(alg, key));
|
PSA_ASSERT(mbedtls_test_psa_raw_key_agreement_with_self(alg, key,
|
||||||
|
key_destroyable));
|
||||||
}
|
}
|
||||||
ok = 1;
|
ok = 1;
|
||||||
|
|
||||||
@ -626,7 +765,8 @@ exit:
|
|||||||
|
|
||||||
static int exercise_key_agreement_key(mbedtls_svc_key_id_t key,
|
static int exercise_key_agreement_key(mbedtls_svc_key_id_t key,
|
||||||
psa_key_usage_t usage,
|
psa_key_usage_t usage,
|
||||||
psa_algorithm_t alg)
|
psa_algorithm_t alg,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
|
psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
|
||||||
unsigned char input[1] = { 0 };
|
unsigned char input[1] = { 0 };
|
||||||
@ -657,7 +797,12 @@ static int exercise_key_agreement_key(mbedtls_svc_key_id_t key,
|
|||||||
hash length. Otherwise test should fail with INVALID_ARGUMENT. */
|
hash length. Otherwise test should fail with INVALID_ARGUMENT. */
|
||||||
if (PSA_ALG_IS_HKDF_EXPAND(kdf_alg)) {
|
if (PSA_ALG_IS_HKDF_EXPAND(kdf_alg)) {
|
||||||
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
||||||
PSA_ASSERT(psa_get_key_attributes(key, &attributes));
|
psa_status_t status = psa_get_key_attributes(key, &attributes);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
ok = 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
size_t key_bits = psa_get_key_bits(&attributes);
|
size_t key_bits = psa_get_key_bits(&attributes);
|
||||||
psa_algorithm_t hash_alg = PSA_ALG_HKDF_GET_HASH(kdf_alg);
|
psa_algorithm_t hash_alg = PSA_ALG_HKDF_GET_HASH(kdf_alg);
|
||||||
|
|
||||||
@ -666,7 +811,8 @@ static int exercise_key_agreement_key(mbedtls_svc_key_id_t key,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_EQUAL(mbedtls_test_psa_key_agreement_with_self(&operation, key),
|
TEST_EQUAL(mbedtls_test_psa_key_agreement_with_self(&operation, key,
|
||||||
|
key_destroyable),
|
||||||
expected_key_agreement_status);
|
expected_key_agreement_status);
|
||||||
|
|
||||||
if (expected_key_agreement_status != PSA_SUCCESS) {
|
if (expected_key_agreement_status != PSA_SUCCESS) {
|
||||||
@ -857,7 +1003,8 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int exercise_export_key(mbedtls_svc_key_id_t key,
|
static int exercise_export_key(mbedtls_svc_key_id_t key,
|
||||||
psa_key_usage_t usage)
|
psa_key_usage_t usage,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
||||||
uint8_t *exported = NULL;
|
uint8_t *exported = NULL;
|
||||||
@ -865,25 +1012,31 @@ static int exercise_export_key(mbedtls_svc_key_id_t key,
|
|||||||
size_t exported_length = 0;
|
size_t exported_length = 0;
|
||||||
int ok = 0;
|
int ok = 0;
|
||||||
|
|
||||||
PSA_ASSERT(psa_get_key_attributes(key, &attributes));
|
psa_status_t status = psa_get_key_attributes(key, &attributes);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
psa_reset_key_attributes(&attributes);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
|
|
||||||
exported_size = PSA_EXPORT_KEY_OUTPUT_SIZE(
|
exported_size = PSA_EXPORT_KEY_OUTPUT_SIZE(
|
||||||
psa_get_key_type(&attributes),
|
psa_get_key_type(&attributes),
|
||||||
psa_get_key_bits(&attributes));
|
psa_get_key_bits(&attributes));
|
||||||
TEST_CALLOC(exported, exported_size);
|
TEST_CALLOC(exported, exported_size);
|
||||||
|
|
||||||
if ((usage & PSA_KEY_USAGE_EXPORT) == 0 &&
|
status = psa_export_key(key, exported, exported_size, &exported_length);
|
||||||
!PSA_KEY_TYPE_IS_PUBLIC_KEY(psa_get_key_type(&attributes))) {
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
TEST_EQUAL(psa_export_key(key, exported,
|
/* The key has been destroyed. */
|
||||||
exported_size, &exported_length),
|
ok = 1;
|
||||||
PSA_ERROR_NOT_PERMITTED);
|
goto exit;
|
||||||
|
} else if ((usage & PSA_KEY_USAGE_EXPORT) == 0 &&
|
||||||
|
!PSA_KEY_TYPE_IS_PUBLIC_KEY(psa_get_key_type(&attributes))) {
|
||||||
|
TEST_EQUAL(status, PSA_ERROR_NOT_PERMITTED);
|
||||||
ok = 1;
|
ok = 1;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
PSA_ASSERT(psa_export_key(key,
|
|
||||||
exported, exported_size,
|
|
||||||
&exported_length));
|
|
||||||
ok = mbedtls_test_psa_exported_key_sanity_check(
|
ok = mbedtls_test_psa_exported_key_sanity_check(
|
||||||
psa_get_key_type(&attributes), psa_get_key_bits(&attributes),
|
psa_get_key_type(&attributes), psa_get_key_bits(&attributes),
|
||||||
exported, exported_length);
|
exported, exported_length);
|
||||||
@ -899,7 +1052,8 @@ exit:
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int exercise_export_public_key(mbedtls_svc_key_id_t key)
|
static int exercise_export_public_key(mbedtls_svc_key_id_t key,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
||||||
psa_key_type_t public_type;
|
psa_key_type_t public_type;
|
||||||
@ -908,16 +1062,27 @@ static int exercise_export_public_key(mbedtls_svc_key_id_t key)
|
|||||||
size_t exported_length = 0;
|
size_t exported_length = 0;
|
||||||
int ok = 0;
|
int ok = 0;
|
||||||
|
|
||||||
PSA_ASSERT(psa_get_key_attributes(key, &attributes));
|
psa_status_t status = psa_get_key_attributes(key, &attributes);
|
||||||
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
psa_reset_key_attributes(&attributes);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
if (!PSA_KEY_TYPE_IS_ASYMMETRIC(psa_get_key_type(&attributes))) {
|
if (!PSA_KEY_TYPE_IS_ASYMMETRIC(psa_get_key_type(&attributes))) {
|
||||||
exported_size = PSA_EXPORT_KEY_OUTPUT_SIZE(
|
exported_size = PSA_EXPORT_KEY_OUTPUT_SIZE(
|
||||||
psa_get_key_type(&attributes),
|
psa_get_key_type(&attributes),
|
||||||
psa_get_key_bits(&attributes));
|
psa_get_key_bits(&attributes));
|
||||||
TEST_CALLOC(exported, exported_size);
|
TEST_CALLOC(exported, exported_size);
|
||||||
|
|
||||||
TEST_EQUAL(psa_export_public_key(key, exported,
|
status = psa_export_public_key(key, exported,
|
||||||
exported_size, &exported_length),
|
exported_size, &exported_length);
|
||||||
PSA_ERROR_INVALID_ARGUMENT);
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
ok = 1;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
TEST_EQUAL(status, PSA_ERROR_INVALID_ARGUMENT);
|
||||||
ok = 1;
|
ok = 1;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
@ -928,9 +1093,14 @@ static int exercise_export_public_key(mbedtls_svc_key_id_t key)
|
|||||||
psa_get_key_bits(&attributes));
|
psa_get_key_bits(&attributes));
|
||||||
TEST_CALLOC(exported, exported_size);
|
TEST_CALLOC(exported, exported_size);
|
||||||
|
|
||||||
PSA_ASSERT(psa_export_public_key(key,
|
status = psa_export_public_key(key, exported,
|
||||||
exported, exported_size,
|
exported_size, &exported_length);
|
||||||
&exported_length));
|
if (key_destroyable && status == PSA_ERROR_INVALID_HANDLE) {
|
||||||
|
/* The key has been destroyed. */
|
||||||
|
ok = 1;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
ok = mbedtls_test_psa_exported_key_sanity_check(
|
ok = mbedtls_test_psa_exported_key_sanity_check(
|
||||||
public_type, psa_get_key_bits(&attributes),
|
public_type, psa_get_key_bits(&attributes),
|
||||||
exported, exported_length);
|
exported, exported_length);
|
||||||
@ -948,38 +1118,43 @@ exit:
|
|||||||
|
|
||||||
int mbedtls_test_psa_exercise_key(mbedtls_svc_key_id_t key,
|
int mbedtls_test_psa_exercise_key(mbedtls_svc_key_id_t key,
|
||||||
psa_key_usage_t usage,
|
psa_key_usage_t usage,
|
||||||
psa_algorithm_t alg)
|
psa_algorithm_t alg,
|
||||||
|
int key_destroyable)
|
||||||
{
|
{
|
||||||
int ok = 0;
|
int ok = 0;
|
||||||
|
|
||||||
if (!check_key_attributes_sanity(key)) {
|
if (!check_key_attributes_sanity(key, key_destroyable)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (alg == 0) {
|
if (alg == 0) {
|
||||||
ok = 1; /* If no algorithm, do nothing (used for raw data "keys"). */
|
ok = 1; /* If no algorithm, do nothing (used for raw data "keys"). */
|
||||||
} else if (PSA_ALG_IS_MAC(alg)) {
|
} else if (PSA_ALG_IS_MAC(alg)) {
|
||||||
ok = exercise_mac_key(key, usage, alg);
|
ok = exercise_mac_key(key, usage, alg, key_destroyable);
|
||||||
} else if (PSA_ALG_IS_CIPHER(alg)) {
|
} else if (PSA_ALG_IS_CIPHER(alg)) {
|
||||||
ok = exercise_cipher_key(key, usage, alg);
|
ok = exercise_cipher_key(key, usage, alg, key_destroyable);
|
||||||
} else if (PSA_ALG_IS_AEAD(alg)) {
|
} else if (PSA_ALG_IS_AEAD(alg)) {
|
||||||
ok = exercise_aead_key(key, usage, alg);
|
ok = exercise_aead_key(key, usage, alg, key_destroyable);
|
||||||
} else if (PSA_ALG_IS_SIGN(alg)) {
|
} else if (PSA_ALG_IS_SIGN(alg)) {
|
||||||
ok = exercise_signature_key(key, usage, alg);
|
ok = exercise_signature_key(key, usage, alg, key_destroyable);
|
||||||
} else if (PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg)) {
|
} else if (PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg)) {
|
||||||
ok = exercise_asymmetric_encryption_key(key, usage, alg);
|
ok = exercise_asymmetric_encryption_key(key, usage, alg,
|
||||||
|
key_destroyable);
|
||||||
} else if (PSA_ALG_IS_KEY_DERIVATION(alg)) {
|
} else if (PSA_ALG_IS_KEY_DERIVATION(alg)) {
|
||||||
ok = exercise_key_derivation_key(key, usage, alg);
|
ok = exercise_key_derivation_key(key, usage, alg, key_destroyable);
|
||||||
} else if (PSA_ALG_IS_RAW_KEY_AGREEMENT(alg)) {
|
} else if (PSA_ALG_IS_RAW_KEY_AGREEMENT(alg)) {
|
||||||
ok = exercise_raw_key_agreement_key(key, usage, alg);
|
ok = exercise_raw_key_agreement_key(key, usage, alg, key_destroyable);
|
||||||
} else if (PSA_ALG_IS_KEY_AGREEMENT(alg)) {
|
} else if (PSA_ALG_IS_KEY_AGREEMENT(alg)) {
|
||||||
ok = exercise_key_agreement_key(key, usage, alg);
|
ok = exercise_key_agreement_key(key, usage, alg, key_destroyable);
|
||||||
} else {
|
} else {
|
||||||
TEST_FAIL("No code to exercise this category of algorithm");
|
TEST_FAIL("No code to exercise this category of algorithm");
|
||||||
}
|
}
|
||||||
|
|
||||||
ok = ok && exercise_export_key(key, usage);
|
ok = ok && exercise_export_key(key,
|
||||||
ok = ok && exercise_export_public_key(key);
|
usage,
|
||||||
|
key_destroyable);
|
||||||
|
ok = ok && exercise_export_public_key(key,
|
||||||
|
key_destroyable);
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
return ok;
|
return ok;
|
||||||
|
@ -57,7 +57,7 @@ static int test_psa_bridge(const mbedtls_pk_context *ctx,
|
|||||||
if (mbedtls_test_can_exercise_psa_algorithm(exercise_alg)) {
|
if (mbedtls_test_can_exercise_psa_algorithm(exercise_alg)) {
|
||||||
TEST_ASSERT(mbedtls_test_psa_exercise_key(psa_key,
|
TEST_ASSERT(mbedtls_test_psa_exercise_key(psa_key,
|
||||||
exercise_usage,
|
exercise_usage,
|
||||||
exercise_alg));
|
exercise_alg, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
mbedtls_test_set_step((unsigned long) -1);
|
mbedtls_test_set_step((unsigned long) -1);
|
||||||
|
@ -4278,6 +4278,50 @@ PSA import/exercise: TLS 1.2 PRF SHA-256
|
|||||||
depends_on:PSA_WANT_ALG_SHA_256:PSA_WANT_ALG_TLS12_PRF
|
depends_on:PSA_WANT_ALG_SHA_256:PSA_WANT_ALG_TLS12_PRF
|
||||||
import_and_exercise_key:"c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0":PSA_KEY_TYPE_DERIVE:192:PSA_ALG_TLS12_PRF(PSA_ALG_SHA_256)
|
import_and_exercise_key:"c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0":PSA_KEY_TYPE_DERIVE:192:PSA_ALG_TLS12_PRF(PSA_ALG_SHA_256)
|
||||||
|
|
||||||
|
PSA concurrently import/exercise same key: RSA keypair, PKCS#1 v1.5 raw
|
||||||
|
depends_on:PSA_WANT_ALG_RSA_PKCS1V15_SIGN:PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC:PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_IMPORT
|
||||||
|
concurrently_use_same_persistent_key:"3082025e02010002818100af057d396ee84fb75fdbb5c2b13c7fe5a654aa8aa2470b541ee1feb0b12d25c79711531249e1129628042dbbb6c120d1443524ef4c0e6e1d8956eeb2077af12349ddeee54483bc06c2c61948cd02b202e796aebd94d3a7cbf859c2c1819c324cb82b9cd34ede263a2abffe4733f077869e8660f7d6834da53d690ef7985f6bc3020301000102818100874bf0ffc2f2a71d14671ddd0171c954d7fdbf50281e4f6d99ea0e1ebcf82faa58e7b595ffb293d1abe17f110b37c48cc0f36c37e84d876621d327f64bbe08457d3ec4098ba2fa0a319fba411c2841ed7be83196a8cdf9daa5d00694bc335fc4c32217fe0488bce9cb7202e59468b1ead119000477db2ca797fac19eda3f58c1024100e2ab760841bb9d30a81d222de1eb7381d82214407f1b975cbbfe4e1a9467fd98adbd78f607836ca5be1928b9d160d97fd45c12d6b52e2c9871a174c66b488113024100c5ab27602159ae7d6f20c3c2ee851e46dc112e689e28d5fcbbf990a99ef8a90b8bb44fd36467e7fc1789ceb663abda338652c3c73f111774902e840565927091024100b6cdbd354f7df579a63b48b3643e353b84898777b48b15f94e0bfc0567a6ae5911d57ad6409cf7647bf96264e9bd87eb95e263b7110b9a1f9f94acced0fafa4d024071195eec37e8d257decfc672b07ae639f10cbb9b0c739d0c809968d644a94e3fd6ed9287077a14583f379058f76a8aecd43c62dc8c0f41766650d725275ac4a1024100bb32d133edc2e048d463388b7be9cb4be29f4b6250be603e70e3647501c97ddde20a4e71be95fd5e71784e25aca4baf25be5738aae59bbfe1c997781447a2b24":PSA_KEY_TYPE_RSA_KEY_PAIR:1024:PSA_ALG_RSA_PKCS1V15_SIGN_RAW:100
|
||||||
|
|
||||||
|
PSA concurrently import/exercise same key: RSA keypair, PSS-SHA-256
|
||||||
|
depends_on:PSA_WANT_ALG_RSA_PSS:PSA_WANT_ALG_SHA_256:PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC:PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_IMPORT
|
||||||
|
concurrently_use_same_persistent_key:"3082025e02010002818100af057d396ee84fb75fdbb5c2b13c7fe5a654aa8aa2470b541ee1feb0b12d25c79711531249e1129628042dbbb6c120d1443524ef4c0e6e1d8956eeb2077af12349ddeee54483bc06c2c61948cd02b202e796aebd94d3a7cbf859c2c1819c324cb82b9cd34ede263a2abffe4733f077869e8660f7d6834da53d690ef7985f6bc3020301000102818100874bf0ffc2f2a71d14671ddd0171c954d7fdbf50281e4f6d99ea0e1ebcf82faa58e7b595ffb293d1abe17f110b37c48cc0f36c37e84d876621d327f64bbe08457d3ec4098ba2fa0a319fba411c2841ed7be83196a8cdf9daa5d00694bc335fc4c32217fe0488bce9cb7202e59468b1ead119000477db2ca797fac19eda3f58c1024100e2ab760841bb9d30a81d222de1eb7381d82214407f1b975cbbfe4e1a9467fd98adbd78f607836ca5be1928b9d160d97fd45c12d6b52e2c9871a174c66b488113024100c5ab27602159ae7d6f20c3c2ee851e46dc112e689e28d5fcbbf990a99ef8a90b8bb44fd36467e7fc1789ceb663abda338652c3c73f111774902e840565927091024100b6cdbd354f7df579a63b48b3643e353b84898777b48b15f94e0bfc0567a6ae5911d57ad6409cf7647bf96264e9bd87eb95e263b7110b9a1f9f94acced0fafa4d024071195eec37e8d257decfc672b07ae639f10cbb9b0c739d0c809968d644a94e3fd6ed9287077a14583f379058f76a8aecd43c62dc8c0f41766650d725275ac4a1024100bb32d133edc2e048d463388b7be9cb4be29f4b6250be603e70e3647501c97ddde20a4e71be95fd5e71784e25aca4baf25be5738aae59bbfe1c997781447a2b24":PSA_KEY_TYPE_RSA_KEY_PAIR:1024:PSA_ALG_RSA_PSS(PSA_ALG_SHA_256):100
|
||||||
|
|
||||||
|
PSA concurrently import/exercise same key: RSA keypair, PSS-any-salt-SHA-256
|
||||||
|
depends_on:PSA_WANT_ALG_RSA_PSS:PSA_WANT_ALG_SHA_256:PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC:PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_IMPORT
|
||||||
|
concurrently_use_same_persistent_key:"3082025e02010002818100af057d396ee84fb75fdbb5c2b13c7fe5a654aa8aa2470b541ee1feb0b12d25c79711531249e1129628042dbbb6c120d1443524ef4c0e6e1d8956eeb2077af12349ddeee54483bc06c2c61948cd02b202e796aebd94d3a7cbf859c2c1819c324cb82b9cd34ede263a2abffe4733f077869e8660f7d6834da53d690ef7985f6bc3020301000102818100874bf0ffc2f2a71d14671ddd0171c954d7fdbf50281e4f6d99ea0e1ebcf82faa58e7b595ffb293d1abe17f110b37c48cc0f36c37e84d876621d327f64bbe08457d3ec4098ba2fa0a319fba411c2841ed7be83196a8cdf9daa5d00694bc335fc4c32217fe0488bce9cb7202e59468b1ead119000477db2ca797fac19eda3f58c1024100e2ab760841bb9d30a81d222de1eb7381d82214407f1b975cbbfe4e1a9467fd98adbd78f607836ca5be1928b9d160d97fd45c12d6b52e2c9871a174c66b488113024100c5ab27602159ae7d6f20c3c2ee851e46dc112e689e28d5fcbbf990a99ef8a90b8bb44fd36467e7fc1789ceb663abda338652c3c73f111774902e840565927091024100b6cdbd354f7df579a63b48b3643e353b84898777b48b15f94e0bfc0567a6ae5911d57ad6409cf7647bf96264e9bd87eb95e263b7110b9a1f9f94acced0fafa4d024071195eec37e8d257decfc672b07ae639f10cbb9b0c739d0c809968d644a94e3fd6ed9287077a14583f379058f76a8aecd43c62dc8c0f41766650d725275ac4a1024100bb32d133edc2e048d463388b7be9cb4be29f4b6250be603e70e3647501c97ddde20a4e71be95fd5e71784e25aca4baf25be5738aae59bbfe1c997781447a2b24":PSA_KEY_TYPE_RSA_KEY_PAIR:1024:PSA_ALG_RSA_PSS(PSA_ALG_SHA_256):100
|
||||||
|
|
||||||
|
PSA concurrently import/exercise same key: RSA public key, PKCS#1 v1.5 raw
|
||||||
|
depends_on:PSA_WANT_ALG_RSA_PKCS1V15_SIGN:PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY
|
||||||
|
concurrently_use_same_persistent_key:"30818902818100af057d396ee84fb75fdbb5c2b13c7fe5a654aa8aa2470b541ee1feb0b12d25c79711531249e1129628042dbbb6c120d1443524ef4c0e6e1d8956eeb2077af12349ddeee54483bc06c2c61948cd02b202e796aebd94d3a7cbf859c2c1819c324cb82b9cd34ede263a2abffe4733f077869e8660f7d6834da53d690ef7985f6bc30203010001":PSA_KEY_TYPE_RSA_PUBLIC_KEY:1024:PSA_ALG_RSA_PKCS1V15_SIGN_RAW:100
|
||||||
|
|
||||||
|
PSA concurrently import/exercise same key: RSA public key, PSS-SHA-256
|
||||||
|
depends_on:PSA_WANT_ALG_RSA_PSS:PSA_WANT_ALG_SHA_256:PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY
|
||||||
|
concurrently_use_same_persistent_key:"30818902818100af057d396ee84fb75fdbb5c2b13c7fe5a654aa8aa2470b541ee1feb0b12d25c79711531249e1129628042dbbb6c120d1443524ef4c0e6e1d8956eeb2077af12349ddeee54483bc06c2c61948cd02b202e796aebd94d3a7cbf859c2c1819c324cb82b9cd34ede263a2abffe4733f077869e8660f7d6834da53d690ef7985f6bc30203010001":PSA_KEY_TYPE_RSA_PUBLIC_KEY:1024:PSA_ALG_RSA_PSS(PSA_ALG_SHA_256):100
|
||||||
|
|
||||||
|
PSA concurrently import/exercise same key: RSA public key, PSS-any-salt-SHA-256
|
||||||
|
depends_on:PSA_WANT_ALG_RSA_PSS:PSA_WANT_ALG_SHA_256:PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY
|
||||||
|
concurrently_use_same_persistent_key:"30818902818100af057d396ee84fb75fdbb5c2b13c7fe5a654aa8aa2470b541ee1feb0b12d25c79711531249e1129628042dbbb6c120d1443524ef4c0e6e1d8956eeb2077af12349ddeee54483bc06c2c61948cd02b202e796aebd94d3a7cbf859c2c1819c324cb82b9cd34ede263a2abffe4733f077869e8660f7d6834da53d690ef7985f6bc30203010001":PSA_KEY_TYPE_RSA_PUBLIC_KEY:1024:PSA_ALG_RSA_PSS_ANY_SALT(PSA_ALG_SHA_256):100
|
||||||
|
|
||||||
|
PSA concurrently import/exercise same key: ECP SECP256R1 keypair, ECDSA
|
||||||
|
depends_on:PSA_WANT_ALG_ECDSA:PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_BASIC:PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_IMPORT:PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_EXPORT:PSA_WANT_ECC_SECP_R1_256
|
||||||
|
concurrently_use_same_persistent_key:"49c9a8c18c4b885638c431cf1df1c994131609b580d4fd43a0cab17db2f13eee":PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1):256:PSA_ALG_ECDSA_ANY:100
|
||||||
|
|
||||||
|
PSA concurrently import/exercise same key: ECP SECP256R1 keypair, deterministic ECDSA
|
||||||
|
depends_on:PSA_WANT_ALG_DETERMINISTIC_ECDSA:PSA_WANT_ALG_SHA_256:PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_BASIC:PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_IMPORT:PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_EXPORT:PSA_WANT_ECC_SECP_R1_256
|
||||||
|
concurrently_use_same_persistent_key:"49c9a8c18c4b885638c431cf1df1c994131609b580d4fd43a0cab17db2f13eee":PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1):256:PSA_ALG_DETERMINISTIC_ECDSA( PSA_ALG_SHA_256 ):100
|
||||||
|
|
||||||
|
PSA concurrently import/exercise same key: ECP SECP256R1 keypair, ECDH
|
||||||
|
depends_on:PSA_WANT_ALG_ECDH:PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_BASIC:PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_IMPORT:PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_EXPORT:PSA_WANT_ECC_SECP_R1_256
|
||||||
|
concurrently_use_same_persistent_key:"49c9a8c18c4b885638c431cf1df1c994131609b580d4fd43a0cab17db2f13eee":PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1):256:PSA_ALG_ECDH:100
|
||||||
|
|
||||||
|
PSA concurrently import/exercise same key: HKDF SHA-256
|
||||||
|
depends_on:PSA_WANT_ALG_HKDF:PSA_WANT_ALG_SHA_256
|
||||||
|
concurrently_use_same_persistent_key:"c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0":PSA_KEY_TYPE_DERIVE:192:PSA_ALG_HKDF(PSA_ALG_SHA_256):100
|
||||||
|
|
||||||
|
PSA concurrently import/exercise same key: TLS 1.2 PRF SHA-256
|
||||||
|
depends_on:PSA_WANT_ALG_SHA_256:PSA_WANT_ALG_TLS12_PRF
|
||||||
|
concurrently_use_same_persistent_key:"c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0":PSA_KEY_TYPE_DERIVE:192:PSA_ALG_TLS12_PRF(PSA_ALG_SHA_256):100
|
||||||
|
|
||||||
PSA sign hash: RSA PKCS#1 v1.5, raw
|
PSA sign hash: RSA PKCS#1 v1.5, raw
|
||||||
depends_on:PSA_WANT_ALG_RSA_PKCS1V15_SIGN:PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC:PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_IMPORT
|
depends_on:PSA_WANT_ALG_RSA_PKCS1V15_SIGN:PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC:PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_IMPORT
|
||||||
sign_hash_deterministic:PSA_KEY_TYPE_RSA_KEY_PAIR:"3082025e02010002818100af057d396ee84fb75fdbb5c2b13c7fe5a654aa8aa2470b541ee1feb0b12d25c79711531249e1129628042dbbb6c120d1443524ef4c0e6e1d8956eeb2077af12349ddeee54483bc06c2c61948cd02b202e796aebd94d3a7cbf859c2c1819c324cb82b9cd34ede263a2abffe4733f077869e8660f7d6834da53d690ef7985f6bc3020301000102818100874bf0ffc2f2a71d14671ddd0171c954d7fdbf50281e4f6d99ea0e1ebcf82faa58e7b595ffb293d1abe17f110b37c48cc0f36c37e84d876621d327f64bbe08457d3ec4098ba2fa0a319fba411c2841ed7be83196a8cdf9daa5d00694bc335fc4c32217fe0488bce9cb7202e59468b1ead119000477db2ca797fac19eda3f58c1024100e2ab760841bb9d30a81d222de1eb7381d82214407f1b975cbbfe4e1a9467fd98adbd78f607836ca5be1928b9d160d97fd45c12d6b52e2c9871a174c66b488113024100c5ab27602159ae7d6f20c3c2ee851e46dc112e689e28d5fcbbf990a99ef8a90b8bb44fd36467e7fc1789ceb663abda338652c3c73f111774902e840565927091024100b6cdbd354f7df579a63b48b3643e353b84898777b48b15f94e0bfc0567a6ae5911d57ad6409cf7647bf96264e9bd87eb95e263b7110b9a1f9f94acced0fafa4d024071195eec37e8d257decfc672b07ae639f10cbb9b0c739d0c809968d644a94e3fd6ed9287077a14583f379058f76a8aecd43c62dc8c0f41766650d725275ac4a1024100bb32d133edc2e048d463388b7be9cb4be29f4b6250be603e70e3647501c97ddde20a4e71be95fd5e71784e25aca4baf25be5738aae59bbfe1c997781447a2b24":PSA_ALG_RSA_PKCS1V15_SIGN_RAW:"616263":"2c7744983f023ac7bb1c55529d83ed11a76a7898a1bb5ce191375a4aa7495a633d27879ff58eba5a57371c34feb1180e8b850d552476ebb5634df620261992f12ebee9097041dbbea85a42d45b344be5073ceb772ffc604954b9158ba81ec3dc4d9d65e3ab7aa318165f38c36f841f1c69cb1cfa494aa5cbb4d6c0efbafb043a"
|
sign_hash_deterministic:PSA_KEY_TYPE_RSA_KEY_PAIR:"3082025e02010002818100af057d396ee84fb75fdbb5c2b13c7fe5a654aa8aa2470b541ee1feb0b12d25c79711531249e1129628042dbbb6c120d1443524ef4c0e6e1d8956eeb2077af12349ddeee54483bc06c2c61948cd02b202e796aebd94d3a7cbf859c2c1819c324cb82b9cd34ede263a2abffe4733f077869e8660f7d6834da53d690ef7985f6bc3020301000102818100874bf0ffc2f2a71d14671ddd0171c954d7fdbf50281e4f6d99ea0e1ebcf82faa58e7b595ffb293d1abe17f110b37c48cc0f36c37e84d876621d327f64bbe08457d3ec4098ba2fa0a319fba411c2841ed7be83196a8cdf9daa5d00694bc335fc4c32217fe0488bce9cb7202e59468b1ead119000477db2ca797fac19eda3f58c1024100e2ab760841bb9d30a81d222de1eb7381d82214407f1b975cbbfe4e1a9467fd98adbd78f607836ca5be1928b9d160d97fd45c12d6b52e2c9871a174c66b488113024100c5ab27602159ae7d6f20c3c2ee851e46dc112e689e28d5fcbbf990a99ef8a90b8bb44fd36467e7fc1789ceb663abda338652c3c73f111774902e840565927091024100b6cdbd354f7df579a63b48b3643e353b84898777b48b15f94e0bfc0567a6ae5911d57ad6409cf7647bf96264e9bd87eb95e263b7110b9a1f9f94acced0fafa4d024071195eec37e8d257decfc672b07ae639f10cbb9b0c739d0c809968d644a94e3fd6ed9287077a14583f379058f76a8aecd43c62dc8c0f41766650d725275ac4a1024100bb32d133edc2e048d463388b7be9cb4be29f4b6250be603e70e3647501c97ddde20a4e71be95fd5e71784e25aca4baf25be5738aae59bbfe1c997781447a2b24":PSA_ALG_RSA_PKCS1V15_SIGN_RAW:"616263":"2c7744983f023ac7bb1c55529d83ed11a76a7898a1bb5ce191375a4aa7495a633d27879ff58eba5a57371c34feb1180e8b850d552476ebb5634df620261992f12ebee9097041dbbea85a42d45b344be5073ceb772ffc604954b9158ba81ec3dc4d9d65e3ab7aa318165f38c36f841f1c69cb1cfa494aa5cbb4d6c0efbafb043a"
|
||||||
|
@ -1338,6 +1338,126 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(MBEDTLS_THREADING_PTHREAD)
|
#if defined(MBEDTLS_THREADING_PTHREAD)
|
||||||
|
|
||||||
|
typedef struct same_key_context {
|
||||||
|
data_t *data;
|
||||||
|
mbedtls_svc_key_id_t key;
|
||||||
|
psa_key_attributes_t *attributes;
|
||||||
|
int type;
|
||||||
|
int bits;
|
||||||
|
/* The following two parameters are used to ensure that when multiple
|
||||||
|
* threads attempt to load/destroy the key, exactly one thread succeeds. */
|
||||||
|
int key_loaded;
|
||||||
|
mbedtls_threading_mutex_t MBEDTLS_PRIVATE(key_loaded_mutex);
|
||||||
|
}
|
||||||
|
same_key_context;
|
||||||
|
|
||||||
|
/* Attempt to import the key in ctx. This handles any valid error codes
|
||||||
|
* and reports an error for any invalid codes. This function also insures
|
||||||
|
* that once imported by some thread, all threads can use the key. */
|
||||||
|
void *thread_import_key(void *ctx)
|
||||||
|
{
|
||||||
|
mbedtls_svc_key_id_t returned_key_id;
|
||||||
|
same_key_context *skc = (struct same_key_context *) ctx;
|
||||||
|
psa_key_attributes_t got_attributes = PSA_KEY_ATTRIBUTES_INIT;
|
||||||
|
|
||||||
|
/* Import the key, exactly one thread must succeed. */
|
||||||
|
psa_status_t status = psa_import_key(skc->attributes, skc->data->x,
|
||||||
|
skc->data->len, &returned_key_id);
|
||||||
|
switch (status) {
|
||||||
|
case PSA_SUCCESS:
|
||||||
|
if (mbedtls_mutex_lock(&skc->key_loaded_mutex) == 0) {
|
||||||
|
if (skc->key_loaded) {
|
||||||
|
mbedtls_mutex_unlock(&skc->key_loaded_mutex);
|
||||||
|
/* More than one thread has succeeded, report a failure. */
|
||||||
|
TEST_FAIL("The same key has been loaded into the key store multiple times.");
|
||||||
|
}
|
||||||
|
skc->key_loaded = 1;
|
||||||
|
mbedtls_mutex_unlock(&skc->key_loaded_mutex);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PSA_ERROR_INSUFFICIENT_MEMORY:
|
||||||
|
/* If all of the key slots are reserved when a thread
|
||||||
|
* locks the mutex to reserve a new slot, it will return
|
||||||
|
* PSA_ERROR_INSUFFICIENT_MEMORY; this is correct behaviour.
|
||||||
|
* There is a chance for this to occur here when the number of
|
||||||
|
* threads running this function is larger than the number of
|
||||||
|
* free key slots. Each thread reserves an empty key slot,
|
||||||
|
* unlocks the mutex, then relocks it to finalize key creation.
|
||||||
|
* It is at that point where the thread sees that the key
|
||||||
|
* already exists, releases the reserved slot,
|
||||||
|
* and returns PSA_ERROR_ALREADY_EXISTS.
|
||||||
|
* There is no guarantee that the key is loaded upon this return
|
||||||
|
* code, so we can't test the key information. Just stop this
|
||||||
|
* thread from executing, note that this is not an error. */
|
||||||
|
goto exit;
|
||||||
|
break;
|
||||||
|
case PSA_ERROR_ALREADY_EXISTS:
|
||||||
|
/* The key has been loaded by a different thread. */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PSA_ASSERT(status);
|
||||||
|
}
|
||||||
|
/* At this point the key must exist, test the key information. */
|
||||||
|
status = psa_get_key_attributes(skc->key, &got_attributes);
|
||||||
|
if (status == PSA_ERROR_INSUFFICIENT_MEMORY) {
|
||||||
|
/* This is not a test failure. The following sequence of events
|
||||||
|
* causes this to occur:
|
||||||
|
* 1: This thread successfuly imports a persistent key skc->key.
|
||||||
|
* 2: N threads reserve an empty key slot in psa_import_key,
|
||||||
|
* where N is equal to the number of free key slots.
|
||||||
|
* 3: A final thread attempts to reserve an empty key slot, kicking
|
||||||
|
* skc->key (which has no registered readers) out of its slot.
|
||||||
|
* 4: This thread calls psa_get_key_attributes(skc->key,...):
|
||||||
|
* it sees that skc->key is not in a slot, attempts to load it and
|
||||||
|
* finds that there are no free slots.
|
||||||
|
* This thread returns PSA_ERROR_INSUFFICIENT_MEMORY.
|
||||||
|
*
|
||||||
|
* The PSA spec allows this behaviour, it is an unavoidable consequence
|
||||||
|
* of allowing persistent keys to be kicked out of the key store while
|
||||||
|
* they are still valid. */
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
PSA_ASSERT(status);
|
||||||
|
TEST_EQUAL(psa_get_key_type(&got_attributes), skc->type);
|
||||||
|
TEST_EQUAL(psa_get_key_bits(&got_attributes), skc->bits);
|
||||||
|
|
||||||
|
exit:
|
||||||
|
/* Key attributes may have been returned by psa_get_key_attributes(),
|
||||||
|
* reset them as required. */
|
||||||
|
psa_reset_key_attributes(&got_attributes);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *thread_use_and_destroy_key(void *ctx)
|
||||||
|
{
|
||||||
|
same_key_context *skc = (struct same_key_context *) ctx;
|
||||||
|
|
||||||
|
/* Do something with the key according
|
||||||
|
* to its type and permitted usage. */
|
||||||
|
TEST_ASSERT(mbedtls_test_psa_exercise_key(skc->key,
|
||||||
|
skc->attributes->policy.usage,
|
||||||
|
skc->attributes->policy.alg, 1));
|
||||||
|
|
||||||
|
psa_status_t status = psa_destroy_key(skc->key);
|
||||||
|
if (status == PSA_SUCCESS) {
|
||||||
|
if (mbedtls_mutex_lock(&skc->key_loaded_mutex) == 0) {
|
||||||
|
/* Ensure that we are the only thread to succeed. */
|
||||||
|
if (skc->key_loaded != 1) {
|
||||||
|
mbedtls_mutex_unlock(&skc->key_loaded_mutex);
|
||||||
|
TEST_FAIL("The same key has been destroyed multiple times.");
|
||||||
|
}
|
||||||
|
skc->key_loaded = 0;
|
||||||
|
mbedtls_mutex_unlock(&skc->key_loaded_mutex);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
TEST_EQUAL(status, PSA_ERROR_INVALID_HANDLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct generate_key_context {
|
typedef struct generate_key_context {
|
||||||
psa_key_type_t type;
|
psa_key_type_t type;
|
||||||
psa_key_usage_t usage;
|
psa_key_usage_t usage;
|
||||||
@ -1379,7 +1499,7 @@ void *thread_generate_key(void *ctx)
|
|||||||
|
|
||||||
/* Do something with the key according
|
/* Do something with the key according
|
||||||
* to its type and permitted usage. */
|
* to its type and permitted usage. */
|
||||||
if (!mbedtls_test_psa_exercise_key(key, gkc->usage, gkc->alg)) {
|
if (!mbedtls_test_psa_exercise_key(key, gkc->usage, gkc->alg, 0)) {
|
||||||
psa_destroy_key(key);
|
psa_destroy_key(key);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
@ -1715,7 +1835,7 @@ void import_export(data_t *data,
|
|||||||
* this doesn't directly validate the implementation, but it still helps
|
* this doesn't directly validate the implementation, but it still helps
|
||||||
* by cross-validating the test data with the sanity check code. */
|
* by cross-validating the test data with the sanity check code. */
|
||||||
if (!psa_key_lifetime_is_external(lifetime)) {
|
if (!psa_key_lifetime_is_external(lifetime)) {
|
||||||
if (!mbedtls_test_psa_exercise_key(key, usage_arg, 0)) {
|
if (!mbedtls_test_psa_exercise_key(key, usage_arg, 0, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1824,6 +1944,78 @@ exit:
|
|||||||
}
|
}
|
||||||
/* END_CASE */
|
/* END_CASE */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_THREADING_PTHREAD)
|
||||||
|
/* BEGIN_CASE depends_on:MBEDTLS_THREADING_PTHREAD:MBEDTLS_PSA_CRYPTO_STORAGE_C */
|
||||||
|
void concurrently_use_same_persistent_key(data_t *data,
|
||||||
|
int type_arg,
|
||||||
|
int bits_arg,
|
||||||
|
int alg_arg,
|
||||||
|
int thread_count_arg)
|
||||||
|
{
|
||||||
|
size_t thread_count = (size_t) thread_count_arg;
|
||||||
|
mbedtls_test_thread_t *threads = NULL;
|
||||||
|
mbedtls_svc_key_id_t key_id = mbedtls_svc_key_id_make(1, 1);
|
||||||
|
same_key_context skc;
|
||||||
|
skc.data = data;
|
||||||
|
skc.key = key_id;
|
||||||
|
skc.type = type_arg;
|
||||||
|
skc.bits = bits_arg;
|
||||||
|
skc.key_loaded = 0;
|
||||||
|
mbedtls_mutex_init(&skc.key_loaded_mutex);
|
||||||
|
psa_key_usage_t usage = mbedtls_test_psa_usage_to_exercise(skc.type, alg_arg);
|
||||||
|
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
|
||||||
|
|
||||||
|
PSA_ASSERT(psa_crypto_init());
|
||||||
|
|
||||||
|
psa_set_key_id(&attributes, key_id);
|
||||||
|
psa_set_key_lifetime(&attributes, PSA_KEY_LIFETIME_PERSISTENT);
|
||||||
|
psa_set_key_usage_flags(&attributes, usage);
|
||||||
|
psa_set_key_algorithm(&attributes, alg_arg);
|
||||||
|
psa_set_key_type(&attributes, type_arg);
|
||||||
|
psa_set_key_bits(&attributes, bits_arg);
|
||||||
|
skc.attributes = &attributes;
|
||||||
|
|
||||||
|
TEST_CALLOC(threads, sizeof(mbedtls_test_thread_t) * thread_count);
|
||||||
|
|
||||||
|
/* Test that when multiple threads import the same key,
|
||||||
|
* exactly one thread succeeds and the rest fail with valid errors.
|
||||||
|
* Also test that all threads can use the key as soon as it has been
|
||||||
|
* imported. */
|
||||||
|
for (size_t i = 0; i < thread_count; i++) {
|
||||||
|
TEST_EQUAL(
|
||||||
|
mbedtls_test_thread_create(&threads[i], thread_import_key,
|
||||||
|
(void *) &skc), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Join threads. */
|
||||||
|
for (size_t i = 0; i < thread_count; i++) {
|
||||||
|
TEST_EQUAL(mbedtls_test_thread_join(&threads[i]), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test that when multiple threads use and destroy a key no corruption
|
||||||
|
* occurs, and exactly one thread succeeds when destroying the key. */
|
||||||
|
for (size_t i = 0; i < thread_count; i++) {
|
||||||
|
TEST_EQUAL(
|
||||||
|
mbedtls_test_thread_create(&threads[i], thread_use_and_destroy_key,
|
||||||
|
(void *) &skc), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Join threads. */
|
||||||
|
for (size_t i = 0; i < thread_count; i++) {
|
||||||
|
TEST_EQUAL(mbedtls_test_thread_join(&threads[i]), 0);
|
||||||
|
}
|
||||||
|
/* Ensure that one thread succeeded in destroying the key. */
|
||||||
|
TEST_ASSERT(!skc.key_loaded);
|
||||||
|
exit:
|
||||||
|
psa_reset_key_attributes(&attributes);
|
||||||
|
mbedtls_mutex_free(&skc.key_loaded_mutex);
|
||||||
|
mbedtls_free(threads);
|
||||||
|
PSA_DONE();
|
||||||
|
}
|
||||||
|
/* END_CASE */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* BEGIN_CASE */
|
/* BEGIN_CASE */
|
||||||
void import_and_exercise_key(data_t *data,
|
void import_and_exercise_key(data_t *data,
|
||||||
int type_arg,
|
int type_arg,
|
||||||
@ -1853,7 +2045,7 @@ void import_and_exercise_key(data_t *data,
|
|||||||
TEST_EQUAL(psa_get_key_bits(&got_attributes), bits);
|
TEST_EQUAL(psa_get_key_bits(&got_attributes), bits);
|
||||||
|
|
||||||
/* Do something with the key according to its type and permitted usage. */
|
/* Do something with the key according to its type and permitted usage. */
|
||||||
if (!mbedtls_test_psa_exercise_key(key, usage, alg)) {
|
if (!mbedtls_test_psa_exercise_key(key, usage, alg, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2490,7 +2682,7 @@ void agreement_key_policy(int policy_usage,
|
|||||||
&key));
|
&key));
|
||||||
|
|
||||||
PSA_ASSERT(psa_key_derivation_setup(&operation, exercise_alg));
|
PSA_ASSERT(psa_key_derivation_setup(&operation, exercise_alg));
|
||||||
status = mbedtls_test_psa_key_agreement_with_self(&operation, key);
|
status = mbedtls_test_psa_key_agreement_with_self(&operation, key, 0);
|
||||||
|
|
||||||
TEST_EQUAL(status, expected_status);
|
TEST_EQUAL(status, expected_status);
|
||||||
|
|
||||||
@ -2529,10 +2721,10 @@ void key_policy_alg2(int key_type_arg, data_t *key_data,
|
|||||||
TEST_EQUAL(psa_get_key_algorithm(&got_attributes), alg);
|
TEST_EQUAL(psa_get_key_algorithm(&got_attributes), alg);
|
||||||
TEST_EQUAL(psa_get_key_enrollment_algorithm(&got_attributes), alg2);
|
TEST_EQUAL(psa_get_key_enrollment_algorithm(&got_attributes), alg2);
|
||||||
|
|
||||||
if (!mbedtls_test_psa_exercise_key(key, usage, alg)) {
|
if (!mbedtls_test_psa_exercise_key(key, usage, alg, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
if (!mbedtls_test_psa_exercise_key(key, usage, alg2)) {
|
if (!mbedtls_test_psa_exercise_key(key, usage, alg2, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2572,7 +2764,7 @@ void raw_agreement_key_policy(int policy_usage,
|
|||||||
PSA_ASSERT(psa_import_key(&attributes, key_data->x, key_data->len,
|
PSA_ASSERT(psa_import_key(&attributes, key_data->x, key_data->len,
|
||||||
&key));
|
&key));
|
||||||
|
|
||||||
status = mbedtls_test_psa_raw_key_agreement_with_self(exercise_alg, key);
|
status = mbedtls_test_psa_raw_key_agreement_with_self(exercise_alg, key, 0);
|
||||||
|
|
||||||
TEST_EQUAL(status, expected_status);
|
TEST_EQUAL(status, expected_status);
|
||||||
|
|
||||||
@ -2663,10 +2855,10 @@ void copy_success(int source_usage_arg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!psa_key_lifetime_is_external(target_lifetime)) {
|
if (!psa_key_lifetime_is_external(target_lifetime)) {
|
||||||
if (!mbedtls_test_psa_exercise_key(target_key, expected_usage, expected_alg)) {
|
if (!mbedtls_test_psa_exercise_key(target_key, expected_usage, expected_alg, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
if (!mbedtls_test_psa_exercise_key(target_key, expected_usage, expected_alg2)) {
|
if (!mbedtls_test_psa_exercise_key(target_key, expected_usage, expected_alg2, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -8681,7 +8873,7 @@ void derive_input(int alg_arg,
|
|||||||
// When taking a private key as secret input, use key agreement
|
// When taking a private key as secret input, use key agreement
|
||||||
// to add the shared secret to the derivation
|
// to add the shared secret to the derivation
|
||||||
TEST_EQUAL(mbedtls_test_psa_key_agreement_with_self(
|
TEST_EQUAL(mbedtls_test_psa_key_agreement_with_self(
|
||||||
&operation, keys[i]),
|
&operation, keys[i], 0),
|
||||||
expected_statuses[i]);
|
expected_statuses[i]);
|
||||||
} else {
|
} else {
|
||||||
TEST_EQUAL(psa_key_derivation_input_key(&operation, steps[i],
|
TEST_EQUAL(psa_key_derivation_input_key(&operation, steps[i],
|
||||||
@ -8780,7 +8972,7 @@ void derive_over_capacity(int alg_arg)
|
|||||||
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, key, alg,
|
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, key, alg,
|
||||||
input1, input1_length,
|
input1, input1_length,
|
||||||
input2, input2_length,
|
input2, input2_length,
|
||||||
capacity)) {
|
capacity, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9099,7 +9291,7 @@ void derive_full(int alg_arg,
|
|||||||
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, key, alg,
|
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, key, alg,
|
||||||
input1->x, input1->len,
|
input1->x, input1->len,
|
||||||
input2->x, input2->len,
|
input2->x, input2->len,
|
||||||
requested_capacity)) {
|
requested_capacity, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9216,7 +9408,7 @@ void derive_key_exercise(int alg_arg,
|
|||||||
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, base_key, alg,
|
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, base_key, alg,
|
||||||
input1->x, input1->len,
|
input1->x, input1->len,
|
||||||
input2->x, input2->len,
|
input2->x, input2->len,
|
||||||
capacity)) {
|
capacity, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9233,7 +9425,7 @@ void derive_key_exercise(int alg_arg,
|
|||||||
TEST_EQUAL(psa_get_key_bits(&got_attributes), derived_bits);
|
TEST_EQUAL(psa_get_key_bits(&got_attributes), derived_bits);
|
||||||
|
|
||||||
/* Exercise the derived key. */
|
/* Exercise the derived key. */
|
||||||
if (!mbedtls_test_psa_exercise_key(derived_key, derived_usage, derived_alg)) {
|
if (!mbedtls_test_psa_exercise_key(derived_key, derived_usage, derived_alg, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9286,7 +9478,7 @@ void derive_key_export(int alg_arg,
|
|||||||
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, base_key, alg,
|
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, base_key, alg,
|
||||||
input1->x, input1->len,
|
input1->x, input1->len,
|
||||||
input2->x, input2->len,
|
input2->x, input2->len,
|
||||||
capacity)) {
|
capacity, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9299,7 +9491,7 @@ void derive_key_export(int alg_arg,
|
|||||||
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, base_key, alg,
|
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, base_key, alg,
|
||||||
input1->x, input1->len,
|
input1->x, input1->len,
|
||||||
input2->x, input2->len,
|
input2->x, input2->len,
|
||||||
capacity)) {
|
capacity, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9370,7 +9562,7 @@ void derive_key_type(int alg_arg,
|
|||||||
&operation, base_key, alg,
|
&operation, base_key, alg,
|
||||||
input1->x, input1->len,
|
input1->x, input1->len,
|
||||||
input2->x, input2->len,
|
input2->x, input2->len,
|
||||||
PSA_KEY_DERIVATION_UNLIMITED_CAPACITY) == 0) {
|
PSA_KEY_DERIVATION_UNLIMITED_CAPACITY, 0) == 0) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9435,7 +9627,7 @@ void derive_key_ext(int alg_arg,
|
|||||||
&operation, base_key, alg,
|
&operation, base_key, alg,
|
||||||
input1->x, input1->len,
|
input1->x, input1->len,
|
||||||
input2->x, input2->len,
|
input2->x, input2->len,
|
||||||
PSA_KEY_DERIVATION_UNLIMITED_CAPACITY) == 0) {
|
PSA_KEY_DERIVATION_UNLIMITED_CAPACITY, 0) == 0) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9499,7 +9691,7 @@ void derive_key(int alg_arg,
|
|||||||
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, base_key, alg,
|
if (!mbedtls_test_psa_setup_key_derivation_wrap(&operation, base_key, alg,
|
||||||
input1->x, input1->len,
|
input1->x, input1->len,
|
||||||
input2->x, input2->len,
|
input2->x, input2->len,
|
||||||
SIZE_MAX)) {
|
SIZE_MAX, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9941,7 +10133,7 @@ void generate_key(int type_arg,
|
|||||||
TEST_EQUAL(psa_get_key_bits(&got_attributes), bits);
|
TEST_EQUAL(psa_get_key_bits(&got_attributes), bits);
|
||||||
|
|
||||||
/* Do something with the key according to its type and permitted usage. */
|
/* Do something with the key according to its type and permitted usage. */
|
||||||
if (!mbedtls_test_psa_exercise_key(key, usage, alg)) {
|
if (!mbedtls_test_psa_exercise_key(key, usage, alg, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10011,7 +10203,7 @@ void generate_key_ext(int type_arg,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Do something with the key according to its type and permitted usage. */
|
/* Do something with the key according to its type and permitted usage. */
|
||||||
if (!mbedtls_test_psa_exercise_key(key, usage, alg)) {
|
if (!mbedtls_test_psa_exercise_key(key, usage, alg, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10162,7 +10354,7 @@ void persistent_key_load_key_from_storage(data_t *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Do something with the key according to its type and permitted usage. */
|
/* Do something with the key according to its type and permitted usage. */
|
||||||
if (!mbedtls_test_psa_exercise_key(key, usage_flags, alg)) {
|
if (!mbedtls_test_psa_exercise_key(key, usage_flags, alg, 0)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,7 +187,7 @@ static int test_read_key(const psa_key_attributes_t *expected_attributes,
|
|||||||
TEST_ASSERT(mbedtls_test_psa_exercise_key(
|
TEST_ASSERT(mbedtls_test_psa_exercise_key(
|
||||||
key_id,
|
key_id,
|
||||||
psa_get_key_usage_flags(expected_attributes),
|
psa_get_key_usage_flags(expected_attributes),
|
||||||
psa_get_key_algorithm(expected_attributes)));
|
psa_get_key_algorithm(expected_attributes), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user