Home | History | Annotate | Line # | Download | only in tcs
      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