263
/* This should only be called through paths with a verified connected
266
obj_pcrs_get_composite(TSS_HPCRS hPcrs, TCPA_PCRVALUE *comp)
268
struct tsp_object *obj;
269
struct tr_pcrs_obj *pcrs;
270
TSS_RESULT result = TSS_SUCCESS;
271
UINT16 num_pcrs, bytes_to_hold;
273
if ((obj = obj_list_get_obj(&pcrs_list, hPcrs)) == NULL)
274
return TSPERR(TSS_E_INVALID_HANDLE);
276
pcrs = (struct tr_pcrs_obj *)obj->data;
278
if ((num_pcrs = get_num_pcrs(obj->tspContext)) == 0) {
347
obj_pcrs_get_digest_at_release(TSS_HPCRS hPcrs, UINT32 *size, BYTE **out)
349
struct tsp_object *obj;
350
struct tr_pcrs_obj *pcrs;
351
TSS_RESULT result = TSS_SUCCESS;
354
if ((obj = obj_list_get_obj(&pcrs_list, hPcrs)) == NULL)
355
return TSPERR(TSS_E_INVALID_HANDLE);
357
pcrs = (struct tr_pcrs_obj *)obj->data;
360
case TSS_PCRS_STRUCT_INFO:
361
result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
363
case TSS_PCRS_STRUCT_INFO_SHORT:
364
digest = (BYTE *)&pcrs->info.infoshort.digestAtRelease;
366
case TSS_PCRS_STRUCT_INFO_LONG:
367
digest = (BYTE *)&pcrs->info.infolong.digestAtRelease;
370
LogDebugFn("Undefined type of PCRs object");
371
result = TSPERR(TSS_E_INTERNAL_ERROR);
376
if ((*out = calloc_tspi(obj->tspContext, sizeof(TPM_COMPOSITE_HASH))) == NULL) {
377
LogError("malloc of %zd bytes failed.", sizeof(TPM_COMPOSITE_HASH));
378
result = TSPERR(TSS_E_OUTOFMEMORY);
381
memcpy(*out, digest, sizeof(TPM_COMPOSITE_HASH));
382
*size = sizeof(TPM_COMPOSITE_HASH);
385
obj_list_put(&pcrs_list);
391
obj_pcrs_select_index(TSS_HPCRS hPcrs, UINT32 idx)
393
struct tsp_object *obj;
394
struct tr_pcrs_obj *pcrs;
395
TSS_RESULT result = TSS_SUCCESS;
396
TPM_PCR_SELECTION *select;
397
UINT16 bytes_to_hold = (idx / 8) + 1;
399
if ((obj = obj_list_get_obj(&pcrs_list, hPcrs)) == NULL)
400
return TSPERR(TSS_E_INVALID_HANDLE);
402
pcrs = (struct tr_pcrs_obj *)obj->data;
405
case TSS_PCRS_STRUCT_INFO:
406
bytes_to_hold = (bytes_to_hold < 2) ? 2 : bytes_to_hold;
407
select = &pcrs->info.info11.pcrSelection;
409
case TSS_PCRS_STRUCT_INFO_SHORT:
410
case TSS_PCRS_STRUCT_INFO_LONG:
411
result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
414
LogDebugFn("Undefined type of PCRs object");
415
result = TSPERR(TSS_E_INTERNAL_ERROR);
420
/* allocate the selection structure */
421
if (select->pcrSelect == NULL) {
422
if ((select->pcrSelect = malloc(bytes_to_hold)) == NULL) {
423
LogError("malloc of %d bytes failed.", bytes_to_hold);
424
result = TSPERR(TSS_E_OUTOFMEMORY);
427
select->sizeOfSelect = bytes_to_hold;
428
memset(select->pcrSelect, 0, bytes_to_hold);
430
/* alloc the pcrs array */
431
if ((pcrs->pcrs = malloc(bytes_to_hold * 8 * TCPA_SHA1_160_HASH_LEN)) == NULL) {
432
LogError("malloc of %d bytes failed.", bytes_to_hold * 8 *
433
TCPA_SHA1_160_HASH_LEN);
434
result = TSPERR(TSS_E_OUTOFMEMORY);
437
} else if (select->sizeOfSelect < bytes_to_hold) {
438
if ((select->pcrSelect = realloc(select->pcrSelect, bytes_to_hold)) == NULL) {
439
LogError("malloc of %d bytes failed.", bytes_to_hold);
440
result = TSPERR(TSS_E_OUTOFMEMORY);
443
/* set the newly allocated bytes to 0 */
444
memset(&select->pcrSelect[select->sizeOfSelect], 0,
445
bytes_to_hold - select->sizeOfSelect);
446
select->sizeOfSelect = bytes_to_hold;
448
/* realloc the pcrs array */
449
if ((pcrs->pcrs = realloc(pcrs->pcrs,
450
bytes_to_hold * 8 * TCPA_SHA1_160_HASH_LEN)) == NULL) {
451
LogError("malloc of %d bytes failed.", bytes_to_hold * 8 *
452
TCPA_SHA1_160_HASH_LEN);
453
result = TSPERR(TSS_E_OUTOFMEMORY);
458
/* set the bit in the selection structure */
459
select->pcrSelect[idx / 8] |= (1 << (idx % 8));
462
obj_list_put(&pcrs_list);
468
obj_pcrs_select_index_ex(TSS_HPCRS hPcrs, UINT32 dir, UINT32 idx)
470
struct tsp_object *obj;
471
struct tr_pcrs_obj *pcrs;
472
TSS_RESULT result = TSS_SUCCESS;
473
TPM_PCR_SELECTION *select;
474
UINT16 bytes_to_hold = (idx / 8) + 1;
476
if ((obj = obj_list_get_obj(&pcrs_list, hPcrs)) == NULL)
477
return TSPERR(TSS_E_INVALID_HANDLE);
479
pcrs = (struct tr_pcrs_obj *)obj->data;
482
case TSS_PCRS_STRUCT_INFO:
483
result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
485
case TSS_PCRS_STRUCT_INFO_SHORT:
486
if (dir == TSS_PCRS_DIRECTION_CREATION) {
487
result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
490
bytes_to_hold = (bytes_to_hold < 3) ? 3 : bytes_to_hold;
491
select = &pcrs->info.infoshort.pcrSelection;
493
case TSS_PCRS_STRUCT_INFO_LONG:
494
bytes_to_hold = (bytes_to_hold < 3) ? 3 : bytes_to_hold;
495
if (dir == TSS_PCRS_DIRECTION_CREATION)
496
select = &pcrs->info.infolong.creationPCRSelection;
498
select = &pcrs->info.infolong.releasePCRSelection;
501
LogDebugFn("Undefined type of PCRs object");
502
result = TSPERR(TSS_E_INTERNAL_ERROR);
507
/* allocate the selection structure */
508
if (select->pcrSelect == NULL) {
509
if ((select->pcrSelect = malloc(bytes_to_hold)) == NULL) {
510
LogError("malloc of %d bytes failed.", bytes_to_hold);
511
result = TSPERR(TSS_E_OUTOFMEMORY);
514
select->sizeOfSelect = bytes_to_hold;
515
memset(select->pcrSelect, 0, bytes_to_hold);
517
/* alloc the pcrs array */
518
if ((pcrs->pcrs = malloc(bytes_to_hold * 8 * TCPA_SHA1_160_HASH_LEN)) == NULL) {
519
LogError("malloc of %d bytes failed.", bytes_to_hold * 8 *
520
TCPA_SHA1_160_HASH_LEN);
521
result = TSPERR(TSS_E_OUTOFMEMORY);
524
} else if (select->sizeOfSelect < bytes_to_hold) {
525
if ((select->pcrSelect = realloc(select->pcrSelect, bytes_to_hold)) == NULL) {
526
LogError("malloc of %d bytes failed.", bytes_to_hold);
527
result = TSPERR(TSS_E_OUTOFMEMORY);
530
/* set the newly allocated bytes to 0 */
531
memset(&select->pcrSelect[select->sizeOfSelect], 0,
532
bytes_to_hold - select->sizeOfSelect);
533
select->sizeOfSelect = bytes_to_hold;
535
/* realloc the pcrs array */
536
if ((pcrs->pcrs = realloc(pcrs->pcrs,
537
bytes_to_hold * 8 * TCPA_SHA1_160_HASH_LEN)) == NULL) {
538
LogError("malloc of %d bytes failed.", bytes_to_hold * 8 *
539
TCPA_SHA1_160_HASH_LEN);
540
result = TSPERR(TSS_E_OUTOFMEMORY);
545
/* set the bit in the selection structure */
546
select->pcrSelect[idx / 8] |= (1 << (idx % 8));
549
obj_list_put(&pcrs_list);
555
obj_pcrs_create_info_type(TSS_HPCRS hPcrs, UINT32 *type, UINT32 *size, BYTE **info)
559
/* If type equals 0, then we create the structure
560
based on how the object was created */
562
struct tsp_object *obj;
563
struct tr_pcrs_obj *pcrs;
565
if ((obj = obj_list_get_obj(&pcrs_list, hPcrs)) == NULL)
566
return TSPERR(TSS_E_INVALID_HANDLE);
568
pcrs = (struct tr_pcrs_obj *)obj->data;
571
obj_list_put(&pcrs_list);
575
case TSS_PCRS_STRUCT_INFO:
576
result = obj_pcrs_create_info(hPcrs, size, info);
578
case TSS_PCRS_STRUCT_INFO_LONG:
579
result = obj_pcrs_create_info_long(hPcrs, size, info);
581
case TSS_PCRS_STRUCT_INFO_SHORT:
582
result = obj_pcrs_create_info_short(hPcrs, size, info);
585
return TSPERR(TSS_E_INTERNAL_ERROR);
591
/* Create a PCR info struct based on the hPcrs object */
593
obj_pcrs_create_info(TSS_HPCRS hPcrs, UINT32 *size, BYTE **info)
595
struct tsp_object *obj;
596
struct tr_pcrs_obj *pcrs;
597
TSS_RESULT result = TSS_SUCCESS;
603
if ((obj = obj_list_get_obj(&pcrs_list, hPcrs)) == NULL)
604
return TSPERR(TSS_E_INVALID_HANDLE);
606
pcrs = (struct tr_pcrs_obj *)obj->data;
608
/* Set everything that is not assigned to be all zeroes */
609
memset(&info11, 0, sizeof(info11));
611
switch (pcrs->type) {
612
case TSS_PCRS_STRUCT_INFO:
613
info11 = pcrs->info.info11;
615
case TSS_PCRS_STRUCT_INFO_LONG:
616
info11.pcrSelection = pcrs->info.infolong.releasePCRSelection;
617
info11.digestAtRelease = pcrs->info.infolong.digestAtRelease;
619
case TSS_PCRS_STRUCT_INFO_SHORT:
620
info11.pcrSelection = pcrs->info.infoshort.pcrSelection;
621
info11.digestAtRelease = pcrs->info.infoshort.digestAtRelease;
624
result = TSPERR(TSS_E_INTERNAL_ERROR);
629
Trspi_LoadBlob_PCR_INFO(&offset, NULL, &info11);
632
if ((ret = calloc(1, ret_size)) == NULL) {
633
result = TSPERR(TSS_E_OUTOFMEMORY);
634
LogDebug("malloc of %u bytes failed.", ret_size);
639
Trspi_LoadBlob_PCR_INFO(&offset, ret, &info11);
645
obj_list_put(&pcrs_list);
651
obj_pcrs_create_info_long(TSS_HPCRS hPcrs, UINT32 *size, BYTE **info)
653
struct tsp_object *obj;
654
struct tr_pcrs_obj *pcrs;
655
TSS_RESULT result = TSS_SUCCESS;
656
TPM_PCR_INFO_LONG infolong;
657
BYTE dummyBits[3] = { 0, 0, 0 };
658
TPM_PCR_SELECTION dummySelection = { 3, dummyBits };
663
if ((obj = obj_list_get_obj(&pcrs_list, hPcrs)) == NULL)
664
return TSPERR(TSS_E_INVALID_HANDLE);
666
pcrs = (struct tr_pcrs_obj *)obj->data;
668
/* Set everything that is not assigned to be all zeroes */
669
memset(&infolong, 0, sizeof(infolong));
671
infolong.tag = TPM_TAG_PCR_INFO_LONG;
672
/* localityAtCreation and creationPCRSelection certainly do not need to be set here, but
673
* some chips such as Winbond do not ignore them on input, so we must give them dummy
675
infolong.localityAtCreation = TPM_LOC_ZERO;
676
infolong.creationPCRSelection = dummySelection;
677
switch (pcrs->type) {
678
case TSS_PCRS_STRUCT_INFO:
679
infolong.localityAtRelease = TSS_LOCALITY_ALL;
680
infolong.releasePCRSelection = pcrs->info.info11.pcrSelection;
681
infolong.digestAtRelease = pcrs->info.info11.digestAtRelease;
683
case TSS_PCRS_STRUCT_INFO_LONG:
684
infolong.localityAtRelease = pcrs->info.infolong.localityAtRelease;
685
infolong.releasePCRSelection = pcrs->info.infolong.releasePCRSelection;
686
infolong.digestAtRelease = pcrs->info.infolong.digestAtRelease;
688
case TSS_PCRS_STRUCT_INFO_SHORT:
689
infolong.localityAtRelease = pcrs->info.infoshort.localityAtRelease;
690
infolong.releasePCRSelection = pcrs->info.infoshort.pcrSelection;
691
infolong.digestAtRelease = pcrs->info.infoshort.digestAtRelease;
694
result = TSPERR(TSS_E_INTERNAL_ERROR);
699
Trspi_LoadBlob_PCR_INFO_LONG(&offset, NULL, &infolong);
702
if ((ret = calloc(1, ret_size)) == NULL) {
703
result = TSPERR(TSS_E_OUTOFMEMORY);
704
LogDebug("malloc of %u bytes failed.", ret_size);
709
Trspi_LoadBlob_PCR_INFO_LONG(&offset, ret, &infolong);
715
obj_list_put(&pcrs_list);
721
obj_pcrs_create_info_short(TSS_HPCRS hPcrs, UINT32 *size, BYTE **info)
723
struct tsp_object *obj;
724
struct tr_pcrs_obj *pcrs;
725
TSS_RESULT result = TSS_SUCCESS;
726
TPM_PCR_INFO_SHORT infoshort;
727
BYTE select[] = { 0, 0, 0 };
732
/* Set everything that is not assigned to be all zeroes */
733
memset(&infoshort, 0, sizeof(infoshort));
735
if (hPcrs != NULL_HPCRS) {
736
if ((obj = obj_list_get_obj(&pcrs_list, hPcrs)) == NULL)
737
return TSPERR(TSS_E_INVALID_HANDLE);
739
pcrs = (struct tr_pcrs_obj *)obj->data;
741
switch (pcrs->type) {
742
case TSS_PCRS_STRUCT_INFO:
743
infoshort.pcrSelection = pcrs->info.info11.pcrSelection;
744
infoshort.localityAtRelease = TSS_LOCALITY_ALL;
745
infoshort.digestAtRelease = pcrs->info.info11.digestAtRelease;
747
case TSS_PCRS_STRUCT_INFO_LONG:
748
infoshort.pcrSelection = pcrs->info.infolong.releasePCRSelection;
749
infoshort.localityAtRelease = pcrs->info.infolong.localityAtRelease;
750
infoshort.digestAtRelease = pcrs->info.infolong.digestAtRelease;
752
case TSS_PCRS_STRUCT_INFO_SHORT:
753
infoshort = pcrs->info.infoshort;
756
result = TSPERR(TSS_E_INTERNAL_ERROR);
760
infoshort.pcrSelection.sizeOfSelect = sizeof(select);
761
infoshort.pcrSelection.pcrSelect = select;
762
infoshort.localityAtRelease = TSS_LOCALITY_ALL;
766
Trspi_LoadBlob_PCR_INFO_SHORT(&offset, NULL, &infoshort);
769
if ((ret = calloc(1, ret_size)) == NULL) {
770
result = TSPERR(TSS_E_OUTOFMEMORY);
771
LogDebug("malloc of %u bytes failed.", ret_size);
776
Trspi_LoadBlob_PCR_INFO_SHORT(&offset, ret, &infoshort);
782
if (hPcrs != NULL_HPCRS)
783
obj_list_put(&pcrs_list);
789
obj_pcrs_get_locality(TSS_HPCRS hPcrs, UINT32 *out)
791
struct tsp_object *obj;
792
struct tr_pcrs_obj *pcrs;
793
TSS_RESULT result = TSS_SUCCESS;
796
if ((obj = obj_list_get_obj(&pcrs_list, hPcrs)) == NULL)
797
return TSPERR(TSS_E_INVALID_HANDLE);
799
pcrs = (struct tr_pcrs_obj *)obj->data;
802
case TSS_PCRS_STRUCT_INFO:
803
result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
805
case TSS_PCRS_STRUCT_INFO_SHORT:
806
locality = &pcrs->info.infoshort.localityAtRelease;
808
case TSS_PCRS_STRUCT_INFO_LONG:
809
locality = &pcrs->info.infolong.localityAtRelease;
812
LogDebugFn("Undefined type of PCRs object");
813
result = TSPERR(TSS_E_INTERNAL_ERROR);
817
*out = (UINT32)*locality;
820
obj_list_put(&pcrs_list);
826
obj_pcrs_set_locality(TSS_HPCRS hPcrs, UINT32 locality)
828
struct tsp_object *obj;
829
struct tr_pcrs_obj *pcrs;
830
TSS_RESULT result = TSS_SUCCESS;
833
if ((obj = obj_list_get_obj(&pcrs_list, hPcrs)) == NULL)
834
return TSPERR(TSS_E_INVALID_HANDLE);
836
pcrs = (struct tr_pcrs_obj *)obj->data;
839
case TSS_PCRS_STRUCT_INFO:
840
result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
842
case TSS_PCRS_STRUCT_INFO_SHORT:
843
loc = &pcrs->info.infoshort.localityAtRelease;
845
case TSS_PCRS_STRUCT_INFO_LONG:
846
loc = &pcrs->info.infolong.localityAtRelease;
849
LogDebugFn("Undefined type of PCRs object");
850
result = TSPERR(TSS_E_INTERNAL_ERROR);
856
obj_list_put(&pcrs_list);
862
obj_pcrs_set_digest_at_release(TSS_HPCRS hPcrs, TPM_COMPOSITE_HASH digest)
864
struct tsp_object *obj;
865
struct tr_pcrs_obj *pcrs;
866
TSS_RESULT result = TSS_SUCCESS;
867
TPM_COMPOSITE_HASH *dig;
869
LogDebugFn("######## Digest to be set on TSS object:");
870
LogDebugData(TCPA_SHA1_160_HASH_LEN, digest.digest);
872
if ((obj = obj_list_get_obj(&pcrs_list, hPcrs)) == NULL)
873
return TSPERR(TSS_E_INVALID_HANDLE);
875
pcrs = (struct tr_pcrs_obj *)obj->data;
878
case TSS_PCRS_STRUCT_INFO:
879
result = TSPERR(TSS_E_INVALID_OBJ_ACCESS);
881
case TSS_PCRS_STRUCT_INFO_SHORT:
882
dig = &pcrs->info.infoshort.digestAtRelease;
884
case TSS_PCRS_STRUCT_INFO_LONG:
885
dig = &pcrs->info.infolong.digestAtRelease;
888
LogDebugFn("Undefined type of PCRs object");
279
889
result = TSPERR(TSS_E_INTERNAL_ERROR);
282
bytes_to_hold = num_pcrs / 8;
284
/* Is the current select object going to be interpretable by the TPM?
285
* If the select object is of a size greater than the one the TPM
286
* wants, just calculate the composite hash and let the TPM return an
287
* error code to the user. If its less than the size of the one the
288
* TPM wants, add extra zero bytes until its the right size. */
289
if (bytes_to_hold > pcrs->select.sizeOfSelect) {
290
if ((pcrs->select.pcrSelect = realloc(pcrs->select.pcrSelect,
291
bytes_to_hold)) == NULL) {
292
LogError("malloc of %d bytes failed.", bytes_to_hold);
293
result = TSPERR(TSS_E_OUTOFMEMORY);
296
/* set the newly allocated bytes to 0 */
297
memset(&pcrs->select.pcrSelect[pcrs->select.sizeOfSelect], 0,
298
bytes_to_hold - pcrs->select.sizeOfSelect);
299
pcrs->select.sizeOfSelect = bytes_to_hold;
301
/* realloc the pcr array as well */
302
if ((pcrs->pcrs = realloc(pcrs->pcrs,
303
(bytes_to_hold * 8) * TCPA_SHA1_160_HASH_LEN))
305
LogError("malloc of %d bytes failed.",
306
(bytes_to_hold * 8) * TCPA_SHA1_160_HASH_LEN);
307
result = TSPERR(TSS_E_OUTOFMEMORY);
315
for (i = 0; i < pcrs->select.sizeOfSelect * 8; i++) {
316
if (pcrs->select.pcrSelect[i/8] & (1 << (i % 8))) {
317
LogDebug("PCR%d: Selected", i);
318
LogBlobData(APPID, TCPA_SHA1_160_HASH_LEN,
319
(unsigned char *)&pcrs->pcrs[i]);
321
LogDebug("PCR%d: Not Selected", i);
327
result = calc_composite_from_object(&pcrs->select, pcrs->pcrs, comp);
330
obj_list_put(&pcrs_list);
336
obj_pcrs_select_index(TSS_HPCRS hPcrs, UINT32 idx)
338
struct tsp_object *obj;
339
struct tr_pcrs_obj *pcrs;
340
TSS_RESULT result = TSS_SUCCESS;
341
UINT16 bytes_to_hold = (idx / 8) + 1;
343
if ((obj = obj_list_get_obj(&pcrs_list, hPcrs)) == NULL)
344
return TSPERR(TSS_E_INVALID_HANDLE);
346
pcrs = (struct tr_pcrs_obj *)obj->data;
348
/* allocate the selection structure */
349
if (pcrs->select.pcrSelect == NULL) {
350
if ((pcrs->select.pcrSelect = malloc(bytes_to_hold)) == NULL) {
351
LogError("malloc of %d bytes failed.", bytes_to_hold);
352
result = TSPERR(TSS_E_OUTOFMEMORY);
355
pcrs->select.sizeOfSelect = bytes_to_hold;
356
memset(pcrs->select.pcrSelect, 0, bytes_to_hold);
358
/* alloc the pcrs array */
359
if ((pcrs->pcrs = malloc(bytes_to_hold * 8 *
360
TCPA_SHA1_160_HASH_LEN)) == NULL) {
361
LogError("malloc of %d bytes failed.", bytes_to_hold *
362
8 * TCPA_SHA1_160_HASH_LEN);
363
result = TSPERR(TSS_E_OUTOFMEMORY);
366
} else if (pcrs->select.sizeOfSelect < bytes_to_hold) {
367
if ((pcrs->select.pcrSelect = realloc(pcrs->select.pcrSelect,
368
bytes_to_hold)) == NULL) {
369
LogError("malloc of %d bytes failed.", bytes_to_hold);
370
result = TSPERR(TSS_E_OUTOFMEMORY);
373
/* set the newly allocated bytes to 0 */
374
memset(&pcrs->select.pcrSelect[pcrs->select.sizeOfSelect], 0,
375
bytes_to_hold - pcrs->select.sizeOfSelect);
376
pcrs->select.sizeOfSelect = bytes_to_hold;
378
/* realloc the pcrs array */
379
if ((pcrs->pcrs = realloc(pcrs->pcrs, bytes_to_hold * 8 *
380
TCPA_SHA1_160_HASH_LEN)) == NULL) {
381
LogError("malloc of %d bytes failed.", bytes_to_hold *
382
8 * TCPA_SHA1_160_HASH_LEN);
383
result = TSPERR(TSS_E_OUTOFMEMORY);
388
/* set the bit in the selection structure */
389
pcrs->select.pcrSelect[idx / 8] |= (1 << (idx % 8));
392
obj_list_put(&pcrs_list);
398
calc_composite_from_object(TCPA_PCR_SELECTION *select, TCPA_PCRVALUE * arrayOfPcrs, TCPA_DIGEST * digestOut)
405
UINT64 sizeOffset = 0;
407
if (select->sizeOfSelect > 0) {
409
Trspi_LoadBlob_PCR_SELECTION(&sizeOffset, hashBlob, select);
410
offset = sizeOffset + 4;
412
for (size = 0; size < select->sizeOfSelect; size++) {
413
for (index = 0, mask = 1; index < 8; index++, mask = mask << 1) {
414
if (select->pcrSelect[size] & mask) {
415
memcpy(&hashBlob[(numPCRs * TCPA_SHA1_160_HASH_LEN) + offset],
416
arrayOfPcrs[index + (size << 3)].digest,
417
TCPA_SHA1_160_HASH_LEN);
424
offset += (numPCRs * TCPA_SHA1_160_HASH_LEN);
425
UINT32ToArray(numPCRs * TCPA_SHA1_160_HASH_LEN, &hashBlob[sizeOffset]);
427
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, digestOut->digest);
433
return TSPERR(TSS_E_INTERNAL_ERROR);
893
/* Copy the digest information */
894
memcpy(dig->digest,&digest.digest,TPM_SHA1_160_HASH_LEN);
896
LogDebugFn("######## Digest SET on TSS object:");
897
LogDebugData(TCPA_SHA1_160_HASH_LEN,pcrs->info.infoshort.digestAtRelease.digest);
900
obj_list_put(&pcrs_list);