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 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 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 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 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