/* BEGIN_HEADER */
#include "mbedtls/hkdf.h"
#include "md_wrap.h"
/* END_HEADER */

/* BEGIN_DEPENDENCIES
 * depends_on:MBEDTLS_HKDF_C
 * END_DEPENDENCIES
 */

/* BEGIN_CASE */
void test_hkdf(int md_alg, data_t *ikm, data_t *salt, data_t *info,
               data_t *expected_okm)
{
    int ret;
    unsigned char okm[128] = { '\0' };

    const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
    TEST_ASSERT(md != NULL);

    TEST_ASSERT(expected_okm->len <= sizeof(okm));

    ret = mbedtls_hkdf(md, salt->x, salt->len, ikm->x, ikm->len,
                       info->x, info->len, okm, expected_okm->len);
    TEST_ASSERT(ret == 0);

    ASSERT_COMPARE(okm, expected_okm->len,
                   expected_okm->x, expected_okm->len);
}
/* END_CASE */

/* BEGIN_CASE */
void test_hkdf_extract(int md_alg,
                       data_t *ikm,
                       data_t *salt,
                       data_t *prk)
{
    int ret;
    unsigned char *output_prk = NULL;
    size_t output_prk_len;

    const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
    TEST_ASSERT(md != NULL);

    output_prk_len = mbedtls_md_get_size(md);
    ASSERT_ALLOC(output_prk, output_prk_len);

    ret = mbedtls_hkdf_extract(md, salt->x, salt->len,
                               ikm->x, ikm->len, output_prk);
    TEST_ASSERT(ret == 0);

    ASSERT_COMPARE(output_prk, output_prk_len, prk->x, prk->len);

exit:
    mbedtls_free(output_prk);
}
/* END_CASE */

/* BEGIN_CASE */
void test_hkdf_expand(int md_alg,
                      data_t *info,
                      data_t *prk,
                      data_t *okm)
{
    enum { OKM_LEN  = 1024 };
    int ret;
    unsigned char *output_okm = NULL;

    const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
    TEST_ASSERT(md != NULL);

    ASSERT_ALLOC(output_okm, OKM_LEN);

    TEST_ASSERT(prk->len == mbedtls_md_get_size(md));
    TEST_ASSERT(okm->len < OKM_LEN);

    ret = mbedtls_hkdf_expand(md, prk->x, prk->len,
                              info->x, info->len,
                              output_okm, OKM_LEN);
    TEST_ASSERT(ret == 0);
    ASSERT_COMPARE(output_okm, okm->len, okm->x, okm->len);

exit:
    mbedtls_free(output_okm);
}
/* END_CASE */

/* BEGIN_CASE */
void test_hkdf_extract_ret(int hash_len, int ret)
{
    int output_ret;
    unsigned char *salt = NULL;
    unsigned char *ikm = NULL;
    unsigned char *prk = NULL;
    size_t salt_len, ikm_len;
    struct mbedtls_md_info_t fake_md_info;

    memset(&fake_md_info, 0, sizeof(fake_md_info));
    fake_md_info.type = MBEDTLS_MD_NONE;
    fake_md_info.size = hash_len;

    ASSERT_ALLOC(prk, MBEDTLS_MD_MAX_SIZE);
    salt_len = 0;
    ikm_len = 0;

    output_ret = mbedtls_hkdf_extract(&fake_md_info, salt, salt_len,
                                      ikm, ikm_len, prk);
    TEST_ASSERT(output_ret == ret);

exit:
    mbedtls_free(prk);
}
/* END_CASE */

/* BEGIN_CASE */
void test_hkdf_expand_ret(int hash_len, int prk_len, int okm_len, int ret)
{
    int output_ret;
    unsigned char *info = NULL;
    unsigned char *prk = NULL;
    unsigned char *okm = NULL;
    size_t info_len;
    struct mbedtls_md_info_t fake_md_info;

    memset(&fake_md_info, 0, sizeof(fake_md_info));
    fake_md_info.type = MBEDTLS_MD_NONE;
    fake_md_info.size = hash_len;

    info_len = 0;

    if (prk_len > 0) {
        ASSERT_ALLOC(prk, prk_len);
    }

    if (okm_len > 0) {
        ASSERT_ALLOC(okm, okm_len);
    }

    output_ret = mbedtls_hkdf_expand(&fake_md_info, prk, prk_len,
                                     info, info_len, okm, okm_len);
    TEST_ASSERT(output_ret == ret);

exit:
    mbedtls_free(prk);
    mbedtls_free(okm);
}
/* END_CASE */
