static TPM_RESULT execute_MTM_SetVerifiedPCRSelection(TPM_REQUEST *req, TPM_RESPONSE *rsp) { BYTE *ptr; UINT32 len; TPM_PCR_SELECTION verifiedSelection; TPM_RESULT res; /* compute parameter digest */ tpm_compute_in_param_digest(req); /* unmarshal input */ ptr = req->param; len = req->paramSize; if (tpm_unmarshal_TPM_PCR_SELECTION(&ptr, &len, &verifiedSelection) || len != 0) return TPM_BAD_PARAMETER; /* execute command */ res = MTM_SetVerifiedPCRSelection(&verifiedSelection, &req->auth1); /* marshal output */ rsp->paramSize = len = 0; rsp->param = ptr = NULL; return res; }
static TPM_RESULT execute_TPM_Quote(TPM_REQUEST *req, TPM_RESPONSE *rsp) { BYTE *ptr; UINT32 len; TPM_KEY_HANDLE keyHandle; TPM_NONCE extrnalData; TPM_PCR_SELECTION targetPCR; TPM_PCR_COMPOSITE *pcrData; UINT32 sigSize; BYTE *sig = NULL; TPM_RESULT res; pcrData = (TPM_PCR_COMPOSITE *)InOutBuf; /* compute parameter digest */ tpm_compute_in_param_digest(req); /* unmarshal input */ ptr = req->param; len = req->paramSize; if (tpm_unmarshal_TPM_KEY_HANDLE(&ptr, &len, &keyHandle) || tpm_unmarshal_TPM_NONCE(&ptr, &len, &extrnalData) || tpm_unmarshal_TPM_PCR_SELECTION(&ptr, &len, &targetPCR) || len != 0) return TPM_BAD_PARAMETER; /* execute command */ res = TPM_Quote(keyHandle, &extrnalData, &targetPCR, &req->auth1, pcrData, &sigSize, &sig); if (res != TPM_SUCCESS) return res; /* marshal output */ rsp->paramSize = len = sizeof_TPM_PCR_COMPOSITE((*pcrData)) + 4 + sigSize; rsp->param = ptr = ExtendBuf; if (ptr == NULL || tpm_marshal_TPM_PCR_COMPOSITE(&ptr, &len, pcrData) || tpm_marshal_UINT32(&ptr, &len, sigSize) || tpm_marshal_BLOB(&ptr, &len, sig, sigSize)) { free(rsp->param); res = TPM_FAIL; } free(sig); return res; }