xref: /netbsd-src/crypto/external/cpl/trousers/dist/src/tcs/rpc/tcstp/rpc_context.c (revision 1023804e3833a0bd94414f2545512128f6502c74)
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 #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
tcs_wrap_OpenContext(struct tcsd_thread_data * data)31 tcs_wrap_OpenContext(struct tcsd_thread_data *data)
32 {
33 	TCS_CONTEXT_HANDLE hContext;
34 	TSS_RESULT result;
35 	UINT32 tpm_version = tpm_metrics.version.minor;
36 
37 	LogDebugFn("thread %ld", THREAD_ID);
38 
39 	result = TCS_OpenContext_Internal(&hContext);
40 	if (result == TSS_SUCCESS) {
41 		initData(&data->comm, 2);
42 		if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
43 			return TCSERR(TSS_E_INTERNAL_ERROR);
44 
45 		if (setData(TCSD_PACKET_TYPE_UINT32, 1, &tpm_version, 0, &data->comm))
46 			return TCSERR(TSS_E_INTERNAL_ERROR);
47 
48 		/* Set the context in the thread's object. Later, if something goes wrong
49 		 * and the connection can't be closed cleanly, we'll still have a reference
50 		 * to what resources need to be freed. */
51 		data->context = hContext;
52 
53 		LogDebug("New context is 0x%x", hContext);
54 	} else
55 		initData(&data->comm, 0);
56 
57 	data->comm.hdr.u.result = result;
58 
59 	return TSS_SUCCESS;
60 }
61 
62 TSS_RESULT
tcs_wrap_CloseContext(struct tcsd_thread_data * data)63 tcs_wrap_CloseContext(struct tcsd_thread_data *data)
64 {
65 	TCS_CONTEXT_HANDLE hContext;
66 	TSS_RESULT result;
67 
68 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
69 		return TCSERR(TSS_E_INTERNAL_ERROR);
70 
71 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
72 
73 	result = TCS_CloseContext_Internal(hContext);
74 
75 	/* This will signal the thread that the connection has been closed cleanly */
76 	if (result == TSS_SUCCESS)
77 		data->context = NULL_TCS_HANDLE;
78 
79 	initData(&data->comm, 0);
80 	data->comm.hdr.u.result = result;
81 
82 	return TSS_SUCCESS;
83 }
84