1 
2 /*
3  * The Initial Developer of the Original Code is Intel Corporation.
4  * Portions created by Intel Corporation are Copyright (C) 2007 Intel Corporation.
5  * All Rights Reserved.
6  * trousers - An open source TCG Software Stack
7  *
8  * Author: james.xu@intel.com Rossey.liu@intel.com
9  *
10  */
11 
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <string.h>
15 #include <inttypes.h>
16 
17 #include "trousers/tss.h"
18 #include "trousers_types.h"
19 #include "tcs_tsp.h"
20 #include "tcsps.h"
21 #include "tcs_utils.h"
22 #include "tcs_int_literals.h"
23 #include "capabilities.h"
24 #include "tcslog.h"
25 #include "req_mgr.h"
26 #include "tcsd_wrap.h"
27 #include "tcsd.h"
28 
29 TSS_RESULT
TCSP_NV_DefineOrReleaseSpace_Internal(TCS_CONTEXT_HANDLE hContext,UINT32 cPubInfoSize,BYTE * pPubInfo,TPM_ENCAUTH encAuth,TPM_AUTH * pAuth)30 TCSP_NV_DefineOrReleaseSpace_Internal(TCS_CONTEXT_HANDLE hContext, /* in */
31                                               UINT32 cPubInfoSize,    /* in */
32                                               BYTE* pPubInfo,         /* in */
33                                               TPM_ENCAUTH encAuth,    /* in */
34                                               TPM_AUTH* pAuth)        /* in, out */
35 {
36           UINT64 offset = 0;
37           UINT32 paramSize;
38           TSS_RESULT result;
39           BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
40 
41           LogDebugFn("Enter");
42           if ((result = ctx_verify_context(hContext)))
43                     return result;
44 
45           if (pAuth) {
46                     if ((result = auth_mgr_check(hContext, &pAuth->AuthHandle)))
47                               goto done;
48           }
49 
50           if ((result = tpm_rqu_build(TPM_ORD_NV_DefineSpace, &offset, txBlob, cPubInfoSize, pPubInfo,
51                                             TPM_ENCAUTH_SIZE, encAuth.authdata, pAuth)))
52                     return result;
53 
54           LogDebug("req_mgr_submit_req  (oldOffset=%" PRIu64 ")", offset);
55           if ((result = req_mgr_submit_req(txBlob)))
56                     goto done;
57 
58           result = UnloadBlob_Header(txBlob, &paramSize);
59           LogDebug("UnloadBlob  (paramSize=%u) result=%u", paramSize, result);
60           if (!result) {
61                     result = tpm_rsp_parse(TPM_ORD_NV_DefineSpace, txBlob, paramSize, pAuth);
62           }
63 done:
64           LogDebug("Leaving DefineSpace with result:%u", result);
65           auth_mgr_release_auth(pAuth, NULL, hContext);
66           return result;
67 }
68 
69 TSS_RESULT
TCSP_NV_WriteValue_Internal(TCS_CONTEXT_HANDLE hContext,TSS_NV_INDEX hNVStore,UINT32 offset,UINT32 ulDataLength,BYTE * rgbDataToWrite,TPM_AUTH * privAuth)70 TCSP_NV_WriteValue_Internal(TCS_CONTEXT_HANDLE hContext,    /* in */
71                                   TSS_NV_INDEX hNVStore,    /* in */
72                                   UINT32 offset,            /* in */
73                                   UINT32 ulDataLength,      /* in */
74                                   BYTE * rgbDataToWrite,    /* in */
75                                   TPM_AUTH * privAuth)      /* in, out */
76 {
77           UINT64 off_set = 0;
78           UINT32 paramSize;
79           TSS_RESULT result;
80           BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
81 
82           LogDebugFn("Enter");
83           if ( (result = ctx_verify_context(hContext)))
84                     return result;
85           if (privAuth) {
86                     if ((result = auth_mgr_check(hContext, &privAuth->AuthHandle)))
87                               goto done;
88           }
89 
90           if ((result = tpm_rqu_build(TPM_ORD_NV_WriteValue, &off_set, txBlob, hNVStore, offset,
91                                             ulDataLength, rgbDataToWrite, privAuth)))
92                     return result;
93 
94           LogDebug("req_mgr_submit_req  (oldOffset=%" PRIu64 ")", off_set);
95           if ((result = req_mgr_submit_req(txBlob)))
96                     goto done;
97 
98           result = UnloadBlob_Header(txBlob, &paramSize);
99           LogDebug("UnloadBlob  (paramSize=%u) result=%u", paramSize, result);
100           if (!result) {
101                     result = tpm_rsp_parse(TPM_ORD_NV_WriteValue, txBlob, paramSize, privAuth);
102           }
103 done:
104           LogDebug("Leaving NVWriteValue with result:%u", result);
105           auth_mgr_release_auth(privAuth, NULL, hContext);
106           return result;
107 }
108 
109 TSS_RESULT
TCSP_NV_WriteValueAuth_Internal(TCS_CONTEXT_HANDLE hContext,TSS_NV_INDEX hNVStore,UINT32 offset,UINT32 ulDataLength,BYTE * rgbDataToWrite,TPM_AUTH * NVAuth)110 TCSP_NV_WriteValueAuth_Internal(TCS_CONTEXT_HANDLE hContext,          /* in */
111                                         TSS_NV_INDEX hNVStore,        /* in */
112                                         UINT32 offset,                /* in */
113                                         UINT32 ulDataLength,          /* in */
114                                         BYTE * rgbDataToWrite,        /* in */
115                                         TPM_AUTH * NVAuth)  /* in, out */
116 {
117           UINT64 off_set = 0;
118           UINT32 paramSize;
119           TSS_RESULT result;
120           BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
121 
122           LogDebugFn("Enter");
123           if ((result = ctx_verify_context(hContext)))
124                     return result;
125           if ((result = auth_mgr_check(hContext, &NVAuth->AuthHandle)))
126                     goto done;
127 
128           if ((result = tpm_rqu_build(TPM_ORD_NV_WriteValueAuth, &off_set, txBlob, hNVStore, offset,
129                                             ulDataLength, rgbDataToWrite, NVAuth)))
130                     return result;
131 
132           LogDebug("req_mgr_submit_req  (oldOffset=%" PRIu64 ")", off_set);
133           if ((result = req_mgr_submit_req(txBlob)))
134                     goto done;
135 
136           result = UnloadBlob_Header(txBlob, &paramSize);
137           LogDebug("UnloadBlob  (paramSize=%u) result=%u", paramSize, result);
138           if (!result) {
139                     result = tpm_rsp_parse(TPM_ORD_NV_WriteValueAuth, txBlob, paramSize, NVAuth);
140           }
141 done:
142           LogDebug("Leaving NVWriteValueAuth with result:%u", result);
143           auth_mgr_release_auth(NVAuth, NULL, hContext);
144           return result;
145 }
146 
147 TSS_RESULT
TCSP_NV_ReadValue_Internal(TCS_CONTEXT_HANDLE hContext,TSS_NV_INDEX hNVStore,UINT32 offset,UINT32 * pulDataLength,TPM_AUTH * privAuth,BYTE ** rgbDataRead)148 TCSP_NV_ReadValue_Internal(TCS_CONTEXT_HANDLE hContext,     /* in */
149                                  TSS_NV_INDEX hNVStore,     /* in */
150                                  UINT32 offset,   /* in */
151                                  UINT32 * pulDataLength,    /* in, out */
152                                  TPM_AUTH * privAuth,       /* in, out */
153                                  BYTE ** rgbDataRead)       /* out */
154 {
155           UINT64 off_set = 0;
156           UINT32 paramSize;
157           TSS_RESULT result;
158           BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
159 
160           LogDebugFn("Enter");
161           if ((result = ctx_verify_context(hContext)))
162                     return result;
163 
164           if (privAuth) {
165                     if ((result = auth_mgr_check(hContext, &privAuth->AuthHandle)))
166                               goto done;
167           }
168 
169           if ((result = tpm_rqu_build(TPM_ORD_NV_ReadValue, &off_set, txBlob, hNVStore, offset,
170                                             *pulDataLength, privAuth)))
171                     return result;
172 
173           LogDebug("req_mgr_submit_req  (oldOffset=%" PRIu64 ")", off_set);
174           if ((result = req_mgr_submit_req(txBlob)))
175                     goto done;
176 
177           result = UnloadBlob_Header(txBlob, &paramSize);
178           LogDebug("UnloadBlob  (paramSize=%u) result=%u", paramSize, result);
179           if (!result) {
180                     result = tpm_rsp_parse(TPM_ORD_NV_ReadValue, txBlob, paramSize, pulDataLength,
181                                                rgbDataRead, privAuth, NULL);
182           }
183 done:
184           LogDebug("Leaving NVReadValue with result:%u", result);
185           auth_mgr_release_auth(privAuth, NULL, hContext);
186           return result;
187 }
188 
189 TSS_RESULT
TCSP_NV_ReadValueAuth_Internal(TCS_CONTEXT_HANDLE hContext,TSS_NV_INDEX hNVStore,UINT32 offset,UINT32 * pulDataLength,TPM_AUTH * NVAuth,BYTE ** rgbDataRead)190 TCSP_NV_ReadValueAuth_Internal(TCS_CONTEXT_HANDLE hContext, /* in */
191                                      TSS_NV_INDEX hNVStore, /* in */
192                                      UINT32 offset,                   /* in */
193                                      UINT32 * pulDataLength,          /* in, out */
194                                      TPM_AUTH * NVAuth,     /* in, out */
195                                      BYTE ** rgbDataRead)   /* out */
196 {
197           UINT64 off_set = 0;
198           UINT32 paramSize;
199           TSS_RESULT result;
200           BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
201 
202           LogDebugFn("Enter");
203           if ((result = ctx_verify_context(hContext)))
204                     return result;
205           if ((NVAuth != NULL) && (result = auth_mgr_check(hContext, &NVAuth->AuthHandle)))
206                     goto done;
207 
208           if ((result = tpm_rqu_build(TPM_ORD_NV_ReadValueAuth, &off_set, txBlob, hNVStore, offset,
209                                             *pulDataLength, NVAuth)))
210                     return result;
211 
212           LogDebug("req_mgr_submit_req  (oldOffset=%" PRIu64 ")", off_set);
213           if ((result = req_mgr_submit_req(txBlob)))
214                     goto done;
215 
216           result = UnloadBlob_Header(txBlob, &paramSize);
217           LogDebug("UnloadBlob  (paramSize=%u) result=%u", paramSize, result);
218           if (!result) {
219                     result = tpm_rsp_parse(TPM_ORD_NV_ReadValueAuth, txBlob, paramSize, pulDataLength,
220                                                rgbDataRead, NVAuth, NULL);
221           }
222 done:
223           LogDebug("Leaving NVReadValueAuth with result:%u", result);
224           auth_mgr_release_auth(NVAuth, NULL, hContext);
225           return result;
226 }
227 
228