1/* BEGIN_HEADER */ 2#include "mbedtls/pkcs5.h" 3#include "mbedtls/cipher.h" 4/* END_HEADER */ 5 6/* BEGIN_DEPENDENCIES 7 * depends_on:MBEDTLS_PKCS5_C 8 * END_DEPENDENCIES 9 */ 10 11/* BEGIN_CASE */ 12void pbkdf2_hmac(int hash, data_t *pw_str, data_t *salt_str, 13 int it_cnt, int key_len, data_t *result_key_string) 14{ 15 mbedtls_md_context_t ctx; 16 const mbedtls_md_info_t *info; 17 18 unsigned char key[100]; 19 20 mbedtls_md_init(&ctx); 21 22 info = mbedtls_md_info_from_type(hash); 23 TEST_ASSERT(info != NULL); 24 TEST_ASSERT(mbedtls_md_setup(&ctx, info, 1) == 0); 25 TEST_ASSERT(mbedtls_pkcs5_pbkdf2_hmac(&ctx, pw_str->x, pw_str->len, salt_str->x, salt_str->len, 26 it_cnt, key_len, key) == 0); 27 28 TEST_ASSERT(mbedtls_test_hexcmp(key, result_key_string->x, 29 key_len, result_key_string->len) == 0); 30 31exit: 32 mbedtls_md_free(&ctx); 33} 34/* END_CASE */ 35 36/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */ 37void pbes2_encrypt(int params_tag, data_t *params_hex, data_t *pw, 38 data_t *data, int outsize, int ref_ret, 39 data_t *ref_out) 40{ 41 int my_ret; 42 mbedtls_asn1_buf params; 43 unsigned char *my_out = NULL; 44#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) 45 size_t my_out_len = 0; 46#endif 47 48 params.tag = params_tag; 49 params.p = params_hex->x; 50 params.len = params_hex->len; 51 52 ASSERT_ALLOC(my_out, outsize); 53 54 if (ref_ret != MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) { 55 my_ret = mbedtls_pkcs5_pbes2(¶ms, MBEDTLS_PKCS5_ENCRYPT, 56 pw->x, pw->len, data->x, data->len, my_out); 57 TEST_EQUAL(my_ret, ref_ret); 58 } 59 if (ref_ret == 0) { 60 ASSERT_COMPARE(my_out, ref_out->len, 61 ref_out->x, ref_out->len); 62 } 63 64#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) 65 my_ret = mbedtls_pkcs5_pbes2_ext(¶ms, MBEDTLS_PKCS5_ENCRYPT, 66 pw->x, pw->len, data->x, data->len, my_out, 67 outsize, &my_out_len); 68 TEST_EQUAL(my_ret, ref_ret); 69 if (ref_ret == 0) { 70 ASSERT_COMPARE(my_out, my_out_len, 71 ref_out->x, ref_out->len); 72 } 73#endif 74 75exit: 76 mbedtls_free(my_out); 77} 78/* END_CASE */ 79 80/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */ 81void pbes2_decrypt(int params_tag, data_t *params_hex, data_t *pw, 82 data_t *data, int outsize, int ref_ret, 83 data_t *ref_out) 84{ 85 int my_ret; 86 mbedtls_asn1_buf params; 87 unsigned char *my_out = NULL; 88#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) 89 size_t my_out_len = 0; 90#endif 91 92 params.tag = params_tag; 93 params.p = params_hex->x; 94 params.len = params_hex->len; 95 96 ASSERT_ALLOC(my_out, outsize); 97 98 if (ref_ret != MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) { 99 my_ret = mbedtls_pkcs5_pbes2(¶ms, MBEDTLS_PKCS5_DECRYPT, 100 pw->x, pw->len, data->x, data->len, my_out); 101 TEST_EQUAL(my_ret, ref_ret); 102 } 103 if (ref_ret == 0) { 104 ASSERT_COMPARE(my_out, ref_out->len, 105 ref_out->x, ref_out->len); 106 } 107#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) 108 my_ret = mbedtls_pkcs5_pbes2_ext(¶ms, MBEDTLS_PKCS5_DECRYPT, 109 pw->x, pw->len, data->x, data->len, my_out, 110 outsize, &my_out_len); 111 TEST_EQUAL(my_ret, ref_ret); 112 if (ref_ret == 0) { 113 ASSERT_COMPARE(my_out, my_out_len, 114 ref_out->x, ref_out->len); 115 } 116#endif 117 118exit: 119 mbedtls_free(my_out); 120} 121/* END_CASE */ 122 123/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */ 124void pkcs5_selftest() 125{ 126 TEST_ASSERT(mbedtls_pkcs5_self_test(1) == 0); 127} 128/* END_CASE */ 129