1 2 /* 3 * Licensed Materials - Property of IBM 4 * 5 * trousers - An open source TCG Software Stack 6 * 7 * (C) Copyright International Business Machines Corp. 2004-2006 8 * 9 */ 10 11 12 #include <stdlib.h> 13 #include <stdio.h> 14 #include <string.h> 15 #include <unistd.h> 16 #include <sys/types.h> 17 #include <sys/stat.h> 18 #include <sys/mman.h> 19 #include <fcntl.h> 20 #include <errno.h> 21 22 #include "trousers/tss.h" 23 #include "trousers_types.h" 24 #include "tcs_tsp.h" 25 #include "tcs_utils.h" 26 #include "tcslog.h" 27 28 29 TSS_RESULT 30 UnloadBlob_STORED_DATA(UINT64 *offset, BYTE *blob, TCPA_STORED_DATA *data) 31 { 32 if (!data) { 33 UINT32 size; 34 35 UnloadBlob_VERSION(offset, blob, NULL); 36 37 UnloadBlob_UINT32(offset, &size, blob); 38 39 if (size > 0) 40 UnloadBlob(offset, size, blob, NULL); 41 42 UnloadBlob_UINT32(offset, &size, blob); 43 44 if (size > 0) 45 UnloadBlob(offset, size, blob, NULL); 46 47 return TSS_SUCCESS; 48 } 49 50 UnloadBlob_VERSION(offset, blob, (TPM_VERSION *)&data->ver); 51 52 UnloadBlob_UINT32(offset, &data->sealInfoSize, blob); 53 54 if (data->sealInfoSize > 0) { 55 data->sealInfo = (BYTE *)calloc(1, data->sealInfoSize); 56 if (data->sealInfo == NULL) { 57 LogError("malloc of %u bytes failed.", data->sealInfoSize); 58 data->sealInfoSize = 0; 59 return TCSERR(TSS_E_OUTOFMEMORY); 60 } 61 UnloadBlob(offset, data->sealInfoSize, blob, data->sealInfo); 62 } else { 63 data->sealInfo = NULL; 64 } 65 66 UnloadBlob_UINT32(offset, &data->encDataSize, blob); 67 68 if (data->encDataSize > 0) { 69 data->encData = (BYTE *)calloc(1, data->encDataSize); 70 if (data->encData == NULL) { 71 LogError("malloc of %u bytes failed.", data->encDataSize); 72 data->encDataSize = 0; 73 free(data->sealInfo); 74 data->sealInfo = NULL; 75 data->sealInfoSize = 0; 76 return TCSERR(TSS_E_OUTOFMEMORY); 77 } 78 UnloadBlob(offset, data->encDataSize, blob, data->encData); 79 } else { 80 data->encData = NULL; 81 } 82 83 return TSS_SUCCESS; 84 } 85