@@ -1057,55 +1057,105 @@ GetDigestListBinSize (
1057
1057
return TotalSize ;
1058
1058
}
1059
1059
1060
+ STATIC VOID *
1061
+ FindHashInDigestListBin (
1062
+ IN VOID * DigestListBin ,
1063
+ TPMI_ALG_HASH HashAlg
1064
+ )
1065
+ {
1066
+ UINTN Index ;
1067
+ UINT32 Count ;
1068
+ TPMI_ALG_HASH Alg ;
1069
+
1070
+ Count = ReadUnaligned32 (DigestListBin );
1071
+ DigestListBin = (UINT8 * )DigestListBin + sizeof (Count );
1072
+ for (Index = 0 ; Index < Count ; Index ++ ) {
1073
+ Alg = ReadUnaligned16 (DigestListBin );
1074
+ DigestListBin = (UINT8 * )DigestListBin + sizeof (Alg );
1075
+
1076
+ if (Alg == HashAlg )
1077
+ return DigestListBin ;
1078
+
1079
+ DigestListBin = (UINT8 * )DigestListBin + GetHashSizeFromAlgo (Alg );
1080
+ }
1081
+
1082
+ return NULL ;
1083
+ }
1084
+
1060
1085
/**
1061
1086
Copy TPML_DIGEST_VALUES compact binary into a buffer
1062
1087
1063
1088
@param[in,out] Buffer Buffer to hold copied TPML_DIGEST_VALUES compact binary.
1064
1089
@param[in] DigestListBin TPML_DIGEST_VALUES compact binary buffer.
1065
1090
@param[in] HashAlgorithmMask HASH bits corresponding to the desired digests to copy.
1066
- @param[out] HashAlgorithmMaskCopied Pointer to HASH bits corresponding to the digests copied.
1067
1091
1068
1092
@return The end of buffer to hold TPML_DIGEST_VALUES compact binary.
1069
1093
**/
1070
1094
VOID *
1071
1095
CopyDigestListBinToBuffer (
1072
1096
IN OUT VOID * Buffer ,
1073
1097
IN VOID * DigestListBin ,
1074
- IN UINT32 HashAlgorithmMask ,
1075
- OUT UINT32 * HashAlgorithmMaskCopied
1098
+ IN UINT32 HashAlgorithmMask
1076
1099
)
1077
1100
{
1078
1101
UINTN Index ;
1079
1102
UINT16 DigestSize ;
1080
- UINT32 Count ;
1081
1103
TPMI_ALG_HASH HashAlg ;
1082
1104
UINT32 DigestListCount ;
1083
1105
UINT32 * DigestListCountPtr ;
1106
+ TPMI_ALG_HASH HashAlgs [5 ];
1107
+ VOID * Digest ;
1108
+
1109
+ HashAlgs [0 ] = TPM_ALG_SHA1 ;
1110
+ HashAlgs [1 ] = TPM_ALG_SHA256 ;
1111
+ HashAlgs [2 ] = TPM_ALG_SM3_256 ;
1112
+ HashAlgs [3 ] = TPM_ALG_SHA384 ;
1113
+ HashAlgs [4 ] = TPM_ALG_SHA512 ;
1084
1114
1085
1115
DigestListCountPtr = (UINT32 * ) Buffer ;
1116
+ Buffer = (UINT8 * )Buffer + sizeof (UINT32 );
1117
+
1086
1118
DigestListCount = 0 ;
1087
- (* HashAlgorithmMaskCopied ) = 0 ;
1088
1119
1089
- Count = ReadUnaligned32 (DigestListBin );
1090
- Buffer = (UINT8 * )Buffer + sizeof (Count );
1091
- DigestListBin = (UINT8 * )DigestListBin + sizeof (Count );
1092
- for (Index = 0 ; Index < Count ; Index ++ ) {
1093
- HashAlg = ReadUnaligned16 (DigestListBin );
1094
- DigestListBin = (UINT8 * )DigestListBin + sizeof (HashAlg );
1120
+ //
1121
+ // Make sure output buffer conforms to HashAlgorithmMask.
1122
+ //
1123
+ // Copy digests from the entry if they are present, otherwise add missing
1124
+ // digests filled as what's called "OneDigest" in TXT Software
1125
+ // Development Guide (not really related, but alternatives are zeroes or
1126
+ // 0xFFs, might as well use a value documented somewhere).
1127
+ //
1128
+ for (Index = 0 ; Index < ARRAY_SIZE (HashAlgs ); Index ++ ) {
1129
+ HashAlg = HashAlgs [Index ];
1130
+ Digest = FindHashInDigestListBin (DigestListBin , HashAlg );
1095
1131
DigestSize = GetHashSizeFromAlgo (HashAlg );
1096
1132
1097
- if (IsHashAlgSupportedInHashAlgorithmMask (HashAlg , HashAlgorithmMask )) {
1098
- CopyMem (Buffer , & HashAlg , sizeof (HashAlg ));
1099
- Buffer = (UINT8 * )Buffer + sizeof (HashAlg );
1100
- CopyMem (Buffer , DigestListBin , DigestSize );
1101
- Buffer = (UINT8 * )Buffer + DigestSize ;
1102
- DigestListCount ++ ;
1103
- (* HashAlgorithmMaskCopied ) |= GetHashMaskFromAlgo (HashAlg );
1133
+ if (!(HashAlgorithmMask & GetHashMaskFromAlgo (HashAlg ))) {
1134
+ // Not active.
1135
+ if (Digest != NULL )
1136
+ DEBUG ((DEBUG_WARN , "%a(): Event log entry includes HashAlg (0x%x) unsupported by PCR bank\n" ,
1137
+ __FUNCTION__ , HashAlg ));
1138
+ continue ;
1139
+ }
1140
+
1141
+ CopyMem (Buffer , & HashAlg , sizeof (HashAlg ));
1142
+ Buffer = (UINT8 * )Buffer + sizeof (HashAlg );
1143
+
1144
+ if (Digest == NULL ) {
1145
+ // Missing, use "OneDigest".
1146
+ ZeroMem (Buffer , DigestSize );
1147
+ * (UINT8 * )Buffer = 1 ;
1148
+ DEBUG ((DEBUG_WARN , "%a(): Event log entry is missing HashAlg (0x%x) supported by PCR bank\n" ,
1149
+ __FUNCTION__ , HashAlg ));
1104
1150
} else {
1105
- DEBUG (( DEBUG_ERROR , "WARNING: CopyDigestListBinToBuffer Event log has HashAlg unsupported by PCR bank (0x%x)\n" , HashAlg ) );
1151
+ CopyMem ( Buffer , Digest , DigestSize );
1106
1152
}
1107
- DigestListBin = (UINT8 * )DigestListBin + DigestSize ;
1153
+
1154
+ Buffer = (UINT8 * )Buffer + DigestSize ;
1155
+
1156
+ DigestListCount ++ ;
1108
1157
}
1158
+
1109
1159
WriteUnaligned32 (DigestListCountPtr , DigestListCount );
1110
1160
1111
1161
return Buffer ;
@@ -1552,12 +1602,10 @@ SetupEventLog (
1552
1602
EFI_PHYSICAL_ADDRESS Lasa ;
1553
1603
UINTN Index ;
1554
1604
VOID * DigestListBin ;
1555
- TPML_DIGEST_VALUES TempDigestListBin ;
1556
1605
UINT32 DigestListBinSize ;
1557
1606
UINT8 * Event ;
1558
1607
UINT32 EventSize ;
1559
1608
UINT32 * EventSizePtr ;
1560
- UINT32 HashAlgorithmMaskCopied ;
1561
1609
TCG_EfiSpecIDEventStruct * TcgEfiSpecIdEventStruct ;
1562
1610
UINT8 TempBuf [sizeof (TCG_EfiSpecIDEventStruct ) + sizeof (UINT32 ) + (HASH_COUNT * sizeof (TCG_EfiSpecIdEventAlgorithmSize )) + sizeof (UINT8 )];
1563
1611
TCG_PCR_EVENT_HDR SpecIdEvent ;
@@ -1814,11 +1862,11 @@ SetupEventLog (
1814
1862
Status = EFI_SUCCESS ;
1815
1863
while (!EFI_ERROR (Status ) &&
1816
1864
(GuidHob .Raw = GetNextGuidHob (mTcg2EventInfo [Index ].EventGuid , GuidHob .Raw )) != NULL ) {
1817
- TcgEvent = AllocateCopyPool (GET_GUID_HOB_DATA_SIZE (GuidHob .Guid ), GET_GUID_HOB_DATA (GuidHob .Guid ));
1818
- ASSERT (TcgEvent != NULL );
1819
- GuidHob .Raw = GET_NEXT_HOB (GuidHob );
1820
1865
switch (mTcg2EventInfo [Index ].LogFormat ) {
1821
1866
case EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2 :
1867
+ TcgEvent = AllocateCopyPool (GET_GUID_HOB_DATA_SIZE (GuidHob .Guid ), GET_GUID_HOB_DATA (GuidHob .Guid ));
1868
+ ASSERT (TcgEvent != NULL );
1869
+
1822
1870
Status = TcgDxeLogEvent (
1823
1871
mTcg2EventInfo [Index ].LogFormat ,
1824
1872
TcgEvent ,
@@ -1828,8 +1876,15 @@ SetupEventLog (
1828
1876
);
1829
1877
break ;
1830
1878
case EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 :
1831
- DigestListBin = (UINT8 * )TcgEvent + sizeof (TCG_PCRINDEX ) + sizeof (TCG_EVENTTYPE );
1879
+ //
1880
+ // This is a storage for new header.
1881
+ //
1882
+ TcgEvent = AllocatePool (sizeof (TCG_PCRINDEX ) + sizeof (TCG_EVENTTYPE ) + sizeof (TPML_DIGEST_VALUES ) + sizeof (UINT32 ));
1883
+ ASSERT (TcgEvent != NULL );
1884
+
1885
+ DigestListBin = (UINT8 * )GET_GUID_HOB_DATA (GuidHob .Guid ) + sizeof (TCG_PCRINDEX ) + sizeof (TCG_EVENTTYPE );
1832
1886
DigestListBinSize = GetDigestListBinSize (DigestListBin );
1887
+ CopyMem (TcgEvent , GET_GUID_HOB_DATA (GuidHob .Guid ), sizeof (TCG_PCRINDEX ) + sizeof (TCG_EVENTTYPE ));
1833
1888
//
1834
1889
// Save event size.
1835
1890
//
@@ -1838,26 +1893,18 @@ SetupEventLog (
1838
1893
//
1839
1894
// Filter inactive digest in the event2 log from PEI HOB.
1840
1895
//
1841
- CopyMem (& TempDigestListBin , DigestListBin , GetDigestListBinSize (DigestListBin ));
1842
1896
EventSizePtr = CopyDigestListBinToBuffer (
1897
+ TcgEvent + sizeof (TCG_PCRINDEX ) + sizeof (TCG_EVENTTYPE ),
1843
1898
DigestListBin ,
1844
- & TempDigestListBin ,
1845
- mTcgDxeData .BsCap .ActivePcrBanks ,
1846
- & HashAlgorithmMaskCopied
1899
+ mTcgDxeData .BsCap .ActivePcrBanks
1847
1900
);
1848
- if (HashAlgorithmMaskCopied != mTcgDxeData .BsCap .ActivePcrBanks ) {
1849
- DEBUG ((
1850
- DEBUG_ERROR ,
1851
- "ERROR: The event2 log includes digest hash mask 0x%x, but required digest hash mask is 0x%x\n" ,
1852
- HashAlgorithmMaskCopied ,
1853
- mTcgDxeData .BsCap .ActivePcrBanks
1854
- ));
1855
- }
1856
1901
//
1857
1902
// Restore event size.
1858
1903
//
1859
1904
CopyMem (EventSizePtr , & EventSize , sizeof (UINT32 ));
1860
- DigestListBinSize = GetDigestListBinSize (DigestListBin );
1905
+ DigestListBinSize = GetDigestListBinSize (TcgEvent + sizeof (TCG_PCRINDEX ) + sizeof (TCG_EVENTTYPE ));
1906
+
1907
+ DEBUG ((DEBUG_INFO , "%a: DigestListBinSize = %d\n" , __FUNCTION__ , DigestListBinSize ));
1861
1908
1862
1909
Status = TcgDxeLogEvent (
1863
1910
mTcg2EventInfo [Index ].LogFormat ,
@@ -1869,6 +1916,7 @@ SetupEventLog (
1869
1916
break ;
1870
1917
}
1871
1918
FreePool (TcgEvent );
1919
+ GuidHob .Raw = GET_NEXT_HOB (GuidHob );
1872
1920
}
1873
1921
}
1874
1922
}
@@ -2863,13 +2911,10 @@ DriverEntry (
2863
2911
}
2864
2912
}
2865
2913
2866
- mTcgDxeData .BsCap .SupportedEventLogs = EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2 | EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 ;
2867
- if ((mTcgDxeData .BsCap .ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA1 ) == 0 ) {
2868
- //
2869
- // No need to expose TCG1.2 event log if SHA1 bank does not exist.
2870
- //
2871
- mTcgDxeData .BsCap .SupportedEventLogs &= ~EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2 ;
2872
- }
2914
+ //
2915
+ // Only expose TCG2 event log for TPM2.
2916
+ //
2917
+ mTcgDxeData .BsCap .SupportedEventLogs = EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 ;
2873
2918
2874
2919
DEBUG ((EFI_D_INFO , "Tcg2.SupportedEventLogs - 0x%08x\n" , mTcgDxeData .BsCap .SupportedEventLogs ));
2875
2920
DEBUG ((EFI_D_INFO , "Tcg2.HashAlgorithmBitmap - 0x%08x\n" , mTcgDxeData .BsCap .HashAlgorithmBitmap ));
0 commit comments