/* BEGIN_HEADER */
#include "mbedtls/md.h"
#include "md_psa.h"

#include "mbedtls/oid.h"
#include "mbedtls/asn1.h"

#define MD_PSA(md, psa) \
    TEST_EQUAL(mbedtls_md_psa_alg_from_type(md), psa);  \
    TEST_EQUAL(mbedtls_md_type_from_psa_alg(psa), md);
/* END_HEADER */

/* BEGIN_DEPENDENCIES
 * depends_on:MBEDTLS_MD_LIGHT
 * END_DEPENDENCIES
 */

/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
void mbedtls_md_list()
{
    const int *md_type_ptr;
    const mbedtls_md_info_t *info;
    mbedtls_md_context_t ctx;
    unsigned char out[MBEDTLS_MD_MAX_SIZE] = { 0 };

    MD_PSA_INIT();
    mbedtls_md_init(&ctx);

    /*
     * Test that mbedtls_md_list() only returns valid MDs.
     */
    for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
        info = mbedtls_md_info_from_type(*md_type_ptr);
        TEST_ASSERT(info != NULL);
        TEST_EQUAL(0, mbedtls_md_setup(&ctx, info, 0));
        TEST_EQUAL(0, mbedtls_md_starts(&ctx));
        TEST_EQUAL(0, mbedtls_md_finish(&ctx, out));
        mbedtls_md_free(&ctx);

#if defined(MBEDTLS_PSA_CRYPTO_C)
        /* Ensure that we can convert to and from a psa_algorithm_t */
        psa_algorithm_t p = mbedtls_md_psa_alg_from_type(*md_type_ptr);
        TEST_ASSERT(p != PSA_ALG_NONE);
        TEST_EQUAL(*md_type_ptr, mbedtls_md_type_from_psa_alg(p));
#endif

#if defined(MBEDTLS_OID_C)
        mbedtls_asn1_buf asn1;
        /* Check that we have an OID definition */
        TEST_EQUAL(mbedtls_oid_get_oid_by_md((mbedtls_md_type_t) *md_type_ptr,
                                             (const char **) &asn1.p, &asn1.len), 0);
        /* Check that this OID definition maps back to the correct mbedtls_md_type_t */
        mbedtls_md_type_t m;
        TEST_EQUAL(mbedtls_oid_get_md_alg(&asn1, &m), 0);
        TEST_EQUAL(m, *md_type_ptr);
#endif
    }

exit:
    mbedtls_md_free(&ctx);
    MD_PSA_DONE();
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
void md_to_from_psa()
{
    /* We use a simplified implementation that relies on numerical values
     * being aligned, so make sure they remain so. */
    MD_PSA(MBEDTLS_MD_MD5, PSA_ALG_MD5);
    MD_PSA(MBEDTLS_MD_RIPEMD160, PSA_ALG_RIPEMD160);
    MD_PSA(MBEDTLS_MD_SHA1, PSA_ALG_SHA_1);
    MD_PSA(MBEDTLS_MD_SHA224, PSA_ALG_SHA_224);
    MD_PSA(MBEDTLS_MD_SHA256, PSA_ALG_SHA_256);
    MD_PSA(MBEDTLS_MD_SHA384, PSA_ALG_SHA_384);
    MD_PSA(MBEDTLS_MD_SHA512, PSA_ALG_SHA_512);
    MD_PSA(MBEDTLS_MD_SHA3_224, PSA_ALG_SHA3_224);
    MD_PSA(MBEDTLS_MD_SHA3_256, PSA_ALG_SHA3_256);
    MD_PSA(MBEDTLS_MD_SHA3_384, PSA_ALG_SHA3_384);
    MD_PSA(MBEDTLS_MD_SHA3_512, PSA_ALG_SHA3_512);

    /* Don't test for NONE<->NONE as this is not guaranteed */
}
/* END_CASE */

/* BEGIN_CASE */
void md_null_args()
{
    mbedtls_md_context_t ctx;
#if defined(MBEDTLS_MD_C)
    const mbedtls_md_info_t *info = mbedtls_md_info_from_type(*(mbedtls_md_list()));
#endif
    unsigned char buf[1] = { 0 };

    MD_PSA_INIT();
    mbedtls_md_init(&ctx);

    TEST_EQUAL(0, mbedtls_md_get_size(NULL));
#if defined(MBEDTLS_MD_C)
    TEST_EQUAL(mbedtls_md_get_type(NULL), MBEDTLS_MD_NONE);
    TEST_ASSERT(mbedtls_md_get_name(NULL) == NULL);

    TEST_ASSERT(mbedtls_md_info_from_string(NULL) == NULL);
    TEST_ASSERT(mbedtls_md_info_from_ctx(NULL) == NULL);
    TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == NULL);
#endif /* MBEDTLS_MD_C */

    TEST_EQUAL(mbedtls_md_setup(&ctx, NULL, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
#if defined(MBEDTLS_MD_C)
    TEST_EQUAL(mbedtls_md_setup(NULL, info, 0), MBEDTLS_ERR_MD_BAD_INPUT_DATA);

    TEST_EQUAL(mbedtls_md_starts(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
    TEST_EQUAL(mbedtls_md_starts(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);

    TEST_EQUAL(mbedtls_md_update(NULL, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
    TEST_EQUAL(mbedtls_md_update(&ctx, buf, 1), MBEDTLS_ERR_MD_BAD_INPUT_DATA);

    TEST_EQUAL(mbedtls_md_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
    TEST_EQUAL(mbedtls_md_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
#endif

    TEST_EQUAL(mbedtls_md(NULL, buf, 1, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);

#if defined(MBEDTLS_MD_C)
#if defined(MBEDTLS_FS_IO)
    TEST_EQUAL(mbedtls_md_file(NULL, "", buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
#endif

    TEST_EQUAL(mbedtls_md_hmac_starts(NULL, buf, 1),
               MBEDTLS_ERR_MD_BAD_INPUT_DATA);
    TEST_EQUAL(mbedtls_md_hmac_starts(&ctx, buf, 1),
               MBEDTLS_ERR_MD_BAD_INPUT_DATA);

    TEST_EQUAL(mbedtls_md_hmac_update(NULL, buf, 1),
               MBEDTLS_ERR_MD_BAD_INPUT_DATA);
    TEST_EQUAL(mbedtls_md_hmac_update(&ctx, buf, 1),
               MBEDTLS_ERR_MD_BAD_INPUT_DATA);

    TEST_EQUAL(mbedtls_md_hmac_finish(NULL, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
    TEST_EQUAL(mbedtls_md_hmac_finish(&ctx, buf), MBEDTLS_ERR_MD_BAD_INPUT_DATA);

    TEST_EQUAL(mbedtls_md_hmac_reset(NULL), MBEDTLS_ERR_MD_BAD_INPUT_DATA);
    TEST_EQUAL(mbedtls_md_hmac_reset(&ctx), MBEDTLS_ERR_MD_BAD_INPUT_DATA);

    TEST_EQUAL(mbedtls_md_hmac(NULL, buf, 1, buf, 1, buf),
               MBEDTLS_ERR_MD_BAD_INPUT_DATA);
#endif /* MBEDTLS_MD_C */

    /* Ok, this is not NULL arg but NULL return... */
    TEST_ASSERT(mbedtls_md_info_from_type(MBEDTLS_MD_NONE) == NULL);
#if defined(MBEDTLS_MD_C)
    TEST_ASSERT(mbedtls_md_info_from_string("no such md") == NULL);
#endif

exit:
    MD_PSA_DONE();
}
/* END_CASE */

/* BEGIN_CASE */
void md_info(int md_type, char *md_name, int md_size)
{
    const mbedtls_md_info_t *md_info;
#if defined(MBEDTLS_MD_C)
    const int *md_type_ptr;
#else
    (void) md_name;
#endif

    /* Note: PSA Crypto init not needed for info functions */

    md_info = mbedtls_md_info_from_type(md_type);
    TEST_ASSERT(md_info != NULL);
#if defined(MBEDTLS_MD_C)
    TEST_ASSERT(md_info == mbedtls_md_info_from_string(md_name));
#endif

    TEST_EQUAL(mbedtls_md_get_type(md_info), (mbedtls_md_type_t) md_type);
    TEST_EQUAL(mbedtls_md_get_size(md_info), (unsigned char) md_size);
#if defined(MBEDTLS_MD_C)
    TEST_EQUAL(0, strcmp(mbedtls_md_get_name(md_info), md_name));

    int found = 0;
    for (md_type_ptr = mbedtls_md_list(); *md_type_ptr != 0; md_type_ptr++) {
        if (*md_type_ptr == md_type) {
            found = 1;
        }
    }
    TEST_EQUAL(found, 1);
#endif /* MBEDTLS_MD_C */
}
/* END_CASE */

/* BEGIN_CASE */
void md_text(int md_type, char *text_src_string, data_t *hash)
{
    unsigned char *src = (unsigned char *) text_src_string;
    size_t src_len = strlen(text_src_string);
    unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
    const mbedtls_md_info_t *md_info = NULL;

    MD_PSA_INIT();

    md_info = mbedtls_md_info_from_type(md_type);
    TEST_ASSERT(md_info != NULL);

    TEST_EQUAL(0, mbedtls_md(md_info, src, src_len, output));

    TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);

exit:
    MD_PSA_DONE();
}
/* END_CASE */

/* BEGIN_CASE */
void md_hex(int md_type, data_t *src_str, data_t *hash)
{
    unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
    const mbedtls_md_info_t *md_info = NULL;

    MD_PSA_INIT();

    md_info = mbedtls_md_info_from_type(md_type);
    TEST_ASSERT(md_info != NULL);

    TEST_EQUAL(0, mbedtls_md(md_info, src_str->x, src_str->len, output));


    TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);

exit:
    MD_PSA_DONE();
}
/* END_CASE */

/* BEGIN_CASE */
void md_text_multi(int md_type, char *text_src_string,
                   data_t *hash)
{
    unsigned char *src = (unsigned char *) text_src_string;
    size_t src_len = strlen(text_src_string);
    unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
    size_t halfway;

    const mbedtls_md_info_t *md_info = NULL;
    mbedtls_md_context_t ctx, ctx_copy;

    MD_PSA_INIT();

    mbedtls_md_init(&ctx);
    mbedtls_md_init(&ctx_copy);

    halfway = src_len / 2;

    md_info = mbedtls_md_info_from_type(md_type);
    TEST_ASSERT(md_info != NULL);
    TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
    TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
#if defined(MBEDTLS_MD_C)
    TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
    TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
#endif /* MBEDTLS_MD_C */

    TEST_EQUAL(0, mbedtls_md_starts(&ctx));
    TEST_ASSERT(ctx.md_ctx != NULL);
    TEST_EQUAL(0, mbedtls_md_update(&ctx, src, halfway));
    TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));

    TEST_EQUAL(0, mbedtls_md_update(&ctx, src + halfway, src_len - halfway));
    TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
    TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);

    /* Test clone */
    memset(output, 0x00, sizeof(output));

    TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src + halfway, src_len - halfway));
    TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
    TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);

exit:
    mbedtls_md_free(&ctx);
    mbedtls_md_free(&ctx_copy);
    MD_PSA_DONE();
}
/* END_CASE */

/* BEGIN_CASE */
void md_hex_multi(int md_type, data_t *src_str, data_t *hash)
{
    unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
    const mbedtls_md_info_t *md_info = NULL;
    mbedtls_md_context_t ctx, ctx_copy;
    int halfway;

    MD_PSA_INIT();

    mbedtls_md_init(&ctx);
    mbedtls_md_init(&ctx_copy);

    md_info = mbedtls_md_info_from_type(md_type);
    TEST_ASSERT(md_info != NULL);
    TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 0));
    TEST_EQUAL(0, mbedtls_md_setup(&ctx_copy, md_info, 0));
#if defined(MBEDTLS_MD_C)
    TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
    TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx_copy) == md_info);
#endif /* MBEDTLS_MD_C */

    halfway = src_str->len / 2;

    TEST_EQUAL(0, mbedtls_md_starts(&ctx));
    TEST_ASSERT(ctx.md_ctx != NULL);
    TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x, halfway));
    TEST_EQUAL(0, mbedtls_md_clone(&ctx_copy, &ctx));

    TEST_EQUAL(0, mbedtls_md_update(&ctx, src_str->x + halfway, src_str->len - halfway));
    TEST_EQUAL(0, mbedtls_md_finish(&ctx, output));
    TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);

    /* Test clone */
    memset(output, 0x00, sizeof(output));

    TEST_EQUAL(0, mbedtls_md_update(&ctx_copy, src_str->x + halfway, src_str->len - halfway));
    TEST_EQUAL(0, mbedtls_md_finish(&ctx_copy, output));
    TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);

exit:
    mbedtls_md_free(&ctx);
    mbedtls_md_free(&ctx_copy);
    MD_PSA_DONE();
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
void mbedtls_md_hmac(int md_type, int trunc_size,
                     data_t *key_str, data_t *src_str,
                     data_t *hash)
{
    unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
    const mbedtls_md_info_t *md_info = NULL;

    MD_PSA_INIT();

    md_info = mbedtls_md_info_from_type(md_type);
    TEST_ASSERT(md_info != NULL);


    TEST_EQUAL(0, mbedtls_md_hmac(md_info, key_str->x, key_str->len,
                                  src_str->x, src_str->len, output));

    TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len);

exit:
    MD_PSA_DONE();
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_MD_C */
void md_hmac_multi(int md_type, int trunc_size, data_t *key_str,
                   data_t *src_str, data_t *hash)
{
    unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
    const mbedtls_md_info_t *md_info = NULL;
    mbedtls_md_context_t ctx;
    int halfway;

    MD_PSA_INIT();

    mbedtls_md_init(&ctx);

    md_info = mbedtls_md_info_from_type(md_type);
    TEST_ASSERT(md_info != NULL);
    TEST_EQUAL(0, mbedtls_md_setup(&ctx, md_info, 1));
#if defined(MBEDTLS_MD_C)
    TEST_ASSERT(mbedtls_md_info_from_ctx(&ctx) == md_info);
#endif

    halfway = src_str->len / 2;

    TEST_EQUAL(0, mbedtls_md_hmac_starts(&ctx, key_str->x, key_str->len));
    TEST_ASSERT(ctx.md_ctx != NULL);
    TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
    TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
    TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));

    TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len);

    /* Test again, for reset() */
    memset(output, 0x00, sizeof(output));

    TEST_EQUAL(0, mbedtls_md_hmac_reset(&ctx));
    TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x, halfway));
    TEST_EQUAL(0, mbedtls_md_hmac_update(&ctx, src_str->x + halfway, src_str->len - halfway));
    TEST_EQUAL(0, mbedtls_md_hmac_finish(&ctx, output));

    TEST_MEMORY_COMPARE(output, trunc_size, hash->x, hash->len);

exit:
    mbedtls_md_free(&ctx);
    MD_PSA_DONE();
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_MD_C */
void mbedtls_md_file(int md_type, char *filename,
                     data_t *hash)
{
    unsigned char output[MBEDTLS_MD_MAX_SIZE] = { 0 };
    const mbedtls_md_info_t *md_info = NULL;

    MD_PSA_INIT();

    md_info = mbedtls_md_info_from_type(md_type);
    TEST_ASSERT(md_info != NULL);

    TEST_EQUAL(0, mbedtls_md_file(md_info, filename, output));

    TEST_MEMORY_COMPARE(output, mbedtls_md_get_size(md_info), hash->x, hash->len);

exit:
    MD_PSA_DONE();
}
/* END_CASE */

/* BEGIN_CASE */
void md_psa_dynamic_dispatch(int md_type, int pre_psa_ret, int post_psa_engine)
{
    const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type);
    mbedtls_md_context_t ctx1, ctx2;

    /* Intentionally no PSA init here! (Will be done later.) */

    mbedtls_md_init(&ctx1);
    mbedtls_md_init(&ctx2);

    TEST_ASSERT(md_info != NULL);

    /* Before PSA crypto init */
    TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx1, md_info, 0));
    TEST_EQUAL(pre_psa_ret, mbedtls_md_setup(&ctx2, md_info, 0));

#if defined(MBEDTLS_MD_SOME_PSA)
    TEST_EQUAL(ctx1.engine, MBEDTLS_MD_ENGINE_LEGACY);
    TEST_EQUAL(ctx2.engine, MBEDTLS_MD_ENGINE_LEGACY);
#endif

    /* Reset ctx1 but keep ctx2 for the cloning test */
    mbedtls_md_free(&ctx1);
    mbedtls_md_init(&ctx1);

    /* Now initilize PSA Crypto */
    MD_PSA_INIT();

    /* After PSA Crypto init */
    TEST_EQUAL(0, mbedtls_md_setup(&ctx1, md_info, 0));
#if defined(MBEDTLS_MD_SOME_PSA)
    TEST_EQUAL(ctx1.engine, post_psa_engine);
#endif

    /* Cloning test */
    if (pre_psa_ret == 0) {
        int exp_clone_ret = post_psa_engine == MBEDTLS_MD_ENGINE_PSA
                          ? MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE
                          : 0;
        TEST_EQUAL(exp_clone_ret, mbedtls_md_clone(&ctx2, &ctx1));
    }

exit:
    mbedtls_md_free(&ctx1);
    mbedtls_md_free(&ctx2);
    MD_PSA_DONE();
}
/* END_CASE */
