xref: /aosp_15_r20/external/tpm2-tss/src/tss2-tcti/tcti-common.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*
3*758e9fbaSOystein Eftevaag  * Copyright (c) 2015 - 2018 Intel Corporation
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 <inttypes.h>
12*758e9fbaSOystein Eftevaag #include <stdio.h>
13*758e9fbaSOystein Eftevaag #include <stdlib.h>
14*758e9fbaSOystein Eftevaag #include <string.h>
15*758e9fbaSOystein Eftevaag 
16*758e9fbaSOystein Eftevaag #ifndef _WIN32
17*758e9fbaSOystein Eftevaag #include <unistd.h>
18*758e9fbaSOystein Eftevaag #endif
19*758e9fbaSOystein Eftevaag 
20*758e9fbaSOystein Eftevaag #include "tss2_tpm2_types.h"
21*758e9fbaSOystein Eftevaag #include "tss2_mu.h"
22*758e9fbaSOystein Eftevaag 
23*758e9fbaSOystein Eftevaag #include "tcti-common.h"
24*758e9fbaSOystein Eftevaag #define LOGMODULE tcti
25*758e9fbaSOystein Eftevaag #include "util/log.h"
26*758e9fbaSOystein Eftevaag 
27*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT*
tcti_common_context_cast(TSS2_TCTI_CONTEXT * ctx)28*758e9fbaSOystein Eftevaag tcti_common_context_cast (TSS2_TCTI_CONTEXT *ctx)
29*758e9fbaSOystein Eftevaag {
30*758e9fbaSOystein Eftevaag     return (TSS2_TCTI_COMMON_CONTEXT*)ctx;
31*758e9fbaSOystein Eftevaag }
32*758e9fbaSOystein Eftevaag 
33*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT*
tcti_common_down_cast(TSS2_TCTI_COMMON_CONTEXT * ctx)34*758e9fbaSOystein Eftevaag tcti_common_down_cast (TSS2_TCTI_COMMON_CONTEXT *ctx)
35*758e9fbaSOystein Eftevaag {
36*758e9fbaSOystein Eftevaag     return (TSS2_TCTI_CONTEXT*)&ctx->v2;
37*758e9fbaSOystein Eftevaag }
38*758e9fbaSOystein Eftevaag 
39*758e9fbaSOystein Eftevaag TSS2_RC
tcti_common_cancel_checks(TSS2_TCTI_COMMON_CONTEXT * tcti_common)40*758e9fbaSOystein Eftevaag tcti_common_cancel_checks (
41*758e9fbaSOystein Eftevaag     TSS2_TCTI_COMMON_CONTEXT *tcti_common)
42*758e9fbaSOystein Eftevaag {
43*758e9fbaSOystein Eftevaag     if (tcti_common->state != TCTI_STATE_RECEIVE) {
44*758e9fbaSOystein Eftevaag         return TSS2_TCTI_RC_BAD_SEQUENCE;
45*758e9fbaSOystein Eftevaag     }
46*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
47*758e9fbaSOystein Eftevaag }
48*758e9fbaSOystein Eftevaag 
49*758e9fbaSOystein Eftevaag TSS2_RC
tcti_common_transmit_checks(TSS2_TCTI_COMMON_CONTEXT * tcti_common,const uint8_t * command_buffer)50*758e9fbaSOystein Eftevaag tcti_common_transmit_checks (
51*758e9fbaSOystein Eftevaag     TSS2_TCTI_COMMON_CONTEXT *tcti_common,
52*758e9fbaSOystein Eftevaag     const uint8_t *command_buffer)
53*758e9fbaSOystein Eftevaag {
54*758e9fbaSOystein Eftevaag     if (tcti_common->state != TCTI_STATE_TRANSMIT) {
55*758e9fbaSOystein Eftevaag         return TSS2_TCTI_RC_BAD_SEQUENCE;
56*758e9fbaSOystein Eftevaag     }
57*758e9fbaSOystein Eftevaag     if (command_buffer == NULL) {
58*758e9fbaSOystein Eftevaag         return TSS2_TCTI_RC_BAD_REFERENCE;
59*758e9fbaSOystein Eftevaag     }
60*758e9fbaSOystein Eftevaag 
61*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
62*758e9fbaSOystein Eftevaag }
63*758e9fbaSOystein Eftevaag 
64*758e9fbaSOystein Eftevaag TSS2_RC
tcti_common_receive_checks(TSS2_TCTI_COMMON_CONTEXT * tcti_common,size_t * response_size)65*758e9fbaSOystein Eftevaag tcti_common_receive_checks (
66*758e9fbaSOystein Eftevaag     TSS2_TCTI_COMMON_CONTEXT *tcti_common,
67*758e9fbaSOystein Eftevaag     size_t *response_size)
68*758e9fbaSOystein Eftevaag {
69*758e9fbaSOystein Eftevaag     if (tcti_common->state != TCTI_STATE_RECEIVE) {
70*758e9fbaSOystein Eftevaag         return TSS2_TCTI_RC_BAD_SEQUENCE;
71*758e9fbaSOystein Eftevaag     }
72*758e9fbaSOystein Eftevaag     if (response_size == NULL) {
73*758e9fbaSOystein Eftevaag         return TSS2_TCTI_RC_BAD_REFERENCE;
74*758e9fbaSOystein Eftevaag     }
75*758e9fbaSOystein Eftevaag 
76*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
77*758e9fbaSOystein Eftevaag }
78*758e9fbaSOystein Eftevaag 
79*758e9fbaSOystein Eftevaag TSS2_RC
tcti_common_set_locality_checks(TSS2_TCTI_COMMON_CONTEXT * tcti_common)80*758e9fbaSOystein Eftevaag tcti_common_set_locality_checks (
81*758e9fbaSOystein Eftevaag     TSS2_TCTI_COMMON_CONTEXT *tcti_common)
82*758e9fbaSOystein Eftevaag {
83*758e9fbaSOystein Eftevaag     if (tcti_common->state != TCTI_STATE_TRANSMIT) {
84*758e9fbaSOystein Eftevaag         return TSS2_TCTI_RC_BAD_SEQUENCE;
85*758e9fbaSOystein Eftevaag     }
86*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
87*758e9fbaSOystein Eftevaag }
88*758e9fbaSOystein Eftevaag 
89*758e9fbaSOystein Eftevaag TSS2_RC
tcti_make_sticky_not_implemented(TSS2_TCTI_CONTEXT * tctiContext,TPM2_HANDLE * handle,uint8_t sticky)90*758e9fbaSOystein Eftevaag tcti_make_sticky_not_implemented (
91*758e9fbaSOystein Eftevaag     TSS2_TCTI_CONTEXT *tctiContext,
92*758e9fbaSOystein Eftevaag     TPM2_HANDLE *handle,
93*758e9fbaSOystein Eftevaag     uint8_t sticky)
94*758e9fbaSOystein Eftevaag {
95*758e9fbaSOystein Eftevaag     (void)(tctiContext);
96*758e9fbaSOystein Eftevaag     (void)(handle);
97*758e9fbaSOystein Eftevaag     (void)(sticky);
98*758e9fbaSOystein Eftevaag     return TSS2_TCTI_RC_NOT_IMPLEMENTED;
99*758e9fbaSOystein Eftevaag }
100*758e9fbaSOystein Eftevaag 
101*758e9fbaSOystein Eftevaag TSS2_RC
header_unmarshal(const uint8_t * buf,tpm_header_t * header)102*758e9fbaSOystein Eftevaag header_unmarshal (
103*758e9fbaSOystein Eftevaag     const uint8_t *buf,
104*758e9fbaSOystein Eftevaag     tpm_header_t *header)
105*758e9fbaSOystein Eftevaag {
106*758e9fbaSOystein Eftevaag     TSS2_RC rc;
107*758e9fbaSOystein Eftevaag     size_t offset = 0;
108*758e9fbaSOystein Eftevaag 
109*758e9fbaSOystein Eftevaag     LOG_TRACE ("Parsing header from buffer: 0x%" PRIxPTR, (uintptr_t)buf);
110*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPM2_ST_Unmarshal (buf,
111*758e9fbaSOystein Eftevaag                                     TPM_HEADER_SIZE,
112*758e9fbaSOystein Eftevaag                                     &offset,
113*758e9fbaSOystein Eftevaag                                     &header->tag);
114*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
115*758e9fbaSOystein Eftevaag         LOG_ERROR ("Failed to unmarshal tag.");
116*758e9fbaSOystein Eftevaag         return rc;
117*758e9fbaSOystein Eftevaag     }
118*758e9fbaSOystein Eftevaag     rc = Tss2_MU_UINT32_Unmarshal (buf,
119*758e9fbaSOystein Eftevaag                                    TPM_HEADER_SIZE,
120*758e9fbaSOystein Eftevaag                                    &offset,
121*758e9fbaSOystein Eftevaag                                    &header->size);
122*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
123*758e9fbaSOystein Eftevaag         LOG_ERROR ("Failed to unmarshal command size.");
124*758e9fbaSOystein Eftevaag         return rc;
125*758e9fbaSOystein Eftevaag     }
126*758e9fbaSOystein Eftevaag     rc = Tss2_MU_UINT32_Unmarshal (buf,
127*758e9fbaSOystein Eftevaag                                    TPM_HEADER_SIZE,
128*758e9fbaSOystein Eftevaag                                    &offset,
129*758e9fbaSOystein Eftevaag                                    &header->code);
130*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
131*758e9fbaSOystein Eftevaag         LOG_ERROR ("Failed to unmarshal command code.");
132*758e9fbaSOystein Eftevaag     }
133*758e9fbaSOystein Eftevaag     return rc;
134*758e9fbaSOystein Eftevaag }
135*758e9fbaSOystein Eftevaag 
136*758e9fbaSOystein Eftevaag TSS2_RC
header_marshal(const tpm_header_t * header,uint8_t * buf)137*758e9fbaSOystein Eftevaag header_marshal (
138*758e9fbaSOystein Eftevaag     const tpm_header_t *header,
139*758e9fbaSOystein Eftevaag     uint8_t *buf)
140*758e9fbaSOystein Eftevaag {
141*758e9fbaSOystein Eftevaag     TSS2_RC rc;
142*758e9fbaSOystein Eftevaag     size_t offset = 0;
143*758e9fbaSOystein Eftevaag 
144*758e9fbaSOystein Eftevaag     LOG_TRACE ("Parsing header from buffer: 0x%" PRIxPTR, (uintptr_t)buf);
145*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPM2_ST_Marshal (header->tag,
146*758e9fbaSOystein Eftevaag                                   buf,
147*758e9fbaSOystein Eftevaag                                   TPM_HEADER_SIZE,
148*758e9fbaSOystein Eftevaag                                   &offset);
149*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
150*758e9fbaSOystein Eftevaag         LOG_ERROR ("Failed to marshal tag.");
151*758e9fbaSOystein Eftevaag         return rc;
152*758e9fbaSOystein Eftevaag     }
153*758e9fbaSOystein Eftevaag     rc = Tss2_MU_UINT32_Marshal (header->size,
154*758e9fbaSOystein Eftevaag                                  buf,
155*758e9fbaSOystein Eftevaag                                  TPM_HEADER_SIZE,
156*758e9fbaSOystein Eftevaag                                  &offset);
157*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
158*758e9fbaSOystein Eftevaag         LOG_ERROR ("Failed to marshal command size.");
159*758e9fbaSOystein Eftevaag         return rc;
160*758e9fbaSOystein Eftevaag     }
161*758e9fbaSOystein Eftevaag     rc = Tss2_MU_UINT32_Marshal (header->code,
162*758e9fbaSOystein Eftevaag                                  buf,
163*758e9fbaSOystein Eftevaag                                  TPM_HEADER_SIZE,
164*758e9fbaSOystein Eftevaag                                  &offset);
165*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
166*758e9fbaSOystein Eftevaag         LOG_ERROR ("Failed to marshal command code.");
167*758e9fbaSOystein Eftevaag     }
168*758e9fbaSOystein Eftevaag     return rc;
169*758e9fbaSOystein Eftevaag }
170