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
16 #include "trousers/tss.h"
17 #include "trousers_types.h"
18 #include "trousers_types.h"
19 #include "tcs_tsp.h"
20 #include "tcs_utils.h"
21 #include "tcs_int_literals.h"
22 #include "capabilities.h"
23 #include "tcsps.h"
24 #include "tcslog.h"
25 #include "tddl.h"
26 #include "req_mgr.h"
27 #include "tcsd_wrap.h"
28 #include "tcsd.h"
29
30
31 TSS_RESULT
get_vendor_data(struct key_disk_cache * d,UINT32 * size,BYTE ** data)32 get_vendor_data(struct key_disk_cache *d, UINT32 *size, BYTE **data)
33 {
34 if (d->vendor_data_size == 0) {
35 *size = 0;
36 *data = NULL;
37
38 return TSS_SUCCESS;
39 }
40
41 return ps_get_vendor_data(d, size, data);
42 }
43
44 TSS_RESULT
fill_key_info(struct key_disk_cache * d,struct key_mem_cache * m,TSS_KM_KEYINFO * key_info)45 fill_key_info(struct key_disk_cache *d, struct key_mem_cache *m, TSS_KM_KEYINFO *key_info)
46 {
47 BYTE tmp_blob[2048];
48 UINT16 tmp_blob_size = 2048;
49 TSS_KEY tmp_key;
50 UINT64 offset;
51 TSS_RESULT result;
52
53 if (m == NULL) {
54 key_info->fIsLoaded = FALSE;
55
56 /* read key from disk */
57 if ((result = ps_get_key_by_cache_entry(d, (BYTE *)&tmp_blob, &tmp_blob_size)))
58 return result;
59
60 offset = 0;
61 /* XXX add a real context handle here */
62 if ((result = UnloadBlob_TSS_KEY(&offset, tmp_blob, &tmp_key)))
63 return result;
64
65 if (tmp_key.hdr.key12.tag == TPM_TAG_KEY12) {
66 key_info->versionInfo.bMajor = TSS_SPEC_MAJOR;
67 key_info->versionInfo.bMinor = TSS_SPEC_MINOR;
68 key_info->versionInfo.bRevMajor = 0;
69 key_info->versionInfo.bRevMajor = 0;
70 } else
71 memcpy(&key_info->versionInfo, &tmp_key.hdr.key11.ver, sizeof(TSS_VERSION));
72 memcpy(&key_info->bAuthDataUsage, &tmp_key.authDataUsage,
73 sizeof(TCPA_AUTH_DATA_USAGE));
74 destroy_key_refs(&tmp_key);
75 } else {
76 if (m->tpm_handle == NULL_TPM_HANDLE)
77 key_info->fIsLoaded = FALSE;
78 else
79 key_info->fIsLoaded = TRUE;
80
81 if (m->blob->hdr.key12.tag == TPM_TAG_KEY12) {
82 key_info->versionInfo.bMajor = TSS_SPEC_MAJOR;
83 key_info->versionInfo.bMinor = TSS_SPEC_MINOR;
84 key_info->versionInfo.bRevMajor = 0;
85 key_info->versionInfo.bRevMajor = 0;
86 } else
87 memcpy(&key_info->versionInfo, &m->blob->hdr.key11.ver, sizeof(TSS_VERSION));
88 memcpy(&key_info->bAuthDataUsage, &m->blob->authDataUsage,
89 sizeof(TCPA_AUTH_DATA_USAGE));
90 }
91
92 memcpy(&key_info->keyUUID, &d->uuid, sizeof(TSS_UUID));
93 memcpy(&key_info->parentKeyUUID, &d->parent_uuid, sizeof(TSS_UUID));
94
95 return get_vendor_data(d, &key_info->ulVendorDataLength, &key_info->rgbVendorData);
96 }
97
98 TSS_RESULT
fill_key_info2(struct key_disk_cache * d,struct key_mem_cache * m,TSS_KM_KEYINFO2 * key_info)99 fill_key_info2(struct key_disk_cache *d, struct key_mem_cache *m, TSS_KM_KEYINFO2 *key_info)
100 {
101 BYTE tmp_blob[2048];
102 UINT16 tmp_blob_size = 2048;
103 TSS_KEY tmp_key;
104 UINT64 offset;
105 TSS_RESULT result;
106
107 if (m == NULL) {
108 key_info->fIsLoaded = FALSE;
109
110 /* read key from disk */
111 if ((result = ps_get_key_by_cache_entry(d, (BYTE *)&tmp_blob, &tmp_blob_size)))
112 return result;
113
114 offset = 0;
115 /* XXX add a real context handle here */
116 if ((result = UnloadBlob_TSS_KEY(&offset, tmp_blob, &tmp_key)))
117 return result;
118
119 if (tmp_key.hdr.key12.tag == TPM_TAG_KEY12) {
120 key_info->versionInfo.bMajor = TSS_SPEC_MAJOR;
121 key_info->versionInfo.bMinor = TSS_SPEC_MINOR;
122 key_info->versionInfo.bRevMajor = 0;
123 key_info->versionInfo.bRevMajor = 0;
124 } else
125 memcpy(&key_info->versionInfo, &tmp_key.hdr.key11.ver, sizeof(TSS_VERSION));
126 memcpy(&key_info->bAuthDataUsage, &tmp_key.authDataUsage,
127 sizeof(TCPA_AUTH_DATA_USAGE));
128 destroy_key_refs(&tmp_key);
129 } else {
130 if (m->tpm_handle == NULL_TPM_HANDLE)
131 key_info->fIsLoaded = FALSE;
132 else
133 key_info->fIsLoaded = TRUE;
134
135 if (m->blob->hdr.key12.tag == TPM_TAG_KEY12) {
136 key_info->versionInfo.bMajor = TSS_SPEC_MAJOR;
137 key_info->versionInfo.bMinor = TSS_SPEC_MINOR;
138 key_info->versionInfo.bRevMajor = 0;
139 key_info->versionInfo.bRevMajor = 0;
140 } else
141 memcpy(&key_info->versionInfo, &m->blob->hdr.key11.ver, sizeof(TSS_VERSION));
142 memcpy(&key_info->bAuthDataUsage, &m->blob->authDataUsage,
143 sizeof(TCPA_AUTH_DATA_USAGE));
144 }
145
146 memcpy(&key_info->keyUUID, &d->uuid, sizeof(TSS_UUID));
147 memcpy(&key_info->parentKeyUUID, &d->parent_uuid, sizeof(TSS_UUID));
148
149 /* Fill the two new TSS_KM_KEYINFO2 fields here */
150 key_info->persistentStorageTypeParent = d->flags & CACHE_FLAG_PARENT_PS_SYSTEM ?
151 TSS_PS_TYPE_SYSTEM : TSS_PS_TYPE_USER;
152 key_info->persistentStorageType = TSS_PS_TYPE_SYSTEM;
153
154 return get_vendor_data(d, &key_info->ulVendorDataLength, &key_info->rgbVendorData);
155 }
156
157 TSS_RESULT
key_mgr_load_by_uuid(TCS_CONTEXT_HANDLE hContext,TSS_UUID * uuid,TCS_LOADKEY_INFO * pInfo,TCS_KEY_HANDLE * phKeyTCSI)158 key_mgr_load_by_uuid(TCS_CONTEXT_HANDLE hContext,
159 TSS_UUID *uuid,
160 TCS_LOADKEY_INFO *pInfo,
161 TCS_KEY_HANDLE *phKeyTCSI)
162 {
163 TSS_RESULT result;
164
165 MUTEX_LOCK(mem_cache_lock);
166
167 result = TCSP_LoadKeyByUUID_Internal(hContext, uuid, pInfo, phKeyTCSI);
168
169 LogDebug("Key %s loaded by UUID w/ TCS handle: 0x%x",
170 result ? "NOT" : "successfully", result ? 0 : *phKeyTCSI);
171
172 MUTEX_UNLOCK(mem_cache_lock);
173
174 return result;
175 }
176
177