TPM_RESULT cap_pid(UINT32 subCapSize, BYTE *subCap, UINT32 *respSize, BYTE **resp) { TPM_PROTOCOL_ID id; if (tpm_unmarshal_TPM_PROTOCOL_ID(&subCap, &subCapSize, &id)) return TPM_BAD_MODE; switch (id) { case TPM_PID_OIAP: case TPM_PID_OSAP: case TPM_PID_ADIP: case TPM_PID_ADCP: case TPM_PID_OWNER: /* WATCH: not yet implemented case TPM_PID_DSAP: */ case TPM_PID_TRANSPORT: return return_BOOL(respSize, resp, TRUE); default: return return_BOOL(respSize, resp, FALSE); } }
static TPM_RESULT execute_TPM_TakeOwnership(TPM_REQUEST *req, TPM_RESPONSE *rsp) { BYTE *ptr; UINT32 len; TPM_PROTOCOL_ID protocolID; UINT32 encOwnerAuthSize; BYTE *encOwnerAuth; UINT32 encSrkAuthSize; BYTE *encSrkAuth; TPM_KEY srkParams; TPM_KEY srkPub; TPM_RESULT res; /* compute parameter digest */ tpm_compute_in_param_digest(req); /* unmarshal input */ ptr = req->param; len = req->paramSize; if (tpm_unmarshal_TPM_PROTOCOL_ID(&ptr, &len, &protocolID) || tpm_unmarshal_UINT32(&ptr, &len, &encOwnerAuthSize) || tpm_unmarshal_BLOB(&ptr, &len, &encOwnerAuth, encOwnerAuthSize) || tpm_unmarshal_UINT32(&ptr, &len, &encSrkAuthSize) || tpm_unmarshal_BLOB(&ptr, &len, &encSrkAuth, encSrkAuthSize) || tpm_unmarshal_TPM_KEY(&ptr, &len, &srkParams) || len != 0) return TPM_BAD_PARAMETER; /* execute command */ res = TPM_TakeOwnership(protocolID, encOwnerAuthSize, encOwnerAuth, encSrkAuthSize, encSrkAuth, &srkParams, &req->auth1, &srkPub); if (res != TPM_SUCCESS) return res; /* marshal output */ rsp->paramSize = len = sizeof_TPM_KEY(srkPub); rsp->param = ptr = malloc(len); if (ptr == NULL || tpm_marshal_TPM_KEY(&ptr, &len, &srkPub)) { free(rsp->param); res = TPM_FAIL; } free_TPM_KEY(srkPub); return res; }