📄 rpc.c
字号:
/* * Licensed Materials - Property of IBM * * trousers - An open source TCG Software Stack * * (C) Copyright International Business Machines Corp. 2004-2007 * */#include <stdlib.h>#include <stdio.h>#include <syslog.h>#include <string.h>#include <netdb.h>#include <errno.h>#include "trousers/tss.h"#include "trousers_types.h"#include "tcs_tsp.h"#include "tcs_utils.h"#include "tcs_int_literals.h"#include "capabilities.h"#include "tcslog.h"#include "tcsd_wrap.h"#include "tcsd.h"#include "rpc_tcstp_tcs.h"/* Lock is not static because we need to reference it in the auth manager */MUTEX_DECLARE_INIT(tcsp_lock);voidLoadBlob_Auth_Special(UINT64 *offset, BYTE *blob, TPM_AUTH *auth){ LoadBlob(offset, TCPA_SHA1BASED_NONCE_LEN, blob, auth->NonceEven.nonce); LoadBlob_BOOL(offset, auth->fContinueAuthSession, blob); LoadBlob(offset, TCPA_SHA1BASED_NONCE_LEN, blob, (BYTE *)&auth->HMAC);}voidUnloadBlob_Auth_Special(UINT64 *offset, BYTE *blob, TPM_AUTH *auth){ UnloadBlob_UINT32(offset, &auth->AuthHandle, blob); UnloadBlob(offset, TCPA_SHA1BASED_NONCE_LEN, blob, auth->NonceOdd.nonce); UnloadBlob_BOOL(offset, &auth->fContinueAuthSession, blob); UnloadBlob(offset, TCPA_SHA1BASED_NONCE_LEN, blob, (BYTE *)&auth->HMAC);}intrecv_from_socket(int sock, void *buffer, int size){ int recv_size = 0, recv_total = 0; while (recv_total < size) { errno = 0; if ((recv_size = recv(sock, buffer+recv_total, size-recv_total, 0)) <= 0) { if (recv_size < 0) { if (errno == EINTR) continue; LogError("Socket receive connection error: %s.", strerror(errno)); } else { LogDebug("Socket connection closed."); } return -1; } recv_total += recv_size; } return recv_total;}intsend_to_socket(int sock, void *buffer, int size){ int send_size = 0, send_total = 0; while (send_total < size) { if ((send_size = send(sock, buffer+send_total, size-send_total, 0)) < 0) { LogError("Socket send connection error: %s.", strerror(errno)); return -1; } send_total += send_size; } return send_total;}voidinitData(struct tcsd_comm_data *comm, int parm_count){ /* min packet size should be the size of the header */ memset(&comm->hdr, 0, sizeof(struct tcsd_packet_hdr)); comm->hdr.packet_size = sizeof(struct tcsd_packet_hdr); if (parm_count > 0) { comm->hdr.type_offset = sizeof(struct tcsd_packet_hdr); comm->hdr.parm_offset = comm->hdr.type_offset + (sizeof(TCSD_PACKET_TYPE) * parm_count); comm->hdr.packet_size = comm->hdr.parm_offset; } memset(comm->buf, 0, comm->buf_size);}intloadData(UINT64 *offset, TCSD_PACKET_TYPE data_type, void *data, int data_size, BYTE *blob){ switch (data_type) { case TCSD_PACKET_TYPE_BYTE: LoadBlob_BYTE(offset, *((BYTE *) (data)), blob); break; case TCSD_PACKET_TYPE_BOOL: LoadBlob_BOOL(offset, *((TSS_BOOL *) (data)), blob); break; case TCSD_PACKET_TYPE_UINT16: LoadBlob_UINT16(offset, *((UINT16 *) (data)), blob); break; case TCSD_PACKET_TYPE_UINT32: LoadBlob_UINT32(offset, *((UINT32 *) (data)), blob); break; case TCSD_PACKET_TYPE_UINT64: LoadBlob_UINT64(offset, *((UINT64 *) (data)), blob); break; case TCSD_PACKET_TYPE_PBYTE: LoadBlob(offset, data_size, blob, data); break; case TCSD_PACKET_TYPE_NONCE: LoadBlob(offset, sizeof(TCPA_NONCE), blob, ((TCPA_NONCE *)data)->nonce); break; case TCSD_PACKET_TYPE_DIGEST: LoadBlob(offset, sizeof(TCPA_DIGEST), blob, ((TCPA_DIGEST *)data)->digest); break; case TCSD_PACKET_TYPE_AUTH: LoadBlob_Auth_Special(offset, blob, ((TPM_AUTH *)data)); break; case TCSD_PACKET_TYPE_UUID: LoadBlob_UUID(offset, blob, *((TSS_UUID *)data)); break; case TCSD_PACKET_TYPE_ENCAUTH: LoadBlob(offset, sizeof(TCPA_ENCAUTH), blob, ((TCPA_ENCAUTH *)data)->authdata); break; case TCSD_PACKET_TYPE_VERSION: LoadBlob_VERSION(offset, blob, ((TPM_VERSION *)data)); break; case TCSD_PACKET_TYPE_KM_KEYINFO: LoadBlob_KM_KEYINFO(offset, blob, ((TSS_KM_KEYINFO *)data)); break; case TCSD_PACKET_TYPE_KM_KEYINFO2: LoadBlob_KM_KEYINFO2(offset, blob, ((TSS_KM_KEYINFO2 *)data)); break; case TCSD_PACKET_TYPE_LOADKEY_INFO: LoadBlob_LOADKEY_INFO(offset, blob, ((TCS_LOADKEY_INFO *)data)); break; case TCSD_PACKET_TYPE_PCR_EVENT: LoadBlob_PCR_EVENT(offset, blob, ((TSS_PCR_EVENT *)data)); break; case TCSD_PACKET_TYPE_SECRET: LoadBlob(offset, sizeof(TCPA_SECRET), blob, ((TCPA_SECRET *)data)->authdata); break; default: LogError("TCSD packet type unknown! (0x%x)", data_type & 0xff); return TCSERR(TSS_E_INTERNAL_ERROR); } return TSS_SUCCESS;}#if 0intsetData(BYTE dataType, int index, void *theData, int theDataSize, struct tcsd_packet_hdr *hdr){ UINT64 offset; if (index == 0) { /* min packet size should be everything except the 1 byte 'data' field */ hdr->packet_size = sizeof(struct tcsd_packet_hdr) - 1; hdr->num_parms = 0; memset(hdr->parm_types, 0, sizeof(hdr->parm_types)); } DBG_ASSERT(hdr->packet_size + theDataSize < USHRT_MAX); offset = hdr->packet_size; if (index >= TCSD_MAX_NUM_PARMS) { LogError("Too many elements in TCSD packet!"); return TCSERR(TSS_E_INTERNAL_ERROR); } switch (dataType) { case TCSD_PACKET_TYPE_BYTE: LoadBlob_BYTE(&offset, *((BYTE *) (theData)), (void *)hdr); break; case TCSD_PACKET_TYPE_BOOL: LoadBlob_BOOL(&offset, *((TSS_BOOL *) (theData)), (void *)hdr); break; case TCSD_PACKET_TYPE_UINT16: LoadBlob_UINT16(&offset, *((UINT16 *) (theData)), (void *)hdr); break; case TCSD_PACKET_TYPE_UINT32: LoadBlob_UINT32(&offset, *((UINT32 *) (theData)), (void *)hdr); break; case TCSD_PACKET_TYPE_PBYTE: LoadBlob(&offset, theDataSize, (void *)hdr, theData); break; case TCSD_PACKET_TYPE_NONCE: LoadBlob(&offset, sizeof(TCPA_NONCE), (void *)hdr, ((TCPA_NONCE *)theData)->nonce); break; case TCSD_PACKET_TYPE_DIGEST: LoadBlob(&offset, sizeof(TCPA_DIGEST), (void *)hdr, ((TCPA_DIGEST *)theData)->digest); break; case TCSD_PACKET_TYPE_AUTH: LoadBlob_Auth_Special(&offset, (void *)hdr, ((TPM_AUTH *)theData)); break; case TCSD_PACKET_TYPE_ENCAUTH: LoadBlob(&offset, sizeof(TCPA_ENCAUTH), (void *)hdr, ((TCPA_ENCAUTH *)theData)->authdata); break; case TCSD_PACKET_TYPE_VERSION: LoadBlob_VERSION(&offset, (void *)hdr, ((TCPA_VERSION *)theData)); break;#ifdef TSS_BUILD_PS case TCSD_PACKET_TYPE_KM_KEYINFO: LoadBlob_KM_KEYINFO(&offset, (void *)hdr, ((TSS_KM_KEYINFO *)theData)); break; case TCSD_PACKET_TYPE_LOADKEY_INFO: LoadBlob_LOADKEY_INFO(&offset, (void *)hdr, ((TCS_LOADKEY_INFO *)theData)); break; case TCSD_PACKET_TYPE_UUID: LoadBlob_UUID(&offset, (void *)hdr, *((TSS_UUID *)theData)); break;#endif#ifdef TSS_BUILD_PCR_EVENT case TCSD_PACKET_TYPE_PCR_EVENT: LoadBlob_PCR_EVENT(&offset, (void *)hdr, ((TSS_PCR_EVENT *)theData)); break;#endif default: LogError("TCSD packet type unknown! (0x%x)", dataType & 0xff); return TCSERR(TSS_E_INTERNAL_ERROR); } hdr->parm_types[index] = dataType; hdr->packet_size = offset; hdr->num_parms++; return 0;}#elseintsetData(TCSD_PACKET_TYPE dataType, int index, void *theData, int theDataSize, struct tcsd_comm_data *comm){ UINT64 old_offset, offset; TSS_RESULT result; TCSD_PACKET_TYPE *type; /* Calculate the size of the area needed (use NULL for blob address) */ offset = 0; if ((result = loadData(&offset, dataType, theData, theDataSize, NULL)) != TSS_SUCCESS) return result; if (((int)comm->hdr.packet_size + (int)offset) < 0) { LogError("Too much data to be transmitted!"); return TCSERR(TSS_E_INTERNAL_ERROR); } if (((int)comm->hdr.packet_size + (int)offset) > comm->buf_size) { /* reallocate the buffer */ BYTE *buffer; int buffer_size = comm->hdr.packet_size + offset;#if 0 static int realloc_scalar = 1; realloc_scalar *= TCSD_COMMBUF_REALLOC_SCALAR; if (((int)offset * realloc_scalar) + buffer_size < 0) buffer_size = INT_MAX; else buffer_size += (int)offset * realloc_scalar; LogDebug("Increasing communication buffer by %d bytes.", (int)offset * realloc_scalar);#endif LogDebug("Increasing communication buffer to %d bytes.", buffer_size); buffer = realloc(comm->buf, buffer_size); if (buffer == NULL) { LogError("realloc of %d bytes failed.", buffer_size); return TCSERR(TSS_E_INTERNAL_ERROR); } comm->buf_size = buffer_size; comm->buf = buffer; } offset = old_offset = comm->hdr.parm_offset + comm->hdr.parm_size; if ((result = loadData(&offset, dataType, theData, theDataSize, comm->buf)) != TSS_SUCCESS) return result; type = (TCSD_PACKET_TYPE *)(comm->buf + comm->hdr.type_offset) + index; *type = dataType; comm->hdr.type_size += sizeof(TCSD_PACKET_TYPE); comm->hdr.parm_size += (offset - old_offset); comm->hdr.packet_size = offset; comm->hdr.num_parms++; return TSS_SUCCESS;}#endif#if 0UINT32getData(BYTE dataType, int index, void *theData, int theDataSize, struct tsp_packet * packet){ UINT64 offset; if (index == 0) packet->dataSize = 0; offset = packet->dataSize; if (index >= TCSD_MAX_NUM_PARMS) { LogError("Too many elements in TCSD packet!"); return TCSERR(TSS_E_INTERNAL_ERROR); } if (index >= packet->numParms || dataType != packet->types[index]) { LogDebug("Data type of TCS packet element %d doesn't match.", index); return TSS_TCP_RPC_BAD_PACKET_TYPE; } switch (dataType) { case TCSD_PACKET_TYPE_BYTE: UnloadBlob_BYTE(&offset, (BYTE *) (theData), packet->dataBuffer); break; case TCSD_PACKET_TYPE_BOOL: UnloadBlob_BOOL(&offset, (TSS_BOOL *) (theData), packet->dataBuffer); break; case TCSD_PACKET_TYPE_UINT16: UnloadBlob_UINT16(&offset, (UINT16 *) (theData), packet->dataBuffer); break; case TCSD_PACKET_TYPE_UINT32: UnloadBlob_UINT32(&offset, (UINT32 *) (theData), packet->dataBuffer); break; case TCSD_PACKET_TYPE_PBYTE: UnloadBlob(&offset, theDataSize, packet->dataBuffer, theData); break; case TCSD_PACKET_TYPE_NONCE: UnloadBlob(&offset, sizeof(TCPA_NONCE), packet->dataBuffer, ((TCPA_NONCE *) (theData))->nonce); break; case TCSD_PACKET_TYPE_DIGEST: UnloadBlob(&offset, sizeof(TCPA_DIGEST), packet->dataBuffer, ((TCPA_DIGEST *) (theData))->digest); break; case TCSD_PACKET_TYPE_AUTH: UnloadBlob_Auth_Special(&offset, packet->dataBuffer, ((TPM_AUTH *) theData)); break; case TCSD_PACKET_TYPE_ENCAUTH: UnloadBlob(&offset, sizeof(TCPA_ENCAUTH), packet->dataBuffer, ((TCPA_ENCAUTH *) theData)->authdata); break; case TCSD_PACKET_TYPE_VERSION: UnloadBlob_VERSION(&offset, packet->dataBuffer, ((TCPA_VERSION *) theData)); break;#ifdef TSS_BUILD_PS case TCSD_PACKET_TYPE_KM_KEYINFO: UnloadBlob_KM_KEYINFO(&offset, packet->dataBuffer, ((TSS_KM_KEYINFO*)theData)); break; case TCSD_PACKET_TYPE_LOADKEY_INFO: UnloadBlob_LOADKEY_INFO(&offset, packet->dataBuffer, ((TCS_LOADKEY_INFO *)theData)); break; case TCSD_PACKET_TYPE_UUID: UnloadBlob_UUID(&offset, packet->dataBuffer, (TSS_UUID *) theData); break;#endif#ifdef TSS_BUILD_PCR_EVENT case TCSD_PACKET_TYPE_PCR_EVENT: if ((UnloadBlob_PCR_EVENT(&offset, packet->dataBuffer, ((TSS_PCR_EVENT *)theData)))) return TCSERR(TSS_E_OUTOFMEMORY);#endif break; default: LogError("TCSD packet type unknown! (0x%x)", dataType & 0xff); return TCSERR(TSS_E_INTERNAL_ERROR); } packet->dataSize = offset; return TSS_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -