⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rpc.c

📁 TCG软件栈 linux系统上使用 为可信应用软件提供和 TPM通信的 接口 其网站上有很多关于使用此软件的测试用例
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -