blob: 5f758df968e038de39a2044f8cee4893dc566640 [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 "mbedtls/oid.h"
5#include "common.h"
Paul Elliott13d5a342021-11-18 22:35:48 +00006
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01007typedef enum {
8 USE_NULL_INPUT = 0,
9 USE_GIVEN_INPUT = 1,
Paul Elliott13d5a342021-11-18 22:35:48 +000010} input_usage_method_t;
11
12/* END_HEADER */
13
14/* BEGIN_DEPENDENCIES
Paul Elliott8ca8f2d2021-11-30 16:21:27 +000015 * depends_on:MBEDTLS_PKCS12_C
Paul Elliott13d5a342021-11-18 22:35:48 +000016 * END_DEPENDENCIES
17 */
18
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010019/* BEGIN_CASE MBEDTLS_ASN1_PARSE_C*/
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010020void pkcs12_derive_key(int md_type, int key_size_arg,
21 data_t *password_arg, int password_usage,
22 data_t *salt_arg, int salt_usage,
23 int iterations,
24 data_t *expected_output, int expected_status)
Paul Elliott13d5a342021-11-18 22:35:48 +000025
26{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010027 unsigned char *output_data = NULL;
Paul Elliott13d5a342021-11-18 22:35:48 +000028
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010029 unsigned char *password = NULL;
30 size_t password_len = 0;
31 unsigned char *salt = NULL;
32 size_t salt_len = 0;
33 size_t key_size = key_size_arg;
Paul Elliott13d5a342021-11-18 22:35:48 +000034
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010035 if (password_usage == USE_GIVEN_INPUT) {
36 password = password_arg->x;
37 }
Paul Elliott270a2642021-11-30 16:39:51 +000038
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010039 password_len = password_arg->len;
Paul Elliott13d5a342021-11-18 22:35:48 +000040
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010041 if (salt_usage == USE_GIVEN_INPUT) {
42 salt = salt_arg->x;
43 }
Paul Elliott270a2642021-11-30 16:39:51 +000044
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010045 salt_len = salt_arg->len;
Paul Elliott13d5a342021-11-18 22:35:48 +000046
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010047 ASSERT_ALLOC(output_data, key_size);
Paul Elliott13d5a342021-11-18 22:35:48 +000048
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010049 int ret = mbedtls_pkcs12_derivation(output_data,
Gilles Peskined84ed272022-09-15 21:05:04 +020050 key_size,
51 password,
52 password_len,
53 salt,
54 salt_len,
55 md_type,
56 MBEDTLS_PKCS12_DERIVE_KEY,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010057 iterations);
Paul Elliott13d5a342021-11-18 22:35:48 +000058
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010059 TEST_EQUAL(ret, expected_status);
Paul Elliott13d5a342021-11-18 22:35:48 +000060
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010061 if (expected_status == 0) {
62 ASSERT_COMPARE(expected_output->x, expected_output->len,
63 output_data, key_size);
64 }
Paul Elliott5752b4b2021-12-03 18:55:31 +000065
Paul Elliott13d5a342021-11-18 22:35:48 +000066exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010067 mbedtls_free(output_data);
Paul Elliott13d5a342021-11-18 22:35:48 +000068
69}
70/* END_CASE */
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010071
72/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
73void pkcs12_pbe_encrypt(data_t *params_hex, data_t *pw,
74 data_t *data, int ref_ret, data_t *ref_out)
75{
76 int my_ret;
77 mbedtls_asn1_buf pbe_alg_oid, pbe_params;
78 unsigned char *my_out = NULL;
79 unsigned char *p, *end;
80 mbedtls_cipher_type_t cipher_alg;
81 mbedtls_md_type_t md_alg;
82
83 p = params_hex->x;
84 end = p + params_hex->len;
85
86 my_ret = mbedtls_asn1_get_alg(&p, end, &pbe_alg_oid, &pbe_params);
87 if (my_ret) {
88 TEST_HELPER_ASSERT(0);
89 }
90 my_ret = mbedtls_oid_get_pkcs12_pbe_alg(&pbe_alg_oid, &md_alg, &cipher_alg);
91 if (my_ret) {
92 TEST_HELPER_ASSERT(0);
93 }
94
95 ASSERT_ALLOC(my_out, ref_out->len);
96
97 my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_ENCRYPT, cipher_alg,
98 md_alg, pw->x, pw->len, data->x, data->len, my_out);
99 TEST_EQUAL(my_ret, ref_ret);
100 if (ref_ret == 0) {
101 ASSERT_COMPARE(my_out, ref_out->len,
102 ref_out->x, ref_out->len);
103 }
104
105exit:
106 mbedtls_free(my_out);
107}
108/* END_CASE */
109
110/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
111void pkcs12_pbe_decrypt(data_t *params_hex, data_t *pw,
112 data_t *data, int ref_ret, data_t *ref_out)
113{
114 int my_ret;
115 mbedtls_asn1_buf pbe_alg_oid, pbe_params;
116 unsigned char *my_out = NULL;
117 unsigned char *p, *end;
118 mbedtls_cipher_type_t cipher_alg;
119 mbedtls_md_type_t md_alg;
120
121 p = params_hex->x;
122 end = p + params_hex->len;
123
124 my_ret = mbedtls_asn1_get_alg(&p, end, &pbe_alg_oid, &pbe_params);
125 if (my_ret) {
126 TEST_HELPER_ASSERT(0);
127 }
128 my_ret = mbedtls_oid_get_pkcs12_pbe_alg(&pbe_alg_oid, &md_alg, &cipher_alg);
129 if (my_ret) {
130 TEST_HELPER_ASSERT(0);
131 }
132
133 ASSERT_ALLOC(my_out, ref_out->len);
134
135 my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg,
136 md_alg, pw->x, pw->len, data->x, data->len, my_out);
137 TEST_EQUAL(my_ret, ref_ret);
138 if (ref_ret == 0) {
139 ASSERT_COMPARE(my_out, ref_out->len,
140 ref_out->x, ref_out->len);
141 }
142
143exit:
144 mbedtls_free(my_out);
145}
146/* END_CASE */