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