blob: 8e5ab30323ba6a342d4b1ed112ca993fd4c1e306 [file] [log] [blame]
Paul Elliottd6635432021-11-18 22:35:48 +00001/* BEGIN_HEADER */
2#include "mbedtls/pkcs12.h"
Waleed Elmelegy255db802023-09-04 15:11:22 +01003#include "mbedtls/oid.h"
Paul Elliott6e7deb12021-12-03 18:55:31 +00004#include "common.h"
Paul Elliottd6635432021-11-18 22:35:48 +00005
Gilles Peskine449bd832023-01-11 14:50:10 +01006typedef enum {
7 USE_NULL_INPUT = 0,
8 USE_GIVEN_INPUT = 1,
Paul Elliottd6635432021-11-18 22:35:48 +00009} input_usage_method_t;
10
11/* END_HEADER */
12
13/* BEGIN_DEPENDENCIES
Paul Elliott3584ae42021-11-30 16:21:27 +000014 * depends_on:MBEDTLS_PKCS12_C
Paul Elliottd6635432021-11-18 22:35:48 +000015 * END_DEPENDENCIES
16 */
17
Waleed Elmelegy255db802023-09-04 15:11:22 +010018/* BEGIN_CASE MBEDTLS_ASN1_PARSE_C*/
Gilles Peskine449bd832023-01-11 14:50:10 +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 Elliottd6635432021-11-18 22:35:48 +000024
25{
Gilles Peskine449bd832023-01-11 14:50:10 +010026 unsigned char *output_data = NULL;
Paul Elliottd6635432021-11-18 22:35:48 +000027
Gilles Peskine449bd832023-01-11 14:50:10 +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 Elliottd6635432021-11-18 22:35:48 +000033
Manuel Pégourié-Gonnardbe97afe2023-03-16 10:00:54 +010034 MD_PSA_INIT();
35
Gilles Peskine449bd832023-01-11 14:50:10 +010036 if (password_usage == USE_GIVEN_INPUT) {
37 password = password_arg->x;
38 }
Paul Elliott4768a302021-11-30 16:39:51 +000039
Gilles Peskine449bd832023-01-11 14:50:10 +010040 password_len = password_arg->len;
Paul Elliottd6635432021-11-18 22:35:48 +000041
Gilles Peskine449bd832023-01-11 14:50:10 +010042 if (salt_usage == USE_GIVEN_INPUT) {
43 salt = salt_arg->x;
44 }
Paul Elliott4768a302021-11-30 16:39:51 +000045
Gilles Peskine449bd832023-01-11 14:50:10 +010046 salt_len = salt_arg->len;
Paul Elliottd6635432021-11-18 22:35:48 +000047
Waleed Elmelegy255db802023-09-04 15:11:22 +010048 ASSERT_ALLOC(output_data, key_size);
Paul Elliottd6635432021-11-18 22:35:48 +000049
Gilles Peskine449bd832023-01-11 14:50:10 +010050 int ret = mbedtls_pkcs12_derivation(output_data,
Gilles Peskinea844b4b2022-09-15 21:05:04 +020051 key_size,
52 password,
53 password_len,
54 salt,
55 salt_len,
56 md_type,
57 MBEDTLS_PKCS12_DERIVE_KEY,
Gilles Peskine449bd832023-01-11 14:50:10 +010058 iterations);
Paul Elliottd6635432021-11-18 22:35:48 +000059
Gilles Peskine449bd832023-01-11 14:50:10 +010060 TEST_EQUAL(ret, expected_status);
Paul Elliottd6635432021-11-18 22:35:48 +000061
Gilles Peskine449bd832023-01-11 14:50:10 +010062 if (expected_status == 0) {
Waleed Elmelegy255db802023-09-04 15:11:22 +010063 ASSERT_COMPARE(expected_output->x, expected_output->len,
64 output_data, key_size);
Gilles Peskine449bd832023-01-11 14:50:10 +010065 }
Paul Elliott6e7deb12021-12-03 18:55:31 +000066
Paul Elliottd6635432021-11-18 22:35:48 +000067exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010068 mbedtls_free(output_data);
Manuel Pégourié-Gonnardbe97afe2023-03-16 10:00:54 +010069 MD_PSA_DONE();
Paul Elliottd6635432021-11-18 22:35:48 +000070}
71/* END_CASE */
Waleed Elmelegy255db802023-09-04 15:11:22 +010072
73/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
74void pkcs12_pbe_encrypt(data_t *params_hex, data_t *pw,
75 data_t *data, int ref_ret, data_t *ref_out)
76{
77 int my_ret;
78 mbedtls_asn1_buf pbe_alg_oid, pbe_params;
79 unsigned char *my_out = NULL;
80 unsigned char *p, *end;
81 mbedtls_cipher_type_t cipher_alg;
82 mbedtls_md_type_t md_alg;
83
84 MD_PSA_INIT();
85
86 p = params_hex->x;
87 end = p + params_hex->len;
88
89 my_ret = mbedtls_asn1_get_alg(&p, end, &pbe_alg_oid, &pbe_params);
90 if (my_ret) {
91 TEST_FAIL("Invalid test paramaters");
92 }
93 my_ret = mbedtls_oid_get_pkcs12_pbe_alg(&pbe_alg_oid, &md_alg, &cipher_alg);
94 if (my_ret) {
95 TEST_FAIL("Invalid test paramaters");
96 }
97
98 ASSERT_ALLOC(my_out, ref_out->len);
99
100 my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_ENCRYPT, cipher_alg,
101 md_alg, pw->x, pw->len, data->x, data->len, my_out);
102 TEST_EQUAL(my_ret, ref_ret);
103 if (ref_ret == 0) {
104 ASSERT_COMPARE(my_out, ref_out->len,
105 ref_out->x, ref_out->len);
106 }
107
108exit:
109 mbedtls_free(my_out);
110 MD_PSA_DONE();
111}
112/* END_CASE */
113
114/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
115void pkcs12_pbe_decrypt(data_t *params_hex, data_t *pw,
116 data_t *data, int ref_ret, data_t *ref_out)
117{
118 int my_ret;
119 mbedtls_asn1_buf pbe_alg_oid, pbe_params;
120 unsigned char *my_out = NULL;
121 unsigned char *p, *end;
122 mbedtls_cipher_type_t cipher_alg;
123 mbedtls_md_type_t md_alg;
124
125 MD_PSA_INIT();
126
127 p = params_hex->x;
128 end = p + params_hex->len;
129
130 my_ret = mbedtls_asn1_get_alg(&p, end, &pbe_alg_oid, &pbe_params);
131 if (my_ret) {
132 TEST_FAIL("Invalid test paramaters");
133 }
134 my_ret = mbedtls_oid_get_pkcs12_pbe_alg(&pbe_alg_oid, &md_alg, &cipher_alg);
135 if (my_ret) {
136 TEST_FAIL("Invalid test paramaters");
137 }
138
139 ASSERT_ALLOC(my_out, ref_out->len);
140
141 my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg,
142 md_alg, pw->x, pw->len, data->x, data->len, my_out);
143 TEST_EQUAL(my_ret, ref_ret);
144 if (ref_ret == 0) {
145 ASSERT_COMPARE(my_out, ref_out->len,
146 ref_out->x, ref_out->len);
147 }
148
149exit:
150 mbedtls_free(my_out);
151 MD_PSA_DONE();
152}
153/* END_CASE */