diff options
Diffstat (limited to 'roms/skiboot/libstb/tss2/ibmtpm20tss/utils/tsstransmit.c')
-rw-r--r-- | roms/skiboot/libstb/tss2/ibmtpm20tss/utils/tsstransmit.c | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/roms/skiboot/libstb/tss2/ibmtpm20tss/utils/tsstransmit.c b/roms/skiboot/libstb/tss2/ibmtpm20tss/utils/tsstransmit.c new file mode 100644 index 000000000..36ef7ade7 --- /dev/null +++ b/roms/skiboot/libstb/tss2/ibmtpm20tss/utils/tsstransmit.c @@ -0,0 +1,184 @@ +/********************************************************************************/ +/* */ +/* Transmit and Receive Utility */ +/* Written by Ken Goldman */ +/* IBM Thomas J. Watson Research Center */ +/* */ +/* (c) Copyright IBM Corporation 2015 - 2020. */ +/* */ +/* All rights reserved. */ +/* */ +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions are */ +/* met: */ +/* */ +/* Redistributions of source code must retain the above copyright notice, */ +/* this list of conditions and the following disclaimer. */ +/* */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the names of the IBM Corporation nor the names of its */ +/* contributors may be used to endorse or promote products derived from */ +/* this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR */ +/* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */ +/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, */ +/* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY */ +/* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */ +/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE */ +/* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/********************************************************************************/ + +/* This file contains the interface that is not platform or interface specific + */ + +#include <string.h> +#include <stdio.h> + +#include "tssproperties.h" +#ifndef TPM_NOSOCKET +#include "tsssocket.h" +#endif +#include <ibmtss/tsserror.h> +#include <ibmtss/tssprint.h> + +#include "tssdev.h" +#include <ibmtss/tsstransmit.h> + +extern int tssVverbose; +extern int tssVerbose; + +/* local prototypes */ + +/* TSS_TransmitPlatform() transmits an administrative out of band command to the TPM through the + platform port. + + Supported by the simulator, not the TPM device. +*/ + +TPM_RC TSS_TransmitPlatform(TSS_CONTEXT *tssContext, uint32_t command, const char *message) +{ + TPM_RC rc = 0; + +#ifndef TPM_NOSOCKET + if ((strcmp(tssContext->tssInterfaceType, "socsim") == 0)) { + rc = TSS_Socket_TransmitPlatform(tssContext, command, message); + } + else +#else + command = command; + message = message; +#endif + if ((strcmp(tssContext->tssInterfaceType, "dev") == 0)) { + if (tssVerbose) printf("TSS_TransmitPlatform: device %s unsupported\n", + tssContext->tssInterfaceType); + rc = TSS_RC_INSUPPORTED_INTERFACE; + } + else { + if (tssVerbose) printf("TSS_TransmitPlatform: device %s unsupported\n", + tssContext->tssInterfaceType); + rc = TSS_RC_INSUPPORTED_INTERFACE; + } + return rc; +} + +/* TSS_TransmitCommand() transmits an administrative in band command to the TPM through the + command port. + + Supported by the simulator, not the TPM device. +*/ + +TPM_RC TSS_TransmitCommand(TSS_CONTEXT *tssContext, uint32_t command, const char *message) +{ + TPM_RC rc = 0; + +#ifndef TPM_NOSOCKET + if ((strcmp(tssContext->tssInterfaceType, "socsim") == 0)) { + rc = TSS_Socket_TransmitCommand(tssContext, command, message); + } + else +#else + command = command; + message = message; +#endif + if ((strcmp(tssContext->tssInterfaceType, "dev") == 0)) { + if (tssVerbose) printf("TSS_TransmitCommand: device %s unsupported\n", + tssContext->tssInterfaceType); + rc = TSS_RC_INSUPPORTED_INTERFACE; + } + else { + if (tssVerbose) printf("TSS_TransmitCommand: device %s unsupported\n", + tssContext->tssInterfaceType); + rc = TSS_RC_INSUPPORTED_INTERFACE; + } + return rc; +} + +/* TSS_Transmit() transmits a TPM command packet and receives a response using the command port. + The command type is hard coded to TPM_SEND_COMMAND. + +*/ + +TPM_RC TSS_Transmit(TSS_CONTEXT *tssContext, + uint8_t *responseBuffer, uint32_t *read, + const uint8_t *commandBuffer, uint32_t written, + const char *message) +{ + TPM_RC rc = 0; + +#ifndef TPM_NOSOCKET + if ((strcmp(tssContext->tssInterfaceType, "socsim") == 0)) { + rc = TSS_Socket_Transmit(tssContext, + responseBuffer, read, + commandBuffer, written, + message); + } + else +#endif + if (strcmp(tssContext->tssInterfaceType, "dev") == 0) { + rc = TSS_Dev_Transmit(tssContext, + responseBuffer, read, + commandBuffer, written, + message); + } + else { + if (tssVerbose) printf("TSS_Transmit: device %s unsupported\n", + tssContext->tssInterfaceType); + rc = TSS_RC_INSUPPORTED_INTERFACE; + } + return rc; +} + +/* TSS_Close() closes the connection to the TPM */ + +TPM_RC TSS_Close(TSS_CONTEXT *tssContext) +{ + TPM_RC rc = 0; + + /* only close if there was an open */ + if (!tssContext->tssFirstTransmit) { +#ifndef TPM_NOSOCKET + if ((strcmp(tssContext->tssInterfaceType, "socsim") == 0)) { + rc = TSS_Socket_Close(tssContext); + } + else +#endif + if (strcmp(tssContext->tssInterfaceType, "dev") == 0) { + rc = TSS_Dev_Close(tssContext); + } + else { + if (tssVerbose) printf("TSS_Transmit: device %s unsupported\n", + tssContext->tssInterfaceType); + rc = TSS_RC_INSUPPORTED_INTERFACE; + } + tssContext->tssFirstTransmit = TRUE; + } + return rc; +} |