xref: /aosp_15_r20/external/tpm2-tss/src/tss2-tcti/tcti-common.h (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 #ifndef TCTI_COMMON_H
7*758e9fbaSOystein Eftevaag #define TCTI_COMMON_H
8*758e9fbaSOystein Eftevaag 
9*758e9fbaSOystein Eftevaag #include <errno.h>
10*758e9fbaSOystein Eftevaag #include <stdbool.h>
11*758e9fbaSOystein Eftevaag 
12*758e9fbaSOystein Eftevaag #include "tss2_tcti.h"
13*758e9fbaSOystein Eftevaag 
14*758e9fbaSOystein Eftevaag #define TCTI_VERSION 0x2
15*758e9fbaSOystein Eftevaag 
16*758e9fbaSOystein Eftevaag #define TPM_HEADER_SIZE (sizeof (TPM2_ST) + sizeof (UINT32) + sizeof (UINT32))
17*758e9fbaSOystein Eftevaag 
18*758e9fbaSOystein Eftevaag typedef struct {
19*758e9fbaSOystein Eftevaag     TPM2_ST tag;
20*758e9fbaSOystein Eftevaag     UINT32 size;
21*758e9fbaSOystein Eftevaag     UINT32 code;
22*758e9fbaSOystein Eftevaag } tpm_header_t;
23*758e9fbaSOystein Eftevaag /*
24*758e9fbaSOystein Eftevaag  * The elements in this enumeration represent the possible states that the
25*758e9fbaSOystein Eftevaag  * TCTI can be in. The state machine is as follows:
26*758e9fbaSOystein Eftevaag  * An instantiated TCTI context begins in the TRANSMIT state:
27*758e9fbaSOystein Eftevaag  *   TRANSMIT:
28*758e9fbaSOystein Eftevaag  *     transmit:    success transitions the state machine to RECEIVE
29*758e9fbaSOystein Eftevaag  *                  failure leaves the state unchanged
30*758e9fbaSOystein Eftevaag  *     receive:     produces TSS2_TCTI_RC_BAD_SEQUENCE
31*758e9fbaSOystein Eftevaag  *     finalize:    transitions state machine to FINAL state
32*758e9fbaSOystein Eftevaag  *     cancel:      produces TSS2_TCTI_RC_BAD_SEQUENCE
33*758e9fbaSOystein Eftevaag  *     setLocality: success or failure leaves state unchanged
34*758e9fbaSOystein Eftevaag  *   RECEIVE:
35*758e9fbaSOystein Eftevaag  *     transmit:    produces TSS2_TCTI_RC_BAD_SEQUENCE
36*758e9fbaSOystein Eftevaag  *     receive:     success transitions the state machine to TRANSMIT
37*758e9fbaSOystein Eftevaag  *                  failure with the following RCs leave the state unchanged:
38*758e9fbaSOystein Eftevaag  *                    TRY_AGAIN, INSUFFICIENT_BUFFER, BAD_CONTEXT,
39*758e9fbaSOystein Eftevaag  *                    BAD_REFERENCE, BAD_VALUE, BAD_SEQUENCE
40*758e9fbaSOystein Eftevaag  *                  all other failures transition state machine to
41*758e9fbaSOystein Eftevaag  *                    TRANSMIT (not recoverable)
42*758e9fbaSOystein Eftevaag  *     finalize:    transitions state machine to FINAL state
43*758e9fbaSOystein Eftevaag  *     cancel:      success transitions state machine to TRANSMIT
44*758e9fbaSOystein Eftevaag  *                  failure leaves state unchanged
45*758e9fbaSOystein Eftevaag  *     setLocality: produces TSS2_TCTI_RC_BAD_SEQUENCE
46*758e9fbaSOystein Eftevaag  *   FINAL:
47*758e9fbaSOystein Eftevaag  *     all function calls produce TSS2_TCTI_RC_BAD_SEQUENCE
48*758e9fbaSOystein Eftevaag  */
49*758e9fbaSOystein Eftevaag typedef enum {
50*758e9fbaSOystein Eftevaag     TCTI_STATE_FINAL,
51*758e9fbaSOystein Eftevaag     TCTI_STATE_TRANSMIT,
52*758e9fbaSOystein Eftevaag     TCTI_STATE_RECEIVE,
53*758e9fbaSOystein Eftevaag } tcti_state_t;
54*758e9fbaSOystein Eftevaag 
55*758e9fbaSOystein Eftevaag typedef struct {
56*758e9fbaSOystein Eftevaag     TSS2_TCTI_CONTEXT_COMMON_V2 v2;
57*758e9fbaSOystein Eftevaag     tcti_state_t state;
58*758e9fbaSOystein Eftevaag     tpm_header_t header;
59*758e9fbaSOystein Eftevaag     uint8_t locality;
60*758e9fbaSOystein Eftevaag     bool partial;
61*758e9fbaSOystein Eftevaag } TSS2_TCTI_COMMON_CONTEXT;
62*758e9fbaSOystein Eftevaag 
63*758e9fbaSOystein Eftevaag /*
64*758e9fbaSOystein Eftevaag  */
65*758e9fbaSOystein Eftevaag TSS2_TCTI_COMMON_CONTEXT*
66*758e9fbaSOystein Eftevaag tcti_common_context_cast (TSS2_TCTI_CONTEXT *ctx);
67*758e9fbaSOystein Eftevaag /*
68*758e9fbaSOystein Eftevaag  * This function is used to "down cast" the Intel TCTI context to the opaque
69*758e9fbaSOystein Eftevaag  * context type.
70*758e9fbaSOystein Eftevaag  */
71*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT*
72*758e9fbaSOystein Eftevaag tcti_common_down_cast (TSS2_TCTI_COMMON_CONTEXT *ctx);
73*758e9fbaSOystein Eftevaag /*
74*758e9fbaSOystein Eftevaag  * This function performs checks on the common context structure passed to a
75*758e9fbaSOystein Eftevaag  * TCTI 'cancel' function.
76*758e9fbaSOystein Eftevaag  */
77*758e9fbaSOystein Eftevaag TSS2_RC
78*758e9fbaSOystein Eftevaag tcti_common_cancel_checks (
79*758e9fbaSOystein Eftevaag     TSS2_TCTI_COMMON_CONTEXT *tcti_common);
80*758e9fbaSOystein Eftevaag /*
81*758e9fbaSOystein Eftevaag  * This function performs common checks on the context structure and the
82*758e9fbaSOystein Eftevaag  * buffer passed into TCTI 'transmit' functions.
83*758e9fbaSOystein Eftevaag  */
84*758e9fbaSOystein Eftevaag TSS2_RC
85*758e9fbaSOystein Eftevaag tcti_common_transmit_checks (
86*758e9fbaSOystein Eftevaag     TSS2_TCTI_COMMON_CONTEXT *tcti_common,
87*758e9fbaSOystein Eftevaag     const uint8_t *command_buffer);
88*758e9fbaSOystein Eftevaag /*
89*758e9fbaSOystein Eftevaag  * This function performs common checks on the context structure, buffer and
90*758e9fbaSOystein Eftevaag  * size parameter passed to the TCTI 'receive' functions.
91*758e9fbaSOystein Eftevaag  */
92*758e9fbaSOystein Eftevaag TSS2_RC
93*758e9fbaSOystein Eftevaag tcti_common_receive_checks (
94*758e9fbaSOystein Eftevaag     TSS2_TCTI_COMMON_CONTEXT *tcti_common,
95*758e9fbaSOystein Eftevaag     size_t *response_size);
96*758e9fbaSOystein Eftevaag /*
97*758e9fbaSOystein Eftevaag  * This function performs checks on the common context structure passed to a
98*758e9fbaSOystein Eftevaag  * TCTI 'set_locality' function.
99*758e9fbaSOystein Eftevaag  */
100*758e9fbaSOystein Eftevaag TSS2_RC
101*758e9fbaSOystein Eftevaag tcti_common_set_locality_checks (
102*758e9fbaSOystein Eftevaag     TSS2_TCTI_COMMON_CONTEXT *tcti_common);
103*758e9fbaSOystein Eftevaag /*
104*758e9fbaSOystein Eftevaag  * Just a function with the right prototype that returns the not implemented
105*758e9fbaSOystein Eftevaag  * RC for the TCTI layer.
106*758e9fbaSOystein Eftevaag  */
107*758e9fbaSOystein Eftevaag TSS2_RC
108*758e9fbaSOystein Eftevaag tcti_make_sticky_not_implemented (
109*758e9fbaSOystein Eftevaag     TSS2_TCTI_CONTEXT *tctiContext,
110*758e9fbaSOystein Eftevaag     TPM2_HANDLE *handle,
111*758e9fbaSOystein Eftevaag     uint8_t sticky);
112*758e9fbaSOystein Eftevaag /*
113*758e9fbaSOystein Eftevaag  * Utility to function to parse the first 10 bytes of a buffer and populate
114*758e9fbaSOystein Eftevaag  * the 'header' structure with the results. The provided buffer is assumed to
115*758e9fbaSOystein Eftevaag  * be at least 10 bytes long.
116*758e9fbaSOystein Eftevaag  */
117*758e9fbaSOystein Eftevaag TSS2_RC
118*758e9fbaSOystein Eftevaag header_unmarshal (
119*758e9fbaSOystein Eftevaag     const uint8_t *buf,
120*758e9fbaSOystein Eftevaag     tpm_header_t *header);
121*758e9fbaSOystein Eftevaag /*
122*758e9fbaSOystein Eftevaag  */
123*758e9fbaSOystein Eftevaag TSS2_RC
124*758e9fbaSOystein Eftevaag header_marshal (
125*758e9fbaSOystein Eftevaag     const tpm_header_t *header,
126*758e9fbaSOystein Eftevaag     uint8_t *buf);
127*758e9fbaSOystein Eftevaag 
128*758e9fbaSOystein Eftevaag #endif
129