From ddfd0c601720ff1dd8b413aaf1eb6f852922ebe4 Mon Sep 17 00:00:00 2001 From: iadgovuser58 <124906646+iadgovuser58@users.noreply.github.com> Date: Thu, 27 Jun 2024 18:11:01 -0400 Subject: [PATCH 1/5] spdm processing --- .../hirs/utils/tpm/eventlog/TpmPcrEvent.java | 2 + .../eventlog/events/DeviceSecurityEvent.java | 15 +- .../events/DeviceSecurityEventData.java | 4 +- .../events/DeviceSecurityEventData2.java | 48 +++++- .../events/DeviceSecurityEventDataHeader.java | 27 ++-- .../DeviceSecurityEventDataHeader2.java | 146 +++++++++++++++++- .../DeviceSecurityEventDataSubHeader.java | 20 +++ ...ventDataSubHeaderSpdmMeasurementBlock.java | 106 +++++++++++++ .../events/DeviceSecurityEventHeader.java | 16 +- .../events/EvEfiSpdmDeviceSecurityEvent.java | 50 ++++-- .../eventlog/spdm/SpdmMeasurementBlock.java | 49 ++++-- 11 files changed, 434 insertions(+), 49 deletions(-) create mode 100644 HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataSubHeader.java create mode 100644 HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock.java diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/TpmPcrEvent.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/TpmPcrEvent.java index ca4a851ea..f1be1b57b 100644 --- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/TpmPcrEvent.java +++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/TpmPcrEvent.java @@ -396,6 +396,8 @@ public String getEventContentStr() { } catch (UnsupportedEncodingException ueEx) { log.error(ueEx); sb.append(ueEx.toString()); + } catch (IOException e) { + throw new RuntimeException(e); } break; default: diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEvent.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEvent.java index 0e97f8a16..fe8d9ec1c 100644 --- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEvent.java +++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEvent.java @@ -50,6 +50,12 @@ */ public abstract class DeviceSecurityEvent { + /** + * DeviceSecurityEventDataContext Object. + */ + @Getter + private DeviceSecurityEventDataDeviceContext dsedDevContext = null; + /** * Human readable description of the data within the * DEVICE_SECURITY_EVENT_DATA_DEVICE_CONTEXT. DEVICE can be either PCI or USB. @@ -83,12 +89,15 @@ public void parseDeviceContext(final byte[] dSEDbytes, int startByte, int device deviceContextLength); if (deviceType == 0) { - deviceContextInfo = "No Device Context (indicated by device type value of 0"; + deviceContextInfo = "\n No Device Context (indicated by device type value of 0"; } else if (deviceType == 1) { - DeviceSecurityEventDataPciContext dSEDpciContext +// DeviceSecurityEventDataPciContext dSEDpciContext +// = new DeviceSecurityEventDataPciContext(deviceContextBytes); +// deviceContextInfo = dSEDpciContext.toString(); + dsedDevContext = new DeviceSecurityEventDataPciContext(deviceContextBytes); - deviceContextInfo = dSEDpciContext.toString(); + deviceContextInfo = dsedDevContext.toString(); } //else if (deviceType == 2) { //DeviceSecurityEventDataUsbContext dSEDusbContext diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData.java index 4f996548c..1043f74df 100644 --- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData.java +++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData.java @@ -1,6 +1,8 @@ package hirs.utils.tpm.eventlog.events; import lombok.Getter; + +import java.io.IOException; import java.io.UnsupportedEncodingException; /** @@ -26,7 +28,7 @@ public class DeviceSecurityEventData extends DeviceSecurityEvent { * * @param dSEDbytes byte array holding the DeviceSecurityEventData. */ - public DeviceSecurityEventData(final byte[] dSEDbytes) throws UnsupportedEncodingException { + public DeviceSecurityEventData(final byte[] dSEDbytes) throws IOException { dsedHeader = new DeviceSecurityEventDataHeader(dSEDbytes); parseDeviceContext(dSEDbytes, dsedHeader.getDSEDheaderByteSize(), dsedHeader.getDeviceType()); } diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData2.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData2.java index 014b6fe0b..81ae1ccfd 100644 --- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData2.java +++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData2.java @@ -1,7 +1,14 @@ package hirs.utils.tpm.eventlog.events; +import hirs.utils.HexUtils; import lombok.Getter; +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +import static hirs.utils.tpm.eventlog.events.DeviceSecurityEventDataHeader2.SUBHEADERTYPE_CERT_CHAIN; +import static hirs.utils.tpm.eventlog.events.DeviceSecurityEventDataHeader2.SUBHEADERTYPE_MEAS_BLOCK; + // TODO Placeholder class to be implemented upon getting test pattern /** * Class to process DEVICE_SECURITY_EVENT_DATA2. @@ -22,14 +29,50 @@ public class DeviceSecurityEventData2 extends DeviceSecurityEvent { @Getter private DeviceSecurityEventDataHeader2 dsedHeader2 = null; + /** + * DeviceSecurityEventDataSubHeader Object. + */ + @Getter + private DeviceSecurityEventDataSubHeader dsedSubHeader = null; + + /** + * Human readable description of the data within the + * DEVICE_SECURITY_EVENT_DATA_SUB_HEADER. SUB_HEADER can be either + * DEVICE_SECURITY_EVENT_DATA_SUB_HEADER_SPDM_MEASUREMENT_BLOCK or + * DEVICE_SECURITY_EVENT_DATA_SUB_HEADER_SPDM_CERT_CHAIN + */ + @Getter + String subHeaderInfo = ""; + /** * DeviceSecurityEventData2 Constructor. * * @param dSEDbytes byte array holding the DeviceSecurityEventData2. */ - public DeviceSecurityEventData2(final byte[] dSEDbytes) { + public DeviceSecurityEventData2(final byte[] dSEDbytes) throws IOException { dsedHeader2 = new DeviceSecurityEventDataHeader2(dSEDbytes); + int dSEDheaderByteSize = dsedHeader2.getDSEDheaderByteSize(); + int subHeaderType = dsedHeader2.getSubHeaderType(); + int subHeaderLength = dsedHeader2.getSubHeaderLength(); + + subHeaderInfo = "\nSub header type: " + subHeaderType; + + byte[] dSEDsubHeaderBytes = new byte[subHeaderLength]; + System.arraycopy(dSEDbytes, dSEDheaderByteSize, dSEDsubHeaderBytes, 0, subHeaderLength); + + if (subHeaderType == SUBHEADERTYPE_MEAS_BLOCK) { + dsedSubHeader = new DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock(dSEDsubHeaderBytes); + subHeaderInfo += dsedSubHeader.toString(); + } + else if (subHeaderType == SUBHEADERTYPE_CERT_CHAIN) { + // TBD: + // dsedSubHeader = new DeviceSecurityEventDataSubHeaderCertChain(); + } + else { + subHeaderInfo += "Subheader type unknown"; + } + // get subheader parseDeviceContext(dSEDbytes, dsedHeader2.getDSEDheaderByteSize(), dsedHeader2.getDeviceType()); } @@ -41,6 +84,9 @@ public DeviceSecurityEventData2(final byte[] dSEDbytes) { */ public String toString() { String dsedInfo = ""; + dsedInfo += dsedHeader2.toString(); + dsedInfo += dsedSubHeader.toString(); + dsedInfo += getDeviceContextInfo(); return dsedInfo; } } diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader.java index 3c9ac4442..bca6cd33f 100644 --- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader.java +++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader.java @@ -6,6 +6,8 @@ import hirs.utils.tpm.eventlog.uefi.UefiConstants; import lombok.Getter; +import java.io.ByteArrayInputStream; +import java.io.IOException; import java.io.UnsupportedEncodingException; /** @@ -49,39 +51,44 @@ public class DeviceSecurityEventDataHeader extends DeviceSecurityEventHeader { /** * DeviceSecurityEventDataHeader Constructor. * - * @param dSEDbytes byte array holding the DeviceSecurityEventData. + * @param dsedBytes byte array holding the DeviceSecurityEventData. */ - public DeviceSecurityEventDataHeader(final byte[] dSEDbytes) throws UnsupportedEncodingException { + public DeviceSecurityEventDataHeader(final byte[] dsedBytes) throws IOException { - super(dSEDbytes); + super(dsedBytes); byte[] lengthBytes = new byte[UefiConstants.SIZE_2]; - System.arraycopy(dSEDbytes, 18, lengthBytes, 0, + System.arraycopy(dsedBytes, 18, lengthBytes, 0, UefiConstants.SIZE_2); length = HexUtils.leReverseInt(lengthBytes); byte[] spdmHashAlgoBytes = new byte[UefiConstants.SIZE_4]; - System.arraycopy(dSEDbytes, UefiConstants.OFFSET_20, spdmHashAlgoBytes, 0, + System.arraycopy(dsedBytes, UefiConstants.OFFSET_20, spdmHashAlgoBytes, 0, UefiConstants.SIZE_4); spdmHashAlgo = HexUtils.leReverseInt(spdmHashAlgoBytes); - extractDeviceType(dSEDbytes, 24); + extractDeviceType(dsedBytes, 24); // get the size of the SPDM Measurement Block byte[] sizeOfSpdmMeasBlockBytes = new byte[UefiConstants.SIZE_2]; - System.arraycopy(dSEDbytes, 30, sizeOfSpdmMeasBlockBytes, 0, + System.arraycopy(dsedBytes, 30, sizeOfSpdmMeasBlockBytes, 0, UefiConstants.SIZE_2); int sizeOfSpdmMeas = HexUtils.leReverseInt(sizeOfSpdmMeasBlockBytes); int sizeOfSpdmMeasBlock = sizeOfSpdmMeas + 4; // header is 4 bytes // extract the bytes from the SPDM Measurement Block byte[] spdmMeasBlockBytes = new byte[sizeOfSpdmMeasBlock]; - System.arraycopy(dSEDbytes, 28, spdmMeasBlockBytes, 0, + System.arraycopy(dsedBytes, 28, spdmMeasBlockBytes, 0, sizeOfSpdmMeasBlock); - spdmMeasurementBlock = new SpdmMeasurementBlock(spdmMeasBlockBytes); + +// spdmMeasurementBlock = new SpdmMeasurementBlock(spdmMeasBlockBytes); + + ByteArrayInputStream spdmMeasurementBlockData = + new ByteArrayInputStream(spdmMeasBlockBytes); + spdmMeasurementBlock = new SpdmMeasurementBlock(spdmMeasurementBlockData); int devPathLenStartByte = 28 + sizeOfSpdmMeasBlock; - extractDevicePathAndFinalSize(dSEDbytes, devPathLenStartByte); + extractDevicePathAndFinalSize(dsedBytes, devPathLenStartByte); } /** diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader2.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader2.java index 8e7589a95..5ebef0173 100644 --- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader2.java +++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader2.java @@ -1,12 +1,130 @@ package hirs.utils.tpm.eventlog.events; +import hirs.utils.HexUtils; import hirs.utils.tpm.eventlog.spdm.SpdmHa; +import hirs.utils.tpm.eventlog.spdm.SpdmMeasurementBlock; +import hirs.utils.tpm.eventlog.uefi.UefiConstants; +import lombok.Getter; -// Placeholder for Header2 data structure. +import java.io.UnsupportedEncodingException; + +/** + * Class to process the DEVICE_SECURITY_EVENT_DATA_HEADER2. + * DEVICE_SECURITY_EVENT_DATA_HEADER2 contains the measurement(s) and hash algorithm identifier + * returned by the SPDM "GET_MEASUREMENTS" function. + * + * HEADERS defined by PFP v1.06 Rev 52: + *
+ * typedef struct tdDEVICE_SECURITY_EVENT_DATA_HEADER2 { + * UINT8 Signature[16]; + * UINT16 Version; + * UINT8 AuthState; + * UINT8 Reserved + * UINT32 Length; + * UINT32 DeviceType; + * UINT32 SubHeaderType; + * UINT32 SubHeaderLength; + * UINT64 SubHeaderUID; + * UINT64 DevicePathLength; + * UNIT8 DevicePath[DevicePathLength] + * } DEVICE_SECURITY_EVENT_DATA_HEADER2; + *
+ * Assumption: there is only 1 SpdmMeasurementBlock per event. Need more test patterns to verify. + */ public class DeviceSecurityEventDataHeader2 extends DeviceSecurityEventHeader { - public DeviceSecurityEventDataHeader2(final byte[] dSEDbytes) { + /** + * Event auth state + */ + @Getter + private int authState = 0; + /** + * Event data length. + */ + @Getter + private int length = 0; + /** + * Event sub headerType + */ + @Getter + private int subHeaderType = 0; + /** + * Event sub header length. + */ + @Getter + private int subHeaderLength = 0; + /** + * Event sub header UID. + */ + @Getter + private String subHeaderUid = ""; + + /** + * Auth state - success + */ + public static final int AUTH_SUCCESS = 0; + /** + * Auth state - digital signature of the data is valid, but the public key certificate chain is not + * validated with the entry in in the UEFI device signature variable + */ + public static final int AUTH_NO_AUTHORITY = 1; + /** + * Auth state - digital signature of the measurement data is valid, but the reported device capabilities, + * negotiated parameters or certificate chains were not validated by a transcript. + */ + public static final int AUTH_NO_BINDING = 2; + /** + * Auth state - data has no digital signature + */ + public static final int AUTH_FAIL_NO_SIG = 3; + /** + * Auth state - data is invalid + */ + public static final int AUTH_FAIL_INVALID = 4; + /** + * Auth state - device is not an SPDM-capable device + */ + public static final int AUTH_NO_SPDM = 0xFF; + /** + * Sub header type - SPDM measurement block + */ + public static final int SUBHEADERTYPE_MEAS_BLOCK = 0; + /** + * Sub header type - SPDM cert chain + */ + public static final int SUBHEADERTYPE_CERT_CHAIN = 1; + + + public DeviceSecurityEventDataHeader2(final byte[] dsedBytes) throws UnsupportedEncodingException { + + super(dsedBytes); + + byte[] authStateBytes = new byte[1]; + System.arraycopy(dsedBytes, 18, authStateBytes, 0, 1); + authState = HexUtils.leReverseInt(authStateBytes); + // byte[] reserved[Bytes]: 1 byte + + byte[] lengthBytes = new byte[4]; + System.arraycopy(dsedBytes, 20, lengthBytes, 0, 4); + length = HexUtils.leReverseInt(lengthBytes); + + extractDeviceType(dsedBytes, 24); + + byte[] subHeaderTypeBytes = new byte[4]; + System.arraycopy(dsedBytes, 44, subHeaderTypeBytes, 0, 4); + subHeaderType = HexUtils.leReverseInt(subHeaderTypeBytes); + + byte[] subHeaderLengthBytes = new byte[4]; + System.arraycopy(dsedBytes, 48, subHeaderLengthBytes, 0, 4); + subHeaderLength = HexUtils.leReverseInt(subHeaderLengthBytes); + + byte[] subHeaderUidBytes = new byte[8]; + System.arraycopy(dsedBytes, 52, subHeaderUidBytes, 0, 8); + subHeaderUid = HexUtils.byteArrayToHexString(subHeaderUidBytes); + + int devPathLenStartByte = 60; + extractDevicePathAndFinalSize(dsedBytes, devPathLenStartByte); } /** @@ -17,6 +135,30 @@ public DeviceSecurityEventDataHeader2(final byte[] dSEDbytes) { public String toString() { String dsedHeader2Info = ""; + dsedHeader2Info += super.toString(); + dsedHeader2Info += "\n AuthState: " + getAuthStateString(); + dsedHeader2Info += "\n Sub header UID: " + subHeaderUid; + return dsedHeader2Info; } + + public String getAuthStateString() { + + switch (authState) { + case AUTH_SUCCESS: + return ("AUTH_SUCCESS"); + case AUTH_NO_AUTHORITY: + return ("AUTH_NO_AUTHORITY"); + case AUTH_NO_BINDING: + return ("AUTH_NO_BINDING"); + case AUTH_FAIL_NO_SIG: + return ("AUTH_FAIL_NO_SIG"); + case AUTH_FAIL_INVALID: + return ("AUTH_FAIL_INVALID"); + case AUTH_NO_SPDM: + return ("AUTH_NO_SPDM"); + default: + return ("Auth State unknown"); + } + } } diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataSubHeader.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataSubHeader.java new file mode 100644 index 000000000..8c7b07649 --- /dev/null +++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataSubHeader.java @@ -0,0 +1,20 @@ +package hirs.utils.tpm.eventlog.events; + + +/** + * Class to process the DEVICE_SECURITY_EVENT_DATA_SUB_HEADER event per PFP. + * + *
+ * typedef union tdDEVICE_SECURITY_EVENT_DATA_SUB_HEADER { + * DEVICE_SECURITY_EVENT_DATA_SUB_HEADER_SPDM_MEASUREMENT_BLOCK SpdmMeasurementBlock; + * DEVICE_SECURITY_EVENT_DATA_SUB_HEADER_SPDM_CERT_CHAIN SpdmCertChain; + * DEVICE_SECURITY_EVENT_DATA_SUB_HEADER_OEM_MEASUREMENT OemMeasurement; + * } DEVICE_SECURITY_EVENT_DATA_SUB_HEADER; + *
+ */ +public abstract class DeviceSecurityEventDataSubHeader { + + public DeviceSecurityEventDataSubHeader() { + } + +} diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock.java new file mode 100644 index 000000000..5a3196ec1 --- /dev/null +++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock.java @@ -0,0 +1,106 @@ +package hirs.utils.tpm.eventlog.events; + +import hirs.utils.HexUtils; +import hirs.utils.tpm.eventlog.spdm.SpdmMeasurementBlock; +import hirs.utils.tpm.eventlog.uefi.UefiConstants; +import hirs.utils.tpm.eventlog.uefi.UefiSignatureList; +import lombok.Getter; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; + +/** + * Class to process the DEVICE_SECURITY_EVENT_DATA_SUB_HEADER_SPDM_MEASUREMENT_BLOCK event per PFP. + * + *
+ * typedef union tdDEVICE_SECURITY_EVENT_DATA_SUB_HEADER_SPDM_MEASUREMENT_BLOCK { + * UINT16 SpdmVersion; + * UINT8 SpdmMeasurementBlockCount; + * UINT8 Reserved; + * UINT32 SpdmMeasurementHashAlgo; + * SPDM_MEASUREMENT_BLOCK SpdmMeasurementBlock[SpdmMeasurementBlockCount]; + * } DEVICE_SECURITY_EVENT_DATA_SUB_HEADER_SPDM_MEASUREMENT_BLOCK; + *
+ */
+public class DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock extends DeviceSecurityEventDataSubHeader {
+
+ /**
+ * SPDM version.
+ */
+ @Getter
+ private int spdmVersion = 0;
+ /**
+ * SPDM measurement block count.
+ */
+ @Getter
+ private int spdmMeasurementBlockCount = 0;
+ /**
+ * SPDM measurement hash algorithm.
+ */
+ @Getter
+ private int spdmMeasurementHashAlgo = -1;
+
+ /**
+ * List of SPDM Measurement Blocks.
+ */
+ private List
@@ -42,32 +45,58 @@ public class SpdmMeasurementBlock {
/**
* SpdmMeasurementBlock Constructor.
*
- * @param spdmMeasBlockBytes byte array holding the SPDM Measurement Block bytes.
+ * @param spdmMeasBlocks byte array holding the SPDM Measurement Block bytes.
*/
- public SpdmMeasurementBlock(final byte[] spdmMeasBlockBytes) {
+// public SpdmMeasurementBlock(final ByteArrayInputStream spdmMeasBlocks) {
+ public SpdmMeasurementBlock(final ByteArrayInputStream spdmMeasBlocks) throws IOException {
byte[] indexBytes = new byte[1];
- System.arraycopy(spdmMeasBlockBytes, 0, indexBytes, 0,
- 1);
+ spdmMeasBlocks.read(indexBytes);
index = HexUtils.leReverseInt(indexBytes);
byte[] measurementSpecBytes = new byte[1];
- System.arraycopy(spdmMeasBlockBytes, 1, measurementSpecBytes, 0,
- 1);
+ spdmMeasBlocks.read(measurementSpecBytes);
measurementSpec = HexUtils.leReverseInt(measurementSpecBytes);
// in future, can crosscheck this measurement size with the MeasurementSpec hash alg size
byte[] measurementSizeBytes = new byte[2];
- System.arraycopy(spdmMeasBlockBytes, 2, measurementSizeBytes, 0,
- 2);
+ spdmMeasBlocks.read(measurementSizeBytes);
int measurementSize = HexUtils.leReverseInt(measurementSizeBytes);
byte[] measurementBytes = new byte[measurementSize];
- System.arraycopy(spdmMeasBlockBytes, 4, measurementBytes, 0,
- measurementSize);
+ spdmMeasBlocks.read(measurementBytes);
spdmMeasurement = new SpdmMeasurement(measurementBytes);
}
+// /**
+// * SpdmMeasurementBlock Constructor.
+// *
+// * @param spdmMeasBlockBytes byte array holding the SPDM Measurement Block bytes.
+// */
+// public SpdmMeasurementBlock(final byte[] spdmMeasBlockBytes) {
+//
+// byte[] indexBytes = new byte[1];
+// System.arraycopy(spdmMeasBlockBytes, 0, indexBytes, 0,
+// 1);
+// index = HexUtils.leReverseInt(indexBytes);
+//
+// byte[] measurementSpecBytes = new byte[1];
+// System.arraycopy(spdmMeasBlockBytes, 1, measurementSpecBytes, 0,
+// 1);
+// measurementSpec = HexUtils.leReverseInt(measurementSpecBytes);
+//
+// // in future, can crosscheck this measurement size with the MeasurementSpec hash alg size
+// byte[] measurementSizeBytes = new byte[2];
+// System.arraycopy(spdmMeasBlockBytes, 2, measurementSizeBytes, 0,
+// 2);
+// int measurementSize = HexUtils.leReverseInt(measurementSizeBytes);
+//
+// byte[] measurementBytes = new byte[measurementSize];
+// System.arraycopy(spdmMeasBlockBytes, 4, measurementBytes, 0,
+// measurementSize);
+// spdmMeasurement = new SpdmMeasurement(measurementBytes);
+// }
+
/**
* Returns a human readable description of the data within this structure.
*
From 70e2870373783fea78dde6dcbbc9ab27d87266f9 Mon Sep 17 00:00:00 2001
From: iadgovuser58 <124906646+iadgovuser58@users.noreply.github.com>
Date: Fri, 28 Jun 2024 15:02:35 -0400
Subject: [PATCH 2/5] spdm processing
---
.../hirs/utils/tpm/eventlog/TpmPcrEvent.java | 4 +-
.../eventlog/events/DeviceSecurityEvent.java | 46 +++++++++----------
.../events/DeviceSecurityEventData.java | 17 +++++--
.../events/DeviceSecurityEventData2.java | 31 +++++++------
.../DeviceSecurityEventDataDeviceContext.java | 19 ++++----
.../events/DeviceSecurityEventDataHeader.java | 7 +--
.../DeviceSecurityEventDataHeader2.java | 14 +++---
...ventDataSubHeaderSpdmMeasurementBlock.java | 30 +++++++-----
.../events/DeviceSecurityEventHeader.java | 24 ++++------
.../utils/tpm/eventlog/uefi/UefiVariable.java | 1 +
10 files changed, 100 insertions(+), 93 deletions(-)
diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/TpmPcrEvent.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/TpmPcrEvent.java
index f1be1b57b..bd0b1f68c 100644
--- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/TpmPcrEvent.java
+++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/TpmPcrEvent.java
@@ -562,7 +562,9 @@ public String processEvent(final byte[] eventData, final byte[] content,
case EvConstants.EV_EFI_HCRTM_EVENT:
break;
case EvConstants.EV_EFI_SPDM_FIRMWARE_BLOB:
- description += "Event Content:\n" + new EvEfiSpdmDeviceSecurityEvent(content).toString();
+ EvEfiSpdmDeviceSecurityEvent tempp = new EvEfiSpdmDeviceSecurityEvent(content);
+ description += "Event Content:\n" + tempp.toString();
+// description += "Event Content:\n" + new EvEfiSpdmDeviceSecurityEvent(content).toString();
break;
case EvConstants.EV_EFI_SPDM_FIRMWARE_CONFIG:
description += "Event Content:\n" + new EvEfiSpdmDeviceSecurityEvent(content).toString();
diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEvent.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEvent.java
index fe8d9ec1c..18894e880 100644
--- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEvent.java
+++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEvent.java
@@ -1,6 +1,11 @@
package hirs.utils.tpm.eventlog.events;
import lombok.Getter;
+import lombok.Setter;
+
+import static hirs.utils.tpm.eventlog.events.DeviceSecurityEventHeader.DEVICE_TYPE_NONE;
+import static hirs.utils.tpm.eventlog.events.DeviceSecurityEventHeader.DEVICE_TYPE_PCI;
+import static hirs.utils.tpm.eventlog.events.DeviceSecurityEventHeader.DEVICE_TYPE_USB;
/**
@@ -56,6 +61,13 @@ public abstract class DeviceSecurityEvent {
@Getter
private DeviceSecurityEventDataDeviceContext dsedDevContext = null;
+ /**
+ * Device type.
+ */
+ @Getter
+ @Setter
+ private int deviceType = -1;
+
/**
* Human readable description of the data within the
* DEVICE_SECURITY_EVENT_DATA_DEVICE_CONTEXT. DEVICE can be either PCI or USB.
@@ -74,37 +86,25 @@ public DeviceSecurityEvent() {
/**
* Parse the Device Context structure, can be PCI or USB based on device type field.
*
- * @param dSEDbytes byte array holding the DeviceSecurityEventData.
- * @param startByte starting byte of the device structure (depends on length of header).
- * @param deviceType device type either PCI or USB.
+ * @param dsedDeviceContextBytes byte array holding the DeviceSecurityEventData.
*
*/
- public void parseDeviceContext(final byte[] dSEDbytes, int startByte, int deviceType) {
-
- int deviceContextLength = dSEDbytes.length - startByte;
+ public void instantiateDeviceContext(final byte[] dsedDeviceContextBytes) {
- // get the device context bytes
- byte[] deviceContextBytes = new byte[deviceContextLength];
- System.arraycopy(dSEDbytes, startByte, deviceContextBytes, 0,
- deviceContextLength);
-
- if (deviceType == 0) {
+ if (deviceType == DEVICE_TYPE_NONE) {
deviceContextInfo = "\n No Device Context (indicated by device type value of 0";
}
- else if (deviceType == 1) {
-// DeviceSecurityEventDataPciContext dSEDpciContext
-// = new DeviceSecurityEventDataPciContext(deviceContextBytes);
-// deviceContextInfo = dSEDpciContext.toString();
+ else if (deviceType == DEVICE_TYPE_PCI) {
dsedDevContext
- = new DeviceSecurityEventDataPciContext(deviceContextBytes);
+ = new DeviceSecurityEventDataPciContext(dsedDeviceContextBytes);
deviceContextInfo = dsedDevContext.toString();
}
- //else if (deviceType == 2) {
- //DeviceSecurityEventDataUsbContext dSEDusbContext
- // = new DeviceSecurityEventDataUsbContext(deviceContextBytes);
- //deviceContextInfo = dSEDusbContext.toString();
- //deviceContextInfo = "Device type is USB - to be implemented in future";
- //}
+ else if (deviceType == DEVICE_TYPE_USB) {
+ // dsedDevContext
+ // = new DeviceSecurityEventDataUsbContext(dsedDeviceContextBytes);
+ // deviceContextInfo = dsedDevContext.toString();
+ deviceContextInfo = " Device Type: USB - To be implemented";
+ }
else {
deviceContextInfo = " Unknown device type; cannot process device context";
}
diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData.java
index 1043f74df..91a4a2ecc 100644
--- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData.java
+++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData.java
@@ -3,7 +3,6 @@
import lombok.Getter;
import java.io.IOException;
-import java.io.UnsupportedEncodingException;
/**
* Class to process DEVICE_SECURITY_EVENT_DATA.
@@ -26,11 +25,19 @@ public class DeviceSecurityEventData extends DeviceSecurityEvent {
/**
* DeviceSecurityEventData Constructor.
*
- * @param dSEDbytes byte array holding the DeviceSecurityEventData.
+ * @param dsedBytes byte array holding the DeviceSecurityEventData.
*/
- public DeviceSecurityEventData(final byte[] dSEDbytes) throws IOException {
- dsedHeader = new DeviceSecurityEventDataHeader(dSEDbytes);
- parseDeviceContext(dSEDbytes, dsedHeader.getDSEDheaderByteSize(), dsedHeader.getDeviceType());
+ public DeviceSecurityEventData(final byte[] dsedBytes) throws IOException {
+ dsedHeader = new DeviceSecurityEventDataHeader(dsedBytes);
+ setDeviceType(dsedHeader.getDeviceType());
+ int dsedHeaderLength = dsedHeader.getDsedHeaderLength();
+
+ int dsedDevContextLength = dsedBytes.length - dsedHeaderLength;
+ byte[] dsedDevContextBytes = new byte[dsedDevContextLength];
+ System.arraycopy(dsedBytes, dsedHeaderLength, dsedDevContextBytes, 0,
+ dsedDevContextLength);
+
+ instantiateDeviceContext(dsedDevContextBytes);
}
/**
diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData2.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData2.java
index 81ae1ccfd..c470a5fb3 100644
--- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData2.java
+++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventData2.java
@@ -1,15 +1,12 @@
package hirs.utils.tpm.eventlog.events;
-import hirs.utils.HexUtils;
import lombok.Getter;
import java.io.IOException;
-import java.io.UnsupportedEncodingException;
import static hirs.utils.tpm.eventlog.events.DeviceSecurityEventDataHeader2.SUBHEADERTYPE_CERT_CHAIN;
import static hirs.utils.tpm.eventlog.events.DeviceSecurityEventDataHeader2.SUBHEADERTYPE_MEAS_BLOCK;
-// TODO Placeholder class to be implemented upon getting test pattern
/**
* Class to process DEVICE_SECURITY_EVENT_DATA2.
* Parses event data per PFP v1.06 Rev52 Table 26.
@@ -47,34 +44,40 @@ public class DeviceSecurityEventData2 extends DeviceSecurityEvent {
/**
* DeviceSecurityEventData2 Constructor.
*
- * @param dSEDbytes byte array holding the DeviceSecurityEventData2.
+ * @param dsedBytes byte array holding the DeviceSecurityEventData2.
*/
- public DeviceSecurityEventData2(final byte[] dSEDbytes) throws IOException {
+ public DeviceSecurityEventData2(final byte[] dsedBytes) throws IOException {
- dsedHeader2 = new DeviceSecurityEventDataHeader2(dSEDbytes);
- int dSEDheaderByteSize = dsedHeader2.getDSEDheaderByteSize();
+ dsedHeader2 = new DeviceSecurityEventDataHeader2(dsedBytes);
+ setDeviceType(dsedHeader2.getDeviceType());
+ int dsedHeaderLength = dsedHeader2.getDsedHeaderLength();
int subHeaderType = dsedHeader2.getSubHeaderType();
int subHeaderLength = dsedHeader2.getSubHeaderLength();
subHeaderInfo = "\nSub header type: " + subHeaderType;
- byte[] dSEDsubHeaderBytes = new byte[subHeaderLength];
- System.arraycopy(dSEDbytes, dSEDheaderByteSize, dSEDsubHeaderBytes, 0, subHeaderLength);
+ byte[] dsedSubHeaderBytes = new byte[subHeaderLength];
+ System.arraycopy(dsedBytes, dsedHeaderLength, dsedSubHeaderBytes, 0, subHeaderLength);
if (subHeaderType == SUBHEADERTYPE_MEAS_BLOCK) {
- dsedSubHeader = new DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock(dSEDsubHeaderBytes);
+ dsedSubHeader = new DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock(dsedSubHeaderBytes);
subHeaderInfo += dsedSubHeader.toString();
}
else if (subHeaderType == SUBHEADERTYPE_CERT_CHAIN) {
- // TBD:
// dsedSubHeader = new DeviceSecurityEventDataSubHeaderCertChain();
+ subHeaderInfo += " Cert chain to be implemented ";
}
else {
- subHeaderInfo += "Subheader type unknown";
+ subHeaderInfo += "Sub header type unknown";
}
- // get subheader
- parseDeviceContext(dSEDbytes, dsedHeader2.getDSEDheaderByteSize(), dsedHeader2.getDeviceType());
+ int dsedDevContextStartByte = dsedHeaderLength + subHeaderLength;
+ int dsedDevContextLength = dsedBytes.length - dsedDevContextStartByte;
+ byte[] dsedDevContextBytes = new byte[dsedDevContextLength];
+ System.arraycopy(dsedBytes, dsedDevContextStartByte, dsedDevContextBytes, 0,
+ dsedDevContextLength);
+
+ instantiateDeviceContext(dsedDevContextBytes);
}
/**
diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataDeviceContext.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataDeviceContext.java
index a9863eb7b..0404884e4 100644
--- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataDeviceContext.java
+++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataDeviceContext.java
@@ -31,17 +31,17 @@ public abstract class DeviceSecurityEventDataDeviceContext {
/**
* DeviceSecurityEventDataDeviceContext Constructor.
*
- * @param dSEDdeviceContextBytes byte array holding the DeviceSecurityEventData.
+ * @param dsedDeviceContextBytes byte array holding the DeviceSecurityEventData.
*/
- public DeviceSecurityEventDataDeviceContext(final byte[] dSEDdeviceContextBytes) {
+ public DeviceSecurityEventDataDeviceContext(final byte[] dsedDeviceContextBytes) {
- byte[] pciVersionBytes = new byte[2];
- System.arraycopy(dSEDdeviceContextBytes, 0, pciVersionBytes, 0, 2);
- version = HexUtils.leReverseInt(pciVersionBytes);
+ byte[] versionBytes = new byte[2];
+ System.arraycopy(dsedDeviceContextBytes, 0, versionBytes, 0, 2);
+ version = HexUtils.leReverseInt(versionBytes);
- byte[] pciLengthBytes = new byte[2];
- System.arraycopy(dSEDdeviceContextBytes, 2, pciLengthBytes, 0, 2);
- length = HexUtils.leReverseInt(pciLengthBytes);
+ byte[] lengthBytes = new byte[2];
+ System.arraycopy(dsedDeviceContextBytes, 2, lengthBytes, 0, 2);
+ length = HexUtils.leReverseInt(lengthBytes);
}
/**
@@ -52,8 +52,7 @@ public DeviceSecurityEventDataDeviceContext(final byte[] dSEDdeviceContextBytes)
public String toString() {
String dSEDdeviceContextCommonInfo = "";
- dSEDdeviceContextCommonInfo += "\n DeviceSecurityEventData Device Info:";
- dSEDdeviceContextCommonInfo += "\n Device Structure Version = " + version;
+ dSEDdeviceContextCommonInfo += "\n DeviceSecurityEventData Device Context:";
return dSEDdeviceContextCommonInfo;
}
diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader.java
index bca6cd33f..0fe0226e4 100644
--- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader.java
+++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader.java
@@ -8,7 +8,6 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
-import java.io.UnsupportedEncodingException;
/**
* Class to process the DEVICE_SECURITY_EVENT_DATA_HEADER.
@@ -76,13 +75,11 @@ public DeviceSecurityEventDataHeader(final byte[] dsedBytes) throws IOException
int sizeOfSpdmMeas = HexUtils.leReverseInt(sizeOfSpdmMeasBlockBytes);
int sizeOfSpdmMeasBlock = sizeOfSpdmMeas + 4; // header is 4 bytes
- // extract the bytes from the SPDM Measurement Block
+ // extract the bytes that comprise the SPDM Measurement Block
byte[] spdmMeasBlockBytes = new byte[sizeOfSpdmMeasBlock];
System.arraycopy(dsedBytes, 28, spdmMeasBlockBytes, 0,
sizeOfSpdmMeasBlock);
-// spdmMeasurementBlock = new SpdmMeasurementBlock(spdmMeasBlockBytes);
-
ByteArrayInputStream spdmMeasurementBlockData =
new ByteArrayInputStream(spdmMeasBlockBytes);
spdmMeasurementBlock = new SpdmMeasurementBlock(spdmMeasurementBlockData);
@@ -92,7 +89,7 @@ public DeviceSecurityEventDataHeader(final byte[] dsedBytes) throws IOException
}
/**
- * Returns a human readable description of the data within this structure.
+ * Returns a human-readable description of the data within this structure.
*
* @return a description of this structure.
*/
diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader2.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader2.java
index 5ebef0173..f113c8554 100644
--- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader2.java
+++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataHeader2.java
@@ -1,9 +1,6 @@
package hirs.utils.tpm.eventlog.events;
import hirs.utils.HexUtils;
-import hirs.utils.tpm.eventlog.spdm.SpdmHa;
-import hirs.utils.tpm.eventlog.spdm.SpdmMeasurementBlock;
-import hirs.utils.tpm.eventlog.uefi.UefiConstants;
import lombok.Getter;
import java.io.UnsupportedEncodingException;
@@ -112,23 +109,24 @@ public DeviceSecurityEventDataHeader2(final byte[] dsedBytes) throws Unsupported
extractDeviceType(dsedBytes, 24);
byte[] subHeaderTypeBytes = new byte[4];
- System.arraycopy(dsedBytes, 44, subHeaderTypeBytes, 0, 4);
+ System.arraycopy(dsedBytes, 28, subHeaderTypeBytes, 0, 4);
subHeaderType = HexUtils.leReverseInt(subHeaderTypeBytes);
byte[] subHeaderLengthBytes = new byte[4];
- System.arraycopy(dsedBytes, 48, subHeaderLengthBytes, 0, 4);
+ System.arraycopy(dsedBytes, 32, subHeaderLengthBytes, 0, 4);
subHeaderLength = HexUtils.leReverseInt(subHeaderLengthBytes);
byte[] subHeaderUidBytes = new byte[8];
- System.arraycopy(dsedBytes, 52, subHeaderUidBytes, 0, 8);
+ System.arraycopy(dsedBytes, 36, subHeaderUidBytes, 0, 8);
+ subHeaderUidBytes = HexUtils.leReverseByte(subHeaderUidBytes);
subHeaderUid = HexUtils.byteArrayToHexString(subHeaderUidBytes);
- int devPathLenStartByte = 60;
+ int devPathLenStartByte = 44;
extractDevicePathAndFinalSize(dsedBytes, devPathLenStartByte);
}
/**
- * Returns a human readable description of the data within this structure.
+ * Returns a human-readable description of the data within this structure.
*
* @return a description of this structure.
*/
diff --git a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock.java b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock.java
index 5a3196ec1..e1e0d2421 100644
--- a/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock.java
+++ b/HIRS_Utils/src/main/java/hirs/utils/tpm/eventlog/events/DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock.java
@@ -1,14 +1,13 @@
package hirs.utils.tpm.eventlog.events;
import hirs.utils.HexUtils;
+import hirs.utils.tpm.eventlog.spdm.SpdmHa;
import hirs.utils.tpm.eventlog.spdm.SpdmMeasurementBlock;
-import hirs.utils.tpm.eventlog.uefi.UefiConstants;
import hirs.utils.tpm.eventlog.uefi.UefiSignatureList;
import lombok.Getter;
import java.io.ByteArrayInputStream;
import java.io.IOException;
-import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
@@ -47,10 +46,6 @@ public class DeviceSecurityEventDataSubHeaderSpdmMeasurementBlock extends Device
* List of SPDM Measurement Blocks.
*/
private List
- * Assumption: there is only 1 SpdmMeasurementBlock per event. Need more test patterns to verify.
*/
public class DeviceSecurityEventDataHeader2 extends DeviceSecurityEventHeader {