xref: /aosp_15_r20/external/tpm2-tss/test/integration/fapi-duplicate.int.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag  * Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG
4*758e9fbaSOystein Eftevaag  * All rights reserved.
5*758e9fbaSOystein Eftevaag  *******************************************************************************/
6*758e9fbaSOystein Eftevaag 
7*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
8*758e9fbaSOystein Eftevaag #include <config.h>
9*758e9fbaSOystein Eftevaag #endif
10*758e9fbaSOystein Eftevaag 
11*758e9fbaSOystein Eftevaag #include <stdlib.h>
12*758e9fbaSOystein Eftevaag #include <stdio.h>
13*758e9fbaSOystein Eftevaag #include <unistd.h>
14*758e9fbaSOystein Eftevaag 
15*758e9fbaSOystein Eftevaag #include "tss2_fapi.h"
16*758e9fbaSOystein Eftevaag 
17*758e9fbaSOystein Eftevaag #include "test-fapi.h"
18*758e9fbaSOystein Eftevaag #define LOGMODULE test
19*758e9fbaSOystein Eftevaag #include "util/log.h"
20*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
21*758e9fbaSOystein Eftevaag 
22*758e9fbaSOystein Eftevaag #define SIZE 2000
23*758e9fbaSOystein Eftevaag 
24*758e9fbaSOystein Eftevaag /** Test the FAPI functions for key duplication.
25*758e9fbaSOystein Eftevaag  *
26*758e9fbaSOystein Eftevaag  * Tested FAPI commands:
27*758e9fbaSOystein Eftevaag  *  - Fapi_Provision()
28*758e9fbaSOystein Eftevaag  *  - Fapi_Import()
29*758e9fbaSOystein Eftevaag  *  - Fapi_CreateKey()
30*758e9fbaSOystein Eftevaag  *  - Fapi_ExportKey()
31*758e9fbaSOystein Eftevaag  *  - Fapi_Delete()
32*758e9fbaSOystein Eftevaag  *
33*758e9fbaSOystein Eftevaag  * Tested Policies:
34*758e9fbaSOystein Eftevaag  *  - PolicyDuplicationSelect
35*758e9fbaSOystein Eftevaag  *
36*758e9fbaSOystein Eftevaag  * @param[in,out] context The FAPI_CONTEXT.
37*758e9fbaSOystein Eftevaag  * @retval EXIT_FAILURE
38*758e9fbaSOystein Eftevaag  * @retval EXIT_SUCCESS
39*758e9fbaSOystein Eftevaag  */
40*758e9fbaSOystein Eftevaag int
test_fapi_duplicate(FAPI_CONTEXT * context)41*758e9fbaSOystein Eftevaag test_fapi_duplicate(FAPI_CONTEXT *context)
42*758e9fbaSOystein Eftevaag {
43*758e9fbaSOystein Eftevaag     TSS2_RC r;
44*758e9fbaSOystein Eftevaag     char *policy_name = "/policy/pol_duplicate";
45*758e9fbaSOystein Eftevaag     char *policy_file = TOP_SOURCEDIR "/test/data/fapi/policy/pol_duplicate.json";
46*758e9fbaSOystein Eftevaag     FILE *stream = NULL;
47*758e9fbaSOystein Eftevaag     char *json_policy = NULL;
48*758e9fbaSOystein Eftevaag     long policy_size;
49*758e9fbaSOystein Eftevaag     char *json_duplicate = NULL;
50*758e9fbaSOystein Eftevaag     char *json_string_pub_key = NULL;
51*758e9fbaSOystein Eftevaag 
52*758e9fbaSOystein Eftevaag     r = Fapi_Provision(context, NULL, NULL, NULL);
53*758e9fbaSOystein Eftevaag     goto_if_error(r, "Error Fapi_Provision", error);
54*758e9fbaSOystein Eftevaag 
55*758e9fbaSOystein Eftevaag     r = pcr_reset(context, 16);
56*758e9fbaSOystein Eftevaag     goto_if_error(r, "Error pcr_reset", error);
57*758e9fbaSOystein Eftevaag 
58*758e9fbaSOystein Eftevaag     stream = fopen(policy_file, "r");
59*758e9fbaSOystein Eftevaag     if (!stream) {
60*758e9fbaSOystein Eftevaag         LOG_ERROR("File %s does not exist", policy_file);
61*758e9fbaSOystein Eftevaag         goto error;
62*758e9fbaSOystein Eftevaag     }
63*758e9fbaSOystein Eftevaag     fseek(stream, 0L, SEEK_END);
64*758e9fbaSOystein Eftevaag     policy_size = ftell(stream);
65*758e9fbaSOystein Eftevaag     fclose(stream);
66*758e9fbaSOystein Eftevaag     json_policy = malloc(policy_size + 1);
67*758e9fbaSOystein Eftevaag     goto_if_null(json_policy,
68*758e9fbaSOystein Eftevaag             "Could not allocate memory for the JSON policy",
69*758e9fbaSOystein Eftevaag             TSS2_FAPI_RC_MEMORY, error);
70*758e9fbaSOystein Eftevaag     stream = fopen(policy_file, "r");
71*758e9fbaSOystein Eftevaag     ssize_t ret = read(fileno(stream), json_policy, policy_size);
72*758e9fbaSOystein Eftevaag     if (ret != policy_size) {
73*758e9fbaSOystein Eftevaag         LOG_ERROR("IO error %s.", policy_file);
74*758e9fbaSOystein Eftevaag         goto error;
75*758e9fbaSOystein Eftevaag     }
76*758e9fbaSOystein Eftevaag     json_policy[policy_size] = '\0';
77*758e9fbaSOystein Eftevaag 
78*758e9fbaSOystein Eftevaag     r = Fapi_Import(context, policy_name, json_policy);
79*758e9fbaSOystein Eftevaag     goto_if_error(r, "Error Fapi_List", error);
80*758e9fbaSOystein Eftevaag 
81*758e9fbaSOystein Eftevaag     r = Fapi_CreateKey(context, "HS/SRK/myCryptKey", "restricted,decrypt,noDa",
82*758e9fbaSOystein Eftevaag                        "", NULL);
83*758e9fbaSOystein Eftevaag     goto_if_error(r, "Error Fapi_CreateKey", error);
84*758e9fbaSOystein Eftevaag 
85*758e9fbaSOystein Eftevaag     r = Fapi_ExportKey(context, "HS/SRK/myCryptKey", NULL, &json_string_pub_key);
86*758e9fbaSOystein Eftevaag     goto_if_error(r, "Error Fapi_CreateKey", error);
87*758e9fbaSOystein Eftevaag 
88*758e9fbaSOystein Eftevaag     r = Fapi_Import(context, "ext/myNewParent", json_string_pub_key);
89*758e9fbaSOystein Eftevaag     goto_if_error(r, "Error Fapi_Import", error);
90*758e9fbaSOystein Eftevaag 
91*758e9fbaSOystein Eftevaag     r = Fapi_CreateKey(context, "HS/SRK/myCryptKey/myCryptKey2",
92*758e9fbaSOystein Eftevaag                        "exportable,decrypt,noDa", policy_name, NULL);
93*758e9fbaSOystein Eftevaag     goto_if_error(r, "Error Fapi_CreateKey", error);
94*758e9fbaSOystein Eftevaag 
95*758e9fbaSOystein Eftevaag     r = Fapi_ExportKey(context, "HS/SRK/myCryptKey/myCryptKey2",
96*758e9fbaSOystein Eftevaag                        "ext/myNewParent", &json_duplicate);
97*758e9fbaSOystein Eftevaag     goto_if_error(r, "Error Fapi_CreateKey", error);
98*758e9fbaSOystein Eftevaag 
99*758e9fbaSOystein Eftevaag     fprintf(stderr, "\nExport Data:\n%s\n", json_duplicate);
100*758e9fbaSOystein Eftevaag 
101*758e9fbaSOystein Eftevaag     r = Fapi_Import(context, "importedKey", json_duplicate);
102*758e9fbaSOystein Eftevaag     goto_if_error(r, "Error Fapi_Import", error);
103*758e9fbaSOystein Eftevaag 
104*758e9fbaSOystein Eftevaag     fprintf(stderr, "Duplicate:\n%s\n", json_duplicate);
105*758e9fbaSOystein Eftevaag 
106*758e9fbaSOystein Eftevaag     r = Fapi_Delete(context, "/");
107*758e9fbaSOystein Eftevaag     goto_if_error(r, "Error Fapi_Delete", error);
108*758e9fbaSOystein Eftevaag 
109*758e9fbaSOystein Eftevaag     SAFE_FREE(json_string_pub_key);
110*758e9fbaSOystein Eftevaag     SAFE_FREE(json_duplicate);
111*758e9fbaSOystein Eftevaag     SAFE_FREE(json_policy);
112*758e9fbaSOystein Eftevaag     return EXIT_SUCCESS;
113*758e9fbaSOystein Eftevaag 
114*758e9fbaSOystein Eftevaag error:
115*758e9fbaSOystein Eftevaag     SAFE_FREE(json_string_pub_key);
116*758e9fbaSOystein Eftevaag     SAFE_FREE(json_duplicate);
117*758e9fbaSOystein Eftevaag     SAFE_FREE(json_policy);
118*758e9fbaSOystein Eftevaag     return EXIT_FAILURE;
119*758e9fbaSOystein Eftevaag }
120*758e9fbaSOystein Eftevaag 
121*758e9fbaSOystein Eftevaag int
test_invoke_fapi(FAPI_CONTEXT * fapi_context)122*758e9fbaSOystein Eftevaag test_invoke_fapi(FAPI_CONTEXT *fapi_context)
123*758e9fbaSOystein Eftevaag {
124*758e9fbaSOystein Eftevaag     return test_fapi_duplicate(fapi_context);
125*758e9fbaSOystein Eftevaag }
126