xref: /netbsd-src/crypto/external/cpl/trousers/dist/src/tcs/tcs_seal.c (revision 2d5f7628c5531eb583b9313ac2fd1cf8582b4479)
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
UnloadBlob_STORED_DATA(UINT64 * offset,BYTE * blob,TCPA_STORED_DATA * data)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