1a8e1175bSopenharmony_ci/* BEGIN_HEADER */
2a8e1175bSopenharmony_ci#include "mbedtls/pkcs12.h"
3a8e1175bSopenharmony_ci#include "common.h"
4a8e1175bSopenharmony_ci
5a8e1175bSopenharmony_citypedef enum {
6a8e1175bSopenharmony_ci    USE_NULL_INPUT = 0,
7a8e1175bSopenharmony_ci    USE_GIVEN_INPUT = 1,
8a8e1175bSopenharmony_ci} input_usage_method_t;
9a8e1175bSopenharmony_ci
10a8e1175bSopenharmony_ci/* END_HEADER */
11a8e1175bSopenharmony_ci
12a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES
13a8e1175bSopenharmony_ci * depends_on:MBEDTLS_PKCS12_C
14a8e1175bSopenharmony_ci * END_DEPENDENCIES
15a8e1175bSopenharmony_ci */
16a8e1175bSopenharmony_ci
17a8e1175bSopenharmony_ci/* BEGIN_CASE */
18a8e1175bSopenharmony_civoid pkcs12_derive_key(int md_type, int key_size_arg,
19a8e1175bSopenharmony_ci                       data_t *password_arg, int password_usage,
20a8e1175bSopenharmony_ci                       data_t *salt_arg, int salt_usage,
21a8e1175bSopenharmony_ci                       int iterations,
22a8e1175bSopenharmony_ci                       data_t *expected_output, int expected_status)
23a8e1175bSopenharmony_ci
24a8e1175bSopenharmony_ci{
25a8e1175bSopenharmony_ci    unsigned char *output_data = NULL;
26a8e1175bSopenharmony_ci
27a8e1175bSopenharmony_ci    unsigned char *password = NULL;
28a8e1175bSopenharmony_ci    size_t password_len = 0;
29a8e1175bSopenharmony_ci    unsigned char *salt = NULL;
30a8e1175bSopenharmony_ci    size_t salt_len = 0;
31a8e1175bSopenharmony_ci    size_t key_size = key_size_arg;
32a8e1175bSopenharmony_ci
33a8e1175bSopenharmony_ci    MD_PSA_INIT();
34a8e1175bSopenharmony_ci
35a8e1175bSopenharmony_ci    if (password_usage == USE_GIVEN_INPUT) {
36a8e1175bSopenharmony_ci        password = password_arg->x;
37a8e1175bSopenharmony_ci    }
38a8e1175bSopenharmony_ci
39a8e1175bSopenharmony_ci    password_len = password_arg->len;
40a8e1175bSopenharmony_ci
41a8e1175bSopenharmony_ci    if (salt_usage == USE_GIVEN_INPUT) {
42a8e1175bSopenharmony_ci        salt = salt_arg->x;
43a8e1175bSopenharmony_ci    }
44a8e1175bSopenharmony_ci
45a8e1175bSopenharmony_ci    salt_len = salt_arg->len;
46a8e1175bSopenharmony_ci
47a8e1175bSopenharmony_ci    TEST_CALLOC(output_data, key_size);
48a8e1175bSopenharmony_ci
49a8e1175bSopenharmony_ci    int ret = mbedtls_pkcs12_derivation(output_data,
50a8e1175bSopenharmony_ci                                        key_size,
51a8e1175bSopenharmony_ci                                        password,
52a8e1175bSopenharmony_ci                                        password_len,
53a8e1175bSopenharmony_ci                                        salt,
54a8e1175bSopenharmony_ci                                        salt_len,
55a8e1175bSopenharmony_ci                                        md_type,
56a8e1175bSopenharmony_ci                                        MBEDTLS_PKCS12_DERIVE_KEY,
57a8e1175bSopenharmony_ci                                        iterations);
58a8e1175bSopenharmony_ci
59a8e1175bSopenharmony_ci    TEST_EQUAL(ret, expected_status);
60a8e1175bSopenharmony_ci
61a8e1175bSopenharmony_ci    if (expected_status == 0) {
62a8e1175bSopenharmony_ci        TEST_MEMORY_COMPARE(expected_output->x, expected_output->len,
63a8e1175bSopenharmony_ci                            output_data, key_size);
64a8e1175bSopenharmony_ci    }
65a8e1175bSopenharmony_ci
66a8e1175bSopenharmony_ciexit:
67a8e1175bSopenharmony_ci    mbedtls_free(output_data);
68a8e1175bSopenharmony_ci    MD_PSA_DONE();
69a8e1175bSopenharmony_ci}
70a8e1175bSopenharmony_ci/* END_CASE */
71a8e1175bSopenharmony_ci
72a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C:MBEDTLS_CIPHER_C */
73a8e1175bSopenharmony_civoid pkcs12_pbe_encrypt(int params_tag, int cipher, int md, data_t *params_hex, data_t *pw,
74a8e1175bSopenharmony_ci                        data_t *data, int outsize, int ref_ret, data_t *ref_out)
75a8e1175bSopenharmony_ci{
76a8e1175bSopenharmony_ci    int my_ret;
77a8e1175bSopenharmony_ci    mbedtls_asn1_buf pbe_params;
78a8e1175bSopenharmony_ci    unsigned char *my_out = NULL;
79a8e1175bSopenharmony_ci    mbedtls_cipher_type_t cipher_alg = (mbedtls_cipher_type_t) cipher;
80a8e1175bSopenharmony_ci    mbedtls_md_type_t md_alg = (mbedtls_md_type_t) md;
81a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
82a8e1175bSopenharmony_ci    size_t my_out_len = 0;
83a8e1175bSopenharmony_ci#endif
84a8e1175bSopenharmony_ci
85a8e1175bSopenharmony_ci    MD_PSA_INIT();
86a8e1175bSopenharmony_ci
87a8e1175bSopenharmony_ci    TEST_CALLOC(my_out, outsize);
88a8e1175bSopenharmony_ci
89a8e1175bSopenharmony_ci    pbe_params.tag = params_tag;
90a8e1175bSopenharmony_ci    pbe_params.len = params_hex->len;
91a8e1175bSopenharmony_ci    pbe_params.p = params_hex->x;
92a8e1175bSopenharmony_ci
93a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_DEPRECATED)
94a8e1175bSopenharmony_ci    if (ref_ret != MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) {
95a8e1175bSopenharmony_ci        my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_ENCRYPT, cipher_alg,
96a8e1175bSopenharmony_ci                                    md_alg, pw->x, pw->len, data->x, data->len, my_out);
97a8e1175bSopenharmony_ci        TEST_EQUAL(my_ret, ref_ret);
98a8e1175bSopenharmony_ci    }
99a8e1175bSopenharmony_ci    if (ref_ret == 0) {
100a8e1175bSopenharmony_ci        ASSERT_COMPARE(my_out, ref_out->len,
101a8e1175bSopenharmony_ci                       ref_out->x, ref_out->len);
102a8e1175bSopenharmony_ci    }
103a8e1175bSopenharmony_ci#endif
104a8e1175bSopenharmony_ci
105a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
106a8e1175bSopenharmony_ci
107a8e1175bSopenharmony_ci    pbe_params.tag = params_tag;
108a8e1175bSopenharmony_ci    pbe_params.len = params_hex->len;
109a8e1175bSopenharmony_ci    pbe_params.p = params_hex->x;
110a8e1175bSopenharmony_ci
111a8e1175bSopenharmony_ci    my_ret = mbedtls_pkcs12_pbe_ext(&pbe_params, MBEDTLS_PKCS12_PBE_ENCRYPT, cipher_alg,
112a8e1175bSopenharmony_ci                                    md_alg, pw->x, pw->len, data->x, data->len, my_out,
113a8e1175bSopenharmony_ci                                    outsize, &my_out_len);
114a8e1175bSopenharmony_ci    TEST_EQUAL(my_ret, ref_ret);
115a8e1175bSopenharmony_ci    if (ref_ret == 0) {
116a8e1175bSopenharmony_ci        ASSERT_COMPARE(my_out, my_out_len,
117a8e1175bSopenharmony_ci                       ref_out->x, ref_out->len);
118a8e1175bSopenharmony_ci    }
119a8e1175bSopenharmony_ci#endif
120a8e1175bSopenharmony_ci
121a8e1175bSopenharmony_ciexit:
122a8e1175bSopenharmony_ci    mbedtls_free(my_out);
123a8e1175bSopenharmony_ci    MD_PSA_DONE();
124a8e1175bSopenharmony_ci}
125a8e1175bSopenharmony_ci/* END_CASE */
126a8e1175bSopenharmony_ci
127a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C:MBEDTLS_CIPHER_C */
128a8e1175bSopenharmony_civoid pkcs12_pbe_decrypt(int params_tag, int cipher, int md, data_t *params_hex, data_t *pw,
129a8e1175bSopenharmony_ci                        data_t *data, int outsize, int ref_ret, data_t *ref_out)
130a8e1175bSopenharmony_ci{
131a8e1175bSopenharmony_ci    int my_ret;
132a8e1175bSopenharmony_ci    mbedtls_asn1_buf pbe_params;
133a8e1175bSopenharmony_ci    unsigned char *my_out = NULL;
134a8e1175bSopenharmony_ci    mbedtls_cipher_type_t cipher_alg = (mbedtls_cipher_type_t) cipher;
135a8e1175bSopenharmony_ci    mbedtls_md_type_t md_alg = (mbedtls_md_type_t) md;
136a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
137a8e1175bSopenharmony_ci    size_t my_out_len = 0;
138a8e1175bSopenharmony_ci#endif
139a8e1175bSopenharmony_ci
140a8e1175bSopenharmony_ci    MD_PSA_INIT();
141a8e1175bSopenharmony_ci
142a8e1175bSopenharmony_ci    TEST_CALLOC(my_out, outsize);
143a8e1175bSopenharmony_ci
144a8e1175bSopenharmony_ci    pbe_params.tag = params_tag;
145a8e1175bSopenharmony_ci    pbe_params.len = params_hex->len;
146a8e1175bSopenharmony_ci    pbe_params.p = params_hex->x;
147a8e1175bSopenharmony_ci
148a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_DEPRECATED)
149a8e1175bSopenharmony_ci    if (ref_ret != MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) {
150a8e1175bSopenharmony_ci        my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg,
151a8e1175bSopenharmony_ci                                    md_alg, pw->x, pw->len, data->x, data->len, my_out);
152a8e1175bSopenharmony_ci        TEST_EQUAL(my_ret, ref_ret);
153a8e1175bSopenharmony_ci    }
154a8e1175bSopenharmony_ci
155a8e1175bSopenharmony_ci    if (ref_ret == 0) {
156a8e1175bSopenharmony_ci        ASSERT_COMPARE(my_out, ref_out->len,
157a8e1175bSopenharmony_ci                       ref_out->x, ref_out->len);
158a8e1175bSopenharmony_ci    }
159a8e1175bSopenharmony_ci#endif
160a8e1175bSopenharmony_ci
161a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
162a8e1175bSopenharmony_ci
163a8e1175bSopenharmony_ci    pbe_params.tag = params_tag;
164a8e1175bSopenharmony_ci    pbe_params.len = params_hex->len;
165a8e1175bSopenharmony_ci    pbe_params.p = params_hex->x;
166a8e1175bSopenharmony_ci
167a8e1175bSopenharmony_ci    my_ret = mbedtls_pkcs12_pbe_ext(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg,
168a8e1175bSopenharmony_ci                                    md_alg, pw->x, pw->len, data->x, data->len, my_out,
169a8e1175bSopenharmony_ci                                    outsize, &my_out_len);
170a8e1175bSopenharmony_ci    TEST_EQUAL(my_ret, ref_ret);
171a8e1175bSopenharmony_ci    if (ref_ret == 0) {
172a8e1175bSopenharmony_ci        ASSERT_COMPARE(my_out, my_out_len,
173a8e1175bSopenharmony_ci                       ref_out->x, ref_out->len);
174a8e1175bSopenharmony_ci    }
175a8e1175bSopenharmony_ci#endif
176a8e1175bSopenharmony_ci
177a8e1175bSopenharmony_ciexit:
178a8e1175bSopenharmony_ci    mbedtls_free(my_out);
179a8e1175bSopenharmony_ci    MD_PSA_DONE();
180a8e1175bSopenharmony_ci}
181a8e1175bSopenharmony_ci/* END_CASE */
182