/* BEGIN_HEADER */
#include "mbedtls/pkcs5.h"
#include "mbedtls/legacy_or_psa.h"
/* END_HEADER */

/* BEGIN_DEPENDENCIES
 * depends_on:MBEDTLS_PKCS5_C
 * END_DEPENDENCIES
 */

/* BEGIN_CASE */
void pbkdf2_hmac(int hash, data_t *pw_str, data_t *salt_str,
                 int it_cnt, int key_len, data_t *result_key_string)
{
    unsigned char key[100];

    PSA_INIT_IF_NO_MD();
    TEST_ASSERT(mbedtls_pkcs5_pbkdf2_hmac_ext(hash, pw_str->x, pw_str->len,
                                              salt_str->x, salt_str->len,
                                              it_cnt, key_len, key) == 0);

    TEST_ASSERT(mbedtls_test_hexcmp(key, result_key_string->x,
                                    key_len, result_key_string->len) == 0);
    PSA_DONE_IF_NO_MD();
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
void mbedtls_pkcs5_pbes2(int params_tag, data_t *params_hex, data_t *pw,
                         data_t *data, int ref_ret, data_t *ref_out)
{
    int my_ret;
    mbedtls_asn1_buf params;
    unsigned char *my_out = NULL;

    PSA_INIT_IF_NO_MD();

    params.tag = params_tag;
    params.p = params_hex->x;
    params.len = params_hex->len;

    my_out = mbedtls_test_zero_alloc(ref_out->len);

    my_ret = mbedtls_pkcs5_pbes2(&params, MBEDTLS_PKCS5_DECRYPT,
                                 pw->x, pw->len, data->x, data->len, my_out);
    TEST_ASSERT(my_ret == ref_ret);

    if (ref_ret == 0) {
        TEST_ASSERT(memcmp(my_out, ref_out->x, ref_out->len) == 0);
    }

exit:
    mbedtls_free(my_out);
    PSA_DONE_IF_NO_MD();
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
void pkcs5_selftest()
{
    TEST_ASSERT(mbedtls_pkcs5_self_test(1) == 0);
}
/* END_CASE */
