blob: 8014c62a3645c78fca5594a7fbeb47c398ff5dcb [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 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)
101 my_ret = mbedtls_pkcs12_pbe_ext(&pbe_params, MBEDTLS_PKCS12_PBE_ENCRYPT, cipher_alg,
102 md_alg, pw->x, pw->len, data->x, data->len, my_out,
103 outsize, &my_out_len);
104 TEST_EQUAL(my_ret, ref_ret);
105 if (ref_ret == 0) {
106 ASSERT_COMPARE(my_out, my_out_len,
107 ref_out->x, ref_out->len);
108 }
109#endif
110
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100111exit:
112 mbedtls_free(my_out);
113}
114/* END_CASE */
115
116/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100117void pkcs12_pbe_decrypt(int params_tag, int cipher, int md, data_t *params_hex, data_t *pw,
118 data_t *data, int outsize, int ref_ret, data_t *ref_out)
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100119{
120 int my_ret;
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +0100121 mbedtls_asn1_buf pbe_params;
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100122 unsigned char *my_out = NULL;
Waleed Elmelegy6d5a5c12023-09-05 15:51:48 +0100123 mbedtls_cipher_type_t cipher_alg = (mbedtls_cipher_type_t) cipher;
124 mbedtls_md_type_t md_alg = (mbedtls_md_type_t) md;
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100125#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
126 size_t my_out_len = 0;
127#endif
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100128
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100129 ASSERT_ALLOC(my_out, outsize);
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100130
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100131 pbe_params.tag = params_tag;
132 pbe_params.len = params_hex->len;
133 pbe_params.p = params_hex->x;
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100134
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100135 if (ref_ret != MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) {
136 my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg,
137 md_alg, pw->x, pw->len, data->x, data->len, my_out);
138 TEST_EQUAL(my_ret, ref_ret);
139 }
140
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100141 if (ref_ret == 0) {
142 ASSERT_COMPARE(my_out, ref_out->len,
143 ref_out->x, ref_out->len);
144 }
145
Waleed Elmelegy6060cf12023-09-06 15:48:08 +0100146#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
147 my_ret = mbedtls_pkcs12_pbe_ext(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg,
148 md_alg, pw->x, pw->len, data->x, data->len, my_out,
149 outsize, &my_out_len);
150 TEST_EQUAL(my_ret, ref_ret);
151 if (ref_ret == 0) {
152 ASSERT_COMPARE(my_out, my_out_len,
153 ref_out->x, ref_out->len);
154 }
155#endif
156
Waleed Elmelegy38a89ad2023-09-04 15:11:22 +0100157exit:
158 mbedtls_free(my_out);
159}
160/* END_CASE */