blob: f2818fc0dfa5d666482701c3f84c029359eb8b18 [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 */
Waleed Elmelegy15de8092023-09-05 15:51:48 +010074void pkcs12_pbe_encrypt(int cipher, int md, data_t *params_hex, data_t *pw,
Waleed Elmelegy255db802023-09-04 15:11:22 +010075 data_t *data, int ref_ret, data_t *ref_out)
76{
77 int my_ret;
Waleed Elmelegy15de8092023-09-05 15:51:48 +010078 mbedtls_asn1_buf pbe_params;
Waleed Elmelegy255db802023-09-04 15:11:22 +010079 unsigned char *my_out = NULL;
Waleed Elmelegy15de8092023-09-05 15:51:48 +010080 mbedtls_cipher_type_t cipher_alg = (mbedtls_cipher_type_t) cipher;
81 mbedtls_md_type_t md_alg = (mbedtls_md_type_t) md;
82 size_t block_size;
Waleed Elmelegy255db802023-09-04 15:11:22 +010083
84 MD_PSA_INIT();
85
Waleed Elmelegy15de8092023-09-05 15:51:48 +010086 block_size = mbedtls_cipher_info_get_block_size(mbedtls_cipher_info_from_type(cipher_alg));
87 ASSERT_ALLOC(my_out, ((data->len/block_size) + 1) * block_size);
Waleed Elmelegy255db802023-09-04 15:11:22 +010088
Waleed Elmelegy15de8092023-09-05 15:51:48 +010089 pbe_params.tag = params_hex->x[0];
90 pbe_params.len = params_hex->x[1];
91 pbe_params.p = params_hex->x + 2;
Waleed Elmelegy255db802023-09-04 15:11:22 +010092
93 my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_ENCRYPT, cipher_alg,
94 md_alg, pw->x, pw->len, data->x, data->len, my_out);
95 TEST_EQUAL(my_ret, ref_ret);
96 if (ref_ret == 0) {
97 ASSERT_COMPARE(my_out, ref_out->len,
98 ref_out->x, ref_out->len);
99 }
100
101exit:
102 mbedtls_free(my_out);
103 MD_PSA_DONE();
104}
105/* END_CASE */
106
107/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */
Waleed Elmelegy15de8092023-09-05 15:51:48 +0100108void pkcs12_pbe_decrypt(int cipher, int md, data_t *params_hex, data_t *pw,
Waleed Elmelegy255db802023-09-04 15:11:22 +0100109 data_t *data, int ref_ret, data_t *ref_out)
110{
111 int my_ret;
Waleed Elmelegy15de8092023-09-05 15:51:48 +0100112 mbedtls_asn1_buf pbe_params;
Waleed Elmelegy255db802023-09-04 15:11:22 +0100113 unsigned char *my_out = NULL;
Waleed Elmelegy15de8092023-09-05 15:51:48 +0100114 mbedtls_cipher_type_t cipher_alg = (mbedtls_cipher_type_t) cipher;
115 mbedtls_md_type_t md_alg = (mbedtls_md_type_t) md;
Waleed Elmelegy255db802023-09-04 15:11:22 +0100116
117 MD_PSA_INIT();
118
Waleed Elmelegy15de8092023-09-05 15:51:48 +0100119 ASSERT_ALLOC(my_out, data->len);
Waleed Elmelegy255db802023-09-04 15:11:22 +0100120
Waleed Elmelegy15de8092023-09-05 15:51:48 +0100121 pbe_params.tag = params_hex->x[0];
122 pbe_params.len = params_hex->x[1];
123 pbe_params.p = params_hex->x + 2;
Waleed Elmelegy255db802023-09-04 15:11:22 +0100124
125 my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg,
126 md_alg, pw->x, pw->len, data->x, data->len, my_out);
127 TEST_EQUAL(my_ret, ref_ret);
128 if (ref_ret == 0) {
129 ASSERT_COMPARE(my_out, ref_out->len,
130 ref_out->x, ref_out->len);
131 }
132
133exit:
134 mbedtls_free(my_out);
135 MD_PSA_DONE();
136}
137/* END_CASE */