blob: 3e8ff5b319b37728e07ac1b197b7e3690b6469bb [file] [log] [blame]
Paul Elliottd6635432021-11-18 22:35:48 +00001/* BEGIN_HEADER */
2#include "mbedtls/pkcs12.h"
Paul Elliott6e7deb12021-12-03 18:55:31 +00003#include "common.h"
Paul Elliottd6635432021-11-18 22:35:48 +00004
Gilles Peskine449bd832023-01-11 14:50:10 +01005typedef enum {
6 USE_NULL_INPUT = 0,
7 USE_GIVEN_INPUT = 1,
Paul Elliottd6635432021-11-18 22:35:48 +00008} input_usage_method_t;
9
10/* END_HEADER */
11
12/* BEGIN_DEPENDENCIES
Paul Elliott3584ae42021-11-30 16:21:27 +000013 * depends_on:MBEDTLS_PKCS12_C
Paul Elliottd6635432021-11-18 22:35:48 +000014 * END_DEPENDENCIES
15 */
16
Waleed Elmelegy8317e912023-09-07 15:46:58 +010017/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010018void pkcs12_derive_key(int md_type, int key_size_arg,
19 data_t *password_arg, int password_usage,
20 data_t *salt_arg, int salt_usage,
21 int iterations,
22 data_t *expected_output, int expected_status)
Paul Elliottd6635432021-11-18 22:35:48 +000023
24{
Gilles Peskine449bd832023-01-11 14:50:10 +010025 unsigned char *output_data = NULL;
Paul Elliottd6635432021-11-18 22:35:48 +000026
Gilles Peskine449bd832023-01-11 14:50:10 +010027 unsigned char *password = NULL;
28 size_t password_len = 0;
29 unsigned char *salt = NULL;
30 size_t salt_len = 0;
31 size_t key_size = key_size_arg;
Paul Elliottd6635432021-11-18 22:35:48 +000032
Manuel Pégourié-Gonnardbe97afe2023-03-16 10:00:54 +010033 MD_PSA_INIT();
34
Gilles Peskine449bd832023-01-11 14:50:10 +010035 if (password_usage == USE_GIVEN_INPUT) {
36 password = password_arg->x;
37 }
Paul Elliott4768a302021-11-30 16:39:51 +000038
Gilles Peskine449bd832023-01-11 14:50:10 +010039 password_len = password_arg->len;
Paul Elliottd6635432021-11-18 22:35:48 +000040
Gilles Peskine449bd832023-01-11 14:50:10 +010041 if (salt_usage == USE_GIVEN_INPUT) {
42 salt = salt_arg->x;
43 }
Paul Elliott4768a302021-11-30 16:39:51 +000044
Gilles Peskine449bd832023-01-11 14:50:10 +010045 salt_len = salt_arg->len;
Paul Elliottd6635432021-11-18 22:35:48 +000046
Waleed Elmelegy8317e912023-09-07 15:46:58 +010047 TEST_CALLOC(output_data, key_size);
Paul Elliottd6635432021-11-18 22:35:48 +000048
Gilles Peskine449bd832023-01-11 14:50:10 +010049 int ret = mbedtls_pkcs12_derivation(output_data,
Gilles Peskinea844b4b2022-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 Peskine449bd832023-01-11 14:50:10 +010057 iterations);
Paul Elliottd6635432021-11-18 22:35:48 +000058
Gilles Peskine449bd832023-01-11 14:50:10 +010059 TEST_EQUAL(ret, expected_status);
Paul Elliottd6635432021-11-18 22:35:48 +000060
Gilles Peskine449bd832023-01-11 14:50:10 +010061 if (expected_status == 0) {
Waleed Elmelegy75b9eb32023-09-07 17:02:37 +010062 TEST_MEMORY_COMPARE(expected_output->x, expected_output->len,
Waleed Elmelegy09601702023-09-07 17:48:40 +010063 output_data, key_size);
Gilles Peskine449bd832023-01-11 14:50:10 +010064 }
Paul Elliott6e7deb12021-12-03 18:55:31 +000065
Paul Elliottd6635432021-11-18 22:35:48 +000066exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010067 mbedtls_free(output_data);
Manuel Pégourié-Gonnardbe97afe2023-03-16 10:00:54 +010068 MD_PSA_DONE();
Paul Elliottd6635432021-11-18 22:35:48 +000069}
70/* END_CASE */
Waleed Elmelegy255db802023-09-04 15:11:22 +010071
Waleed Elmelegy1f59ee02023-09-07 17:59:35 +010072/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +010073void pkcs12_pbe_encrypt(int params_tag, int cipher, int md, data_t *params_hex, data_t *pw,
74 data_t *data, int outsize, int ref_ret, data_t *ref_out)
Waleed Elmelegy255db802023-09-04 15:11:22 +010075{
76 int my_ret;
Waleed Elmelegy15de8092023-09-05 15:51:48 +010077 mbedtls_asn1_buf pbe_params;
Waleed Elmelegy255db802023-09-04 15:11:22 +010078 unsigned char *my_out = NULL;
Waleed Elmelegy15de8092023-09-05 15:51:48 +010079 mbedtls_cipher_type_t cipher_alg = (mbedtls_cipher_type_t) cipher;
80 mbedtls_md_type_t md_alg = (mbedtls_md_type_t) md;
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +010081#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
82 size_t my_out_len = 0;
83#endif
Waleed Elmelegy255db802023-09-04 15:11:22 +010084
85 MD_PSA_INIT();
86
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +010087 TEST_CALLOC(my_out, outsize);
Waleed Elmelegy255db802023-09-04 15:11:22 +010088
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +010089 pbe_params.tag = params_tag;
90 pbe_params.len = params_hex->len;
91 pbe_params.p = params_hex->x;
Waleed Elmelegy255db802023-09-04 15:11:22 +010092
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +010093 if (ref_ret != MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) {
94 my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_ENCRYPT, cipher_alg,
95 md_alg, pw->x, pw->len, data->x, data->len, my_out);
96 TEST_EQUAL(my_ret, ref_ret);
97 }
Waleed Elmelegy255db802023-09-04 15:11:22 +010098 if (ref_ret == 0) {
99 ASSERT_COMPARE(my_out, ref_out->len,
100 ref_out->x, ref_out->len);
101 }
102
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +0100103#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
Waleed Elmelegy57d09b72023-09-12 14:05:10 +0100104
105 pbe_params.tag = params_tag;
106 pbe_params.len = params_hex->len;
107 pbe_params.p = params_hex->x;
108
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +0100109 my_ret = mbedtls_pkcs12_pbe_ext(&pbe_params, MBEDTLS_PKCS12_PBE_ENCRYPT, cipher_alg,
110 md_alg, pw->x, pw->len, data->x, data->len, my_out,
111 outsize, &my_out_len);
112 TEST_EQUAL(my_ret, ref_ret);
113 if (ref_ret == 0) {
114 ASSERT_COMPARE(my_out, my_out_len,
115 ref_out->x, ref_out->len);
116 }
117#endif
118
Waleed Elmelegy255db802023-09-04 15:11:22 +0100119exit:
120 mbedtls_free(my_out);
121 MD_PSA_DONE();
122}
123/* END_CASE */
124
Waleed Elmelegy1f59ee02023-09-07 17:59:35 +0100125/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +0100126void pkcs12_pbe_decrypt(int params_tag, int cipher, int md, data_t *params_hex, data_t *pw,
127 data_t *data, int outsize, int ref_ret, data_t *ref_out)
Waleed Elmelegy255db802023-09-04 15:11:22 +0100128{
129 int my_ret;
Waleed Elmelegy15de8092023-09-05 15:51:48 +0100130 mbedtls_asn1_buf pbe_params;
Waleed Elmelegy255db802023-09-04 15:11:22 +0100131 unsigned char *my_out = NULL;
Waleed Elmelegy15de8092023-09-05 15:51:48 +0100132 mbedtls_cipher_type_t cipher_alg = (mbedtls_cipher_type_t) cipher;
133 mbedtls_md_type_t md_alg = (mbedtls_md_type_t) md;
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +0100134#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
135 size_t my_out_len = 0;
136#endif
Waleed Elmelegy255db802023-09-04 15:11:22 +0100137
138 MD_PSA_INIT();
139
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +0100140 TEST_CALLOC(my_out, outsize);
Waleed Elmelegy255db802023-09-04 15:11:22 +0100141
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +0100142 pbe_params.tag = params_tag;
143 pbe_params.len = params_hex->len;
144 pbe_params.p = params_hex->x;
Waleed Elmelegy255db802023-09-04 15:11:22 +0100145
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +0100146 if (ref_ret != MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) {
147 my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg,
148 md_alg, pw->x, pw->len, data->x, data->len, my_out);
149 TEST_EQUAL(my_ret, ref_ret);
150 }
151
Waleed Elmelegy255db802023-09-04 15:11:22 +0100152 if (ref_ret == 0) {
153 ASSERT_COMPARE(my_out, ref_out->len,
154 ref_out->x, ref_out->len);
155 }
156
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +0100157#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
Waleed Elmelegy57d09b72023-09-12 14:05:10 +0100158
159 pbe_params.tag = params_tag;
160 pbe_params.len = params_hex->len;
161 pbe_params.p = params_hex->x;
162
Waleed Elmelegye1cb35b2023-09-06 15:48:08 +0100163 my_ret = mbedtls_pkcs12_pbe_ext(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg,
164 md_alg, pw->x, pw->len, data->x, data->len, my_out,
165 outsize, &my_out_len);
166 TEST_EQUAL(my_ret, ref_ret);
167 if (ref_ret == 0) {
168 ASSERT_COMPARE(my_out, my_out_len,
169 ref_out->x, ref_out->len);
170 }
171#endif
172
Waleed Elmelegy255db802023-09-04 15:11:22 +0100173exit:
174 mbedtls_free(my_out);
175 MD_PSA_DONE();
176}
177/* END_CASE */