blob: 288188e526953f6f89ba8bf9bf7f7444a6e7e6a0 [file] [log] [blame]
Paul Elliott13d5a342021-11-18 22:35:48 +00001/* BEGIN_HEADER */
2#include "mbedtls/pkcs12.h"
3#include "mbedtls/error.h"
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +01004#include "common.h"
Paul Elliott13d5a342021-11-18 22:35:48 +00005
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01006typedef enum {
7 USE_NULL_INPUT = 0,
8 USE_GIVEN_INPUT = 1,
Paul Elliott13d5a342021-11-18 22:35:48 +00009} input_usage_method_t;
10
11/* END_HEADER */
12
13/* BEGIN_DEPENDENCIES
Paul Elliott8ca8f2d2021-11-30 16:21:27 +000014 * depends_on:MBEDTLS_PKCS12_C
Paul Elliott13d5a342021-11-18 22:35:48 +000015 * END_DEPENDENCIES
16 */
17
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +010018/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010019void pkcs12_derive_key(int md_type, int key_size_arg,
20 data_t *password_arg, int password_usage,
21 data_t *salt_arg, int salt_usage,
22 int iterations,
23 data_t *expected_output, int expected_status)
Paul Elliott13d5a342021-11-18 22:35:48 +000024
25{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010026 unsigned char *output_data = NULL;
Paul Elliott13d5a342021-11-18 22:35:48 +000027
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010028 unsigned char *password = NULL;
29 size_t password_len = 0;
30 unsigned char *salt = NULL;
31 size_t salt_len = 0;
32 size_t key_size = key_size_arg;
Paul Elliott13d5a342021-11-18 22:35:48 +000033
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010034 if (password_usage == USE_GIVEN_INPUT) {
35 password = password_arg->x;
36 }
Paul Elliott270a2642021-11-30 16:39:51 +000037
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010038 password_len = password_arg->len;
Paul Elliott13d5a342021-11-18 22:35:48 +000039
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010040 if (salt_usage == USE_GIVEN_INPUT) {
41 salt = salt_arg->x;
42 }
Paul Elliott270a2642021-11-30 16:39:51 +000043
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010044 salt_len = salt_arg->len;
Paul Elliott13d5a342021-11-18 22:35:48 +000045
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010046 ASSERT_ALLOC(output_data, key_size);
Paul Elliott13d5a342021-11-18 22:35:48 +000047
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010048 int ret = mbedtls_pkcs12_derivation(output_data,
Gilles Peskined84ed272022-09-15 21:05:04 +020049 key_size,
50 password,
51 password_len,
52 salt,
53 salt_len,
54 md_type,
55 MBEDTLS_PKCS12_DERIVE_KEY,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010056 iterations);
Paul Elliott13d5a342021-11-18 22:35:48 +000057
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010058 TEST_EQUAL(ret, expected_status);
Paul Elliott13d5a342021-11-18 22:35:48 +000059
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010060 if (expected_status == 0) {
61 ASSERT_COMPARE(expected_output->x, expected_output->len,
62 output_data, key_size);
63 }
Paul Elliott5752b4b2021-12-03 18:55:31 +000064
Paul Elliott13d5a342021-11-18 22:35:48 +000065exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010066 mbedtls_free(output_data);
Paul Elliott13d5a342021-11-18 22:35:48 +000067
68}
69/* END_CASE */
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010070
71/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +010072void pkcs12_pbe_encrypt(int cipher, int md, data_t *params_hex, data_t *pw,
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010073 data_t *data, int ref_ret, data_t *ref_out)
74{
75 int my_ret;
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +010076 mbedtls_asn1_buf pbe_params;
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010077 unsigned char *my_out = NULL;
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +010078 mbedtls_cipher_type_t cipher_alg = (mbedtls_cipher_type_t) cipher;
79 mbedtls_md_type_t md_alg = (mbedtls_md_type_t) md;
80 unsigned int block_size;
81 const mbedtls_cipher_info_t *cipher_info;
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010082
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +010083 cipher_info = mbedtls_cipher_info_from_type(cipher_alg);
84 block_size = cipher_info->block_size;
85 ASSERT_ALLOC(my_out, ((data->len/block_size) + 1) * block_size);
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010086
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +010087 pbe_params.tag = params_hex->x[0];
88 pbe_params.len = params_hex->x[1];
89 pbe_params.p = params_hex->x + 2;
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010090
91 my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_ENCRYPT, cipher_alg,
92 md_alg, pw->x, pw->len, data->x, data->len, my_out);
93 TEST_EQUAL(my_ret, ref_ret);
94 if (ref_ret == 0) {
95 ASSERT_COMPARE(my_out, ref_out->len,
96 ref_out->x, ref_out->len);
97 }
98
99exit:
100 mbedtls_free(my_out);
101}
102/* END_CASE */
103
104/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +0100105void pkcs12_pbe_decrypt(int cipher, int md, data_t *params_hex, data_t *pw,
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100106 data_t *data, int ref_ret, data_t *ref_out)
107{
108 int my_ret;
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +0100109 mbedtls_asn1_buf pbe_params;
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100110 unsigned char *my_out = NULL;
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +0100111 mbedtls_cipher_type_t cipher_alg = (mbedtls_cipher_type_t) cipher;
112 mbedtls_md_type_t md_alg = (mbedtls_md_type_t) md;
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100113
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +0100114 ASSERT_ALLOC(my_out, data->len);
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100115
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +0100116 pbe_params.tag = params_hex->x[0];
117 pbe_params.len = params_hex->x[1];
118 pbe_params.p = params_hex->x + 2;
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100119
120 my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg,
121 md_alg, pw->x, pw->len, data->x, data->len, my_out);
122 TEST_EQUAL(my_ret, ref_ret);
123 if (ref_ret == 0) {
124 ASSERT_COMPARE(my_out, ref_out->len,
125 ref_out->x, ref_out->len);
126 }
127
128exit:
129 mbedtls_free(my_out);
130}
131/* END_CASE */