From 470e6eccdfc383a9499a367aec4c53e1058d7432 Mon Sep 17 00:00:00 2001 From: Cyrus <24922493+cyrus-dev@users.noreply.github.com> Date: Fri, 21 Jan 2022 06:29:53 -0500 Subject: [PATCH] Refactored the Reference Digest code so that the ReferenceDigestValue table is accessible and upated the contoller for the getOrderedList. --- ...stractAttestationCertificateAuthority.java | 2 +- .../SupplyChainValidationServiceImpl.java | 7 +- ...eferenceManifestDetailsPageController.java | 27 ++- .../controllers/TpmEventsPageController.java | 17 +- .../main/webapp/WEB-INF/jsp/tpm-events.jsp | 26 ++- .../data/persist/ReferenceDigestValue.java | 81 +++++++-- .../hirs/persist/DBReferenceEventManager.java | 162 ++++++++++++++++-- .../hirs/persist/ReferenceEventManager.java | 54 +++++- 8 files changed, 313 insertions(+), 63 deletions(-) diff --git a/HIRS_AttestationCA/src/main/java/hirs/attestationca/AbstractAttestationCertificateAuthority.java b/HIRS_AttestationCA/src/main/java/hirs/attestationca/AbstractAttestationCertificateAuthority.java index 5883b5c2..6cab77da 100644 --- a/HIRS_AttestationCA/src/main/java/hirs/attestationca/AbstractAttestationCertificateAuthority.java +++ b/HIRS_AttestationCA/src/main/java/hirs/attestationca/AbstractAttestationCertificateAuthority.java @@ -1006,7 +1006,7 @@ public abstract class AbstractAttestationCertificateAuthority rdr = referenceDigestManager.saveRecord(dbObj); } // right now this will not deal with updating - if (this.referenceEventManager.getValuesByRecordId(rdr).isEmpty()) { + if (this.referenceEventManager.getValuesByRimId(dbSupport).isEmpty()) { try { TCGEventLog logProcessor = new TCGEventLog(dbSupport.getRimBytes()); ReferenceDigestValue rdv; diff --git a/HIRS_AttestationCA/src/main/java/hirs/attestationca/service/SupplyChainValidationServiceImpl.java b/HIRS_AttestationCA/src/main/java/hirs/attestationca/service/SupplyChainValidationServiceImpl.java index 43321504..47c0c652 100644 --- a/HIRS_AttestationCA/src/main/java/hirs/attestationca/service/SupplyChainValidationServiceImpl.java +++ b/HIRS_AttestationCA/src/main/java/hirs/attestationca/service/SupplyChainValidationServiceImpl.java @@ -9,7 +9,6 @@ import hirs.data.persist.Device; import hirs.data.persist.DeviceInfoReport; import hirs.data.persist.EventLogMeasurements; import hirs.data.persist.PCRPolicy; -import hirs.data.persist.ReferenceDigestRecord; import hirs.data.persist.ReferenceDigestValue; import hirs.data.persist.ReferenceManifest; import hirs.data.persist.SupplyChainPolicy; @@ -389,8 +388,7 @@ public class SupplyChainValidationServiceImpl implements SupplyChainValidationSe Set baseReferenceManifests = null; BaseReferenceManifest baseReferenceManifest = null; ReferenceManifest supportReferenceManifest = null; - EventLogMeasurements measurement = null; - ReferenceDigestRecord digestRecord = null; + ReferenceManifest measurement = null; baseReferenceManifests = BaseReferenceManifest.select(referenceManifestManager) .byModel(model).getRIMs(); @@ -532,7 +530,6 @@ public class SupplyChainValidationServiceImpl implements SupplyChainValidationSe // vs baseline tcg event log // find the measurement TCGEventLog tcgMeasurementLog; - digestRecord = this.referenceDigestManager.getRecord(manufacturer, model); LinkedList tpmPcrEvents = new LinkedList<>(); List eventValue; HashMap eventValueMap = new HashMap<>(); @@ -540,7 +537,7 @@ public class SupplyChainValidationServiceImpl implements SupplyChainValidationSe if (measurement.getPlatformManufacturer().equals(manufacturer)) { tcgMeasurementLog = new TCGEventLog(measurement.getRimBytes()); eventValue = this.referenceEventManager - .getValuesByRecordId(digestRecord); + .getValuesByRimId(supportReferenceManifest); for (ReferenceDigestValue rdv : eventValue) { eventValueMap.put(rdv.getDigestValue(), rdv); } diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ReferenceManifestDetailsPageController.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ReferenceManifestDetailsPageController.java index 1931e62a..73290a56 100644 --- a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ReferenceManifestDetailsPageController.java +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ReferenceManifestDetailsPageController.java @@ -7,7 +7,6 @@ import hirs.attestationca.portal.page.params.ReferenceManifestDetailsPageParams; import hirs.attestationca.service.SupplyChainValidationServiceImpl; import hirs.data.persist.BaseReferenceManifest; import hirs.data.persist.EventLogMeasurements; -import hirs.data.persist.ReferenceDigestRecord; import hirs.data.persist.ReferenceDigestValue; import hirs.data.persist.ReferenceManifest; import hirs.data.persist.SupportReferenceManifest; @@ -522,7 +521,6 @@ public class ReferenceManifestDetailsPageController BaseReferenceManifest base = null; List supports = new ArrayList<>(); SupportReferenceManifest baseSupport = null; - List digestRecords = new LinkedList<>(); data.put("supportFilename", "Blank"); data.put("supportId", ""); @@ -532,9 +530,8 @@ public class ReferenceManifestDetailsPageController data.put("validationResult", measurements.getOverallValidationResult()); data.put("swidBase", true); + List eventValues = new ArrayList<>(); if (measurements.getDeviceName() != null) { - digestRecords = referenceDigestManager - .getRecordsByDeviceName(measurements.getDeviceName()); supports.addAll(SupportReferenceManifest .select(referenceManifestManager) .byDeviceName(measurements @@ -558,24 +555,20 @@ public class ReferenceManifestDetailsPageController if (base != null) { data.put("associatedRim", base.getId()); } + + eventValues.addAll(referenceEventManager.getValuesByRimId(base)); } } TCGEventLog measurementLog = new TCGEventLog(measurements.getRimBytes()); - List eventValue = new ArrayList<>(); Map eventValueMap = new HashMap<>(); - if (!digestRecords.isEmpty()) { - for (ReferenceDigestRecord rdr : digestRecords) { - eventValue.addAll(referenceEventManager - .getValuesByRecordId(rdr)); - } - for (ReferenceDigestValue rdv : eventValue) { - eventValueMap.put(rdv.getDigestValue(), rdv); - } - for (TpmPcrEvent measurementEvent : measurementLog.getEventList()) { - if (!eventValueMap.containsKey(measurementEvent.getEventDigestStr())) { - livelogEvents.add(measurementEvent); - } + + for (ReferenceDigestValue rdv : eventValues) { + eventValueMap.put(rdv.getDigestValue(), rdv); + } + for (TpmPcrEvent measurementEvent : measurementLog.getEventList()) { + if (!eventValueMap.containsKey(measurementEvent.getEventDigestStr())) { + livelogEvents.add(measurementEvent); } } diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/TpmEventsPageController.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/TpmEventsPageController.java index 3fd6ac64..98ef4169 100644 --- a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/TpmEventsPageController.java +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/TpmEventsPageController.java @@ -135,7 +135,7 @@ public class TpmEventsPageController @RequestMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET) - public DataTableResponse getTableData( + public DataTableResponse getTableData( final DataTableInput input) { LOGGER.info("Handling request for summary list: " + input); @@ -151,17 +151,14 @@ public class TpmEventsPageController }; LOGGER.info("Querying with the following datatableinput: " + input.toString()); - FilteredRecordsList referenceDigestRecords - = OrderedListQueryDataTableAdapter.getOrderedList( - ReferenceDigestRecord.class, - referenceDigestManager, + + FilteredRecordsList referenceDigestValues = + OrderedListQueryDataTableAdapter.getOrderedList( + ReferenceDigestValue.class, + referenceEventManager, input, orderColumnName, criteriaModifier); -// FilteredRecordsList> -// mappedRecordValues = mapRecordToValues(referenceDigestRecords); - -// LOGGER.info("Returning list mapping: " + Arrays.toString(mappedRecordValues.toArray())); - return new DataTableResponse<>(referenceDigestRecords, input); + return new DataTableResponse<>(referenceDigestValues, input); } /** diff --git a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/tpm-events.jsp b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/tpm-events.jsp index a523247a..c9551bb3 100644 --- a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/tpm-events.jsp +++ b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/tpm-events.jsp @@ -17,12 +17,14 @@
- +
- + + +
Manufacturer ModelSupport RIMEvent TypePCR IndexDigest Value
@@ -32,13 +34,25 @@ $(document).ready(function() { var url = pagePath +'/list'; var columns = [ - {data: 'manufacturer'}, - {data: 'model'}, - {data: 'supportRim'} + {data: 'manufacturer', + orderable: true, + searchable:false}, + {data: 'model', + orderable: false, + searchable:false}, + {data: 'eventType', + orderable: false, + searchable:false,}, + {data: 'pcrIndex', + orderable: true, + searchable:false}, + {data: 'digestValue', + orderable: false, + searchable:false} ]; //Set data tables - setDataTables("#tpmEventTable", url, columns); + setDataTables("#digestValueTable", url, columns); }); diff --git a/HIRS_Utils/src/main/java/hirs/data/persist/ReferenceDigestValue.java b/HIRS_Utils/src/main/java/hirs/data/persist/ReferenceDigestValue.java index d4a7275e..fefacba3 100644 --- a/HIRS_Utils/src/main/java/hirs/data/persist/ReferenceDigestValue.java +++ b/HIRS_Utils/src/main/java/hirs/data/persist/ReferenceDigestValue.java @@ -1,11 +1,16 @@ package hirs.data.persist; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import org.bouncycastle.util.Arrays; import org.hibernate.annotations.Type; +import javax.persistence.Access; +import javax.persistence.AccessType; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.Table; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; import java.util.Objects; import java.util.UUID; @@ -14,17 +19,21 @@ import java.util.UUID; * Digest Value, Event Type, index, RIM Tagid */ @Entity -public class ReferenceDigestValue extends AbstractEntity { +@Table(name = "ReferenceDigestValue") +@XmlRootElement(name = "ReferenceDigestValue") +@XmlAccessorType(XmlAccessType.FIELD) +@Access(AccessType.FIELD) +public class ReferenceDigestValue extends ArchivableEntity { - private static final Logger LOGGER = LogManager.getLogger(ReferenceDigestValue.class); @Type(type = "uuid-char") @Column private UUID baseRimId; + @Type(type = "uuid-char") @Column private UUID supportRimId; - @Column + @Column(nullable = false) private String manufacturer; - @Column + @Column(nullable = false) private String model; @Column(nullable = false) private int pcrIndex; @@ -40,12 +49,12 @@ public class ReferenceDigestValue extends AbstractEntity { private boolean patched = false; /** - * Default Constructor. + * Default constructor necessary for Hibernate. */ - public ReferenceDigestValue() { + protected ReferenceDigestValue() { super(); - this.baseRimId = UUID.randomUUID(); - this.supportRimId = UUID.randomUUID(); + this.baseRimId = null; + this.supportRimId = null; this.manufacturer = ""; this.model = ""; this.pcrIndex = -1; @@ -83,7 +92,7 @@ public class ReferenceDigestValue extends AbstractEntity { this.eventType = eventType; this.matchFail = matchFail; this.patched = patched; - this.contentBlob = contentBlob; + this.contentBlob = Arrays.clone(contentBlob); } /** @@ -118,6 +127,38 @@ public class ReferenceDigestValue extends AbstractEntity { this.supportRimId = supportRimId; } + /** + * Getter for the manufacturer value. + * @return the stored value + */ + public String getManufacturer() { + return manufacturer; + } + + /** + * Setter for the manufacturer value. + * @param manufacturer the value to store + */ + public void setManufacturer(final String manufacturer) { + this.manufacturer = manufacturer; + } + + /** + * Getter for the model value. + * @return the stored value + */ + public String getModel() { + return model; + } + + /** + * Setter for the model value. + * @param model the value to store + */ + public void setModel(final String model) { + this.model = model; + } + /** * Getter for the event number. * @return the stored value @@ -198,6 +239,24 @@ public class ReferenceDigestValue extends AbstractEntity { this.patched = patched; } + /** + * Getter for the byte array of event values. + * @return a clone of the byte array + */ + public byte[] getContentBlob() { + return contentBlob.clone(); + } + + /** + * Setter for the byte array of values. + * @param contentBlob non-null array. + */ + public void setContentBlob(final byte[] contentBlob) { + if (contentBlob != null) { + this.contentBlob = contentBlob.clone(); + } + } + @Override public boolean equals(final Object obj) { if (this == obj) { diff --git a/HIRS_Utils/src/main/java/hirs/persist/DBReferenceEventManager.java b/HIRS_Utils/src/main/java/hirs/persist/DBReferenceEventManager.java index c8d68238..e3609fcf 100644 --- a/HIRS_Utils/src/main/java/hirs/persist/DBReferenceEventManager.java +++ b/HIRS_Utils/src/main/java/hirs/persist/DBReferenceEventManager.java @@ -1,16 +1,23 @@ package hirs.persist; +import hirs.FilteredRecordsList; +import hirs.data.persist.BaseReferenceManifest; import hirs.data.persist.ReferenceDigestRecord; import hirs.data.persist.ReferenceDigestValue; +import hirs.data.persist.ReferenceManifest; +import hirs.data.persist.SupportReferenceManifest; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.criterion.Restrictions; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; /** @@ -30,6 +37,7 @@ public class DBReferenceEventManager extends DBManager public DBReferenceEventManager(final SessionFactory sessionFactory) { super(ReferenceDigestValue.class, sessionFactory); } + @Override public ReferenceDigestValue saveValue(final ReferenceDigestValue referenceDigestValue) { LOGGER.debug("saving event digest value: {}", referenceDigestValue); @@ -118,24 +126,107 @@ public class DBReferenceEventManager extends DBManager } @Override - public List getValuesByRecordId( - final ReferenceDigestRecord referenceDigestRecord) { - LOGGER.debug("Getting digest values for {}", referenceDigestRecord); - if (referenceDigestRecord == null) { - LOGGER.error("null referenceDigestRecord argument"); - throw new NullPointerException("null referenceDigestRecord"); - } - if (referenceDigestRecord.getId() == null) { - LOGGER.error("null referenceDigestRecord ID argument"); - throw new NullPointerException("null referenceDigestRecord ID"); + public List getValueByManufacturer(final String manufacturer) { + if (manufacturer == null) { + LOGGER.error("null manufacturer argument"); + throw new NullPointerException("null manufacturer parameter"); } List dbDigestValues = new ArrayList<>(); - UUID uuid = referenceDigestRecord.getId(); try { List dbTempList = super.getList(ReferenceDigestValue.class); for (ReferenceDigestValue rdv : dbTempList) { - if (rdv.getSupportRimId().equals(uuid)) { + if (rdv.getManufacturer().equals(manufacturer)) { + dbDigestValues.add(rdv); + } + } + } catch (DBManagerException dbMEx) { + throw new RuntimeException(dbMEx); + } + return dbDigestValues; + } + + @Override + public List getValueByModel(final String model) { + if (model == null) { + LOGGER.error("null model argument"); + throw new NullPointerException("null model parameter"); + } + + List dbDigestValues = new ArrayList<>(); + try { + List dbTempList = super.getList(ReferenceDigestValue.class); + for (ReferenceDigestValue rdv : dbTempList) { + if (rdv.getModel().equals(model)) { + dbDigestValues.add(rdv); + } + } + } catch (DBManagerException dbMEx) { + throw new RuntimeException(dbMEx); + } + return dbDigestValues; + } + + @Override + public List getValueByManufacturerModel( + final String manufacturer, final String model) { + if (model == null) { + LOGGER.error("null model argument"); + throw new NullPointerException("null model parameter"); + } + if (manufacturer == null) { + LOGGER.error("null manufacturer argument"); + throw new NullPointerException("null manufacturer parameter"); + } + + List dbDigestValues = new ArrayList<>(); + try { + List dbTempList = super.getList(ReferenceDigestValue.class); + for (ReferenceDigestValue rdv : dbTempList) { + if (rdv.getManufacturer().equals(manufacturer) + && rdv.getModel().equals(model)) { + dbDigestValues.add(rdv); + } + } + } catch (DBManagerException dbMEx) { + throw new RuntimeException(dbMEx); + } + return dbDigestValues; + } + + @Override + public List getValuesByRecordId( + final ReferenceDigestRecord referenceDigestRecord) { + List dbDigestValues = new ArrayList<>(0); + + return dbDigestValues; + } + + @Override + public List getValuesByRimId( + final ReferenceManifest referenceManifest) { + LOGGER.debug("Getting digest values for {}", referenceManifest); + if (referenceManifest == null) { + LOGGER.error("null referenceManifest argument"); + throw new NullPointerException("null referenceManifest"); + } + if (referenceManifest.getId() == null) { + LOGGER.error("null referenceManifest ID argument"); + throw new NullPointerException("null referenceManifest ID"); + } + + List dbDigestValues = new ArrayList<>(); + UUID uuid = referenceManifest.getId(); + UUID rdvUuid = UUID.randomUUID(); + try { + List dbTempList = super.getList(ReferenceDigestValue.class); + for (ReferenceDigestValue rdv : dbTempList) { + if (referenceManifest instanceof BaseReferenceManifest) { + rdvUuid = rdv.getBaseRimId(); + } else if (referenceManifest instanceof SupportReferenceManifest) { + rdvUuid = rdv.getSupportRimId(); + } + if (rdvUuid.equals(uuid)) { dbDigestValues.add(rdv); } } @@ -167,6 +258,53 @@ public class DBReferenceEventManager extends DBManager return dbDigestValues; } + /** + * Returns a list of all Devices that are ordered by a column + * and direction (ASC, DESC) that is provided by the user. This method + * helps support the server-side processing in the JQuery DataTables. + * + * @param columnToOrder Column to be ordered + * @param ascending direction of sort + * @param firstResult starting point of first result in set + * @param maxResults total number we want returned for display in table + * @param search string of criteria to be matched to visible columns + * + * @return FilteredRecordsList object with fields for DataTables + */ + @Override + public final FilteredRecordsList getOrderedDigestValueList( + final String columnToOrder, + final boolean ascending, final int firstResult, + final int maxResults, final String search) { + if (columnToOrder == null) { + LOGGER.debug("null object argument"); + throw new NullPointerException("object"); + } + + //Maps object types and their ability to be searched by Hibernate + //without modification + Map searchableColumns = new HashMap<>(); + searchableColumns.put("name", true); + searchableColumns.put("group.name", true); + searchableColumns.put("last_report_timestamp", false); + + CriteriaModifier modifier = new CriteriaModifier() { + @Override + public void modify(final Criteria criteria) { + criteria.createAlias("valueGroup", "group"); + } + }; + + try { + LOGGER.debug("Getting baseline list"); + return super.getOrderedList(ReferenceDigestValue.class, columnToOrder, ascending, + firstResult, + maxResults, search, searchableColumns, modifier); + } catch (DBManagerException e) { + throw new AlertManagerException(e); + } + } + @Override public void updateRecord(final ReferenceDigestValue referenceDigestValue) { try { diff --git a/HIRS_Utils/src/main/java/hirs/persist/ReferenceEventManager.java b/HIRS_Utils/src/main/java/hirs/persist/ReferenceEventManager.java index 89c02ebc..7d3dd6bb 100644 --- a/HIRS_Utils/src/main/java/hirs/persist/ReferenceEventManager.java +++ b/HIRS_Utils/src/main/java/hirs/persist/ReferenceEventManager.java @@ -1,7 +1,9 @@ package hirs.persist; +import hirs.FilteredRecordsList; import hirs.data.persist.ReferenceDigestRecord; import hirs.data.persist.ReferenceDigestValue; +import hirs.data.persist.ReferenceManifest; import java.util.List; @@ -9,7 +11,7 @@ import java.util.List; * This class facilitates the persistence of {@link hirs.data.persist.ReferenceDigestValue}s * including storage, retrieval, and deletion. */ -public interface ReferenceEventManager { +public interface ReferenceEventManager extends OrderedListQuerier { /** * Persists a new Reference Digest value. * @@ -34,6 +36,31 @@ public interface ReferenceEventManager { */ ReferenceDigestValue getValueById(ReferenceDigestValue referenceDigestValue); + /** + * Persists a new Reference Digest Value. + * + * @param manufacturer the string value to search for + * @return the persisted ReferenceDigestValue + */ + List getValueByManufacturer(String manufacturer); + + /** + * Persists a new Reference Digest. + * + * @param model the string value to search for + * @return the persisted ReferenceDigestValue + */ + List getValueByModel(String model); + + /** + * Persists a new Reference Digest. + * + * @param manufacturer the string value to search for + * @param model the string value to search for + * @return the persisted ReferenceDigestValue + */ + List getValueByManufacturerModel(String manufacturer, String model); + /** * Persists a new Reference Digest value. * @@ -42,6 +69,14 @@ public interface ReferenceEventManager { */ List getValuesByRecordId(ReferenceDigestRecord referenceDigestRecord); + /** + * Persists a new Reference Digest value. + * + * @param referenceManifest the referenceManifest + * @return the persisted list of ReferenceDigestValue + */ + List getValuesByRimId(ReferenceManifest referenceManifest); + /** * Persists a new Reference Digest value. * @@ -50,6 +85,23 @@ public interface ReferenceEventManager { */ List getValueByEventType(String eventType); + /** + * Returns a list of all ReferenceDigestValues that are ordered by a column + * and direction (ASC, DESC) that is provided by the user. This method + * helps support the server-side processing in the JQuery DataTables. + * + * @param columnToOrder Column to be ordered + * @param ascending direction of sort + * @param firstResult starting point of first result in set + * @param maxResults total number we want returned for display in table + * @param search string of criteria to be matched to visible columns + * + * @return FilteredRecordsList object with fields for DataTables + */ + FilteredRecordsList getOrderedDigestValueList( + String columnToOrder, boolean ascending, int firstResult, + int maxResults, String search); + /** * Updates an existing ReferenceDigestRecord. * @param referenceDigestValue the Reference Event update