xref: /netbsd-src/crypto/external/cpl/trousers/dist/src/tcs/tcs_ps.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 
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