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
13*758e9fbaSOystein Eftevaag #include "tss2_fapi.h"
14*758e9fbaSOystein Eftevaag
15*758e9fbaSOystein Eftevaag #include "test-fapi.h"
16*758e9fbaSOystein Eftevaag #include "fapi_util.h"
17*758e9fbaSOystein Eftevaag #include "fapi_int.h"
18*758e9fbaSOystein Eftevaag
19*758e9fbaSOystein Eftevaag #include "esys_iutil.h"
20*758e9fbaSOystein Eftevaag #define LOGMODULE test
21*758e9fbaSOystein Eftevaag #include "util/log.h"
22*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
23*758e9fbaSOystein Eftevaag
24*758e9fbaSOystein Eftevaag #define PASSWORD "abc"
25*758e9fbaSOystein Eftevaag #define SIGN_TEMPLATE "sign,noDa"
26*758e9fbaSOystein Eftevaag
27*758e9fbaSOystein Eftevaag static TSS2_RC
auth_callback(FAPI_CONTEXT * context,char const * description,char ** auth,void * userData)28*758e9fbaSOystein Eftevaag auth_callback(
29*758e9fbaSOystein Eftevaag FAPI_CONTEXT *context,
30*758e9fbaSOystein Eftevaag char const *description,
31*758e9fbaSOystein Eftevaag char **auth,
32*758e9fbaSOystein Eftevaag void *userData)
33*758e9fbaSOystein Eftevaag {
34*758e9fbaSOystein Eftevaag (void)description;
35*758e9fbaSOystein Eftevaag (void)userData;
36*758e9fbaSOystein Eftevaag char *pw = PASSWORD;
37*758e9fbaSOystein Eftevaag if (!pw)
38*758e9fbaSOystein Eftevaag return TSS2_FAPI_RC_GENERAL_FAILURE;
39*758e9fbaSOystein Eftevaag
40*758e9fbaSOystein Eftevaag *auth = strdup(pw);
41*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
42*758e9fbaSOystein Eftevaag }
43*758e9fbaSOystein Eftevaag
44*758e9fbaSOystein Eftevaag /** Test the FAPI functions for key creation and usage with an SH password.
45*758e9fbaSOystein Eftevaag *
46*758e9fbaSOystein Eftevaag * Tested FAPI commands:
47*758e9fbaSOystein Eftevaag * - Fapi_Provision()
48*758e9fbaSOystein Eftevaag * - Fapi_SetAuthCB()
49*758e9fbaSOystein Eftevaag * - Fapi_CreateKey()
50*758e9fbaSOystein Eftevaag * - Fapi_GetTpmBlobs()
51*758e9fbaSOystein Eftevaag * - Fapi_Sign()
52*758e9fbaSOystein Eftevaag * - Fapi_SetCertificate()
53*758e9fbaSOystein Eftevaag * - Fapi_List()
54*758e9fbaSOystein Eftevaag * - Fapi_ChangeAuth()
55*758e9fbaSOystein Eftevaag * - Fapi_Delete()
56*758e9fbaSOystein Eftevaag *
57*758e9fbaSOystein Eftevaag * @param[in,out] context The FAPI_CONTEXT.
58*758e9fbaSOystein Eftevaag * @retval EXIT_FAILURE
59*758e9fbaSOystein Eftevaag * @retval EXIT_SUCCESS
60*758e9fbaSOystein Eftevaag */
61*758e9fbaSOystein Eftevaag int
test_fapi_key_create_sign_password_provision(FAPI_CONTEXT * context)62*758e9fbaSOystein Eftevaag test_fapi_key_create_sign_password_provision(FAPI_CONTEXT *context)
63*758e9fbaSOystein Eftevaag {
64*758e9fbaSOystein Eftevaag TSS2_RC r;
65*758e9fbaSOystein Eftevaag char *sigscheme = NULL;
66*758e9fbaSOystein Eftevaag uint8_t *publicblob = NULL;
67*758e9fbaSOystein Eftevaag uint8_t *privateblob = NULL;
68*758e9fbaSOystein Eftevaag uint8_t *signature = NULL;
69*758e9fbaSOystein Eftevaag char *publicKey = NULL;
70*758e9fbaSOystein Eftevaag char *path_list = NULL;
71*758e9fbaSOystein Eftevaag
72*758e9fbaSOystein Eftevaag size_t publicsize;
73*758e9fbaSOystein Eftevaag size_t privatesize;
74*758e9fbaSOystein Eftevaag
75*758e9fbaSOystein Eftevaag const char *cert =
76*758e9fbaSOystein Eftevaag "-----BEGIN CERTIFICATE-----\n"
77*758e9fbaSOystein Eftevaag "MIIDBjCCAe4CCQDcvXBOEVM0UTANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJE\n"
78*758e9fbaSOystein Eftevaag "RTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\n"
79*758e9fbaSOystein Eftevaag "cyBQdHkgTHRkMB4XDTE5MDIyODEwNDkyM1oXDTM1MDgyNzEwNDkyM1owRTELMAkG\n"
80*758e9fbaSOystein Eftevaag "A1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\n"
81*758e9fbaSOystein Eftevaag "IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\n"
82*758e9fbaSOystein Eftevaag "AKBi+iKwkgM55iCMwXrLCJlu7TzlMu/LlkyGrm99ip2B5+/Cl6a62d8pKelg6zkH\n"
83*758e9fbaSOystein Eftevaag "jI7+AAPteJiW4O+2qVWF8hJ5BXTjGtYbM0iZ6enCb8eyC54C7xVMc21ZIv3ob4Et\n"
84*758e9fbaSOystein Eftevaag "50ZOuzY2pfpzE3vIaXt1CkHlfyI/hdK+mM/dVvuCz5p3AIlHrEWS3rSNgWbCsB2E\n"
85*758e9fbaSOystein Eftevaag "TM55qSGKaLmtTbUvEKRF0TJrFLntfXkv10QD5pgn52+QV9k59OogqZOsDvkXzKPX\n"
86*758e9fbaSOystein Eftevaag "rXF+XC0gLiGBEGAr1dv9F03xMOtO77bQTdGOeC61Tip6Nb0V3ebMckZXwdFi+Nhe\n"
87*758e9fbaSOystein Eftevaag "FRuU33CaObtV6u5PZvSue/MCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAcamUPe8I\n"
88*758e9fbaSOystein Eftevaag "nMOHcv9x5lVN1joihVRmKc0QqNLFc6XpJY8+U5rGkZvOcDe9Da8L97wDNXpKmU/q\n"
89*758e9fbaSOystein Eftevaag "pprj3rT8l3v0Z5xs8Vdr8lxS6T5NhqQV0UCsn1x14gZJcE48y9/LazYi6Zcar+BX\n"
90*758e9fbaSOystein Eftevaag "Am4vewAV3HmQ8X2EctsRhXe4wlAq4slIfEWaaofa8ai7BzO9KwpMLsGPWoNetkB9\n"
91*758e9fbaSOystein Eftevaag "19+SFt0lFFOj/6vDw5pCpSd1nQlo1ug69mJYSX/wcGkV4t4LfGhV8jRPDsGs6I5n\n"
92*758e9fbaSOystein Eftevaag "ETHSN5KV1XCPYJmRCjFY7sIt1x4zN7JJRO9DVw+YheIlduVfkBiF+GlQgLlFTjrJ\n"
93*758e9fbaSOystein Eftevaag "VrpSGMIFSu301A==\n"
94*758e9fbaSOystein Eftevaag "-----END CERTIFICATE-----\n";
95*758e9fbaSOystein Eftevaag
96*758e9fbaSOystein Eftevaag if (strcmp("P_ECC", fapi_profile) != 0)
97*758e9fbaSOystein Eftevaag sigscheme = "RSA_PSS";
98*758e9fbaSOystein Eftevaag
99*758e9fbaSOystein Eftevaag /* We need to reset the passwords again, in order to not brick physical TPMs */
100*758e9fbaSOystein Eftevaag r = Fapi_Provision(context, NULL, PASSWORD, NULL);
101*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Provision", error);
102*758e9fbaSOystein Eftevaag
103*758e9fbaSOystein Eftevaag r = Fapi_SetAuthCB(context, auth_callback, NULL);
104*758e9fbaSOystein Eftevaag goto_if_error(r, "Error SetPolicyAuthCallback", error);
105*758e9fbaSOystein Eftevaag
106*758e9fbaSOystein Eftevaag r = Fapi_CreateKey(context, "HS/SRK/mySignKey", SIGN_TEMPLATE, "",
107*758e9fbaSOystein Eftevaag PASSWORD);
108*758e9fbaSOystein Eftevaag
109*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_CreateKey", error);
110*758e9fbaSOystein Eftevaag size_t signatureSize = 0;
111*758e9fbaSOystein Eftevaag
112*758e9fbaSOystein Eftevaag TPM2B_DIGEST digest = {
113*758e9fbaSOystein Eftevaag .size = 20,
114*758e9fbaSOystein Eftevaag .buffer = {
115*758e9fbaSOystein Eftevaag 0x67, 0x68, 0x03, 0x3e, 0x21, 0x64, 0x68, 0x24, 0x7b, 0xd0,
116*758e9fbaSOystein Eftevaag 0x31, 0xa0, 0xa2, 0xd9, 0x87, 0x6d, 0x79, 0x81, 0x8f, 0x8f
117*758e9fbaSOystein Eftevaag }
118*758e9fbaSOystein Eftevaag };
119*758e9fbaSOystein Eftevaag
120*758e9fbaSOystein Eftevaag r = Fapi_GetTpmBlobs(context, "HS/SRK/mySignKey", &publicblob,
121*758e9fbaSOystein Eftevaag &publicsize,
122*758e9fbaSOystein Eftevaag &privateblob, &privatesize, NULL);
123*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_GetTpmBlobs", error);
124*758e9fbaSOystein Eftevaag
125*758e9fbaSOystein Eftevaag r = Fapi_Sign(context, "HS/SRK/mySignKey", sigscheme,
126*758e9fbaSOystein Eftevaag &digest.buffer[0], digest.size, &signature, &signatureSize,
127*758e9fbaSOystein Eftevaag &publicKey, NULL);
128*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Sign", error);
129*758e9fbaSOystein Eftevaag
130*758e9fbaSOystein Eftevaag r = Fapi_SetCertificate(context, "HS/SRK/mySignKey", cert);
131*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_SetCertificate", error);
132*758e9fbaSOystein Eftevaag
133*758e9fbaSOystein Eftevaag r = Fapi_List(context, "/", &path_list);
134*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Delete", error);
135*758e9fbaSOystein Eftevaag
136*758e9fbaSOystein Eftevaag fprintf(stderr, "\nPathList:\n%s\n", path_list);
137*758e9fbaSOystein Eftevaag
138*758e9fbaSOystein Eftevaag /* We need to reset the passwords again, in order to not brick physical TPMs */
139*758e9fbaSOystein Eftevaag r = Fapi_ChangeAuth(context, "/HS", NULL);
140*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_ChangeAuth", error);
141*758e9fbaSOystein Eftevaag
142*758e9fbaSOystein Eftevaag r = Fapi_Delete(context, "/");
143*758e9fbaSOystein Eftevaag goto_if_error(r, "Error Fapi_Delete", error);
144*758e9fbaSOystein Eftevaag
145*758e9fbaSOystein Eftevaag SAFE_FREE(publicblob);
146*758e9fbaSOystein Eftevaag SAFE_FREE(privateblob);
147*758e9fbaSOystein Eftevaag SAFE_FREE(signature);
148*758e9fbaSOystein Eftevaag SAFE_FREE(publicKey);
149*758e9fbaSOystein Eftevaag SAFE_FREE(path_list);
150*758e9fbaSOystein Eftevaag return EXIT_SUCCESS;
151*758e9fbaSOystein Eftevaag
152*758e9fbaSOystein Eftevaag error:
153*758e9fbaSOystein Eftevaag Fapi_Delete(context, "/HS/SRK");
154*758e9fbaSOystein Eftevaag SAFE_FREE(publicblob);
155*758e9fbaSOystein Eftevaag SAFE_FREE(privateblob);
156*758e9fbaSOystein Eftevaag SAFE_FREE(signature);
157*758e9fbaSOystein Eftevaag SAFE_FREE(publicKey);
158*758e9fbaSOystein Eftevaag SAFE_FREE(path_list);
159*758e9fbaSOystein Eftevaag return EXIT_FAILURE;
160*758e9fbaSOystein Eftevaag }
161*758e9fbaSOystein Eftevaag
162*758e9fbaSOystein Eftevaag int
test_invoke_fapi(FAPI_CONTEXT * fapi_context)163*758e9fbaSOystein Eftevaag test_invoke_fapi(FAPI_CONTEXT *fapi_context)
164*758e9fbaSOystein Eftevaag {
165*758e9fbaSOystein Eftevaag return test_fapi_key_create_sign_password_provision(fapi_context);
166*758e9fbaSOystein Eftevaag }
167