Home | History | Annotate | Line # | Download | only in tcstp
      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-2007
      8  *
      9  */
     10 
     11 #include <stdlib.h>
     12 #include <stdio.h>
     13 #include <syslog.h>
     14 #include <string.h>
     15 #include <netdb.h>
     16 
     17 #include "trousers/tss.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 "tcslog.h"
     24 #include "tcsd_wrap.h"
     25 #include "tcsd.h"
     26 #include "tcs_utils.h"
     27 #include "rpc_tcstp_tcs.h"
     28 
     29 
     30 TSS_RESULT
     31 tcs_wrap_PhysicalSetDeactivated(struct tcsd_thread_data *data)
     32 {
     33 	TCS_CONTEXT_HANDLE hContext;
     34 	TSS_BOOL state;
     35 	TSS_RESULT result;
     36 
     37 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
     38 		return TCSERR(TSS_E_INTERNAL_ERROR);
     39 
     40 	if ((result = ctx_verify_context(hContext)))
     41 		goto done;
     42 
     43 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
     44 
     45 	if (getData(TCSD_PACKET_TYPE_BOOL, 1, &state, 0, &data->comm))
     46 		return TCSERR(TSS_E_INTERNAL_ERROR);
     47 
     48 	MUTEX_LOCK(tcsp_lock);
     49 
     50 	result = TCSP_PhysicalSetDeactivated_Internal(hContext, state);
     51 
     52 	MUTEX_UNLOCK(tcsp_lock);
     53 done:
     54 	initData(&data->comm, 0);
     55 	data->comm.hdr.u.result = result;
     56 
     57 	return TSS_SUCCESS;
     58 }
     59 
     60 TSS_RESULT
     61 tcs_wrap_DisableOwnerClear(struct tcsd_thread_data *data)
     62 {
     63 	TCS_CONTEXT_HANDLE hContext;
     64 	TSS_RESULT result;
     65 	TPM_AUTH auth;
     66 
     67 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
     68 		return TCSERR(TSS_E_INTERNAL_ERROR);
     69 
     70 	if ((result = ctx_verify_context(hContext)))
     71 		goto done;
     72 
     73 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
     74 
     75 	if (getData(TCSD_PACKET_TYPE_AUTH, 1, &auth, 0, &data->comm))
     76 		return TCSERR(TSS_E_INTERNAL_ERROR);
     77 
     78 	MUTEX_LOCK(tcsp_lock);
     79 
     80 	result = TCSP_DisableOwnerClear_Internal(hContext, &auth);
     81 
     82 	MUTEX_UNLOCK(tcsp_lock);
     83 
     84 	if (result == TSS_SUCCESS) {
     85 		initData(&data->comm, 1);
     86 		if (setData(TCSD_PACKET_TYPE_AUTH, 0, &auth, 0, &data->comm)) {
     87 			return TCSERR(TSS_E_INTERNAL_ERROR);
     88 		}
     89 	} else
     90 done:		initData(&data->comm, 0);
     91 
     92 	data->comm.hdr.u.result = result;
     93 	return TSS_SUCCESS;
     94 }
     95 
     96 TSS_RESULT
     97 tcs_wrap_ForceClear(struct tcsd_thread_data *data)
     98 {
     99 	TCS_CONTEXT_HANDLE hContext;
    100 	TSS_RESULT result;
    101 
    102 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    103 		return TCSERR(TSS_E_INTERNAL_ERROR);
    104 
    105 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    106 
    107 	MUTEX_LOCK(tcsp_lock);
    108 
    109 	result = TCSP_ForceClear_Internal(hContext);
    110 
    111 	MUTEX_UNLOCK(tcsp_lock);
    112 
    113 	initData(&data->comm, 0);
    114 	data->comm.hdr.u.result = result;
    115 
    116 	return TSS_SUCCESS;
    117 }
    118 
    119 TSS_RESULT
    120 tcs_wrap_DisableForceClear(struct tcsd_thread_data *data)
    121 {
    122 	TCS_CONTEXT_HANDLE hContext;
    123 	TSS_RESULT result;
    124 
    125 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    126 		return TCSERR(TSS_E_INTERNAL_ERROR);
    127 
    128 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    129 
    130 	MUTEX_LOCK(tcsp_lock);
    131 
    132 	result = TCSP_DisableForceClear_Internal(hContext);
    133 
    134 	MUTEX_UNLOCK(tcsp_lock);
    135 
    136 	initData(&data->comm, 0);
    137 	data->comm.hdr.u.result = result;
    138 
    139 	return TSS_SUCCESS;
    140 }
    141 
    142 TSS_RESULT
    143 tcs_wrap_PhysicalEnable(struct tcsd_thread_data *data)
    144 {
    145 	TCS_CONTEXT_HANDLE hContext;
    146 	TSS_RESULT result;
    147 
    148 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    149 		return TCSERR(TSS_E_INTERNAL_ERROR);
    150 
    151 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    152 
    153 	MUTEX_LOCK(tcsp_lock);
    154 
    155 	result = TCSP_PhysicalEnable_Internal(hContext);
    156 
    157 	MUTEX_UNLOCK(tcsp_lock);
    158 
    159 	initData(&data->comm, 0);
    160 	data->comm.hdr.u.result = result;
    161 
    162 	return TSS_SUCCESS;
    163 }
    164 
    165 TSS_RESULT
    166 tcs_wrap_SetOwnerInstall(struct tcsd_thread_data *data)
    167 {
    168 	TCS_CONTEXT_HANDLE hContext;
    169 	TSS_BOOL state;
    170 	TSS_RESULT result;
    171 
    172 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    173 		return TCSERR(TSS_E_INTERNAL_ERROR);
    174 
    175 	if ((result = ctx_verify_context(hContext)))
    176 		goto done;
    177 
    178 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    179 
    180 	if (getData(TCSD_PACKET_TYPE_BOOL, 1, &state, 0, &data->comm))
    181 		return TCSERR(TSS_E_INTERNAL_ERROR);
    182 
    183 	MUTEX_LOCK(tcsp_lock);
    184 
    185 	result = TCSP_SetOwnerInstall_Internal(hContext, state);
    186 
    187 	MUTEX_UNLOCK(tcsp_lock);
    188 done:
    189 	initData(&data->comm, 0);
    190 	data->comm.hdr.u.result = result;
    191 
    192 	return TSS_SUCCESS;
    193 }
    194 
    195 TSS_RESULT
    196 tcs_wrap_OwnerSetDisable(struct tcsd_thread_data *data)
    197 {
    198 	TCS_CONTEXT_HANDLE hContext;
    199 	TSS_BOOL disableState;
    200 	TPM_AUTH ownerAuth;
    201 	TSS_RESULT result;
    202 
    203 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    204 		return TCSERR(TSS_E_INTERNAL_ERROR);
    205 
    206 	if ((result = ctx_verify_context(hContext)))
    207 		goto done;
    208 
    209 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    210 
    211 	if (getData(TCSD_PACKET_TYPE_BOOL, 1, &disableState, 0, &data->comm))
    212 		return TCSERR(TSS_E_INTERNAL_ERROR);
    213 
    214 	if (getData(TCSD_PACKET_TYPE_AUTH, 2, &ownerAuth, 0, &data->comm))
    215 		return TCSERR(TSS_E_INTERNAL_ERROR);
    216 
    217 	MUTEX_LOCK(tcsp_lock);
    218 
    219 	result = TCSP_OwnerSetDisable_Internal(hContext, disableState, &ownerAuth);
    220 
    221 	MUTEX_UNLOCK(tcsp_lock);
    222 
    223 	if (result == TSS_SUCCESS) {
    224 		initData(&data->comm, 1);
    225 		if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) {
    226 			return TCSERR(TSS_E_INTERNAL_ERROR);
    227 		}
    228 	} else
    229 done:		initData(&data->comm, 0);
    230 	data->comm.hdr.u.result = result;
    231 
    232 	return TSS_SUCCESS;
    233 }
    234 
    235 TSS_RESULT
    236 tcs_wrap_PhysicalDisable(struct tcsd_thread_data *data)
    237 {
    238 	TCS_CONTEXT_HANDLE hContext;
    239 	TSS_RESULT result;
    240 
    241 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    242 		return TCSERR(TSS_E_INTERNAL_ERROR);
    243 
    244 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    245 
    246 	MUTEX_LOCK(tcsp_lock);
    247 
    248 	result = TCSP_PhysicalDisable_Internal(hContext);
    249 
    250 	MUTEX_UNLOCK(tcsp_lock);
    251 
    252 	initData(&data->comm, 0);
    253 	data->comm.hdr.u.result = result;
    254 
    255 	return TSS_SUCCESS;
    256 }
    257 
    258 TSS_RESULT
    259 tcs_wrap_PhysicalPresence(struct tcsd_thread_data *data)
    260 {
    261 	TCS_CONTEXT_HANDLE hContext;
    262 	TSS_RESULT result;
    263 	TCPA_PHYSICAL_PRESENCE phyPresFlags;
    264 
    265 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    266 		return TCSERR(TSS_E_INTERNAL_ERROR);
    267 
    268 	if ((result = ctx_verify_context(hContext)))
    269 		goto done;
    270 
    271 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    272 
    273 	if (getData(TCSD_PACKET_TYPE_UINT16, 1, &phyPresFlags, 0, &data->comm))
    274 		return TCSERR(TSS_E_INTERNAL_ERROR);
    275 
    276 	MUTEX_LOCK(tcsp_lock);
    277 
    278 	result = TCSP_PhysicalPresence_Internal(hContext, phyPresFlags);
    279 
    280 	MUTEX_UNLOCK(tcsp_lock);
    281 done:
    282 	initData(&data->comm, 0);
    283 	data->comm.hdr.u.result = result;
    284 
    285 	return TSS_SUCCESS;
    286 }
    287 
    288 TSS_RESULT
    289 tcs_wrap_SetTempDeactivated(struct tcsd_thread_data *data)
    290 {
    291 	TCS_CONTEXT_HANDLE hContext;
    292 	TSS_RESULT result;
    293 
    294 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    295 		return TCSERR(TSS_E_INTERNAL_ERROR);
    296 
    297 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    298 
    299 	MUTEX_LOCK(tcsp_lock);
    300 
    301 	result = TCSP_SetTempDeactivated_Internal(hContext);
    302 
    303 	MUTEX_UNLOCK(tcsp_lock);
    304 
    305 	initData(&data->comm, 0);
    306 	data->comm.hdr.u.result = result;
    307 
    308 	return TSS_SUCCESS;
    309 }
    310 
    311 #ifdef TSS_BUILD_TSS12
    312 TSS_RESULT
    313 tcs_wrap_SetTempDeactivated2(struct tcsd_thread_data *data)
    314 {
    315 	TCS_CONTEXT_HANDLE hContext;
    316 	TPM_AUTH operatorAuth, nullAuth, *pAuth;
    317 	TSS_RESULT result;
    318 
    319 	memset(&operatorAuth, 0, sizeof(TPM_AUTH));
    320 	memset(&nullAuth, 0, sizeof(TPM_AUTH));
    321 
    322 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    323 		return TCSERR(TSS_E_INTERNAL_ERROR);
    324 
    325 	if ((result = ctx_verify_context(hContext)))
    326 		goto done;
    327 
    328 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    329 
    330 	if (getData(TCSD_PACKET_TYPE_AUTH, 1, &operatorAuth, 0, &data->comm))
    331 		return TCSERR(TSS_E_INTERNAL_ERROR);
    332 
    333 	if (memcmp(&nullAuth, &operatorAuth, sizeof(TPM_AUTH)))
    334 		pAuth = &operatorAuth;
    335 	else
    336 		pAuth = NULL;
    337 
    338 	MUTEX_LOCK(tcsp_lock);
    339 
    340 	result = TCSP_SetTempDeactivated2_Internal(hContext, pAuth);
    341 
    342 	MUTEX_UNLOCK(tcsp_lock);
    343 
    344 	if (result == TSS_SUCCESS) {
    345 		initData(&data->comm, 1);
    346 		if (pAuth) {
    347 			if (setData(TCSD_PACKET_TYPE_AUTH, 0, pAuth, 0, &data->comm)) {
    348 				return TCSERR(TSS_E_INTERNAL_ERROR);
    349 			}
    350 		}
    351 	} else
    352 done:		initData(&data->comm, 0);
    353 
    354 	data->comm.hdr.u.result = result;
    355 
    356 	return TSS_SUCCESS;
    357 }
    358 
    359 TSS_RESULT
    360 tcs_wrap_ResetLockValue(struct tcsd_thread_data *data)
    361 {
    362 	TCS_CONTEXT_HANDLE hContext;
    363 	TPM_AUTH ownerAuth;
    364 	TSS_RESULT result;
    365 
    366 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    367 		return TCSERR(TSS_E_INTERNAL_ERROR);
    368 
    369 	if ((result = ctx_verify_context(hContext)))
    370 		goto done;
    371 
    372 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    373 
    374 	if (getData(TCSD_PACKET_TYPE_AUTH, 1, &ownerAuth, 0, &data->comm))
    375 		return TCSERR(TSS_E_INTERNAL_ERROR);
    376 
    377 	MUTEX_LOCK(tcsp_lock);
    378 
    379 	result = TCSP_ResetLockValue_Internal(hContext, &ownerAuth);
    380 
    381 	MUTEX_UNLOCK(tcsp_lock);
    382 
    383 	if (result == TSS_SUCCESS) {
    384 		initData(&data->comm, 1);
    385 		if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) {
    386 			return TCSERR(TSS_E_INTERNAL_ERROR);
    387 		}
    388 	} else
    389 done:		initData(&data->comm, 0);
    390 
    391 	data->comm.hdr.u.result = result;
    392 
    393 	return TSS_SUCCESS;
    394 }
    395 
    396 TSS_RESULT
    397 tcs_wrap_FlushSpecific(struct tcsd_thread_data *data)
    398 {
    399 	TCS_CONTEXT_HANDLE hContext;
    400 	TCS_HANDLE hResHandle;
    401 	TPM_RESOURCE_TYPE resourceType;
    402 	TSS_RESULT result;
    403 
    404 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    405 		return TCSERR(TSS_E_INTERNAL_ERROR);
    406 
    407 	if ((result = ctx_verify_context(hContext)))
    408 		goto done;
    409 
    410 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    411 
    412 	if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hResHandle, 0, &data->comm))
    413 		return TCSERR(TSS_E_INTERNAL_ERROR);
    414 	if (getData(TCSD_PACKET_TYPE_UINT32, 2, &resourceType, 0, &data->comm))
    415 		return TCSERR(TSS_E_INTERNAL_ERROR);
    416 
    417 	MUTEX_LOCK(tcsp_lock);
    418 
    419 	result = TCSP_FlushSpecific_Internal(hContext, hResHandle, resourceType);
    420 
    421 	MUTEX_UNLOCK(tcsp_lock);
    422 done:
    423 	initData(&data->comm, 0);
    424 	data->comm.hdr.u.result = result;
    425 
    426 	return TSS_SUCCESS;
    427 }
    428 #endif
    429