blob: 90d744457d99508a0b72d3a925452e6d01068548 [file] [log] [blame]
Tadeusz Struk7c72dd42018-02-01 14:18:23 -08001/*
2 * Copyright (c) 2018, Intel Corporation
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
18 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24 * THE POSSIBILITY OF SUCH DAMAGE.
25 */
26#include <inttypes.h>
Philip Tricca910f17c2018-03-15 12:38:37 -070027#include <stdlib.h>
28#include <string.h>
29
30#include "tss2_mu.h"
31#include "tss2_sys.h"
Tadeusz Struk7c72dd42018-02-01 14:18:23 -080032
33#define LOGMODULE test
Philip Triccaa7c51ce2018-03-10 18:28:25 -080034#include "util/log.h"
Tadeusz Struk7c72dd42018-02-01 14:18:23 -080035#include "sapi-util.h"
36
37TSS2_RC
38test_invoke (TSS2_SYS_CONTEXT *sapi_context)
39{
40 TSS2_RC rc = TSS2_RC_SUCCESS;
41 TPM2B_SENSITIVE_CREATE in_sensitive = { 0 };
Tadeusz Struk2d4f8f72018-02-27 16:14:00 -080042 TPMT_PUBLIC in_public = { 0 };
43 TPM2B_TEMPLATE public_template = { 0 };
Tadeusz Struk7c72dd42018-02-01 14:18:23 -080044 TPM2B_PRIVATE out_private = { 0 };
45 TPM2B_PUBLIC out_public = { 0 };
46 TPM2B_NAME name = TPM2B_NAME_INIT;
47 TPM2B_NAME qualified_name = TPM2B_NAME_INIT;
48 TPM2_HANDLE object_handle = 0;
49 TSS2L_SYS_AUTH_COMMAND auth_cmd = {
50 .auths = {{ .sessionHandle = TPM2_RS_PW }},
51 .count = 1
52 };
53 TSS2L_SYS_AUTH_RESPONSE auth_rsp = {
54 .count = 0
55 };
56
57 if (sapi_context == NULL)
58 return TSS2_RC_LAYER_MASK | TSS2_BASE_RC_BAD_REFERENCE;
59
Tadeusz Struk2d4f8f72018-02-27 16:14:00 -080060 in_public.type = TPM2_ALG_RSA;
61 in_public.nameAlg = TPM2_ALG_SHA256;
62 in_public.objectAttributes |= TPMA_OBJECT_RESTRICTED;
63 in_public.objectAttributes |= TPMA_OBJECT_USERWITHAUTH;
64 in_public.objectAttributes |= TPMA_OBJECT_DECRYPT;
65 in_public.objectAttributes |= TPMA_OBJECT_FIXEDTPM;
66 in_public.objectAttributes |= TPMA_OBJECT_FIXEDPARENT;
67 in_public.objectAttributes |= TPMA_OBJECT_SENSITIVEDATAORIGIN;
68 in_public.parameters.rsaDetail.symmetric.algorithm = TPM2_ALG_AES;
69 in_public.parameters.rsaDetail.symmetric.keyBits.aes = 128;
70 in_public.parameters.rsaDetail.symmetric.mode.aes = TPM2_ALG_CFB;
71 in_public.parameters.rsaDetail.scheme.scheme = TPM2_ALG_NULL;
72 in_public.parameters.rsaDetail.keyBits = 2048;
Tadeusz Struk7c72dd42018-02-01 14:18:23 -080073
Tadeusz Struk2d4f8f72018-02-27 16:14:00 -080074 uint8_t public_buf[sizeof(in_public)] = {0};
75 size_t offset = 0;
76
77 rc = Tss2_MU_TPMT_PUBLIC_Marshal(&in_public, public_buf,
78 sizeof(in_public), &offset);
79 if (rc != TPM2_RC_SUCCESS) {
80 LOG_ERROR("Tss2_MU_TPMT_PUBLIC_Marshal FAILED! Response Code: 0x%x", rc);
81 exit(1);
82 }
83 public_template.size = offset;
84 memcpy(public_template.buffer, public_buf, offset);
Tadeusz Struk7c72dd42018-02-01 14:18:23 -080085 /* Create an object using CreateLoaded.
86 * The result should be that the created object
87 * stays in the TPM
88 */
89 LOG_INFO("Calling CreateLoaded");
90 rc = Tss2_Sys_CreateLoaded (sapi_context,
91 TPM2_RH_OWNER,
92 &auth_cmd,
93 &in_sensitive,
Tadeusz Struk2d4f8f72018-02-27 16:14:00 -080094 &public_template,
Tadeusz Struk7c72dd42018-02-01 14:18:23 -080095 &object_handle,
96 &out_private,
97 &out_public,
98 &name,
99 &auth_rsp);
100 if (rc == TPM2_RC_SUCCESS) {
101 LOG_INFO("success object handle: 0x%x", object_handle);
102 } else {
103 LOG_ERROR("CreateLoaded FAILED! Response Code : 0x%x", rc);
104 exit(1);
105 }
106
107 memset(&out_public, '\0', sizeof(out_public));
108 memset(&name, '\0', sizeof(name));
109
110 /* Check if the object is really loaded by accessing its
111 * public area */
112 LOG_INFO("Calling ReadPublic");
113 rc = Tss2_Sys_ReadPublic (sapi_context,
114 object_handle,
115 NULL,
116 &out_public,
117 &name,
118 &qualified_name,
119 NULL);
120 if (rc == TPM2_RC_SUCCESS) {
121 LOG_INFO("success! Object's qualified name is:");
122 LOGBLOB_INFO(qualified_name.name, qualified_name.size, "%s", "name:");
123 } else {
124 LOG_ERROR("Tss2_Sys_ReadPublic FAILED! Response Code : 0x%x", rc);
125 exit(1);
126 }
127
128 rc = Tss2_Sys_FlushContext (sapi_context, object_handle);
129 if (rc != TSS2_RC_SUCCESS) {
130 LOG_ERROR("Tss2_Sys_FlushContext failed: 0x%" PRIx32, rc);
131 exit(1);
132 }
133
134 return rc;
135}