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

📄 rpc_ps.c

📁 TCG软件栈 linux系统上使用 为可信应用软件提供和 TPM通信的 接口 其网站上有很多关于使用此软件的测试用例
💻 C
字号:
/* * Licensed Materials - Property of IBM * * trousers - An open source TCG Software Stack * * (C) Copyright International Business Machines Corp. 2004-2006 * */#include <stdlib.h>#include <stdio.h>#include <syslog.h>#include <string.h>#include <netdb.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 "tcs_utils.h"#include "rpc_tcstp_tcs.h"TSS_RESULTtcs_wrap_RegisterKey(struct tcsd_thread_data *data){	TCS_CONTEXT_HANDLE hContext;	TSS_UUID WrappingKeyUUID;	TSS_UUID KeyUUID;	UINT32 cKeySize;	BYTE *rgbKey;	UINT32 cVendorData;	BYTE *gbVendorData;	TSS_RESULT result;	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	LogDebugFn("thread %zd context %x", THREAD_ID, hContext);	if (getData(TCSD_PACKET_TYPE_UUID, 1, &WrappingKeyUUID, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	if (getData(TCSD_PACKET_TYPE_UUID, 2, &KeyUUID, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	if (getData(TCSD_PACKET_TYPE_UINT32, 3, &cKeySize, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	rgbKey = calloc(1, cKeySize);	if (rgbKey == NULL) {		LogError("malloc of %d bytes failed.", cKeySize);		return TCSERR(TSS_E_OUTOFMEMORY);	}	if (getData(TCSD_PACKET_TYPE_PBYTE, 4, rgbKey, cKeySize, &data->comm)) {		free(rgbKey);		return TCSERR(TSS_E_INTERNAL_ERROR);	}	if (getData(TCSD_PACKET_TYPE_UINT32, 5, &cVendorData, 0, &data->comm)) {		free(rgbKey);		return TCSERR(TSS_E_INTERNAL_ERROR);	}	if (cVendorData == 0)		gbVendorData = NULL;	else {		gbVendorData = calloc(1, cVendorData);		if (gbVendorData == NULL) {			LogError("malloc of %d bytes failed.", cVendorData);			free(rgbKey);			return TCSERR(TSS_E_OUTOFMEMORY);		}		if (getData(TCSD_PACKET_TYPE_PBYTE, 6, gbVendorData, cVendorData, &data->comm)) {			free(rgbKey);			free(gbVendorData);			return TCSERR(TSS_E_INTERNAL_ERROR);		}	}	result = TCS_RegisterKey_Internal(hContext, &WrappingKeyUUID, &KeyUUID,				     cKeySize, rgbKey, cVendorData,				     gbVendorData);	free(rgbKey);	free(gbVendorData);	initData(&data->comm, 0);	data->comm.hdr.u.result = result;	return TSS_SUCCESS;}TSS_RESULTtcs_wrap_UnregisterKey(struct tcsd_thread_data *data){	TCS_CONTEXT_HANDLE hContext;	TSS_UUID uuid;	TSS_RESULT result;	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	LogDebugFn("thread %zd context %x", THREAD_ID, hContext);	if (getData(TCSD_PACKET_TYPE_UUID, 1, &uuid, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	result = TCS_UnregisterKey_Internal(hContext, uuid);	initData(&data->comm, 0);	data->comm.hdr.u.result = result;	return TSS_SUCCESS;}TSS_RESULTtcs_wrap_GetRegisteredKeyBlob(struct tcsd_thread_data *data){	TCS_CONTEXT_HANDLE hContext;	TSS_UUID uuid;	UINT32 pcKeySize;	BYTE *prgbKey;	TSS_RESULT result;	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	LogDebugFn("thread %zd context %x", THREAD_ID, hContext);	if (getData(TCSD_PACKET_TYPE_UUID, 1, &uuid, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	result = TCS_GetRegisteredKeyBlob_Internal(hContext, &uuid, &pcKeySize,					      &prgbKey);	if (result == TSS_SUCCESS) {		initData(&data->comm, 2);		if (setData(TCSD_PACKET_TYPE_UINT32, 0, &pcKeySize, 0, &data->comm)) {			free(prgbKey);			return TCSERR(TSS_E_INTERNAL_ERROR);		}		if (setData(TCSD_PACKET_TYPE_PBYTE, 1, prgbKey, pcKeySize, &data->comm)) {			free(prgbKey);			return TCSERR(TSS_E_INTERNAL_ERROR);		}		free(prgbKey);	} else		initData(&data->comm, 0);	data->comm.hdr.u.result = result;	return TSS_SUCCESS;}TSS_RESULTtcs_wrap_LoadKeyByUUID(struct tcsd_thread_data *data){	TCS_CONTEXT_HANDLE hContext;	TSS_UUID uuid;	TCS_LOADKEY_INFO info, *pInfo;	TCS_KEY_HANDLE phKeyTCSI;	TSS_RESULT result;	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	LogDebugFn("thread %zd context %x", THREAD_ID, hContext);	if (getData(TCSD_PACKET_TYPE_UUID, 1, &uuid, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	result = getData(TCSD_PACKET_TYPE_LOADKEY_INFO, 2, &info, 0, &data->comm);	if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)		pInfo = NULL;	else if (result)		return result;	else		pInfo = &info;	result = key_mgr_load_by_uuid(hContext, &uuid, pInfo, &phKeyTCSI);	if (result == TSS_SUCCESS) {		initData(&data->comm, 2);		if (setData(TCSD_PACKET_TYPE_UINT32, 0, &phKeyTCSI, 0, &data->comm)) {			return TCSERR(TSS_E_INTERNAL_ERROR);		}		if (pInfo != NULL) {			if (setData(TCSD_PACKET_TYPE_LOADKEY_INFO, 1, pInfo, 0, &data->comm)) {				return TCSERR(TSS_E_INTERNAL_ERROR);			}		}	} else {		if (result == TCSERR(TCS_E_KM_LOADFAILED) && pInfo != NULL) {			initData(&data->comm, 1);			if (setData(TCSD_PACKET_TYPE_LOADKEY_INFO, 0, pInfo, 0, &data->comm)) {				return TCSERR(TSS_E_INTERNAL_ERROR);			}		} else			initData(&data->comm, 0);	}	data->comm.hdr.u.result = result;	return TSS_SUCCESS;}TSS_RESULTtcs_wrap_EnumRegisteredKeys(struct tcsd_thread_data *data){	TCS_CONTEXT_HANDLE hContext;	TSS_UUID uuid, *pUuid;	UINT32 cKeyHierarchySize;	TSS_KM_KEYINFO *pKeyHierarchy;	unsigned int i, j;	TSS_RESULT result;	/* Receive */	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	LogDebugFn("thread %zd context %x", THREAD_ID, hContext);	result = getData(TCSD_PACKET_TYPE_UUID , 1, &uuid, 0, &data->comm);	if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)		pUuid = NULL;	else if (result)		return result;	else		pUuid = &uuid;	result = TCS_EnumRegisteredKeys_Internal(			hContext,			pUuid,			&cKeyHierarchySize,			&pKeyHierarchy);	if (result == TSS_SUCCESS) {		i=0;		initData(&data->comm, cKeyHierarchySize + 1);		if (setData(TCSD_PACKET_TYPE_UINT32, i++, &cKeyHierarchySize, 0, &data->comm)) {			free(pKeyHierarchy);			return TCSERR(TSS_E_INTERNAL_ERROR);		}		for (j = 0; j < cKeyHierarchySize; j++) {			if (setData(TCSD_PACKET_TYPE_KM_KEYINFO, i++, &pKeyHierarchy[j], 0, &data->comm)) {				free(pKeyHierarchy);				return TCSERR(TSS_E_INTERNAL_ERROR);			}		}		free(pKeyHierarchy);	} else		initData(&data->comm, 0);	data->comm.hdr.u.result = result;	return TSS_SUCCESS;}TSS_RESULTtcs_wrap_EnumRegisteredKeys2(struct tcsd_thread_data *data){	TCS_CONTEXT_HANDLE hContext;	TSS_UUID uuid, *pUuid;	UINT32 cKeyHierarchySize;	TSS_KM_KEYINFO2 *pKeyHierarchy;	unsigned int i, j;	TSS_RESULT result;	/* Receive */	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	LogDebugFn("thread %zd context %x", THREAD_ID, hContext);	result = getData(TCSD_PACKET_TYPE_UUID , 1, &uuid, 0, &data->comm);	if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)		pUuid = NULL;	else if (result)		return result;	else		pUuid = &uuid;	result = TCS_EnumRegisteredKeys_Internal2(			hContext,			pUuid,			&cKeyHierarchySize,			&pKeyHierarchy);	if (result == TSS_SUCCESS) {		i=0; 		initData(&data->comm, cKeyHierarchySize + 1);		if (setData(TCSD_PACKET_TYPE_UINT32, i++, &cKeyHierarchySize, 0, &data->comm)) {			free(pKeyHierarchy);			return TCSERR(TSS_E_INTERNAL_ERROR);		}		for (j = 0; j < cKeyHierarchySize; j++) {			if (setData(TCSD_PACKET_TYPE_KM_KEYINFO2, i++, &pKeyHierarchy[j], 0, &data->comm)) {				free(pKeyHierarchy);				return TCSERR(TSS_E_INTERNAL_ERROR);			}		}		free(pKeyHierarchy);	} else		initData(&data->comm, 0);	data->comm.hdr.u.result = result;	return TSS_SUCCESS;}TSS_RESULTtcs_wrap_GetRegisteredKeyByPublicInfo(struct tcsd_thread_data *data){	TCS_CONTEXT_HANDLE hContext;	TSS_RESULT result;	UINT32 algId, ulPublicInfoLength, keySize;	BYTE *rgbPublicInfo, *keyBlob;	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	LogDebugFn("thread %zd context %x", THREAD_ID, hContext);	if (getData(TCSD_PACKET_TYPE_UINT32, 1, &algId, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	if (getData(TCSD_PACKET_TYPE_UINT32, 2, &ulPublicInfoLength, 0, &data->comm))		return TCSERR(TSS_E_INTERNAL_ERROR);	rgbPublicInfo = (BYTE *)calloc(1, ulPublicInfoLength);	if (rgbPublicInfo == NULL) {		LogError("malloc of %d bytes failed.", ulPublicInfoLength);		return TCSERR(TSS_E_INTERNAL_ERROR);	}	if (getData(TCSD_PACKET_TYPE_PBYTE, 3, rgbPublicInfo, ulPublicInfoLength, &data->comm)) {		free(rgbPublicInfo);		return TCSERR(TSS_E_INTERNAL_ERROR);	}	result = TCSP_GetRegisteredKeyByPublicInfo_Internal(hContext, algId,			ulPublicInfoLength, rgbPublicInfo, &keySize, &keyBlob);	free(rgbPublicInfo);	if (result == TSS_SUCCESS) {		initData(&data->comm, 2);		if (setData(TCSD_PACKET_TYPE_UINT32, 0, &keySize, 0, &data->comm)) {			free(keyBlob);			return TCSERR(TSS_E_INTERNAL_ERROR);		}		if (setData(TCSD_PACKET_TYPE_PBYTE, 1, keyBlob, keySize, &data->comm)) {			free(keyBlob);			return TCSERR(TSS_E_INTERNAL_ERROR);		}		free(keyBlob);	} else		initData(&data->comm, 0);	data->comm.hdr.u.result = result;	return TSS_SUCCESS;}voidLoadBlob_LOADKEY_INFO(UINT64 *offset, BYTE *blob, TCS_LOADKEY_INFO *info){	LoadBlob_UUID(offset, blob, info->keyUUID);	LoadBlob_UUID(offset, blob, info->parentKeyUUID);	LoadBlob(offset, TCPA_DIGEST_SIZE, blob, info->paramDigest.digest);	LoadBlob_UINT32(offset, info->authData.AuthHandle, blob);	LoadBlob(offset, TCPA_NONCE_SIZE, blob, info->authData.NonceOdd.nonce);	LoadBlob(offset, TCPA_NONCE_SIZE, blob, info->authData.NonceEven.nonce);	LoadBlob_BOOL(offset, info->authData.fContinueAuthSession, blob);	LoadBlob(offset, TCPA_AUTHDATA_SIZE, blob, (BYTE *)&info->authData.HMAC);}voidUnloadBlob_LOADKEY_INFO(UINT64 *offset, BYTE *blob, TCS_LOADKEY_INFO *info){	UnloadBlob_UUID(offset, blob, &info->keyUUID);	UnloadBlob_UUID(offset, blob, &info->parentKeyUUID);	UnloadBlob(offset, TCPA_DIGEST_SIZE, blob, info->paramDigest.digest);	UnloadBlob_UINT32(offset, &info->authData.AuthHandle, blob);	UnloadBlob(offset, TCPA_NONCE_SIZE, blob, (BYTE *)&info->authData.NonceOdd.nonce);	UnloadBlob(offset, TCPA_NONCE_SIZE, blob, (BYTE *)&info->authData.NonceEven.nonce);	UnloadBlob_BOOL(offset, &info->authData.fContinueAuthSession, blob);	UnloadBlob(offset, TCPA_DIGEST_SIZE, blob, (BYTE *)&info->authData.HMAC);}voidLoadBlob_UUID(UINT64 *offset, BYTE * blob, TSS_UUID uuid){        LoadBlob_UINT32(offset, uuid.ulTimeLow, blob);        LoadBlob_UINT16(offset, uuid.usTimeMid, blob);        LoadBlob_UINT16(offset, uuid.usTimeHigh, blob);        LoadBlob_BYTE(offset, uuid.bClockSeqHigh, blob);        LoadBlob_BYTE(offset, uuid.bClockSeqLow, blob);        LoadBlob(offset, 6, blob, uuid.rgbNode);}voidUnloadBlob_UUID(UINT64 *offset, BYTE * blob, TSS_UUID *uuid){        if (!uuid) {                UnloadBlob_UINT32(offset, NULL, blob);                UnloadBlob_UINT16(offset, NULL, blob);                UnloadBlob_UINT16(offset, NULL, blob);                UnloadBlob_BYTE(offset, NULL, blob);                UnloadBlob_BYTE(offset, NULL, blob);                UnloadBlob(offset, 6, blob, NULL);                return;        }        memset(uuid, 0, sizeof(TSS_UUID));        UnloadBlob_UINT32(offset, &uuid->ulTimeLow, blob);        UnloadBlob_UINT16(offset, &uuid->usTimeMid, blob);        UnloadBlob_UINT16(offset, &uuid->usTimeHigh, blob);        UnloadBlob_BYTE(offset, &uuid->bClockSeqHigh, blob);        UnloadBlob_BYTE(offset, &uuid->bClockSeqLow, blob);        UnloadBlob(offset, 6, blob, uuid->rgbNode);}voidLoadBlob_KM_KEYINFO(UINT64 *offset, BYTE *blob, TSS_KM_KEYINFO *info){	LoadBlob_VERSION(offset, blob, (TPM_VERSION *)&(info->versionInfo));	LoadBlob_UUID(offset, blob, info->keyUUID);	LoadBlob_UUID(offset, blob, info->parentKeyUUID);	LoadBlob_BYTE(offset, info->bAuthDataUsage, blob);	LoadBlob_BOOL(offset, info->fIsLoaded, blob);	LoadBlob_UINT32(offset, info->ulVendorDataLength, blob);	LoadBlob(offset, info->ulVendorDataLength, blob, info->rgbVendorData);}voidLoadBlob_KM_KEYINFO2(UINT64 *offset, BYTE *blob, TSS_KM_KEYINFO2 *info){	LoadBlob_VERSION(offset, blob, (TPM_VERSION *)&(info->versionInfo));	LoadBlob_UUID(offset, blob, info->keyUUID);	LoadBlob_UUID(offset, blob, info->parentKeyUUID);	LoadBlob_BYTE(offset, info->bAuthDataUsage, blob);	/* Load the infos of the blob regarding the new data type TSS_KM_KEYINFO2 */	LoadBlob_UINT32(offset,info->persistentStorageType,blob);	LoadBlob_UINT32(offset, info->persistentStorageTypeParent,blob);	LoadBlob_BOOL(offset, info->fIsLoaded, blob);	LoadBlob_UINT32(offset, info->ulVendorDataLength, blob);	LoadBlob(offset, info->ulVendorDataLength, blob, info->rgbVendorData);}voidUnloadBlob_KM_KEYINFO(UINT64 *offset, BYTE *blob, TSS_KM_KEYINFO *info){	UnloadBlob_VERSION(offset, blob, (TPM_VERSION *)&(info->versionInfo));	UnloadBlob_UUID(offset, blob, &info->keyUUID);	UnloadBlob_UUID(offset, blob, &info->parentKeyUUID);	UnloadBlob_BYTE(offset, blob, &info->bAuthDataUsage);	UnloadBlob_BOOL(offset, &info->fIsLoaded, blob);	UnloadBlob_UINT32(offset, &info->ulVendorDataLength, blob);	UnloadBlob(offset, info->ulVendorDataLength, info->rgbVendorData, blob);}#if 0voidUnloadBlob_KM_KEYINFO2(UINT64 *offset, BYTE *blob, TSS_KM_KEYINFO2 *info){	UnloadBlob_VERSION(offset, blob, (TCPA_VERSION *)&(info->versionInfo));	UnloadBlob_UUID(offset, blob, &info->keyUUID);	UnloadBlob_UUID(offset, blob, &info->parentKeyUUID);	UnloadBlob_BYTE(offset, blob, &info->bAuthDataUsage);		/* Extract the infos of the blob regarding the new data type TSS_KM_KEYINFO2 */	UnloadBlob_UINT32(offset, &info->persistentStorageType, blob);	UnloadBlob_UINT32(offset, &info->persistentStorageTypeParent, blob);		UnloadBlob_BOOL(offset, &info->fIsLoaded, blob);	UnloadBlob_UINT32(offset, &info->ulVendorDataLength, blob);	UnloadBlob(offset, info->ulVendorDataLength, info->rgbVendorData, blob);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -