1a8e1175bSopenharmony_ci/* BEGIN_HEADER */ 2a8e1175bSopenharmony_ci#include "mbedtls/md.h" 3a8e1175bSopenharmony_ci#include "mbedtls/psa_util.h" 4a8e1175bSopenharmony_ci 5a8e1175bSopenharmony_ci#include "mbedtls/oid.h" 6a8e1175bSopenharmony_ci#include "mbedtls/asn1.h" 7a8e1175bSopenharmony_ci 8a8e1175bSopenharmony_ci#define MD_PSA(md, psa) \ 9a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_psa_alg_from_type(md), psa); \ 10a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_type_from_psa_alg(psa), md); 11a8e1175bSopenharmony_ci/* END_HEADER */ 12a8e1175bSopenharmony_ci 13a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES 14a8e1175bSopenharmony_ci * depends_on:MBEDTLS_MD_LIGHT 15a8e1175bSopenharmony_ci * END_DEPENDENCIES 16a8e1175bSopenharmony_ci */ 17a8e1175bSopenharmony_ci 18a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_MD_C */ 19a8e1175bSopenharmony_civoid mbedtls_md_list() 20a8e1175bSopenharmony_ci{ 21a8e1175bSopenharmony_ci const int *md_type_ptr; 22a8e1175bSopenharmony_ci const mbedtls_md_info_t *info; 23a8e1175bSopenharmony_ci mbedtls_md_context_t ctx; 24a8e1175bSopenharmony_ci unsigned char out[MBEDTLS_MD_MAX_SIZE] = { 0 }; 25a8e1175bSopenharmony_ci 26a8e1175bSopenharmony_ci MD_PSA_INIT(); 27a8e1175bSopenharmony_ci mbedtls_md_init(&ctx); 28a8e1175bSopenharmony_ci 29a8e1175bSopenharmony_ci /* 30a8e1175bSopenharmony_ci * Test that mbedtls_md_list() only returns valid MDs. 31a8e1175bSopenharmony_ci */ 32a8e1175bSopenharmony_ci for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) { 33a8e1175bSopenharmony_ci info = mbedtls_md_info_from_type(*md_type_ptr); 34a8e1175bSopenharmony_ci TEST_ASSERT(info != NULL); 35a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_setup(&ctx, info, 0)); 36a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_starts(&ctx)); 37a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_finish(&ctx, out)); 38a8e1175bSopenharmony_ci mbedtls_md_free(&ctx); 39a8e1175bSopenharmony_ci 40a8e1175bSopenharmony_ci#if defined(MBEDTLS_PSA_CRYPTO_C) 41a8e1175bSopenharmony_ci /* Ensure that we can convert to and from a psa_algorithm_t */ 42a8e1175bSopenharmony_ci psa_algorithm_t p = mbedtls_md_psa_alg_from_type(*md_type_ptr); 43a8e1175bSopenharmony_ci TEST_ASSERT(p != PSA_ALG_NONE); 44a8e1175bSopenharmony_ci TEST_EQUAL(*md_type_ptr, mbedtls_md_type_from_psa_alg(p)); 45a8e1175bSopenharmony_ci#endif 46a8e1175bSopenharmony_ci 47a8e1175bSopenharmony_ci#if defined(MBEDTLS_OID_C) 48a8e1175bSopenharmony_ci mbedtls_asn1_buf asn1; 49a8e1175bSopenharmony_ci /* Check that we have an OID definition */ 50a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_oid_get_oid_by_md((mbedtls_md_type_t) *md_type_ptr, 51a8e1175bSopenharmony_ci (const char **) &asn1.p, &asn1.len), 0); 52a8e1175bSopenharmony_ci /* Check that this OID definition maps back to the correct mbedtls_md_type_t */ 53a8e1175bSopenharmony_ci mbedtls_md_type_t m; 54a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_oid_get_md_alg(&asn1, &m), 0); 55a8e1175bSopenharmony_ci TEST_EQUAL(m, *md_type_ptr); 56a8e1175bSopenharmony_ci#endif 57a8e1175bSopenharmony_ci } 58a8e1175bSopenharmony_ci 59a8e1175bSopenharmony_ciexit: 60a8e1175bSopenharmony_ci mbedtls_md_free(&ctx); 61a8e1175bSopenharmony_ci MD_PSA_DONE(); 62a8e1175bSopenharmony_ci} 63a8e1175bSopenharmony_ci/* END_CASE */ 64a8e1175bSopenharmony_ci 65a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */ 66a8e1175bSopenharmony_civoid md_to_from_psa() 67a8e1175bSopenharmony_ci{ 68a8e1175bSopenharmony_ci /* We use a simplified implementation that relies on numerical values 69a8e1175bSopenharmony_ci * being aligned, so make sure they remain so. */ 70a8e1175bSopenharmony_ci MD_PSA(MBEDTLS_MD_MD5, PSA_ALG_MD5); 71a8e1175bSopenharmony_ci MD_PSA(MBEDTLS_MD_RIPEMD160, PSA_ALG_RIPEMD160); 72a8e1175bSopenharmony_ci MD_PSA(MBEDTLS_MD_SHA1, PSA_ALG_SHA_1); 73a8e1175bSopenharmony_ci MD_PSA(MBEDTLS_MD_SHA224, PSA_ALG_SHA_224); 74a8e1175bSopenharmony_ci MD_PSA(MBEDTLS_MD_SHA256, PSA_ALG_SHA_256); 75a8e1175bSopenharmony_ci MD_PSA(MBEDTLS_MD_SHA384, PSA_ALG_SHA_384); 76a8e1175bSopenharmony_ci MD_PSA(MBEDTLS_MD_SHA512, PSA_ALG_SHA_512); 77a8e1175bSopenharmony_ci MD_PSA(MBEDTLS_MD_SHA3_224, PSA_ALG_SHA3_224); 78a8e1175bSopenharmony_ci MD_PSA(MBEDTLS_MD_SHA3_256, PSA_ALG_SHA3_256); 79a8e1175bSopenharmony_ci MD_PSA(MBEDTLS_MD_SHA3_384, PSA_ALG_SHA3_384); 80a8e1175bSopenharmony_ci MD_PSA(MBEDTLS_MD_SHA3_512, PSA_ALG_SHA3_512); 81a8e1175bSopenharmony_ci 82a8e1175bSopenharmony_ci /* Don't test for NONE<->NONE as this is not guaranteed */ 83a8e1175bSopenharmony_ci} 84a8e1175bSopenharmony_ci/* END_CASE */ 85a8e1175bSopenharmony_ci 86a8e1175bSopenharmony_ci/* BEGIN_CASE */ 87a8e1175bSopenharmony_civoid md_null_args() 88a8e1175bSopenharmony_ci{ 89a8e1175bSopenharmony_ci mbedtls_md_context_t ctx; 90a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C) 91a8e1175bSopenharmony_ci const mbedtls_md_info_t *info = mbedtls_md_info_from_type(*(mbedtls_md_list())); 92a8e1175bSopenharmony_ci#endif 93a8e1175bSopenharmony_ci unsigned char buf[1] = { 0 }; 94a8e1175bSopenharmony_ci 95a8e1175bSopenharmony_ci MD_PSA_INIT(); 96a8e1175bSopenharmony_ci mbedtls_md_init(&ctx); 97a8e1175bSopenharmony_ci 98a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_get_size(NULL)); 99a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C) 100a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_get_type(NULL), MBEDTLS_MD_NONE); 101a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_md_get_name(NULL) == NULL); 102a8e1175bSopenharmony_ci 103a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_md_info_from_string(NULL) == NULL); 104a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_md_info_from_ctx(NULL) == NULL); 105a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == NULL); 106a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_C */ 107a8e1175bSopenharmony_ci 108a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_setup(&ctx, NULL, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 109a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C) 110a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_setup(NULL, info, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 111a8e1175bSopenharmony_ci 112a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_starts(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 113a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_starts(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 114a8e1175bSopenharmony_ci 115a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_update(NULL, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 116a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_update(&ctx, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 117a8e1175bSopenharmony_ci 118a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 119a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 120a8e1175bSopenharmony_ci#endif 121a8e1175bSopenharmony_ci 122a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md(NULL, buf, 1, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 123a8e1175bSopenharmony_ci 124a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C) 125a8e1175bSopenharmony_ci#if defined(MBEDTLS_FS_IO) 126a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_file(NULL, "", buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 127a8e1175bSopenharmony_ci#endif 128a8e1175bSopenharmony_ci 129a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_hmac_starts(NULL, buf, 1), 130a8e1175bSopenharmony_ci MBEDTLS_ERR_MD_BAD_INPUT_DATA); 131a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_hmac_starts(&ctx, buf, 1), 132a8e1175bSopenharmony_ci MBEDTLS_ERR_MD_BAD_INPUT_DATA); 133a8e1175bSopenharmony_ci 134a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_hmac_update(NULL, buf, 1), 135a8e1175bSopenharmony_ci MBEDTLS_ERR_MD_BAD_INPUT_DATA); 136a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_hmac_update(&ctx, buf, 1), 137a8e1175bSopenharmony_ci MBEDTLS_ERR_MD_BAD_INPUT_DATA); 138a8e1175bSopenharmony_ci 139a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_hmac_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 140a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_hmac_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 141a8e1175bSopenharmony_ci 142a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_hmac_reset(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 143a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_hmac_reset(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA); 144a8e1175bSopenharmony_ci 145a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_hmac(NULL, buf, 1, buf, 1, buf), 146a8e1175bSopenharmony_ci MBEDTLS_ERR_MD_BAD_INPUT_DATA); 147a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_C */ 148a8e1175bSopenharmony_ci 149a8e1175bSopenharmony_ci /* Ok, this is not NULL arg but NULL return... */ 150a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_md_info_from_type(MBEDTLS_MD_NONE) == NULL); 151a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C) 152a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_md_info_from_string("no such md") == NULL); 153a8e1175bSopenharmony_ci#endif 154a8e1175bSopenharmony_ci 155a8e1175bSopenharmony_ciexit: 156a8e1175bSopenharmony_ci MD_PSA_DONE(); 157a8e1175bSopenharmony_ci} 158a8e1175bSopenharmony_ci/* END_CASE */ 159a8e1175bSopenharmony_ci 160a8e1175bSopenharmony_ci/* BEGIN_CASE */ 161a8e1175bSopenharmony_civoid md_info(int md_type, char *md_name, int md_size) 162a8e1175bSopenharmony_ci{ 163a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info; 164a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C) 165a8e1175bSopenharmony_ci const int *md_type_ptr; 166a8e1175bSopenharmony_ci#else 167a8e1175bSopenharmony_ci (void) md_name; 168a8e1175bSopenharmony_ci#endif 169a8e1175bSopenharmony_ci 170a8e1175bSopenharmony_ci /* Note: PSA Crypto init not needed for info functions */ 171a8e1175bSopenharmony_ci 172a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_type); 173a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 174a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C) 175a8e1175bSopenharmony_ci TEST_ASSERT(md_info == mbedtls_md_info_from_string(md_name)); 176a8e1175bSopenharmony_ci#endif 177a8e1175bSopenharmony_ci 178a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_get_type(md_info), (mbedtls_md_type_t) md_type); 179a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_md_get_size(md_info), (unsigned char) md_size); 180a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C) 181a8e1175bSopenharmony_ci TEST_EQUAL(0, strcmp(mbedtls_md_get_name(md_info), md_name)); 182a8e1175bSopenharmony_ci 183a8e1175bSopenharmony_ci int found = 0; 184a8e1175bSopenharmony_ci for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) { 185a8e1175bSopenharmony_ci if (*md_type_ptr == md_type) { 186a8e1175bSopenharmony_ci found = 1; 187a8e1175bSopenharmony_ci } 188a8e1175bSopenharmony_ci } 189a8e1175bSopenharmony_ci TEST_EQUAL(found, 1); 190a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_C */ 191a8e1175bSopenharmony_ci} 192a8e1175bSopenharmony_ci/* END_CASE */ 193a8e1175bSopenharmony_ci 194a8e1175bSopenharmony_ci/* BEGIN_CASE */ 195a8e1175bSopenharmony_civoid md_text(int md_type, char *text_src_string, data_t *hash) 196a8e1175bSopenharmony_ci{ 197a8e1175bSopenharmony_ci unsigned char *src = (unsigned char *) text_src_string; 198a8e1175bSopenharmony_ci size_t src_len = strlen(text_src_string); 199a8e1175bSopenharmony_ci unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 }; 200a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info = NULL; 201a8e1175bSopenharmony_ci 202a8e1175bSopenharmony_ci MD_PSA_INIT(); 203a8e1175bSopenharmony_ci 204a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_type); 205a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 206a8e1175bSopenharmony_ci 207a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md(md_info, src, src_len, output)); 208a8e1175bSopenharmony_ci 209a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len); 210a8e1175bSopenharmony_ci 211a8e1175bSopenharmony_ciexit: 212a8e1175bSopenharmony_ci MD_PSA_DONE(); 213a8e1175bSopenharmony_ci} 214a8e1175bSopenharmony_ci/* END_CASE */ 215a8e1175bSopenharmony_ci 216a8e1175bSopenharmony_ci/* BEGIN_CASE */ 217a8e1175bSopenharmony_civoid md_hex(int md_type, data_t *src_str, data_t *hash) 218a8e1175bSopenharmony_ci{ 219a8e1175bSopenharmony_ci unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 }; 220a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info = NULL; 221a8e1175bSopenharmony_ci 222a8e1175bSopenharmony_ci MD_PSA_INIT(); 223a8e1175bSopenharmony_ci 224a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_type); 225a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 226a8e1175bSopenharmony_ci 227a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md(md_info, src_str->x, src_str->len, output)); 228a8e1175bSopenharmony_ci 229a8e1175bSopenharmony_ci 230a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len); 231a8e1175bSopenharmony_ci 232a8e1175bSopenharmony_ciexit: 233a8e1175bSopenharmony_ci MD_PSA_DONE(); 234a8e1175bSopenharmony_ci} 235a8e1175bSopenharmony_ci/* END_CASE */ 236a8e1175bSopenharmony_ci 237a8e1175bSopenharmony_ci/* BEGIN_CASE */ 238a8e1175bSopenharmony_civoid md_text_multi(int md_type, char *text_src_string, 239a8e1175bSopenharmony_ci data_t *hash) 240a8e1175bSopenharmony_ci{ 241a8e1175bSopenharmony_ci unsigned char *src = (unsigned char *) text_src_string; 242a8e1175bSopenharmony_ci size_t src_len = strlen(text_src_string); 243a8e1175bSopenharmony_ci unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 }; 244a8e1175bSopenharmony_ci size_t halfway; 245a8e1175bSopenharmony_ci 246a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info = NULL; 247a8e1175bSopenharmony_ci mbedtls_md_context_t ctx, ctx_copy; 248a8e1175bSopenharmony_ci 249a8e1175bSopenharmony_ci MD_PSA_INIT(); 250a8e1175bSopenharmony_ci 251a8e1175bSopenharmony_ci mbedtls_md_init(&ctx); 252a8e1175bSopenharmony_ci mbedtls_md_init(&ctx_copy); 253a8e1175bSopenharmony_ci 254a8e1175bSopenharmony_ci halfway = src_len / 2; 255a8e1175bSopenharmony_ci 256a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_type); 257a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 258a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0)); 259a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0)); 260a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C) 261a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info); 262a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info); 263a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_C */ 264a8e1175bSopenharmony_ci 265a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_starts(&ctx)); 266a8e1175bSopenharmony_ci TEST_ASSERT(ctx.md_ctx != NULL); 267a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_update(&ctx, src, halfway)); 268a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx)); 269a8e1175bSopenharmony_ci 270a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_update(&ctx, src + halfway, src_len - halfway)); 271a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_finish(&ctx, output)); 272a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len); 273a8e1175bSopenharmony_ci 274a8e1175bSopenharmony_ci /* Test clone */ 275a8e1175bSopenharmony_ci memset(output, 0x00, sizeof(output)); 276a8e1175bSopenharmony_ci 277a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src + halfway, src_len - halfway)); 278a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output)); 279a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len); 280a8e1175bSopenharmony_ci 281a8e1175bSopenharmony_ciexit: 282a8e1175bSopenharmony_ci mbedtls_md_free(&ctx); 283a8e1175bSopenharmony_ci mbedtls_md_free(&ctx_copy); 284a8e1175bSopenharmony_ci MD_PSA_DONE(); 285a8e1175bSopenharmony_ci} 286a8e1175bSopenharmony_ci/* END_CASE */ 287a8e1175bSopenharmony_ci 288a8e1175bSopenharmony_ci/* BEGIN_CASE */ 289a8e1175bSopenharmony_civoid md_hex_multi(int md_type, data_t *src_str, data_t *hash) 290a8e1175bSopenharmony_ci{ 291a8e1175bSopenharmony_ci unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 }; 292a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info = NULL; 293a8e1175bSopenharmony_ci mbedtls_md_context_t ctx, ctx_copy; 294a8e1175bSopenharmony_ci int halfway; 295a8e1175bSopenharmony_ci 296a8e1175bSopenharmony_ci MD_PSA_INIT(); 297a8e1175bSopenharmony_ci 298a8e1175bSopenharmony_ci mbedtls_md_init(&ctx); 299a8e1175bSopenharmony_ci mbedtls_md_init(&ctx_copy); 300a8e1175bSopenharmony_ci 301a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_type); 302a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 303a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0)); 304a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0)); 305a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C) 306a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info); 307a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info); 308a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_C */ 309a8e1175bSopenharmony_ci 310a8e1175bSopenharmony_ci halfway = src_str->len / 2; 311a8e1175bSopenharmony_ci 312a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_starts(&ctx)); 313a8e1175bSopenharmony_ci TEST_ASSERT(ctx.md_ctx != NULL); 314a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x, halfway)); 315a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx)); 316a8e1175bSopenharmony_ci 317a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x + halfway, src_str->len - halfway)); 318a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_finish(&ctx, output)); 319a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len); 320a8e1175bSopenharmony_ci 321a8e1175bSopenharmony_ci /* Test clone */ 322a8e1175bSopenharmony_ci memset(output, 0x00, sizeof(output)); 323a8e1175bSopenharmony_ci 324a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src_str->x + halfway, src_str->len - halfway)); 325a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output)); 326a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len); 327a8e1175bSopenharmony_ci 328a8e1175bSopenharmony_ciexit: 329a8e1175bSopenharmony_ci mbedtls_md_free(&ctx); 330a8e1175bSopenharmony_ci mbedtls_md_free(&ctx_copy); 331a8e1175bSopenharmony_ci MD_PSA_DONE(); 332a8e1175bSopenharmony_ci} 333a8e1175bSopenharmony_ci/* END_CASE */ 334a8e1175bSopenharmony_ci 335a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_MD_C */ 336a8e1175bSopenharmony_civoid mbedtls_md_hmac(int md_type, int trunc_size, 337a8e1175bSopenharmony_ci data_t *key_str, data_t *src_str, 338a8e1175bSopenharmony_ci data_t *hash) 339a8e1175bSopenharmony_ci{ 340a8e1175bSopenharmony_ci unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 }; 341a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info = NULL; 342a8e1175bSopenharmony_ci 343a8e1175bSopenharmony_ci MD_PSA_INIT(); 344a8e1175bSopenharmony_ci 345a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_type); 346a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 347a8e1175bSopenharmony_ci 348a8e1175bSopenharmony_ci 349a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_hmac(md_info, key_str->x, key_str->len, 350a8e1175bSopenharmony_ci src_str->x, src_str->len, output)); 351a8e1175bSopenharmony_ci 352a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len); 353a8e1175bSopenharmony_ci 354a8e1175bSopenharmony_ciexit: 355a8e1175bSopenharmony_ci MD_PSA_DONE(); 356a8e1175bSopenharmony_ci} 357a8e1175bSopenharmony_ci/* END_CASE */ 358a8e1175bSopenharmony_ci 359a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_MD_C */ 360a8e1175bSopenharmony_civoid md_hmac_multi(int md_type, int trunc_size, data_t *key_str, 361a8e1175bSopenharmony_ci data_t *src_str, data_t *hash) 362a8e1175bSopenharmony_ci{ 363a8e1175bSopenharmony_ci unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 }; 364a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info = NULL; 365a8e1175bSopenharmony_ci mbedtls_md_context_t ctx; 366a8e1175bSopenharmony_ci int halfway; 367a8e1175bSopenharmony_ci 368a8e1175bSopenharmony_ci MD_PSA_INIT(); 369a8e1175bSopenharmony_ci 370a8e1175bSopenharmony_ci mbedtls_md_init(&ctx); 371a8e1175bSopenharmony_ci 372a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_type); 373a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 374a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 1)); 375a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C) 376a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info); 377a8e1175bSopenharmony_ci#endif 378a8e1175bSopenharmony_ci 379a8e1175bSopenharmony_ci halfway = src_str->len / 2; 380a8e1175bSopenharmony_ci 381a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_hmac_starts(&ctx, key_str->x, key_str->len)); 382a8e1175bSopenharmony_ci TEST_ASSERT(ctx.md_ctx != NULL); 383a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway)); 384a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway)); 385a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output)); 386a8e1175bSopenharmony_ci 387a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len); 388a8e1175bSopenharmony_ci 389a8e1175bSopenharmony_ci /* Test again, for reset() */ 390a8e1175bSopenharmony_ci memset(output, 0x00, sizeof(output)); 391a8e1175bSopenharmony_ci 392a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_hmac_reset(&ctx)); 393a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway)); 394a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway)); 395a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output)); 396a8e1175bSopenharmony_ci 397a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len); 398a8e1175bSopenharmony_ci 399a8e1175bSopenharmony_ciexit: 400a8e1175bSopenharmony_ci mbedtls_md_free(&ctx); 401a8e1175bSopenharmony_ci MD_PSA_DONE(); 402a8e1175bSopenharmony_ci} 403a8e1175bSopenharmony_ci/* END_CASE */ 404a8e1175bSopenharmony_ci 405a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_MD_C */ 406a8e1175bSopenharmony_civoid mbedtls_md_file(int md_type, char *filename, 407a8e1175bSopenharmony_ci data_t *hash) 408a8e1175bSopenharmony_ci{ 409a8e1175bSopenharmony_ci unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 }; 410a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info = NULL; 411a8e1175bSopenharmony_ci 412a8e1175bSopenharmony_ci MD_PSA_INIT(); 413a8e1175bSopenharmony_ci 414a8e1175bSopenharmony_ci md_info = mbedtls_md_info_from_type(md_type); 415a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 416a8e1175bSopenharmony_ci 417a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_file(md_info, filename, output)); 418a8e1175bSopenharmony_ci 419a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len); 420a8e1175bSopenharmony_ci 421a8e1175bSopenharmony_ciexit: 422a8e1175bSopenharmony_ci MD_PSA_DONE(); 423a8e1175bSopenharmony_ci} 424a8e1175bSopenharmony_ci/* END_CASE */ 425a8e1175bSopenharmony_ci 426a8e1175bSopenharmony_ci/* BEGIN_CASE */ 427a8e1175bSopenharmony_civoid md_psa_dynamic_dispatch(int md_type, int pre_psa_ret, int post_psa_engine) 428a8e1175bSopenharmony_ci{ 429a8e1175bSopenharmony_ci const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type); 430a8e1175bSopenharmony_ci mbedtls_md_context_t ctx1, ctx2; 431a8e1175bSopenharmony_ci 432a8e1175bSopenharmony_ci /* Intentionally no PSA init here! (Will be done later.) */ 433a8e1175bSopenharmony_ci 434a8e1175bSopenharmony_ci mbedtls_md_init(&ctx1); 435a8e1175bSopenharmony_ci mbedtls_md_init(&ctx2); 436a8e1175bSopenharmony_ci 437a8e1175bSopenharmony_ci TEST_ASSERT(md_info != NULL); 438a8e1175bSopenharmony_ci 439a8e1175bSopenharmony_ci /* Before PSA crypto init */ 440a8e1175bSopenharmony_ci TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx1, md_info, 0)); 441a8e1175bSopenharmony_ci TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx2, md_info, 0)); 442a8e1175bSopenharmony_ci 443a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SOME_PSA) 444a8e1175bSopenharmony_ci TEST_EQUAL(ctx1.engine, MBEDTLS_MD_ENGINE_LEGACY); 445a8e1175bSopenharmony_ci TEST_EQUAL(ctx2.engine, MBEDTLS_MD_ENGINE_LEGACY); 446a8e1175bSopenharmony_ci#endif 447a8e1175bSopenharmony_ci 448a8e1175bSopenharmony_ci /* Reset ctx1 but keep ctx2 for the cloning test */ 449a8e1175bSopenharmony_ci mbedtls_md_free(&ctx1); 450a8e1175bSopenharmony_ci mbedtls_md_init(&ctx1); 451a8e1175bSopenharmony_ci 452a8e1175bSopenharmony_ci /* Now initilize PSA Crypto */ 453a8e1175bSopenharmony_ci MD_PSA_INIT(); 454a8e1175bSopenharmony_ci 455a8e1175bSopenharmony_ci /* After PSA Crypto init */ 456a8e1175bSopenharmony_ci TEST_EQUAL(0, mbedtls_md_setup(&ctx1, md_info, 0)); 457a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SOME_PSA) 458a8e1175bSopenharmony_ci TEST_EQUAL(ctx1.engine, post_psa_engine); 459a8e1175bSopenharmony_ci#endif 460a8e1175bSopenharmony_ci 461a8e1175bSopenharmony_ci /* Cloning test */ 462a8e1175bSopenharmony_ci if (pre_psa_ret == 0) { 463a8e1175bSopenharmony_ci int exp_clone_ret = post_psa_engine == MBEDTLS_MD_ENGINE_PSA 464a8e1175bSopenharmony_ci ? MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE 465a8e1175bSopenharmony_ci : 0; 466a8e1175bSopenharmony_ci TEST_EQUAL(exp_clone_ret, mbedtls_md_clone(&ctx2, &ctx1)); 467a8e1175bSopenharmony_ci } 468a8e1175bSopenharmony_ci 469a8e1175bSopenharmony_ciexit: 470a8e1175bSopenharmony_ci mbedtls_md_free(&ctx1); 471a8e1175bSopenharmony_ci mbedtls_md_free(&ctx2); 472a8e1175bSopenharmony_ci MD_PSA_DONE(); 473a8e1175bSopenharmony_ci} 474a8e1175bSopenharmony_ci/* END_CASE */ 475