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. 2007
8  *
9  */
10 
11 
12 #include <stdlib.h>
13 #include <string.h>
14 #include <limits.h>
15 
16 #include "trousers/tss.h"
17 #include "trousers/trousers.h"
18 #include "trousers_types.h"
19 #include "spi_utils.h"
20 #include "capabilities.h"
21 #include "tsplog.h"
22 #include "obj.h"
23 
24 
25 #ifdef TSS_BUILD_TRANSPORT
26 TSS_RESULT
Transport_ActivateTPMIdentity(TSS_HCONTEXT tspContext,TCS_KEY_HANDLE idKey,UINT32 blobSize,BYTE * blob,TPM_AUTH * idKeyAuth,TPM_AUTH * ownerAuth,UINT32 * SymmetricKeySize,BYTE ** SymmetricKey)27 Transport_ActivateTPMIdentity(TSS_HCONTEXT tspContext,
28 			      TCS_KEY_HANDLE idKey,        /* in */
29 			      UINT32 blobSize,     /* in */
30 			      BYTE * blob, /* in */
31 			      TPM_AUTH * idKeyAuth,        /* in, out */
32 			      TPM_AUTH * ownerAuth,        /* in, out */
33 			      UINT32 * SymmetricKeySize,   /* out */
34 			      BYTE ** SymmetricKey)        /* out */
35 {
36 	TSS_RESULT result;
37 	UINT32 handlesLen, decLen;
38 	TCS_HANDLE *handles, handle;
39 	TPM_DIGEST pubKeyHash;
40 	Trspi_HashCtx hashCtx;
41 	BYTE *dec;
42 
43 	if ((result = obj_context_transport_init(tspContext)))
44 		return result;
45 
46 	LogDebugFn("Executing in a transport session");
47 
48 	if ((result = obj_tcskey_get_pubkeyhash(idKey, pubKeyHash.digest)))
49 		return result;
50 
51 	result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
52 	result |= Trspi_Hash_DIGEST(&hashCtx, pubKeyHash.digest);
53 	if ((result |= Trspi_HashFinal(&hashCtx, pubKeyHash.digest)))
54 		return result;
55 
56 	handlesLen = 1;
57 	handle = idKey;
58 	handles = &handle;
59 
60 	if ((result = obj_context_transport_execute(tspContext, TPM_ORD_ActivateIdentity, blobSize,
61 						    blob, &pubKeyHash, &handlesLen, &handles,
62 						    idKeyAuth, ownerAuth, &decLen, &dec)))
63 		return result;
64 
65 	*SymmetricKeySize = decLen;
66 	*SymmetricKey = dec;
67 
68 	return result;
69 }
70 
71 TSS_RESULT
Transport_MakeIdentity2(TSS_HCONTEXT tspContext,TCPA_ENCAUTH identityAuth,TCPA_CHOSENID_HASH IDLabel_PrivCAHash,UINT32 idKeyInfoSize,BYTE * idKeyInfo,TPM_AUTH * pSrkAuth,TPM_AUTH * pOwnerAuth,UINT32 * idKeySize,BYTE ** idKey,UINT32 * pcIdentityBindingSize,BYTE ** prgbIdentityBinding)72 Transport_MakeIdentity2(TSS_HCONTEXT tspContext,
73 			TCPA_ENCAUTH identityAuth, /* in */
74 			TCPA_CHOSENID_HASH IDLabel_PrivCAHash,     /* in */
75 			UINT32 idKeyInfoSize,      /* in */
76 			BYTE * idKeyInfo,  /* in */
77 			TPM_AUTH * pSrkAuth,       /* in, out */
78 			TPM_AUTH * pOwnerAuth,     /* in, out */
79 			UINT32 * idKeySize,        /* out */
80 			BYTE ** idKey,     /* out */
81 			UINT32 * pcIdentityBindingSize,    /* out */
82 			BYTE ** prgbIdentityBinding)       /* out */
83 {
84 	UINT64 offset;
85 	TSS_RESULT result;
86 	UINT32 handlesLen = 0, decLen, dataLen;
87 	BYTE *dec, *data;
88 
89 	if ((result = obj_context_transport_init(tspContext)))
90 		return result;
91 
92 	LogDebugFn("Executing in a transport session");
93 
94 	dataLen = sizeof(TCPA_ENCAUTH) + sizeof(TCPA_CHOSENID_HASH) + idKeyInfoSize;
95 	if ((data = malloc(dataLen)) == NULL) {
96 		LogError("malloc of %u bytes failed", dataLen);
97 		return TSPERR(TSS_E_OUTOFMEMORY);
98 	}
99 
100 	offset = 0;
101 	Trspi_LoadBlob(&offset, sizeof(TCPA_ENCAUTH), data, identityAuth.authdata);
102 	Trspi_LoadBlob(&offset, sizeof(TCPA_CHOSENID_HASH), data, IDLabel_PrivCAHash.digest);
103 	Trspi_LoadBlob(&offset, idKeyInfoSize, data, idKeyInfo);
104 
105 	if ((result = obj_context_transport_execute(tspContext, TPM_ORD_MakeIdentity, dataLen,
106 						    data, NULL, &handlesLen, NULL, pSrkAuth,
107 						    pOwnerAuth, &decLen, &dec))) {
108 		free(data);
109 		return result;
110 	}
111 	free(data);
112 
113 	offset = 0;
114 	UnloadBlob_TSS_KEY(&offset, dec, NULL);
115 	*idKeySize = offset;
116 
117 	if ((*idKey = malloc(*idKeySize)) == NULL) {
118 		free(dec);
119 		LogError("malloc of %u bytes failed", *idKeySize);
120 		*idKeySize = 0;
121 		return TSPERR(TSS_E_OUTOFMEMORY);
122 	}
123 
124 	offset = 0;
125 	Trspi_UnloadBlob(&offset, *idKeySize, dec, *idKey);
126 
127 	Trspi_UnloadBlob_UINT32(&offset, pcIdentityBindingSize, dec);
128 	if ((*prgbIdentityBinding = malloc(*pcIdentityBindingSize)) == NULL) {
129 		free(dec);
130 		free(*idKey);
131 		*idKey = NULL;
132 		*idKeySize = 0;
133 		LogError("malloc of %u bytes failed", *pcIdentityBindingSize);
134 		*pcIdentityBindingSize = 0;
135 		return TSPERR(TSS_E_OUTOFMEMORY);
136 	}
137 	Trspi_UnloadBlob(&offset, *pcIdentityBindingSize, dec, *prgbIdentityBinding);
138 	free(dec);
139 
140 	return result;
141 }
142 #endif
143 
144