1a8e1175bSopenharmony_ci/* BEGIN_HEADER */ 2a8e1175bSopenharmony_ci 3a8e1175bSopenharmony_ci#include <stdint.h> 4a8e1175bSopenharmony_ci#include "psa/crypto.h" 5a8e1175bSopenharmony_ci 6a8e1175bSopenharmony_ci/* END_HEADER */ 7a8e1175bSopenharmony_ci 8a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES 9a8e1175bSopenharmony_ci * depends_on:MBEDTLS_PSA_CRYPTO_C 10a8e1175bSopenharmony_ci * END_DEPENDENCIES 11a8e1175bSopenharmony_ci */ 12a8e1175bSopenharmony_ci 13a8e1175bSopenharmony_ci/* BEGIN_CASE */ 14a8e1175bSopenharmony_civoid hash_finish(int alg_arg, data_t *input, data_t *expected_hash) 15a8e1175bSopenharmony_ci{ 16a8e1175bSopenharmony_ci psa_algorithm_t alg = alg_arg; 17a8e1175bSopenharmony_ci unsigned char actual_hash[PSA_HASH_MAX_SIZE]; 18a8e1175bSopenharmony_ci size_t actual_hash_length; 19a8e1175bSopenharmony_ci psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT; 20a8e1175bSopenharmony_ci 21a8e1175bSopenharmony_ci PSA_ASSERT(psa_crypto_init()); 22a8e1175bSopenharmony_ci 23a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_setup(&operation, alg)); 24a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_update(&operation, 25a8e1175bSopenharmony_ci input->x, input->len)); 26a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_finish(&operation, 27a8e1175bSopenharmony_ci actual_hash, sizeof(actual_hash), 28a8e1175bSopenharmony_ci &actual_hash_length)); 29a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(expected_hash->x, expected_hash->len, 30a8e1175bSopenharmony_ci actual_hash, actual_hash_length); 31a8e1175bSopenharmony_ci 32a8e1175bSopenharmony_ciexit: 33a8e1175bSopenharmony_ci psa_hash_abort(&operation); 34a8e1175bSopenharmony_ci PSA_DONE(); 35a8e1175bSopenharmony_ci} 36a8e1175bSopenharmony_ci/* END_CASE */ 37a8e1175bSopenharmony_ci 38a8e1175bSopenharmony_ci/* BEGIN_CASE */ 39a8e1175bSopenharmony_civoid hmac(int alg_arg, char *input, data_t *expected_mac) 40a8e1175bSopenharmony_ci{ 41a8e1175bSopenharmony_ci psa_algorithm_t alg = PSA_ALG_HMAC(alg_arg); 42a8e1175bSopenharmony_ci 43a8e1175bSopenharmony_ci mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT; 44a8e1175bSopenharmony_ci psa_key_type_t key_type = PSA_KEY_TYPE_HMAC; 45a8e1175bSopenharmony_ci const uint8_t key_data[] = { // 32 bytes of 0xaa 46a8e1175bSopenharmony_ci 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 47a8e1175bSopenharmony_ci 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 48a8e1175bSopenharmony_ci 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa 49a8e1175bSopenharmony_ci }; 50a8e1175bSopenharmony_ci psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; 51a8e1175bSopenharmony_ci 52a8e1175bSopenharmony_ci PSA_ASSERT(psa_crypto_init()); 53a8e1175bSopenharmony_ci 54a8e1175bSopenharmony_ci psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_MESSAGE | PSA_KEY_USAGE_VERIFY_MESSAGE); 55a8e1175bSopenharmony_ci psa_set_key_algorithm(&attributes, alg); 56a8e1175bSopenharmony_ci psa_set_key_type(&attributes, key_type); 57a8e1175bSopenharmony_ci PSA_ASSERT(psa_import_key(&attributes, key_data, sizeof(key_data), &key)); 58a8e1175bSopenharmony_ci 59a8e1175bSopenharmony_ci uint8_t mac[PSA_MAC_MAX_SIZE + 10] = { 0 }; 60a8e1175bSopenharmony_ci size_t mac_length = 0; 61a8e1175bSopenharmony_ci 62a8e1175bSopenharmony_ci size_t input_len = strlen(input); 63a8e1175bSopenharmony_ci PSA_ASSERT(psa_mac_compute(key, alg, (uint8_t const *) input, input_len, mac, sizeof(mac), 64a8e1175bSopenharmony_ci &mac_length)); 65a8e1175bSopenharmony_ci 66a8e1175bSopenharmony_ci // manual comparison against expected MAC 67a8e1175bSopenharmony_ci ASSERT_COMPARE(expected_mac->x, expected_mac->len, mac, mac_length); 68a8e1175bSopenharmony_ci 69a8e1175bSopenharmony_ci // use psa_mac_verify to compare to expected MAC 70a8e1175bSopenharmony_ci PSA_ASSERT(psa_mac_verify(key, alg, (uint8_t const *) input, input_len, expected_mac->x, 71a8e1175bSopenharmony_ci expected_mac->len)); 72a8e1175bSopenharmony_ci 73a8e1175bSopenharmony_ci // corrupt the MAC and check that psa_mac_verify fails 74a8e1175bSopenharmony_ci expected_mac->x[0] ^= 0x7f; 75a8e1175bSopenharmony_ci TEST_EQUAL(psa_mac_verify(key, alg, (uint8_t const *) input, input_len, expected_mac->x, 76a8e1175bSopenharmony_ci expected_mac->len), PSA_ERROR_INVALID_SIGNATURE); 77a8e1175bSopenharmony_ci 78a8e1175bSopenharmony_ci PSA_ASSERT(psa_destroy_key(key)); 79a8e1175bSopenharmony_ciexit: 80a8e1175bSopenharmony_ci PSA_DONE(); 81a8e1175bSopenharmony_ci} 82a8e1175bSopenharmony_ci/* END_CASE */ 83a8e1175bSopenharmony_ci 84a8e1175bSopenharmony_ci/* BEGIN_CASE */ 85a8e1175bSopenharmony_civoid hash_verify(int alg_arg, data_t *input, data_t *expected_hash) 86a8e1175bSopenharmony_ci{ 87a8e1175bSopenharmony_ci psa_algorithm_t alg = alg_arg; 88a8e1175bSopenharmony_ci psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT; 89a8e1175bSopenharmony_ci 90a8e1175bSopenharmony_ci PSA_ASSERT(psa_crypto_init()); 91a8e1175bSopenharmony_ci 92a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_setup(&operation, alg)); 93a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_update(&operation, 94a8e1175bSopenharmony_ci input->x, 95a8e1175bSopenharmony_ci input->len)); 96a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_verify(&operation, 97a8e1175bSopenharmony_ci expected_hash->x, 98a8e1175bSopenharmony_ci expected_hash->len)); 99a8e1175bSopenharmony_ci 100a8e1175bSopenharmony_ciexit: 101a8e1175bSopenharmony_ci psa_hash_abort(&operation); 102a8e1175bSopenharmony_ci PSA_DONE(); 103a8e1175bSopenharmony_ci} 104a8e1175bSopenharmony_ci/* END_CASE */ 105a8e1175bSopenharmony_ci 106a8e1175bSopenharmony_ci/* BEGIN_CASE */ 107a8e1175bSopenharmony_civoid hash_multi_part(int alg_arg, data_t *input, data_t *expected_hash) 108a8e1175bSopenharmony_ci{ 109a8e1175bSopenharmony_ci psa_algorithm_t alg = alg_arg; 110a8e1175bSopenharmony_ci unsigned char actual_hash[PSA_HASH_MAX_SIZE]; 111a8e1175bSopenharmony_ci size_t actual_hash_length; 112a8e1175bSopenharmony_ci psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT; 113a8e1175bSopenharmony_ci psa_hash_operation_t operation2 = PSA_HASH_OPERATION_INIT; 114a8e1175bSopenharmony_ci uint32_t len = 0; 115a8e1175bSopenharmony_ci 116a8e1175bSopenharmony_ci PSA_ASSERT(psa_crypto_init()); 117a8e1175bSopenharmony_ci 118a8e1175bSopenharmony_ci do { 119a8e1175bSopenharmony_ci memset(actual_hash, 0, sizeof(actual_hash)); 120a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_setup(&operation, alg)); 121a8e1175bSopenharmony_ci 122a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_update(&operation, 123a8e1175bSopenharmony_ci input->x, len)); 124a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_clone(&operation, &operation2)); 125a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_update(&operation, 126a8e1175bSopenharmony_ci input->x + len, input->len - len)); 127a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_update(&operation2, 128a8e1175bSopenharmony_ci input->x + len, input->len - len)); 129a8e1175bSopenharmony_ci 130a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_finish(&operation, 131a8e1175bSopenharmony_ci actual_hash, sizeof(actual_hash), 132a8e1175bSopenharmony_ci &actual_hash_length)); 133a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(expected_hash->x, expected_hash->len, 134a8e1175bSopenharmony_ci actual_hash, actual_hash_length); 135a8e1175bSopenharmony_ci 136a8e1175bSopenharmony_ci PSA_ASSERT(psa_hash_finish(&operation2, 137a8e1175bSopenharmony_ci actual_hash, sizeof(actual_hash), 138a8e1175bSopenharmony_ci &actual_hash_length)); 139a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(expected_hash->x, expected_hash->len, 140a8e1175bSopenharmony_ci actual_hash, actual_hash_length); 141a8e1175bSopenharmony_ci } while (len++ != input->len); 142a8e1175bSopenharmony_ci 143a8e1175bSopenharmony_ciexit: 144a8e1175bSopenharmony_ci psa_hash_abort(&operation); 145a8e1175bSopenharmony_ci psa_hash_abort(&operation2); 146a8e1175bSopenharmony_ci PSA_DONE(); 147a8e1175bSopenharmony_ci} 148a8e1175bSopenharmony_ci/* END_CASE */ 149