uint32_t TPM_SealCurrPCR(uint32_t keyhandle, uint32_t pcrmap, unsigned char *keyauth, unsigned char *dataauth, unsigned char *data, unsigned int datalen, unsigned char *blob, unsigned int *bloblen) { uint32_t ret; unsigned char pcrinfo[MAXPCRINFOLEN]; uint32_t pcrlen; ret = TSS_GenPCRInfo(pcrmap, pcrinfo, &pcrlen); if (ret != 0) return ret; return TPM_Seal(keyhandle, pcrinfo, pcrlen, keyauth, dataauth, data, datalen, blob, bloblen); }
int TPM_disk_seal(struct disk_seal_entry *dst, const void* src, size_t size) { uint32_t rc; uint32_t infoSize; TPM_PCR_INFO_LONG info; TPM_STORED_DATA12 out; TPM_AUTH_SESSION osap = TPM_AUTH_SESSION_INIT; TPM_AUTHDATA sharedsecret; TPM_AUTHDATA auth; printk("Calling TPM_disk_seal\n"); rc = TPM_OSAP(TPM_ET_KEYHANDLE, TPM_SRK_KEYHANDLE, (void*)&vtpm_globals.srk_auth, &sharedsecret, &osap); if (rc) abort(); #ifdef DEBUG_SEAL_OPS int i; printk("to-seal:"); for(i=0; i < size; i++) printk(" %02x", ((uint8_t*)src)[i]); printk("\n"); #endif memset(auth, 0, 20); info.tag = TPM_TAG_PCR_INFO_LONG; info.localityAtCreation = 1 << vtpm_globals.hw_locality; info.localityAtRelease = 1 << vtpm_globals.hw_locality; info.creationPCRSelection.sizeOfSelect = 3; info.creationPCRSelection.pcrSelect = (void*)&dst->pcr_selection; info.releasePCRSelection.sizeOfSelect = 3; info.releasePCRSelection.pcrSelect = (void*)&dst->pcr_selection; memcpy(&info.digestAtCreation, &dst->digest_at_seal, 20); memcpy(&info.digestAtRelease, &dst->digest_release, 20); infoSize = 2 + 1 + 1 + 2 + 3 + 2 + 3 + 20 + 20; //infoSize = sizeof_TPM_PCR_INFO_LONG(&info); rc = TPM_Seal(TPM_SRK_KEYHANDLE, infoSize, &info, size, src, &out, (void*)&sharedsecret, (void*)&auth, &osap); TPM_TerminateHandle(osap.AuthHandle); #ifdef DEBUG_SEAL_OPS printk("TPM_Seal rc=%d encDataSize=%d sealInfoSize=%d\n", rc, out.encDataSize, out.sealInfoLongSize); #endif if (!rc) memcpy(dst->sealed_data, out.encData, 256); #ifdef DEBUG_SEAL_OPS uint8_t buf[512]; uint8_t *start = buf; uint8_t *end = pack_TPM_STORED_DATA12(buf, &out); printk("stored_data:"); while (start != end) { printk(" %02x", *start); start++; } printk("\n"); #endif free_TPM_STORED_DATA12(&out); return rc; }