summaryrefslogtreecommitdiff
path: root/src/tspi/obj_migdata.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tspi/obj_migdata.c')
-rw-r--r--src/tspi/obj_migdata.c1124
1 files changed, 1124 insertions, 0 deletions
diff --git a/src/tspi/obj_migdata.c b/src/tspi/obj_migdata.c
new file mode 100644
index 0000000..aee4cba
--- /dev/null
+++ b/src/tspi/obj_migdata.c
@@ -0,0 +1,1124 @@
+
+/*
+ * Licensed Materials - Property of IBM
+ *
+ * trousers - An open source TCG Software Stack
+ *
+ * (C) Copyright International Business Machines Corp. 2007
+ *
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#include "trousers/tss.h"
+#include "trousers/trousers.h"
+#include "trousers_types.h"
+#include "spi_utils.h"
+#include "capabilities.h"
+#include "tsplog.h"
+#include "obj.h"
+
+
+void
+migdata_free(void *data)
+{
+ struct tr_migdata_obj *migdata = (struct tr_migdata_obj *)data;
+
+ free(migdata);
+}
+
+TSS_BOOL
+obj_is_migdata(TSS_HOBJECT hObject)
+{
+ TSS_BOOL answer = FALSE;
+
+ if ((obj_list_get_obj(&migdata_list, hObject))) {
+ answer = TRUE;
+ obj_list_put(&migdata_list);
+ }
+
+ return answer;
+}
+
+TSS_RESULT
+obj_migdata_add(TSS_HCONTEXT hContext, TSS_HOBJECT *phObject)
+{
+ TSS_RESULT result;
+ struct tr_migdata_obj *migdata = calloc(1, sizeof(struct tr_migdata_obj));
+
+ if (migdata == NULL) {
+ LogError("malloc of %zd bytes failed.", sizeof(struct tr_migdata_obj));
+ return TSPERR(TSS_E_OUTOFMEMORY);
+ }
+
+ if ((result = obj_list_add(&migdata_list, hContext, 0, migdata, phObject))) {
+ free(migdata);
+ return result;
+ }
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_migdata_remove(TSS_HMIGDATA hMigData, TSS_HCONTEXT hContext)
+{
+ TSS_RESULT result;
+
+ if ((result = obj_list_remove(&migdata_list, &migdata_free, hMigData, hContext)))
+ return result;
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_migdata_get_tsp_context(TSS_HMIGDATA hMigData, TSS_HCONTEXT *hContext)
+{
+ struct tsp_object *obj;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ *hContext = obj->tspContext;
+
+ obj_list_put(&migdata_list);
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_migdata_set_migrationblob(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 blobSize, BYTE *blob)
+{
+ TSS_RESULT result;
+
+ switch (whichOne) {
+ case TSS_MIGATTRIB_MIG_MSALIST_PUBKEY_BLOB:
+ result = obj_migdata_set_msa_pubkey(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_MIG_AUTHORITY_PUBKEY_BLOB:
+ result = obj_migdata_set_ma_pubkey(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_MIG_DESTINATION_PUBKEY_BLOB:
+ result = obj_migdata_set_dest_pubkey(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_MIG_SOURCE_PUBKEY_BLOB:
+ result = obj_migdata_set_src_pubkey(hMigData, blobSize, blob);
+ break;
+ default:
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ }
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_migrationblob(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 *blobSize, BYTE **blob)
+{
+ TSS_RESULT result;
+
+ switch (whichOne) {
+ case TSS_MIGATTRIB_MIG_XOR_BLOB:
+ result = obj_migdata_get_blob(hMigData, blobSize, blob);
+ break;
+ default:
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ }
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_authoritydata(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 blobSize, BYTE *blob)
+{
+ TSS_RESULT result;
+
+ switch (whichOne) {
+ case TSS_MIGATTRIB_AUTHORITY_DIGEST:
+ result = obj_migdata_set_msa_digest(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_AUTHORITY_APPROVAL_HMAC:
+ result = obj_migdata_set_msa_hmac(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_AUTHORITY_MSALIST:
+ result = obj_migdata_set_msa_list(hMigData, blobSize, blob);
+ break;
+ default:
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ }
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_authoritydata(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 *blobSize, BYTE **blob)
+{
+ TSS_RESULT result;
+
+ switch (whichOne) {
+ case TSS_MIGATTRIB_AUTHORITY_DIGEST:
+ result = obj_migdata_get_msa_digest(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_AUTHORITY_APPROVAL_HMAC:
+ result = obj_migdata_get_msa_hmac(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_AUTHORITY_MSALIST:
+ result = obj_migdata_get_msa_list(hMigData, blobSize, blob);
+ break;
+ default:
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ }
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_migauthdata(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 blobSize, BYTE *blob)
+{
+ TSS_RESULT result;
+
+ switch (whichOne) {
+ case TSS_MIGATTRIB_MIG_AUTH_AUTHORITY_DIGEST:
+ result = obj_migdata_set_ma_digest(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_MIG_AUTH_DESTINATION_DIGEST:
+ result = obj_migdata_set_dest_digest(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_MIG_AUTH_SOURCE_DIGEST:
+ result = obj_migdata_set_src_digest(hMigData, blobSize, blob);
+ break;
+ default:
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ }
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_migauthdata(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 *blobSize, BYTE **blob)
+{
+ TSS_RESULT result;
+
+ switch (whichOne) {
+ case TSS_MIGATTRIB_MIG_AUTH_AUTHORITY_DIGEST:
+ result = obj_migdata_get_ma_digest(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_MIG_AUTH_DESTINATION_DIGEST:
+ result = obj_migdata_get_dest_digest(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_MIG_AUTH_SOURCE_DIGEST:
+ result = obj_migdata_get_src_digest(hMigData, blobSize, blob);
+ break;
+ default:
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ }
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_ticketdata(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 blobSize, BYTE *blob)
+{
+ TSS_RESULT result;
+
+ switch (whichOne) {
+ case TSS_MIGATTRIB_TICKET_SIG_DIGEST:
+ result = obj_migdata_set_sig_data(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_TICKET_SIG_VALUE:
+ result = obj_migdata_set_sig_value(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_TICKET_SIG_TICKET:
+ result = obj_migdata_set_sig_ticket(hMigData, blobSize, blob);
+ break;
+ case TSS_MIGATTRIB_TICKET_RESTRICT_TICKET:
+ result = obj_migdata_set_cmk_auth(hMigData, blobSize, blob);
+ break;
+ default:
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ }
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_ticketdata(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 *blobSize, BYTE **blob)
+{
+ TSS_RESULT result;
+
+ switch (whichOne) {
+ case TSS_MIGATTRIB_TICKET_SIG_TICKET:
+ result = obj_migdata_get_sig_ticket(hMigData, blobSize, blob);
+ break;
+ default:
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ }
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_ticket_blob(TSS_HMIGDATA hMigData, UINT32 migTicketSize, BYTE *migTicket)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ migdata->migTicketSize = 0;
+ free(migdata->migTicket);
+ if ((migdata->migTicket = malloc(migTicketSize)) == NULL) {
+ LogError("malloc of %u bytes failed.", migTicketSize);
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(migdata->migTicket, migTicket, migTicketSize);
+ migdata->migTicketSize = migTicketSize;
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_ticket_blob(TSS_HMIGDATA hMigData, UINT32 *migTicketSize, BYTE **migTicket)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((*migTicket = calloc_tspi(obj->tspContext, migdata->migTicketSize)) == NULL) {
+ LogError("malloc of %u bytes failed.", migdata->migTicketSize);
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(*migTicket, migdata->migTicket, migdata->migTicketSize);
+ *migTicketSize = migdata->migTicketSize;
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_msa_list(TSS_HMIGDATA hMigData, UINT32 msaListSize, BYTE *msaList)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ UINT32 i, count, size;
+ TPM_DIGEST *digest;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ count = msaListSize / sizeof(digest->digest);
+ size = count * sizeof(*digest);
+
+ migdata->msaList.MSAlist = 0;
+ free(migdata->msaList.migAuthDigest);
+ if ((migdata->msaList.migAuthDigest = malloc(size)) == NULL) {
+ LogError("malloc of %u bytes failed.", size);
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ digest = migdata->msaList.migAuthDigest;
+ for (i = 0; i < count; i++) {
+ memcpy(digest->digest, msaList, sizeof(digest->digest));
+ msaList += sizeof(digest->digest);
+ digest++;
+ }
+ migdata->msaList.MSAlist = count;
+
+ result = obj_migdata_calc_msa_digest(migdata);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_msa_list(TSS_HMIGDATA hMigData, UINT32 *size, BYTE **msaList)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ UINT32 i;
+ TPM_DIGEST *digest;
+ BYTE *tmpMsaList;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ *size = migdata->msaList.MSAlist * sizeof(migdata->msaList.migAuthDigest->digest);
+ if ((*msaList = calloc_tspi(obj->tspContext, *size)) == NULL) {
+ LogError("malloc of %u bytes failed.", *size);
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ tmpMsaList = *msaList;
+ digest = migdata->msaList.migAuthDigest;
+ for (i = 0; i < migdata->msaList.MSAlist; i++) {
+ memcpy(tmpMsaList, digest->digest, sizeof(digest->digest));
+ tmpMsaList += sizeof(digest->digest);
+ digest++;
+ }
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_msa_pubkey(TSS_HMIGDATA hMigData, UINT32 blobSize, BYTE *pubKeyBlob)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ UINT32 size;
+ TPM_DIGEST msaDigest;
+ TPM_DIGEST *digest;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((result = obj_migdata_calc_pubkey_digest(blobSize, pubKeyBlob, &msaDigest)))
+ goto done;
+
+ size = (migdata->msaList.MSAlist + 1) * sizeof(*digest);
+ if ((migdata->msaList.migAuthDigest = realloc(migdata->msaList.migAuthDigest, size)) == NULL) {
+ LogError("malloc of %u bytes failed.", size);
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ digest = migdata->msaList.migAuthDigest + migdata->msaList.MSAlist;
+ *digest = msaDigest;
+ migdata->msaList.MSAlist++;
+
+ result = obj_migdata_calc_msa_digest(migdata);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_msa_digest(TSS_HMIGDATA hMigData, UINT32 digestSize, BYTE *digest)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if (digestSize != sizeof(migdata->msaDigest.digest)) {
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ goto done;
+ }
+ memcpy(migdata->msaDigest.digest, digest, sizeof(migdata->msaDigest.digest));
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_msa_digest(TSS_HMIGDATA hMigData, UINT32 *digestSize, BYTE **digest)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((*digest = calloc_tspi(obj->tspContext, sizeof(migdata->msaDigest.digest))) == NULL) {
+ LogError("malloc of %zd bytes failed.", sizeof(migdata->msaDigest.digest));
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(*digest, migdata->msaDigest.digest, sizeof(migdata->msaDigest.digest));
+ *digestSize = sizeof(migdata->msaDigest.digest);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_msa_list_blob(TSS_HMIGDATA hMigData, UINT32 *blobSize, BYTE **msaListBlob)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ UINT64 offset;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ offset = 0;
+ Trspi_LoadBlob_MSA_COMPOSITE(&offset, NULL, &migdata->msaList);
+
+ *blobSize = offset;
+ if ((*msaListBlob = calloc_tspi(obj->tspContext, *blobSize)) == NULL) {
+ LogError("malloc of %u bytes failed.", *blobSize);
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ offset = 0;
+ Trspi_LoadBlob_MSA_COMPOSITE(&offset, *msaListBlob, &migdata->msaList);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_msa_hmac(TSS_HMIGDATA hMigData, UINT32 hmacSize, BYTE *hmac)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if (hmacSize != sizeof(migdata->msaHmac.digest)) {
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ goto done;
+ }
+ memcpy(migdata->msaHmac.digest, hmac, sizeof(migdata->msaHmac.digest));
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_msa_hmac(TSS_HMIGDATA hMigData, UINT32 *hmacSize, BYTE **hmac)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((*hmac = calloc_tspi(obj->tspContext, sizeof(migdata->msaHmac.digest))) == NULL) {
+ LogError("malloc of %zd bytes failed.", sizeof(migdata->msaHmac.digest));
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(*hmac, migdata->msaHmac.digest, sizeof(migdata->msaHmac.digest));
+ *hmacSize = sizeof(migdata->msaHmac.digest);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_ma_pubkey(TSS_HMIGDATA hMigData, UINT32 blobSize, BYTE *pubKeyBlob)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TPM_DIGEST pubKeyDigest;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((result = obj_migdata_calc_pubkey_digest(blobSize, pubKeyBlob, &pubKeyDigest)))
+ goto done;
+
+ migdata->maDigest = pubKeyDigest;
+
+ obj_migdata_calc_sig_data_digest(migdata);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_ma_digest(TSS_HMIGDATA hMigData, UINT32 digestSize, BYTE *digest)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if (digestSize != sizeof(migdata->maDigest.digest)) {
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ goto done;
+ }
+ memcpy(migdata->maDigest.digest, digest, sizeof(migdata->maDigest.digest));
+
+ obj_migdata_calc_sig_data_digest(migdata);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_ma_digest(TSS_HMIGDATA hMigData, UINT32 *digestSize, BYTE **digest)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((*digest = calloc_tspi(obj->tspContext, sizeof(migdata->maDigest.digest))) == NULL) {
+ LogError("malloc of %zd bytes failed.", sizeof(migdata->maDigest.digest));
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(*digest, migdata->maDigest.digest, sizeof(migdata->maDigest.digest));
+ *digestSize = sizeof(migdata->maDigest.digest);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_dest_pubkey(TSS_HMIGDATA hMigData, UINT32 blobSize, BYTE *pubKeyBlob)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TPM_DIGEST pubKeyDigest;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((result = obj_migdata_calc_pubkey_digest(blobSize, pubKeyBlob, &pubKeyDigest)))
+ goto done;
+
+ migdata->destDigest = pubKeyDigest;
+
+ obj_migdata_calc_sig_data_digest(migdata);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_dest_digest(TSS_HMIGDATA hMigData, UINT32 digestSize, BYTE *digest)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if (digestSize != sizeof(migdata->destDigest.digest)) {
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ goto done;
+ }
+ memcpy(migdata->destDigest.digest, digest, sizeof(migdata->destDigest.digest));
+
+ obj_migdata_calc_sig_data_digest(migdata);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_dest_digest(TSS_HMIGDATA hMigData, UINT32 *digestSize, BYTE **digest)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((*digest = calloc_tspi(obj->tspContext, sizeof(migdata->destDigest.digest))) == NULL) {
+ LogError("malloc of %zd bytes failed.", sizeof(migdata->destDigest.digest));
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(*digest, migdata->destDigest.digest, sizeof(migdata->destDigest.digest));
+ *digestSize = sizeof(migdata->destDigest.digest);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_src_pubkey(TSS_HMIGDATA hMigData, UINT32 blobSize, BYTE *pubKeyBlob)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TPM_DIGEST pubKeyDigest;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((result = obj_migdata_calc_pubkey_digest(blobSize, pubKeyBlob, &pubKeyDigest)))
+ goto done;
+
+ migdata->srcDigest = pubKeyDigest;
+
+ obj_migdata_calc_sig_data_digest(migdata);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_src_digest(TSS_HMIGDATA hMigData, UINT32 digestSize, BYTE *digest)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if (digestSize != sizeof(migdata->srcDigest.digest)) {
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ goto done;
+ }
+ memcpy(migdata->srcDigest.digest, digest, sizeof(migdata->srcDigest.digest));
+
+ obj_migdata_calc_sig_data_digest(migdata);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_src_digest(TSS_HMIGDATA hMigData, UINT32 *digestSize, BYTE **digest)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((*digest = calloc_tspi(obj->tspContext, sizeof(migdata->srcDigest.digest))) == NULL) {
+ LogError("malloc of %zd bytes failed.", sizeof(migdata->srcDigest.digest));
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(*digest, migdata->srcDigest.digest, sizeof(migdata->srcDigest.digest));
+ *digestSize = sizeof(migdata->srcDigest.digest);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_cmk_auth(TSS_HMIGDATA hMigData, UINT32 digestsSize, BYTE *digests)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if (digestsSize != (sizeof(migdata->maDigest.digest) +
+ sizeof(migdata->destDigest.digest) +
+ sizeof(migdata->srcDigest.digest))) {
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ goto done;
+ }
+ memcpy(migdata->maDigest.digest, digests, sizeof(migdata->maDigest.digest));
+ digests += sizeof(migdata->maDigest.digest);
+ memcpy(migdata->destDigest.digest, digests, sizeof(migdata->destDigest.digest));
+ digests += sizeof(migdata->destDigest.digest);
+ memcpy(migdata->srcDigest.digest, digests, sizeof(migdata->srcDigest.digest));
+
+ obj_migdata_calc_sig_data_digest(migdata);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_cmk_auth(TSS_HMIGDATA hMigData, TPM_CMK_AUTH *cmkAuth)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ cmkAuth->migrationAuthorityDigest = migdata->maDigest;
+ cmkAuth->destinationKeyDigest = migdata->destDigest;
+ cmkAuth->sourceKeyDigest = migdata->srcDigest;
+
+ obj_list_put(&migdata_list);
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_migdata_get_cmk_auth_blob(TSS_HMIGDATA hMigData, UINT32 *blobSize, BYTE **cmkAuthBlob)
+{
+ struct tsp_object *obj;
+ TPM_CMK_AUTH cmkAuth;
+ UINT64 offset;
+ TSS_RESULT result;
+
+ if ((result = obj_migdata_get_cmk_auth(hMigData, &cmkAuth)))
+ return result;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ offset = 0;
+ Trspi_LoadBlob_CMK_AUTH(&offset, NULL, &cmkAuth);
+
+ *blobSize = offset;
+ if ((*cmkAuthBlob = calloc_tspi(obj->tspContext, *blobSize)) == NULL) {
+ LogError("malloc of %u bytes failed.", *blobSize);
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ offset = 0;
+ Trspi_LoadBlob_CMK_AUTH(&offset, *cmkAuthBlob, &cmkAuth);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_sig_data(TSS_HMIGDATA hMigData, UINT32 sigDataSize, BYTE *sigData)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if (sigDataSize != sizeof(migdata->sigData.digest)) {
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ goto done;
+ }
+ memcpy(migdata->sigData.digest, sigData, sizeof(migdata->sigData.digest));
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_sig_data(TSS_HMIGDATA hMigData, UINT32 *sigDataSize, BYTE **sigData)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((*sigData = calloc_tspi(obj->tspContext, sizeof(migdata->sigData.digest))) == NULL) {
+ LogError("malloc of %zd bytes failed.", sizeof(migdata->sigData.digest));
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(*sigData, migdata->sigData.digest, sizeof(migdata->sigData.digest));
+ *sigDataSize = sizeof(migdata->sigData.digest);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_sig_value(TSS_HMIGDATA hMigData, UINT32 sigValueSize, BYTE *sigValue)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ migdata->sigValueSize = 0;
+ free(migdata->sigValue);
+ if ((migdata->sigValue = malloc(sigValueSize)) == NULL) {
+ LogError("malloc of %u bytes failed.", sigValueSize);
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(migdata->sigValue, sigValue, sigValueSize);
+ migdata->sigValueSize = sigValueSize;
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_sig_value(TSS_HMIGDATA hMigData, UINT32 *sigValueSize, BYTE **sigValue)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((*sigValue = calloc_tspi(obj->tspContext, migdata->sigValueSize)) == NULL) {
+ LogError("malloc of %u bytes failed.", migdata->sigValueSize);
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(*sigValue, migdata->sigValue, migdata->sigValueSize);
+ *sigValueSize = migdata->sigValueSize;
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_sig_ticket(TSS_HMIGDATA hMigData, UINT32 sigTicketSize, BYTE *sigTicket)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if (sigTicketSize != sizeof(migdata->sigTicket.digest)) {
+ result = TSPERR(TSS_E_BAD_PARAMETER);
+ goto done;
+ }
+ memcpy(migdata->sigTicket.digest, sigTicket, sizeof(migdata->sigTicket.digest));
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_sig_ticket(TSS_HMIGDATA hMigData, UINT32 *sigTicketSize, BYTE **sigTicket)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((*sigTicket = calloc_tspi(obj->tspContext, sizeof(migdata->sigTicket.digest))) == NULL) {
+ LogError("malloc of %zd bytes failed.", sizeof(migdata->sigTicket.digest));
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(*sigTicket, migdata->sigTicket.digest, sizeof(migdata->sigTicket.digest));
+ *sigTicketSize = sizeof(migdata->sigTicket.digest);
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_set_blob(TSS_HMIGDATA hMigData, UINT32 blobSize, BYTE *blob)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ migdata->blobSize = 0;
+ free(migdata->blob);
+ if ((migdata->blob = malloc(blobSize)) == NULL) {
+ LogError("malloc of %u bytes failed.", blobSize);
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(migdata->blob, blob, blobSize);
+ migdata->blobSize = blobSize;
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_get_blob(TSS_HMIGDATA hMigData, UINT32 *blobSize, BYTE **blob)
+{
+ struct tsp_object *obj;
+ struct tr_migdata_obj *migdata;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ migdata = (struct tr_migdata_obj *)obj->data;
+
+ if ((*blob = calloc_tspi(obj->tspContext, migdata->blobSize)) == NULL) {
+ LogError("malloc of %u bytes failed.", migdata->blobSize);
+ result = TSPERR(TSS_E_OUTOFMEMORY);
+ goto done;
+ }
+ memcpy(*blob, migdata->blob, migdata->blobSize);
+ *blobSize = migdata->blobSize;
+
+done:
+ obj_list_put(&migdata_list);
+
+ return result;
+}
+
+
+TSS_RESULT
+obj_migdata_calc_pubkey_digest(UINT32 blobSize, BYTE *blob, TPM_DIGEST *digest)
+{
+ Trspi_HashCtx hashCtx;
+ TSS_RESULT result;
+
+ result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
+ result |= Trspi_HashUpdate(&hashCtx, blobSize, blob);
+ result |= Trspi_HashFinal(&hashCtx, digest->digest);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_calc_msa_digest(struct tr_migdata_obj *migdata)
+{
+ Trspi_HashCtx hashCtx;
+ TSS_RESULT result;
+
+ result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
+ result |= Trspi_Hash_MSA_COMPOSITE(&hashCtx, &migdata->msaList);
+ result |= Trspi_HashFinal(&hashCtx, migdata->msaDigest.digest);
+
+ return result;
+}
+
+TSS_RESULT
+obj_migdata_calc_sig_data_digest(struct tr_migdata_obj *migdata)
+{
+ Trspi_HashCtx hashCtx;
+ TSS_RESULT result;
+
+ result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
+ result |= Trspi_Hash_DIGEST(&hashCtx, migdata->maDigest.digest);
+ result |= Trspi_Hash_DIGEST(&hashCtx, migdata->destDigest.digest);
+ result |= Trspi_Hash_DIGEST(&hashCtx, migdata->srcDigest.digest);
+ result |= Trspi_HashFinal(&hashCtx, migdata->sigData.digest);
+
+ return result;
+}