/* BEGIN_HEADER */
#include "mbedtls/pkcs12.h"
#include "common.h"

#include "mbedtls/legacy_or_psa.h"

typedef enum
{
   USE_NULL_INPUT = 0,
   USE_GIVEN_INPUT = 1,
} input_usage_method_t;

/* END_HEADER */

/* BEGIN_DEPENDENCIES
 * depends_on:MBEDTLS_PKCS12_C
 * END_DEPENDENCIES
 */

/* BEGIN_CASE */
void pkcs12_derive_key( int md_type, int key_size_arg,
                        data_t *password_arg, int password_usage,
                        data_t *salt_arg, int salt_usage,
                        int iterations,
                        data_t* expected_output, int expected_status )

{
   unsigned char *output_data = NULL;

   unsigned char *password = NULL;
   size_t password_len = 0;
   unsigned char *salt = NULL;
   size_t salt_len = 0;
   size_t key_size = key_size_arg;

   if( password_usage == USE_GIVEN_INPUT )
      password = password_arg->x;

   password_len = password_arg->len;

   if( salt_usage == USE_GIVEN_INPUT )
      salt = salt_arg->x;

   salt_len = salt_arg->len;

   ASSERT_ALLOC( output_data, key_size );

   int ret = mbedtls_pkcs12_derivation( output_data,
                                        key_size,
                                        password,
                                        password_len,
                                        salt,
                                        salt_len,
                                        md_type,
                                        MBEDTLS_PKCS12_DERIVE_KEY,
                                        iterations );

   TEST_EQUAL( ret, expected_status );

   if( expected_status == 0 )
   {
      ASSERT_COMPARE( expected_output->x, expected_output->len,
                      output_data, key_size );
   }

exit:
   mbedtls_free( output_data );

}
/* END_CASE */
