blob: 65722d0ff15ba6c488d5f3f9394c6d4009a01818 [file] [log] [blame]
Paul Elliottd6635432021-11-18 22:35:48 +00001/* BEGIN_HEADER */
2#include "mbedtls/pkcs12.h"
Paul Elliott6e7deb12021-12-03 18:55:31 +00003#include "common.h"
Paul Elliottd6635432021-11-18 22:35:48 +00004
Manuel Pégourié-Gonnard07018f92022-09-15 11:29:35 +02005#include "mbedtls/legacy_or_psa.h"
Andrzej Kurek7bd12c52022-08-24 10:47:10 -04006
Gilles Peskine449bd832023-01-11 14:50:10 +01007typedef enum {
8 USE_NULL_INPUT = 0,
9 USE_GIVEN_INPUT = 1,
Paul Elliottd6635432021-11-18 22:35:48 +000010} input_usage_method_t;
11
12/* END_HEADER */
13
14/* BEGIN_DEPENDENCIES
Paul Elliott3584ae42021-11-30 16:21:27 +000015 * depends_on:MBEDTLS_PKCS12_C
Paul Elliottd6635432021-11-18 22:35:48 +000016 * END_DEPENDENCIES
17 */
18
19/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010020void pkcs12_derive_key(int md_type, int key_size_arg,
21 data_t *password_arg, int password_usage,
22 data_t *salt_arg, int salt_usage,
23 int iterations,
24 data_t *expected_output, int expected_status)
Paul Elliottd6635432021-11-18 22:35:48 +000025
26{
Gilles Peskine449bd832023-01-11 14:50:10 +010027 unsigned char *output_data = NULL;
Paul Elliottd6635432021-11-18 22:35:48 +000028
Gilles Peskine449bd832023-01-11 14:50:10 +010029 unsigned char *password = NULL;
30 size_t password_len = 0;
31 unsigned char *salt = NULL;
32 size_t salt_len = 0;
33 size_t key_size = key_size_arg;
Paul Elliottd6635432021-11-18 22:35:48 +000034
Manuel Pégourié-Gonnardbe97afe2023-03-16 10:00:54 +010035 MD_PSA_INIT();
36
Gilles Peskine449bd832023-01-11 14:50:10 +010037 if (password_usage == USE_GIVEN_INPUT) {
38 password = password_arg->x;
39 }
Paul Elliott4768a302021-11-30 16:39:51 +000040
Gilles Peskine449bd832023-01-11 14:50:10 +010041 password_len = password_arg->len;
Paul Elliottd6635432021-11-18 22:35:48 +000042
Gilles Peskine449bd832023-01-11 14:50:10 +010043 if (salt_usage == USE_GIVEN_INPUT) {
44 salt = salt_arg->x;
45 }
Paul Elliott4768a302021-11-30 16:39:51 +000046
Gilles Peskine449bd832023-01-11 14:50:10 +010047 salt_len = salt_arg->len;
Paul Elliottd6635432021-11-18 22:35:48 +000048
Gilles Peskine449bd832023-01-11 14:50:10 +010049 ASSERT_ALLOC(output_data, key_size);
Paul Elliottd6635432021-11-18 22:35:48 +000050
Gilles Peskine449bd832023-01-11 14:50:10 +010051 int ret = mbedtls_pkcs12_derivation(output_data,
Gilles Peskinea844b4b2022-09-15 21:05:04 +020052 key_size,
53 password,
54 password_len,
55 salt,
56 salt_len,
57 md_type,
58 MBEDTLS_PKCS12_DERIVE_KEY,
Gilles Peskine449bd832023-01-11 14:50:10 +010059 iterations);
Paul Elliottd6635432021-11-18 22:35:48 +000060
Gilles Peskine449bd832023-01-11 14:50:10 +010061 TEST_EQUAL(ret, expected_status);
Paul Elliottd6635432021-11-18 22:35:48 +000062
Gilles Peskine449bd832023-01-11 14:50:10 +010063 if (expected_status == 0) {
64 ASSERT_COMPARE(expected_output->x, expected_output->len,
65 output_data, key_size);
66 }
Paul Elliott6e7deb12021-12-03 18:55:31 +000067
Paul Elliottd6635432021-11-18 22:35:48 +000068exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010069 mbedtls_free(output_data);
Manuel Pégourié-Gonnardbe97afe2023-03-16 10:00:54 +010070 MD_PSA_DONE();
Paul Elliottd6635432021-11-18 22:35:48 +000071}
72/* END_CASE */