blob: a5a9019ac97a54321ff0f0d2c8b8ccd8542dad59 [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
Tom Cosgrove30ceb232023-09-04 11:20:19 +010046 TEST_CALLOC(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) {
Tom Cosgroveba3b14d2023-09-04 11:23:02 +010061 TEST_MEMORY_COMPARE(expected_output->x, expected_output->len,
Tom Cosgrovea240fe32023-09-04 11:29:39 +010062 output_data, key_size);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010063 }
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 Elmelegy6060cf12023-09-06 15:48:08 +010072void pkcs12_pbe_encrypt(int params_tag, int cipher, int md, data_t *params_hex, data_t *pw,
73 data_t *data, int outsize, int ref_ret, data_t *ref_out)
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010074{
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;
Waleed Elmelegy6060cf12023-09-06 15:48:08 +010080#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
81 size_t my_out_len = 0;
82#endif
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010083
Waleed Elmelegy6060cf12023-09-06 15:48:08 +010084 ASSERT_ALLOC(my_out, outsize);
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010085
Waleed Elmelegy6060cf12023-09-06 15:48:08 +010086 pbe_params.tag = params_tag;
87 pbe_params.len = params_hex->len;
88 pbe_params.p = params_hex->x;
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010089
Waleed Elmelegy6060cf12023-09-06 15:48:08 +010090 if (ref_ret != MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) {
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 }
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +010095 if (ref_ret == 0) {
96 ASSERT_COMPARE(my_out, ref_out->len,
97 ref_out->x, ref_out->len);
98 }
99
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100100#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
Waleed Elmelegyf9193932023-09-12 14:05:10 +0100101
102 pbe_params.tag = params_tag;
103 pbe_params.len = params_hex->len;
104 pbe_params.p = params_hex->x;
105
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100106 my_ret = mbedtls_pkcs12_pbe_ext(&pbe_params, MBEDTLS_PKCS12_PBE_ENCRYPT, cipher_alg,
107 md_alg, pw->x, pw->len, data->x, data->len, my_out,
108 outsize, &my_out_len);
109 TEST_EQUAL(my_ret, ref_ret);
110 if (ref_ret == 0) {
111 ASSERT_COMPARE(my_out, my_out_len,
112 ref_out->x, ref_out->len);
113 }
114#endif
115
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100116exit:
117 mbedtls_free(my_out);
118}
119/* END_CASE */
120
121/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100122void pkcs12_pbe_decrypt(int params_tag, int cipher, int md, data_t *params_hex, data_t *pw,
123 data_t *data, int outsize, int ref_ret, data_t *ref_out)
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100124{
125 int my_ret;
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +0100126 mbedtls_asn1_buf pbe_params;
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100127 unsigned char *my_out = NULL;
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +0100128 mbedtls_cipher_type_t cipher_alg = (mbedtls_cipher_type_t) cipher;
129 mbedtls_md_type_t md_alg = (mbedtls_md_type_t) md;
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100130#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
131 size_t my_out_len = 0;
132#endif
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100133
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100134 ASSERT_ALLOC(my_out, outsize);
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100135
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100136 pbe_params.tag = params_tag;
137 pbe_params.len = params_hex->len;
138 pbe_params.p = params_hex->x;
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100139
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100140 if (ref_ret != MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) {
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 }
145
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100146 if (ref_ret == 0) {
147 ASSERT_COMPARE(my_out, ref_out->len,
148 ref_out->x, ref_out->len);
149 }
150
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100151#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
Waleed Elmelegyf9193932023-09-12 14:05:10 +0100152
153 pbe_params.tag = params_tag;
154 pbe_params.len = params_hex->len;
155 pbe_params.p = params_hex->x;
156
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100157 my_ret = mbedtls_pkcs12_pbe_ext(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg,
158 md_alg, pw->x, pw->len, data->x, data->len, my_out,
159 outsize, &my_out_len);
160 TEST_EQUAL(my_ret, ref_ret);
161 if (ref_ret == 0) {
162 ASSERT_COMPARE(my_out, my_out_len,
163 ref_out->x, ref_out->len);
164 }
165#endif
166
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100167exit:
168 mbedtls_free(my_out);
169}
170/* END_CASE */