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