int TPM_disk_seal(struct disk_seal_entry *dst, const void* src, size_t size)
{
uint32_t rc;
- TPM_PCR_INFO info;
- TPM_STORED_DATA out;
+ 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);
#endif
memset(auth, 0, 20);
- info.pcrSelection.sizeOfSelect = 3;
- info.pcrSelection.pcrSelect = (void*)&dst->pcr_selection;
+ 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);
- rc = TPM_Seal(TPM_SRK_KEYHANDLE, 45, &info, size, src, &out,
+ 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.sealInfoSize);
+ 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_DATA(buf, &out);
+ uint8_t *end = pack_TPM_STORED_DATA12(buf, &out);
printk("stored_data:");
while (start != end) {
printk(" %02x", *start);
printk("\n");
#endif
- free_TPM_STORED_DATA(&out);
+ free_TPM_STORED_DATA12(&out);
return rc;
}
int TPM_disk_unseal(void *dst, size_t size, const struct disk_seal_entry *src)
{
uint32_t rc;
- TPM_STORED_DATA in;
+ TPM_STORED_DATA12 in;
TPM_AUTH_SESSION oiap = TPM_AUTH_SESSION_INIT;
TPM_AUTHDATA auth;
uint32_t outSize = 0;
uint8_t *out = NULL;
+ printk("Calling TPM_disk_unseal\n");
+
rc = TPM_OIAP(&oiap);
if (rc) abort();
memset(auth, 0, 20);
- in.ver = TPM_STRUCT_VER_1_1;
- in.sealInfoSize = 45;
- in.sealInfo.pcrSelection.sizeOfSelect = 3;
- in.sealInfo.pcrSelection.pcrSelect = (void*)&src->pcr_selection;
- memcpy(&in.sealInfo.digestAtCreation, &src->digest_at_seal, 20);
- memcpy(&in.sealInfo.digestAtRelease, &src->digest_release, 20);
+ in.tag = TPM_TAG_STORED_DATA12;
+ in.et = 0;
+ //in.sealInfoLongSize = sizeof_TPM_PCR_INFO_LONG(&in.sealInfoLong);
+ in.sealInfoLongSize = 2 + 1 + 1 + 2 + 3 + 2 + 3 + 20 + 20;
+ in.sealInfoLong.tag = TPM_TAG_PCR_INFO_LONG;
+ in.sealInfoLong.localityAtCreation = 1 << vtpm_globals.hw_locality;
+ in.sealInfoLong.localityAtRelease = 1 << vtpm_globals.hw_locality;
+ in.sealInfoLong.creationPCRSelection.sizeOfSelect = 3;
+ in.sealInfoLong.creationPCRSelection.pcrSelect = (void*)&src->pcr_selection;
+ in.sealInfoLong.releasePCRSelection.sizeOfSelect = 3;
+ in.sealInfoLong.releasePCRSelection.pcrSelect = (void*)&src->pcr_selection;
+ memcpy(&in.sealInfoLong.digestAtCreation, &src->digest_at_seal, 20);
+ memcpy(&in.sealInfoLong.digestAtRelease, &src->digest_release, 20);
in.encDataSize = 256;
in.encData = (void*)src->sealed_data;
#ifdef DEBUG_SEAL_OPS
uint8_t buf[512];
uint8_t *start = buf;
- uint8_t *end = pack_TPM_STORED_DATA(buf, &in);
+ uint8_t *end = pack_TPM_STORED_DATA12(buf, &in);
printk("stored_data:");
while (start != end) {
printk(" %02x", *start);
#define pack_TPM_MIGRATE_SCHEME(p, t) pack_UINT16(p, t)
#define pack_TPM_PHYSICAL_PRESENCE(p, t) pack_UINT16(p, t)
#define pack_TPM_KEY_FLAGS(p, t) pack_UINT32(p, t)
+#define pack_TPM_LOCALITY_SELECTION(p, t) pack_BYTE(p, t)
#define unpack_TPM_RESULT(p, t) unpack_UINT32(p, t)
#define unpack_TPM_PCRINDEX(p, t) unpack_UINT32(p, t)
#define unpack_TPM_MIGRATE_SCHEME(p, t) unpack_UINT16(p, t)
#define unpack_TPM_PHYSICAL_PRESENCE(p, t) unpack_UINT16(p, t)
#define unpack_TPM_KEY_FLAGS(p, t) unpack_UINT32(p, t)
+#define unpack_TPM_LOCALITY_SELECTION(p, t) unpack_BYTE(p, t)
#define unpack3_TPM_RESULT(p, l, m, t) unpack3_UINT32(p, l, m, t)
#define unpack3_TPM_PCRINDEX(p, l, m, t) unpack3_UINT32(p, l, m, t)
#define unpack3_TPM_MIGRATE_SCHEME(p, l, m, t) unpack3_UINT16(p, l, m, t)
#define unpack3_TPM_PHYSICAL_PRESENCE(p, l, m, t) unpack3_UINT16(p, l, m, t)
#define unpack3_TPM_KEY_FLAGS(p, l, m, t) unpack3_UINT32(p, l, m, t)
+#define unpack3_TPM_LOCALITY_SELECTION(p, l, m, t) unpack3_BYTE(p, l, m, t)
#define sizeof_TPM_RESULT(t) sizeof_UINT32(t)
#define sizeof_TPM_PCRINDEX(t) sizeof_UINT32(t)
#define sizeof_TPM_MIGRATE_SCHEME(t) sizeof_UINT16(t)
#define sizeof_TPM_PHYSICAL_PRESENCE(t) sizeof_UINT16(t)
#define sizeof_TPM_KEY_FLAGS(t) sizeof_UINT32(t)
+#define sizeof_TPM_LOCALITY_SELECTION(t) sizeof_BYTE(t)
#define pack_TPM_AUTH_HANDLE(p, t) pack_UINT32(p, t)
#define pack_TCS_CONTEXT_HANDLE(p, t) pack_UINT32(p, t)
#define unpack_TPM_PAYLOAD_TYPE(p, t) unpack_BYTE(p, t)
#define unpack_TPM_TAG(p, t) unpack_UINT16(p, t)
#define unpack_TPM_STRUCTURE_TAG(p, t) unpack_UINT16(p, t)
+#define unpack3_TPM_STRUCTURE_TAG(p, l, m, t) unpack3_UINT16(p, l, m, t)
#define sizeof_TPM_SECRET(t) sizeof_TPM_AUTHDATA(t)
#define sizeof_TPM_ENCAUTH(t) sizeof_TPM_AUTHDATA(t)
return rc;
}
+inline BYTE* pack_TPM_PCR_INFO_LONG(BYTE* ptr, const TPM_PCR_INFO_LONG* p) {
+ ptr = pack_TPM_STRUCTURE_TAG(ptr, p->tag);
+ ptr = pack_TPM_LOCALITY_SELECTION(ptr, p->localityAtCreation);
+ ptr = pack_TPM_LOCALITY_SELECTION(ptr, p->localityAtRelease);
+ ptr = pack_TPM_PCR_SELECTION(ptr, &p->creationPCRSelection);
+ ptr = pack_TPM_PCR_SELECTION(ptr, &p->releasePCRSelection);
+ ptr = pack_TPM_COMPOSITE_HASH(ptr, &p->digestAtCreation);
+ ptr = pack_TPM_COMPOSITE_HASH(ptr, &p->digestAtRelease);
+ return ptr;
+}
+
+inline int sizeof_TPM_PCR_INFO_LONG(const TPM_PCR_INFO_LONG* p) {
+ int rc = 0;
+ rc += sizeof_TPM_STRUCTURE_TAG(p->tag);
+ rc += sizeof_TPM_LOCALITY_SELECTION(p->localityAtCreation);
+ rc += sizeof_TPM_LOCALITY_SELECTION(p->localityAtRelease);
+ rc += sizeof_TPM_PCR_SELECTION(&p->creationPCRSelection);
+ rc += sizeof_TPM_PCR_SELECTION(&p->releasePCRSelection);
+ rc += sizeof_TPM_COMPOSITE_HASH(&p->digestAtCreation);
+ rc += sizeof_TPM_COMPOSITE_HASH(&p->digestAtRelease);
+ return rc;
+}
+
+inline int unpack3_TPM_PCR_INFO_LONG(BYTE* ptr, UINT32* pos, UINT32 max, TPM_PCR_INFO_LONG* p, UnpackPtr alloc) {
+ return unpack3_TPM_STRUCTURE_TAG(ptr, pos, max, &p->tag) ||
+ unpack3_TPM_LOCALITY_SELECTION(ptr, pos, max,
+ &p->localityAtCreation) ||
+ unpack3_TPM_LOCALITY_SELECTION(ptr, pos, max,
+ &p->localityAtRelease) ||
+ unpack3_TPM_PCR_SELECTION(ptr, pos, max,
+ &p->creationPCRSelection, alloc) ||
+ unpack3_TPM_PCR_SELECTION(ptr, pos, max,
+ &p->releasePCRSelection, alloc) ||
+ unpack3_TPM_COMPOSITE_HASH(ptr, pos, max,
+ &p->digestAtCreation) ||
+ unpack3_TPM_COMPOSITE_HASH(ptr, pos, max, &p->digestAtRelease);
+}
inline BYTE* pack_TPM_PCR_COMPOSITE(BYTE* ptr, const TPM_PCR_COMPOSITE* p) {
ptr = pack_TPM_PCR_SELECTION(ptr, &p->select);
return rc;
}
+inline BYTE* pack_TPM_STORED_DATA12(BYTE* ptr, const TPM_STORED_DATA12* d) {
+ ptr = pack_TPM_STRUCTURE_TAG(ptr, d->tag);
+ ptr = pack_TPM_ENTITY_TYPE(ptr, d->et);
+ ptr = pack_UINT32(ptr, d->sealInfoLongSize);
+ if(d->sealInfoLongSize) {
+ ptr = pack_TPM_PCR_INFO_LONG(ptr, &d->sealInfoLong);
+ }
+ ptr = pack_UINT32(ptr, d->encDataSize);
+ ptr = pack_BUFFER(ptr, d->encData, d->encDataSize);
+ return ptr;
+}
+
+inline int sizeof_TPM_STORED_DATA12(const TPM_STORED_DATA12* d) {
+ int rv = sizeof_TPM_STRUCTURE_TAG(&d->ver) +
+ sizeof_TPM_ENTITY_TYPE(&d->et) +
+ sizeof_UINT32(d->sealInfoLongSize);
+ if (d->sealInfoLongSize) {
+ rv += sizeof_TPM_PCR_INFO_LONG(&d->sealInfoLong);
+ }
+ rv += sizeof_UINT32(d->encDataSize);
+ rv += sizeof_BUFFER(d->encData, d->encDataSize);
+ return rv;
+}
+
+inline int unpack3_TPM_STORED_DATA12(BYTE* ptr, UINT32* pos, UINT32 len, TPM_STORED_DATA12* d, UnpackPtr alloc) {
+ int rc = unpack3_TPM_STRUCTURE_TAG(ptr, pos, len, &d->tag) ||
+ unpack3_TPM_ENTITY_TYPE(ptr, pos, len, &d->et) ||
+ unpack3_UINT32(ptr, pos, len, &d->sealInfoLongSize);
+ if (rc)
+ return rc;
+ if (d->sealInfoLongSize)
+ rc = unpack3_TPM_PCR_INFO_LONG(ptr, pos, len, &d->sealInfoLong,
+ alloc);
+ if (rc)
+ return rc;
+ rc = unpack3_UINT32(ptr, pos, len, &d->encDataSize) ||
+ unpack3_PTR(ptr, pos, len, &d->encData, d->encDataSize, alloc);
+ return rc;
+}
+
inline BYTE* pack_TPM_AUTH_SESSION(BYTE* ptr, const TPM_AUTH_SESSION* auth) {
ptr = pack_TPM_AUTH_HANDLE(ptr, auth->AuthHandle);
ptr = pack_TPM_NONCE(ptr, &auth->NonceOdd);
#define TPM_ST_DEACTIVATED 0x003
// TPM_TAG values
+#define TPM_TAG_PCR_INFO_LONG 0x0006
+#define TPM_TAG_STORED_DATA12 0x0016
#define TPM_TAG_RQU_COMMAND 0x00c1
#define TPM_TAG_RQU_AUTH1_COMMAND 0x00c2
#define TPM_TAG_RQU_AUTH2_COMMAND 0x00c3
p->pcrSelect = NULL;
}
+#define TPM_LOCALITY_SELECTION BYTE
+
+typedef struct TPM_PCR_INFO_LONG {
+ TPM_STRUCTURE_TAG tag;
+ TPM_LOCALITY_SELECTION localityAtCreation;
+ TPM_LOCALITY_SELECTION localityAtRelease;
+ TPM_PCR_SELECTION creationPCRSelection;
+ TPM_PCR_SELECTION releasePCRSelection;
+ TPM_COMPOSITE_HASH digestAtCreation;
+ TPM_COMPOSITE_HASH digestAtRelease;
+} TPM_PCR_INFO_LONG;
+
+#define TPM_PCR_INFO_LONG_INIT { 0, 0, 0, TPM_PCR_SELECTION_INIT, \
+ TPM_PCR_SELECTION_INIT }
+
+inline void free_TPM_PCR_INFO_LONG(TPM_PCR_INFO_LONG* p) {
+ free_TPM_PCR_SELECTION(&p->creationPCRSelection);
+ free_TPM_PCR_SELECTION(&p->releasePCRSelection);
+}
+
typedef struct TPM_PCR_INFO {
TPM_PCR_SELECTION pcrSelection;
TPM_COMPOSITE_HASH digestAtRelease;
d->encData = NULL;
}
+typedef struct TPM_STORED_DATA12 {
+ TPM_STRUCTURE_TAG tag;
+ TPM_ENTITY_TYPE et;
+ UINT32 sealInfoLongSize;
+ TPM_PCR_INFO_LONG sealInfoLong;
+ UINT32 encDataSize;
+ BYTE* encData;
+} TPM_STORED_DATA12;
+
+#define TPM_STORED_DATA12_INIT { .sealInfoLongSize = 0, \
+ sealInfoLong = TPM_PCR_INFO_INIT, .encDataSize = 0, .encData = NULL }
+
+inline void free_TPM_STORED_DATA12(TPM_STORED_DATA12* d) {
+ if(d->sealInfoLongSize) {
+ free_TPM_PCR_INFO_LONG(&d->sealInfoLong);
+ }
+ free(d->encData);
+ d->encData = NULL;
+}
+
typedef struct TPM_AUTH_SESSION {
TPM_AUTHHANDLE AuthHandle;
TPM_NONCE NonceOdd; // system
TPM_RESULT TPM_Seal(
TPM_KEY_HANDLE keyHandle, // in
- UINT32 pcrInfoSize, // in
- TPM_PCR_INFO* pcrInfo, // in
+ UINT32 pcrInfoLongSize, // in
+ TPM_PCR_INFO_LONG* pcrInfoLong, // in
UINT32 inDataSize, // in
const BYTE* inData, // in
- TPM_STORED_DATA* sealedData, //out
+ TPM_STORED_DATA12* sealedData, //out
const TPM_SECRET* osapSharedSecret, //in
const TPM_AUTHDATA* sealedDataAuth, //in
TPM_AUTH_SESSION* pubAuth // in, out
xorEncrypt(osapSharedSecret, &pubAuth->NonceEven, sealedDataAuth, IN_PTR, NULL, NULL);
in_pos += sizeof(TPM_ENCAUTH);
- PACK_IN(UINT32, pcrInfoSize);
- if (pcrInfoSize)
- PACK_IN(TPM_PCR_INFO, pcrInfo);
+
+ PACK_IN(UINT32, pcrInfoLongSize);
+ if (pcrInfoLongSize) {
+ PACK_IN(TPM_PCR_INFO_LONG, pcrInfoLong);
+ }
PACK_IN(UINT32, inDataSize);
PACK_IN(BUFFER, inData, inDataSize);
TPM_XMIT_AUTH1(osapSharedSecret, pubAuth);
- UNPACK_OUT(TPM_STORED_DATA, sealedData, UNPACK_ALLOC);
+ UNPACK_OUT(TPM_STORED_DATA12, sealedData, UNPACK_ALLOC);
TPM_END_AUTH1(osapSharedSecret, pubAuth);
abort_egress:
if (status)
- free_TPM_STORED_DATA(sealedData);
+ free_TPM_STORED_DATA12(sealedData);
TPM_AUTH_ERR_CHECK(pubAuth);
return status;
}
TPM_RESULT TPM_Unseal(
TPM_KEY_HANDLE parentHandle, // in
- const TPM_STORED_DATA* sealedData,
+ const TPM_STORED_DATA12* sealedData,
UINT32* outSize, // out
BYTE** out, //out
const TPM_AUTHDATA* key_usage_auth, //in
PACK_IN(TPM_KEY_HANDLE, parentHandle);
TPM_HASH_IN_BEGIN;
- PACK_IN(TPM_STORED_DATA, sealedData);
+ PACK_IN(TPM_STORED_DATA12, sealedData);
TPM_XMIT_AUTH2(key_usage_auth, keyAuth, data_usage_auth, dataAuth);
TPM_RESULT TPM_Seal(
TCS_KEY_HANDLE keyHandle, // in
- UINT32 pcrInfoSize, // in
- TPM_PCR_INFO* pcrInfo, // in
+ UINT32 pcrInfoLongSize, // in
+ TPM_PCR_INFO_LONG* pcrInfoLong, // in
UINT32 inDataSize, // in
const BYTE* inData, // in
- TPM_STORED_DATA* sealedData, //out
+ TPM_STORED_DATA12* sealedData, //out
const TPM_SECRET* osapSharedSecret, //in
const TPM_AUTHDATA* sealDataAuth, //in
TPM_AUTH_SESSION* pubAuth // in, out
TPM_RESULT TPM_Unseal (
TPM_KEY_HANDLE parentHandle, // in
- const TPM_STORED_DATA* sealedData,
+ const TPM_STORED_DATA12* sealedData,
UINT32* outSize, // out
BYTE** out, //out
const TPM_AUTHDATA* key_usage_auth, //in