2
* The Initial Developer of the Original Code is Intel Corporation.
3
* Portions created by Intel Corporation are Copyright (C) 2007 Intel Corporation.
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the Common Public License as published by
8
* IBM Corporation; either version 1 of the License, or (at your option)
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* Common Public License for more details.
16
* You should have received a copy of the Common Public License
17
* along with this program; if not, a copy can be viewed at
18
* http://www.opensource.org/licenses/cpl1.0.php.
20
* trousers - An open source TCG Software Stack
22
* Author: james.xu@intel.com Rossey.liu@intel.com
31
#include "trousers/tss.h"
32
#include "trousers/trousers.h"
33
#include "trousers_types.h"
34
#include "spi_utils.h"
35
#include "capabilities.h"
40
obj_nvstore_add(TSS_HCONTEXT tspContext, TSS_HOBJECT *phObject)
43
struct tr_nvstore_obj *nvstore = calloc(1, sizeof(struct tr_nvstore_obj));
45
if (nvstore == NULL) {
46
LogError("malloc of %zd bytes failed.",
47
sizeof(struct tr_nvstore_obj));
48
return TSPERR(TSS_E_OUTOFMEMORY);
51
if ((result = obj_list_add(&nvstore_list, tspContext, 0, nvstore, phObject))) {
60
obj_is_nvstore(TSS_HOBJECT hObject)
62
TSS_BOOL answer = FALSE;
64
if ((obj_list_get_obj(&nvstore_list, hObject))) {
66
obj_list_put(&nvstore_list);
73
nvstore_free(void *data)
75
struct tr_nvstore_obj *nvstore = (struct tr_nvstore_obj *)data;
81
obj_nvstore_remove(TSS_HOBJECT hObject, TSS_HCONTEXT tspContext)
85
if ((result = obj_list_remove(&nvstore_list, &nvstore_free, hObject, tspContext)))
92
obj_nvstore_get_tsp_context(TSS_HNVSTORE hNvstore, TSS_HCONTEXT * tspContext)
94
struct tsp_object *obj;
96
if ((obj = obj_list_get_obj(&nvstore_list, hNvstore)) == NULL)
97
return TSPERR(TSS_E_INVALID_HANDLE);
99
*tspContext = obj->tspContext;
101
obj_list_put(&nvstore_list);
107
obj_nvstore_set_index(TSS_HNVSTORE hNvstore, UINT32 index)
109
struct tsp_object *obj;
110
struct tr_nvstore_obj *nvstore;
111
TSS_RESULT result=TSS_SUCCESS;
113
if ((obj = obj_list_get_obj(&nvstore_list, hNvstore)) == NULL)
114
return TSPERR(TSS_E_INVALID_HANDLE);
116
nvstore = (struct tr_nvstore_obj *)obj->data;
118
nvstore->nvIndex = index;
120
obj_list_put(&nvstore_list);
126
obj_nvstore_get_index(TSS_HNVSTORE hNvstore, UINT32 * index)
128
struct tsp_object *obj;
129
struct tr_nvstore_obj *nvstore;
130
TSS_RESULT result=TSS_SUCCESS;
132
if ((obj = obj_list_get_obj(&nvstore_list, hNvstore)) == NULL)
133
return TSPERR(TSS_E_INVALID_HANDLE);
135
nvstore = (struct tr_nvstore_obj *)obj->data;
137
*index = nvstore->nvIndex;
139
obj_list_put(&nvstore_list);
145
obj_nvstore_set_datasize(TSS_HNVSTORE hNvstore, UINT32 datasize)
147
struct tsp_object *obj;
148
struct tr_nvstore_obj *nvstore;
149
TSS_RESULT result=TSS_SUCCESS;
151
if ((obj = obj_list_get_obj(&nvstore_list, hNvstore)) == NULL)
152
return TSPERR(TSS_E_INVALID_HANDLE);
154
nvstore = (struct tr_nvstore_obj *)obj->data;
156
nvstore->dataSize= datasize;
158
obj_list_put(&nvstore_list);
164
obj_nvstore_get_datasize(TSS_HNVSTORE hNvstore, UINT32 * datasize)
166
struct tsp_object *obj;
167
struct tr_nvstore_obj *nvstore;
168
TSS_RESULT result=TSS_SUCCESS;
170
if ((obj = obj_list_get_obj(&nvstore_list, hNvstore)) == NULL)
171
return TSPERR(TSS_E_INVALID_HANDLE);
173
nvstore = (struct tr_nvstore_obj *)obj->data;
175
*datasize = nvstore->dataSize;
177
obj_list_put(&nvstore_list);
183
obj_nvstore_set_permission(TSS_HNVSTORE hNvstore, UINT32 permission)
185
struct tsp_object *obj;
186
struct tr_nvstore_obj *nvstore;
187
TSS_RESULT result=TSS_SUCCESS;
189
if ((obj = obj_list_get_obj(&nvstore_list, hNvstore)) == NULL)
190
return TSPERR(TSS_E_INVALID_HANDLE);
192
nvstore = (struct tr_nvstore_obj *)obj->data;
194
nvstore->permission.attributes= permission;
196
obj_list_put(&nvstore_list);
202
obj_nvstore_get_permission_from_tpm(TSS_HNVSTORE hNvstore, UINT32 * permission)
204
BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE] = {0};
205
UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
207
UINT16 pcrread_sizeOfSelect;
208
UINT16 pcrwrite_sizeOfSelect;
209
TPM_NV_ATTRIBUTES nv_attributes_value;
210
TSS_HCONTEXT tspContext;
213
if((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
216
if ((result = obj_nvstore_get_tsp_context(hNvstore, &tspContext)))
220
offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
221
pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
223
offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect
224
+ sizeof(TPM_LOCALITY_SELECTION)
225
+ sizeof(TPM_COMPOSITE_HASH);
226
pcrwrite_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
228
offset = offset + sizeof(UINT16) + pcrwrite_sizeOfSelect
229
+ sizeof(TPM_LOCALITY_SELECTION)
230
+ sizeof(TPM_COMPOSITE_HASH);
232
nv_attributes_value.attributes = Decode_UINT32(nv_data_public
233
+ offset + sizeof(TPM_STRUCTURE_TAG));
234
*permission = nv_attributes_value.attributes;
240
obj_nvstore_get_permission(TSS_HNVSTORE hNvstore, UINT32 * permission)
242
struct tsp_object *obj;
243
struct tr_nvstore_obj *nvstore;
244
TSS_RESULT result=TSS_SUCCESS;
246
if ((obj = obj_list_get_obj(&nvstore_list, hNvstore)) == NULL)
247
return TSPERR(TSS_E_INVALID_HANDLE);
249
nvstore = (struct tr_nvstore_obj *)obj->data;
251
*permission = nvstore->permission.attributes;
253
obj_list_put(&nvstore_list);
259
obj_nvstore_set_policy(TSS_HNVSTORE hNvstore, TSS_HPOLICY hPolicy)
261
struct tsp_object *obj;
262
struct tr_nvstore_obj *nvstore;
264
TSS_RESULT result = TSS_SUCCESS;
266
if ((result = obj_policy_get_type(hPolicy, &policyType)))
269
if ((obj = obj_list_get_obj(&nvstore_list, hNvstore)) == NULL)
270
return TSPERR(TSS_E_INVALID_HANDLE);
272
nvstore = (struct tr_nvstore_obj *)obj->data;
274
switch (policyType) {
275
case TSS_POLICY_USAGE:
276
nvstore->policy = hPolicy;
279
result = TSPERR(TSS_E_BAD_PARAMETER);
282
obj_list_put(&nvstore_list);
288
obj_nvstore_get_policy(TSS_HNVSTORE hNvstore, UINT32 policyType, TSS_HPOLICY *phPolicy)
290
struct tsp_object *obj;
291
struct tr_nvstore_obj *nvstore;
292
TSS_RESULT result=TSS_SUCCESS;
294
if ((obj = obj_list_get_obj(&nvstore_list, hNvstore)) == NULL)
295
return TSPERR(TSS_E_INVALID_HANDLE);
297
nvstore = (struct tr_nvstore_obj *)obj->data;
299
switch (policyType) {
300
case TSS_POLICY_USAGE:
301
*phPolicy = nvstore->policy;
304
result = TSPERR(TSS_E_BAD_PARAMETER);
307
obj_list_put(&nvstore_list);
313
obj_nvstore_get_datapublic(TSS_HNVSTORE hNvstore, UINT32 *size, BYTE *nv_data_public)
315
struct tsp_object *obj;
316
TSS_HCONTEXT hContext;
319
struct tr_nvstore_obj *nvstore;
323
TPM_BOOL defined_index = FALSE;
325
if ((obj = obj_list_get_obj(&nvstore_list, hNvstore)) == NULL)
326
return TSPERR(TSS_E_INVALID_HANDLE);
328
hContext = obj->tspContext;
329
nvstore = (struct tr_nvstore_obj *)obj->data;
331
if ((result = obj_tpm_get(hContext, &hTpm)))
334
if ((result = Tspi_TPM_GetCapability(hTpm, TSS_TPMCAP_NV_LIST, 0,
335
NULL, &uiResultLen, &pResult))) {
339
for (i = 0; i < uiResultLen/sizeof(UINT32); i++) {
340
if (nvstore->nvIndex == Decode_UINT32(pResult + i * sizeof(UINT32))) {
341
defined_index = TRUE;
346
free_tspi(hContext, pResult);
348
if (!defined_index) {
349
result = TSPERR(TPM_E_BADINDEX);
353
if ((result = Tspi_TPM_GetCapability(hTpm, TSS_TPMCAP_NV_INDEX,
354
sizeof(UINT32), (BYTE *)(&(nvstore->nvIndex)),
355
&uiResultLen, &pResult))) {
356
LogDebug("get the index capability error");
360
if (uiResultLen > *size) {
361
free_tspi(hContext, pResult);
362
result = TSPERR(TSS_E_INTERNAL_ERROR);
366
memcpy(nv_data_public, pResult, uiResultLen);
367
free_tspi(hContext, pResult);
370
obj_list_put(&nvstore_list);
375
obj_nvstore_get_readdigestatrelease(TSS_HNVSTORE hNvstore, UINT32 *size, BYTE **data)
377
BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE];
378
UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
380
UINT16 pcrread_sizeOfSelect;
381
TSS_HCONTEXT tspContext;
384
if((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
387
if ((result = obj_nvstore_get_tsp_context(hNvstore, &tspContext)))
390
*size = sizeof(TPM_COMPOSITE_HASH);
391
*data = calloc_tspi(tspContext, *size);
393
LogError("malloc of %u bytes failed.", *size);
394
result = TSPERR(TSS_E_OUTOFMEMORY);
398
offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
399
pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
400
offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect + sizeof(TPM_LOCALITY_SELECTION);
401
memcpy(*data, nv_data_public + offset, sizeof(TPM_COMPOSITE_HASH));
407
obj_nvstore_get_readpcrselection(TSS_HNVSTORE hNvstore, UINT32 *size, BYTE **data)
409
BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE];
410
UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
412
UINT16 pcrread_sizeOfSelect;
413
TSS_HCONTEXT tspContext;
416
if((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
419
if ((result = obj_nvstore_get_tsp_context(hNvstore, &tspContext)))
422
offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
423
pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
425
*size = sizeof(UINT16) + pcrread_sizeOfSelect;
426
*data = calloc_tspi(tspContext, *size);
428
LogError("malloc of %u bytes failed.", *size);
429
result = TSPERR(TSS_E_OUTOFMEMORY);
433
memcpy(*data, nv_data_public + offset, *size);
439
obj_nvstore_get_writedigestatrelease(TSS_HNVSTORE hNvstore, UINT32 *size, BYTE **data)
441
BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE];
442
UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
444
UINT16 pcrread_sizeOfSelect;
445
UINT16 pcrwrite_sizeOfSelect;
446
TSS_HCONTEXT tspContext;
449
if ((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
452
if ((result = obj_nvstore_get_tsp_context(hNvstore, &tspContext)))
455
*size = sizeof(TPM_COMPOSITE_HASH);
456
*data = calloc_tspi(tspContext, *size);
458
LogError("malloc of %u bytes failed.", *size);
459
result = TSPERR(TSS_E_OUTOFMEMORY);
463
offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
464
pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
465
offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect
466
+ sizeof(TPM_LOCALITY_SELECTION)
467
+ sizeof(TPM_COMPOSITE_HASH);
469
pcrwrite_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
470
offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect + sizeof(TPM_LOCALITY_SELECTION);
471
memcpy(*data, nv_data_public + offset, sizeof(TPM_COMPOSITE_HASH));
477
obj_nvstore_get_writepcrselection(TSS_HNVSTORE hNvstore, UINT32 *size, BYTE **data)
479
BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE];
480
UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
482
UINT16 pcrread_sizeOfSelect;
483
UINT16 pcrwrite_sizeOfSelect;
484
TSS_HCONTEXT tspContext;
487
if((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
490
if ((result = obj_nvstore_get_tsp_context(hNvstore, &tspContext)))
493
offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
494
pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
495
offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect
496
+ sizeof(TPM_LOCALITY_SELECTION)
497
+ sizeof(TPM_COMPOSITE_HASH);
498
pcrwrite_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
500
*size = sizeof(UINT16) + pcrwrite_sizeOfSelect;
501
*data = calloc_tspi(tspContext, *size);
503
LogError("malloc of %u bytes failed.", *size);
504
result = TSPERR(TSS_E_OUTOFMEMORY);
508
memcpy(*data, nv_data_public + offset, *size);
513
obj_nvstore_get_state_readstclear(TSS_HNVSTORE hNvstore, UINT32 * readstclear)
515
BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE];
516
UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
518
UINT16 pcrread_sizeOfSelect;
519
UINT16 pcrwrite_sizeOfSelect;
523
if ((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
526
offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
527
pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
528
offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect
529
+ sizeof(TPM_LOCALITY_SELECTION)
530
+ sizeof(TPM_COMPOSITE_HASH);
532
pcrwrite_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
533
offset = offset + sizeof(UINT16) + pcrwrite_sizeOfSelect
534
+ sizeof(TPM_LOCALITY_SELECTION)
535
+ sizeof(TPM_COMPOSITE_HASH)
536
+ sizeof(TPM_NV_ATTRIBUTES);
538
value = *((TPM_BOOL *)(nv_data_public + offset));
540
*readstclear = value;
546
obj_nvstore_get_state_writedefine(TSS_HNVSTORE hNvstore, UINT32 * writedefine)
548
BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE];
549
UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
551
UINT16 pcrread_sizeOfSelect;
552
UINT16 pcrwrite_sizeOfSelect;
556
if ((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
559
offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
560
pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
561
offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect
562
+ sizeof(TPM_LOCALITY_SELECTION)
563
+ sizeof(TPM_COMPOSITE_HASH);
565
pcrwrite_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
566
offset = offset + sizeof(UINT16) + pcrwrite_sizeOfSelect
567
+ sizeof(TPM_LOCALITY_SELECTION)
568
+ sizeof(TPM_COMPOSITE_HASH)
569
+ sizeof(TPM_NV_ATTRIBUTES)
573
value = *((TPM_BOOL *)(nv_data_public + offset));
575
*writedefine = value;
581
obj_nvstore_get_state_writestclear(TSS_HNVSTORE hNvstore, UINT32 * writestclear)
583
BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE];
584
UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
586
UINT16 pcrread_sizeOfSelect;
587
UINT16 pcrwrite_sizeOfSelect;
591
if ((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
594
offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
595
pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
596
offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect
597
+ sizeof(TPM_LOCALITY_SELECTION)
598
+ sizeof(TPM_COMPOSITE_HASH);
600
pcrwrite_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
601
offset = offset + sizeof(UINT16) + pcrwrite_sizeOfSelect
602
+ sizeof(TPM_LOCALITY_SELECTION)
603
+ sizeof(TPM_COMPOSITE_HASH)
604
+ sizeof(TPM_NV_ATTRIBUTES)
607
value = *((TPM_BOOL *)(nv_data_public + offset));
608
*writestclear = value;
614
obj_nvstore_get_readlocalityatrelease(TSS_HNVSTORE hNvstore, UINT32 * readlocalityatrelease)
616
BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE];
617
UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
619
UINT16 pcrread_sizeOfSelect;
620
TPM_LOCALITY_SELECTION locality_value;
623
if ((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
626
offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
627
pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
628
offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect;
629
locality_value = *((TPM_LOCALITY_SELECTION *)(nv_data_public + offset));
630
*readlocalityatrelease = locality_value;
636
obj_nvstore_get_writelocalityatrelease(TSS_HNVSTORE hNvstore, UINT32 * writelocalityatrelease)
638
BYTE nv_data_public[MAX_PUBLIC_DATA_SIZE];
639
UINT32 data_public_size = MAX_PUBLIC_DATA_SIZE;
641
UINT16 pcrread_sizeOfSelect;
642
UINT16 pcrwrite_sizeOfSelect;
643
TPM_LOCALITY_SELECTION locality_value;
646
if ((result = obj_nvstore_get_datapublic(hNvstore, &data_public_size, nv_data_public)))
649
offset = sizeof(TPM_STRUCTURE_TAG)+ sizeof(TPM_NV_INDEX);
650
pcrread_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
651
offset = offset + sizeof(UINT16) + pcrread_sizeOfSelect
652
+ sizeof(TPM_LOCALITY_SELECTION)
653
+ sizeof(TPM_COMPOSITE_HASH);
654
pcrwrite_sizeOfSelect = Decode_UINT16(nv_data_public + offset);
655
offset = offset + sizeof(UINT16) + pcrwrite_sizeOfSelect;
657
locality_value = *((TPM_LOCALITY_SELECTION *)(nv_data_public + offset));
658
*writelocalityatrelease = locality_value;
664
obj_nvstore_create_pcrshortinfo(TSS_HNVSTORE hNvstore,
665
TSS_HPCRS hPcrComposite,
669
struct tsp_object *obj;
670
BYTE pdata[MAX_PUBLIC_DATA_SIZE];
673
TSS_HCONTEXT tspContext;
674
TSS_RESULT result = TSS_SUCCESS;
677
BYTE digAtRelease[TPM_SHA1_160_HASH_LEN] = { 0, };
678
UINT32 tmp_locAtRelease;
679
TPM_LOCALITY_SELECTION locAtRelease = TPM_LOC_ZERO | TPM_LOC_ONE
680
| TPM_LOC_TWO | TPM_LOC_THREE| TPM_LOC_FOUR;
681
BYTE tmp_pcr_select[3] = {0, 0, 0};
682
TCPA_PCR_SELECTION pcrSelect = { 3, tmp_pcr_select};
684
if ((obj = obj_list_get_obj(&nvstore_list, hNvstore)) == NULL)
685
return TSPERR(TSS_E_INVALID_HANDLE);
687
tspContext = obj->tspContext;
690
if ((result = obj_pcrs_get_selection(hPcrComposite, &dataLen, pdata))) {
691
LogDebug("get_selection error from hReadPcrComposite");
695
/* the index should not >= 24, so the sizeofselect should not be >3*/
696
if (dataLen - sizeof(UINT16) > 3) {
697
result = TSPERR(TSS_E_BAD_PARAMETER);
701
Trspi_UnloadBlob_PCR_SELECTION(&offset, pdata, &pcrSelect);
703
if (pcrSelect.sizeOfSelect != 0) {
704
if ((result = obj_pcrs_get_digest_at_release(hPcrComposite,
705
&dataLen, &ppbHashData))) {
706
LogDebug("get_composite error from hReadPcrComposite");
709
memcpy(digAtRelease, ppbHashData, dataLen);
710
free_tspi(tspContext, ppbHashData);
712
pcrSelect.sizeOfSelect = 3;
713
pcrSelect.pcrSelect = tmp_pcr_select;
716
if (pcrSelect.sizeOfSelect < 3) {
717
for (i = 0; i < pcrSelect.sizeOfSelect; i++) {
718
tmp_pcr_select[i] = pcrSelect.pcrSelect[i];
720
pcrSelect.sizeOfSelect = 3;
721
pcrSelect.pcrSelect = tmp_pcr_select;
724
if ((result = obj_pcrs_get_locality(hPcrComposite, &tmp_locAtRelease)))
726
locAtRelease = (TPM_LOCALITY_SELECTION)(tmp_locAtRelease & TSS_LOCALITY_MASK);
729
*size = sizeof(UINT16) + 3 + sizeof(TPM_LOCALITY_SELECTION) + TPM_SHA1_160_HASH_LEN;
730
*data = calloc_tspi(tspContext, *size);
732
LogError("malloc of %u bytes failed.", *size);
733
result = TSPERR(TSS_E_OUTOFMEMORY);
738
Trspi_LoadBlob_PCR_SELECTION(&offset, *data, &pcrSelect);
739
Trspi_LoadBlob_BYTE(&offset, locAtRelease, *data);
740
Trspi_LoadBlob(&offset, TPM_SHA1_160_HASH_LEN, *data, digAtRelease);
743
obj_list_put(&nvstore_list);