Home | History | Annotate | Line # | Download | only in tcs
      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