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