📄 tcs.c
字号:
if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { // unpack OutBuf to get the tag, paramSize, & returnCode int i = BSG_UnpackList(OutBuf, 3, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_COMMAND_CODE, &returnCode); if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_AUTH1_COMMAND) { // Extract the remaining output parameters i += BSG_Unpack(BSG_TYPE_UINT32, OutBuf+i, outDataSize); if (TCS_Malloc(hContext, *outDataSize, outData) == TPM_FAIL) return TPM_SIZE; memcpy(*outData, OutBuf+i, *outDataSize); i += *outDataSize; unpackAuth(privAuth, OutBuf+i); vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); } else vtpmlogerror(VTPM_LOG_TCS, "TCSP_UnBind Failed with return code %s\n", tpm_get_error_name(returnCode)); } return(returnCode);}TPM_RESULT TCSP_CreateWrapKey(TCS_CONTEXT_HANDLE hContext, // in TCS_KEY_HANDLE hWrappingKey, // in TPM_ENCAUTH KeyUsageAuth, // in TPM_ENCAUTH KeyMigrationAuth, // in UINT32* pcKeySize, // in, out BYTE** prgbKey, // in, out TCS_AUTH* pAuth) // in, out{ // setup input/output parameters block TPM_TAG tag = TPM_TAG_RQU_AUTH1_COMMAND; UINT32 paramSize = 0; TPM_COMMAND_CODE ordinal = TPM_ORD_CreateWrapKey; TPM_RESULT returnCode = TPM_SUCCESS; // setup the TPM driver input and output buffers TDDL_RESULT hRes = TDDL_E_FAIL; TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; // check input params if (pcKeySize == NULL || *prgbKey == NULL || pAuth == NULL) return TPM_BAD_PARAMETER; // Convert Byte Input parameter in the input byte stream InBuf InLength = BSG_PackList(InBuf, 6, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_COMMAND_CODE, &ordinal, BSG_TYPE_UINT32, &hWrappingKey, BSG_TPM_ENCAUTH, KeyUsageAuth, BSG_TPM_ENCAUTH, KeyMigrationAuth); memcpy(InBuf+InLength, *prgbKey, *pcKeySize); InLength += *pcKeySize; InLength += packAuth(InBuf+InLength, pAuth); // fill paramSize again as we now have the correct size BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); // call the TPM driver if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { // unpack OutBuf to get the tag, paramSize, & returnCode int i = BSG_UnpackList(OutBuf, 3, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_RESULT, &returnCode); if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_AUTH1_COMMAND) { // Extract the remaining output parameters TPM_KEY wrappedKey; i += BSG_Unpack(BSG_TPM_KEY, OutBuf+i, &wrappedKey); unpackAuth(pAuth, OutBuf+i); // Fill prgbKey BYTE tempBuf[1024]; *pcKeySize = BSG_Pack(BSG_TPM_KEY, &wrappedKey, tempBuf); if (TCS_Malloc(hContext, *pcKeySize, prgbKey) == TPM_FAIL) return TPM_SIZE; memcpy(*prgbKey, tempBuf, *pcKeySize); vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); } else vtpmlogerror(VTPM_LOG_TCS, "TCSP_CreateWrapKey Failed with return code %s\n", tpm_get_error_name(returnCode)); } return(returnCode);}TPM_RESULT TCSP_LoadKeyByBlob(TCS_CONTEXT_HANDLE hContext, // in TCS_KEY_HANDLE hUnwrappingKey, // in UINT32 cWrappedKeyBlobSize, // in BYTE* rgbWrappedKeyBlob, // in TCS_AUTH* pAuth, // in, out TCS_KEY_HANDLE* phKeyTCSI, // out TCS_KEY_HANDLE* phKeyHMAC) // out{ // setup input/output parameters block TPM_TAG tag = TPM_TAG_RQU_AUTH1_COMMAND; UINT32 paramSize = 0; TPM_COMMAND_CODE ordinal = TPM_ORD_LoadKey; TPM_RESULT returnCode = TPM_SUCCESS; // setup the TPM driver input and output buffers TDDL_RESULT hRes = TDDL_E_FAIL; TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; // check input params if (rgbWrappedKeyBlob == NULL || pAuth == NULL || phKeyTCSI == NULL || phKeyHMAC == NULL) return TPM_BAD_PARAMETER; *phKeyHMAC = hUnwrappingKey; // the parent key is the one that the TPM use to make the HMAC calc // Convert Byte Input parameter in the input byte stream InBuf InLength = BSG_PackList(InBuf, 4, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_COMMAND_CODE, &ordinal, BSG_TYPE_UINT32, &hUnwrappingKey); memcpy(InBuf+InLength, rgbWrappedKeyBlob, cWrappedKeyBlobSize); InLength += cWrappedKeyBlobSize; InLength += packAuth(InBuf+InLength, pAuth); // fill paramSize again as we now have the correct size BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); // call the TPM driver if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { // unpack OutBuf to get the tag, paramSize, & returnCode int i = BSG_UnpackList(OutBuf, 3, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_COMMAND_CODE, &returnCode); if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_AUTH1_COMMAND) { // Extract the remaining output parameters i += BSG_Unpack(BSG_TYPE_UINT32, OutBuf+i, phKeyTCSI); unpackAuth(pAuth, OutBuf+i); if (!AddHandleToList(hContext, TPM_RT_KEY, *phKeyTCSI)) { vtpmlogerror(VTPM_LOG_TCS, "New KeyHandle not recorded\n"); } vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); } else vtpmlogerror(VTPM_LOG_TCS, "TCSP_LoadKeyByBlob Failed with return code %s\n", tpm_get_error_name(returnCode)); } return(returnCode);}TPM_RESULT TCSP_EvictKey(TCS_CONTEXT_HANDLE hContext, // in TCS_KEY_HANDLE hKey) // in{ // setup input/output parameters block TPM_TAG tag = TPM_TAG_RQU_COMMAND; UINT32 paramSize = 0; TPM_COMMAND_CODE ordinal = TPM_ORD_EvictKey; TPM_RESULT returnCode = TPM_SUCCESS; // setup the TPM driver input and output buffers TDDL_RESULT hRes = TDDL_E_FAIL; TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; // Convert Byte Input parameter in the input byte stream InBuf InLength = BSG_PackList(InBuf, 4, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_COMMAND_CODE, &ordinal, BSG_TYPE_UINT32, &hKey); // fill paramSize again as we now have the correct size BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); // call the TPM driver if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { // unpack OutBuf to get the tag, paramSize, & returnCode BSG_UnpackList(OutBuf, 3, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_COMMAND_CODE, &returnCode); if (!DeleteHandleFromList(hContext, hKey)) { vtpmlogerror(VTPM_LOG_TCS, "KeyHandle not removed from list\n"); } if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_COMMAND) { vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); } else { vtpmlogerror(VTPM_LOG_TCS, "TCSP_EvictKey Failed with return code %s\n", tpm_get_error_name(returnCode)); } } return(returnCode);}TPM_RESULT TCSP_GetRandom(TCS_CONTEXT_HANDLE hContext, // in UINT32* bytesRequested, // in, out BYTE** randomBytes) // out{ // setup input/output parameters block TPM_TAG tag = TPM_TAG_RQU_COMMAND; UINT32 paramSize = 0; TPM_COMMAND_CODE ordinal = TPM_ORD_GetRandom; TPM_RESULT returnCode = TPM_SUCCESS; // setup the TPM driver input and output buffers TDDL_RESULT hRes = TDDL_E_FAIL; TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; // check input params if (bytesRequested == NULL || *randomBytes == NULL){ return TPM_BAD_PARAMETER; } // Convert Byte Input parameter in the input byte stream InBuf InLength = BSG_PackList(InBuf, 4, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_COMMAND_CODE, &ordinal, BSG_TYPE_UINT32, bytesRequested); // fill paramSize again as we now have the correct size BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); // call the TPM driver if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { // unpack OutBuf to get the tag, paramSize, & returnCode int i = BSG_UnpackList(OutBuf, 3, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_COMMAND_CODE, &returnCode); if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_COMMAND) { // Extract the remaining output parameters BSG_Unpack(BSG_TYPE_UINT32, OutBuf+i, bytesRequested); if (TCS_Malloc(hContext, *bytesRequested, randomBytes) == TPM_FAIL) { return TPM_SIZE; } memcpy(*randomBytes, OutBuf+i+sizeof(UINT32), *bytesRequested); vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); } else { vtpmlogerror(VTPM_LOG_TCS, "TCSP_GetRandom Failed with return code %s\n", tpm_get_error_name(returnCode)); } } return(returnCode);}TPM_RESULT TCSP_ReadPubek(TCS_CONTEXT_HANDLE hContext, // in TPM_NONCE antiReplay, // in UINT32* pubEndorsementKeySize, // out BYTE** pubEndorsementKey, // out TPM_DIGEST* checksum) // out{ // setup input/output parameters block TPM_TAG tag = TPM_TAG_RQU_COMMAND; UINT32 paramSize = 0; TPM_COMMAND_CODE ordinal = TPM_ORD_ReadPubek; TPM_RESULT returnCode = TPM_SUCCESS; // setup the TPM driver input and output buffers TDDL_RESULT hRes = TDDL_E_FAIL; TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; // check input params if (pubEndorsementKeySize == NULL || pubEndorsementKey == NULL || checksum == NULL) { return TPM_BAD_PARAMETER; } // Convert Byte Input parameter in the input byte stream InBuf InLength = BSG_PackList(InBuf, 4, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_COMMAND_CODE, &ordinal, BSG_TPM_NONCE, &antiReplay); // fill paramSize again as we now have the correct size BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); // call the TPM driver if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { // unpack OutBuf to get the tag, paramSize, & returnCode int i = BSG_UnpackList(OutBuf, 3, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_COMMAND_CODE, &returnCode); if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_COMMAND) { // Extract the remaining output parameters TPM_PUBKEY pubEK; i += BSG_UnpackList(OutBuf+i, 2, BSG_TPM_PUBKEY, &pubEK, BSG_TPM_DIGEST, checksum); // fill EndorsementKey BYTE tempBuf[1024]; *pubEndorsementKeySize = BSG_Pack(BSG_TPM_PUBKEY, &pubEK, tempBuf); if (TCS_Malloc(hContext, *pubEndorsementKeySize, pubEndorsementKey) == TPM_FAIL) { return TPM_SIZE; } memcpy(*pubEndorsementKey, tempBuf, *pubEndorsementKeySize); vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); } else { vtpmlogerror(VTPM_LOG_TCS, "TCSP_ReadPubek Failed with return code %s\n", tpm_get_error_name(returnCode)); } } return(returnCode);}TPM_RESULT TCSP_SaveState(TCS_CONTEXT_HANDLE hContext) // in{ // setup input/output parameters block TPM_TAG tag = TPM_TAG_RQU_COMMAND; UINT32 paramSize = 0; TPM_COMMAND_CODE ordinal = TPM_ORD_SaveState; TPM_RESULT returnCode = TPM_SUCCESS; // setup the TPM driver input and output buffers TDDL_RESULT hRes = TDDL_E_FAIL; TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; // Convert Byte Input parameter in the input byte stream InBuf InLength = BSG_PackList(InBuf, 3, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_COMMAND_CODE, &ordinal); // fill paramSize again as we now have the correct size BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); // call the TPM driver if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { // unpack OutBuf to get the tag, paramSize, & returnCode BSG_UnpackList(OutBuf, 3, BSG_TPM_TAG, &tag, BSG_TYPE_UINT32, ¶mSize, BSG_TPM_COMMAND_CODE, &returnCode); if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_COMMAND) { vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); } else { vtpmlogerror(VTPM_LOG_TCS, "TCSP_SaveState Failed with return code %s\n", tpm_get_error_name(returnCode)); } } return(returnCode);}TPM_RESULT TCSP_RawTransmitData( UINT32 inDataSize, // in BYTE *inData, // in UINT32 *outDataSize,// in/out BYTE *outData) { // out TDDL_RESULT hRes; vtpmloginfo(VTPM_LOG_TCS, "Calling TransmitData directly.\n"); //FIXME: Add Context Management hRes = TDDL_TransmitData( inData, inDataSize, outData, outDataSize); if (hRes == TDDL_SUCCESS) { return TPM_SUCCESS; } else { vtpmlogerror(VTPM_LOG_TCS, "TCSP_RawTransmitData Failed with return code %s\n", tpm_get_error_name(TPM_IOERROR)); return TPM_IOERROR; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -