diff --git a/HIRS_AttestationCAPortal/build.gradle b/HIRS_AttestationCAPortal/build.gradle index fbab9a60..33086c38 100644 --- a/HIRS_AttestationCAPortal/build.gradle +++ b/HIRS_AttestationCAPortal/build.gradle @@ -25,6 +25,9 @@ repositories { } dependencies { + jaxb "org.glassfish.jaxb:jaxb-xjc:4.0.1" + jaxb "org.glassfish.jaxb:jaxb-runtime:4.0.1" + implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' @@ -34,8 +37,15 @@ dependencies { implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl:3.0.0' implementation 'org.apache.httpcomponents.client5:httpclient5:5.2.1' implementation 'commons-codec:commons-codec:1.15' + implementation 'org.apache.commons:commons-lang3:3.12.0' implementation 'org.apache.logging.log4j:log4j-core:2.19.0' implementation 'org.apache.logging.log4j:log4j-api:2.19.0' + implementation 'com.eclipsesource.minimal-json:minimal-json:0.9.5' + implementation 'com.fasterxml.jackson.core:jackson-core:2.14.2' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.14.2' + implementation "org.glassfish.jaxb:jaxb-runtime:4.0.1" + implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0' + implementation 'com.sun.xml.bind:jaxb-impl:4.0.2' compileOnly 'org.projectlombok:lombok' runtimeOnly 'org.mariadb.jdbc:mariadb-java-client' annotationProcessor 'org.projectlombok:lombok' @@ -52,6 +62,13 @@ war { archiveFileName = 'HIRS_AttestationCAPortal.war' } +task generateXjcLibrary(type:Exec) { + workingDir 'config' + + commandLine './genXjcLibrary.sh' +} +compileJava.dependsOn generateXjcLibrary + //ospackage { // packageName = 'HIRS_AttestationCA' // os = LINUX diff --git a/HIRS_AttestationCAPortal/config/genJavaProtoBuf.sh b/HIRS_AttestationCAPortal/config/genJavaProtoBuf.sh new file mode 100755 index 00000000..53691217 --- /dev/null +++ b/HIRS_AttestationCAPortal/config/genJavaProtoBuf.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Script to generate protobuf Java code. Called by gradle to compile the +# protobuf spec file to Java source. Generates the file +# hirs/attestationca/configuration/provisionerTpm2/ProvisionerTpm2.java. + +dir=$(pwd) +# Relative paths are different when building locally versus on CI +if [[ "$dir" == *"package"* ]]; then + SRC_DIR=$dir/../../../../../../HIRS_ProvisionerTPM2/src + DEST_DIR=$dir/../src/main/java +else + SRC_DIR=../../HIRS_ProvisionerTPM2/src + DEST_DIR=../src/main/java +fi +protoc -I=$SRC_DIR --java_out=$DEST_DIR $SRC_DIR/ProvisionerTpm2.proto diff --git a/HIRS_AttestationCAPortal/config/genXjcLibrary.sh b/HIRS_AttestationCAPortal/config/genXjcLibrary.sh new file mode 100755 index 00000000..3074119b --- /dev/null +++ b/HIRS_AttestationCAPortal/config/genXjcLibrary.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +dir=$(pwd) +# Relative paths are different when building locally versus on CI +#if [[ "$dir" == *"package"* ]]; then +# SRC_DIR=$dir/../../../../../../src +# DEST_DIR=$dir/../src/main/java/ +#else + SRC_DIR=/hirs/HIRS/src/ + DEST_DIR=/hirs/HIRS/src/main/java #/hirs/attestationca/portal +#fi + +XSD_FILE=$SRC_DIR/main/resources/swid_schema.xsd + +if [ ! -d "$DEST_DIR/hirs/attestationca/portal/utils/xjc" ]; then + xjc -p hirs.attestationca.portal.utils.xjc $XSD_FILE -d $DEST_DIR -quiet +fi \ No newline at end of file diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/manager/ReferenceManifestRepository.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/manager/ReferenceManifestRepository.java new file mode 100644 index 00000000..0c8e0f34 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/manager/ReferenceManifestRepository.java @@ -0,0 +1,9 @@ +package hirs.attestationca.portal.entity.manager; + +import hirs.attestationca.portal.entity.userdefined.ReferenceManifest; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface ReferenceManifestRepository extends JpaRepository { +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/ReferenceDigestValue.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/ReferenceDigestValue.java new file mode 100644 index 00000000..ca1a7be1 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/ReferenceDigestValue.java @@ -0,0 +1,72 @@ +package hirs.attestationca.portal.entity.userdefined; + +import hirs.attestationca.portal.entity.ArchivableEntity; +import jakarta.persistence.Access; +import jakarta.persistence.AccessType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.hibernate.annotations.JdbcTypeCode; + +import java.util.UUID; + +/** + * This class represents that actual entry in the Support RIM. + * Digest Value, Event Type, index, RIM Tagid + */ +@ToString @EqualsAndHashCode(callSuper = false) +@Setter @Getter +@Entity +@Table(name = "ReferenceDigestValue") +@Access(AccessType.FIELD) +public class ReferenceDigestValue extends ArchivableEntity { + +// @Type(type = "uuid-char") + @JdbcTypeCode(java.sql.Types.VARCHAR) + @Column + private UUID baseRimId; +// @Type(type = "uuid-char") + @JdbcTypeCode(java.sql.Types.VARCHAR) + @Column + private UUID supportRimId; + @Column(nullable = false) + private String manufacturer; + @Column(nullable = false) + private String model; + @Column(nullable = false) + private int pcrIndex; + @Column(nullable = false) + private String digestValue; + @Column(nullable = false) + private String eventType; + @Column(columnDefinition = "blob", nullable = true) + private byte[] contentBlob; + @Column(nullable = false) + private boolean matchFail; + @Column(nullable = false) + private boolean patched = false; + @Column(nullable = false) + private boolean updated = false; + + /** + * Default constructor necessary for Hibernate. + */ + protected ReferenceDigestValue() { + super(); + this.baseRimId = null; + this.supportRimId = null; + this.manufacturer = ""; + this.model = ""; + this.pcrIndex = -1; + this.digestValue = ""; + this.eventType = ""; + this.matchFail = false; + this.patched = false; + this.updated = false; + this.contentBlob = null; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/ReferenceManifest.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/ReferenceManifest.java new file mode 100644 index 00000000..b1027412 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/ReferenceManifest.java @@ -0,0 +1,157 @@ +package hirs.attestationca.portal.entity.userdefined; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.google.common.base.Preconditions; +import hirs.attestationca.portal.entity.ArchivableEntity; +import jakarta.persistence.Access; +import jakarta.persistence.AccessType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.apache.commons.codec.binary.Hex; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.annotations.JdbcTypeCode; + +import javax.xml.XMLConstants; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.UUID; + +/** + * This class represents the Reference Integrity Manifest object that will be + * loaded into the DB and displayed in the ACA. + */ +@Getter @Setter @ToString +@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) +@Entity +@Table(name = "ReferenceManifest") +@Access(AccessType.FIELD) +public class ReferenceManifest extends ArchivableEntity { + + private static final Logger LOGGER = LogManager.getLogger(ReferenceManifest.class); + /** + * Holds the name of the 'hexDecHash' field. + */ + public static final String HEX_DEC_HASH_FIELD = "hexDecHash"; + /** + * String for display of a Base RIM. + */ + public static final String BASE_RIM = "Base"; + /** + * String for display of a Support RIM. + */ + public static final String SUPPORT_RIM = "Support"; + /** + * String for display of a Support RIM. + */ + public static final String MEASUREMENT_RIM = "Measurement"; + + /** + * String for the xml schema ios standard. + */ + public static final String SCHEMA_STATEMENT = "ISO/IEC 19770-2:2015 Schema (XSD 1.0) " + + "- September 2015, see http://standards.iso.org/iso/19770/-2/2015/schema.xsd"; + /** + * String for the xml schema URL file name. + */ + public static final String SCHEMA_URL = "swid_schema.xsd"; + /** + * String for the language type for the xml schema. + */ + public static final String SCHEMA_LANGUAGE = XMLConstants.W3C_XML_SCHEMA_NS_URI; + /** + * String for the package location of the xml generated java files. + */ + public static final String SCHEMA_PACKAGE = "hirs.utils.xjc"; + + @EqualsAndHashCode.Include + @Column(columnDefinition = "mediumblob", nullable = false) + private byte[] rimBytes; + @EqualsAndHashCode.Include + @Column(nullable = false) + private String rimType = "Base"; + @Column + private String tagId = null; + @Column + private boolean swidPatch = false; + @Column + private boolean swidSupplemental = false; + @Column + private String platformManufacturer = null; + @Column + private String platformManufacturerId = null; + @Column + private String swidTagVersion = null; + @Column + private String swidVersion = null; + @Column + private String platformModel = null; + @Column(nullable = false) + private String fileName = null; +// @Type(type="uuid-char") + @JdbcTypeCode(java.sql.Types.VARCHAR) + @Column + private UUID associatedRim; + @Column + private String deviceName; + @Column + private String hexDecHash = ""; + @Column + private String eventLogHash = ""; + + /** + * Default constructor necessary for Hibernate. + */ + protected ReferenceManifest() { + super(); + this.rimBytes = null; + this.rimType = null; + this.platformManufacturer = null; + this.platformManufacturerId = null; + this.platformModel = null; + this.fileName = BASE_RIM; + this.tagId = null; + this.associatedRim = null; + } + + /** + * Default constructor for ingesting the bytes of the file content. + * @param rimBytes - file contents. + */ + public ReferenceManifest(final byte[] rimBytes) { + Preconditions.checkArgument(rimBytes != null, + "Cannot construct a RIM from a null byte array"); + + Preconditions.checkArgument(rimBytes.length > 0, + "Cannot construct a RIM from an empty byte array"); + + this.rimBytes = rimBytes.clone(); + MessageDigest digest = null; + this.hexDecHash = ""; + try { + digest = MessageDigest.getInstance("SHA-256"); + this.hexDecHash = Hex.encodeHexString( + digest.digest(rimBytes)); + } catch (NoSuchAlgorithmException noSaEx) { + LOGGER.error(noSaEx); + } + } + + /** + * Getter for the Reference Integrity Manifest as a byte array. + * + * @return array of bytes + */ + @JsonIgnore + public byte[] getRimBytes() { + if (this.rimBytes != null) { + return this.rimBytes.clone(); + } + return null; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/rim/BaseReferenceManifest.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/rim/BaseReferenceManifest.java new file mode 100644 index 00000000..27656ad4 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/rim/BaseReferenceManifest.java @@ -0,0 +1,390 @@ +package hirs.attestationca.portal.entity.userdefined.rim; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import hirs.attestationca.portal.entity.userdefined.ReferenceManifest; +import hirs.attestationca.portal.service.ReferenceManifestServiceImpl; +import hirs.attestationca.portal.utils.SwidResource; +import hirs.attestationca.portal.utils.xjc.BaseElement; +import hirs.attestationca.portal.utils.xjc.Directory; +import hirs.attestationca.portal.utils.xjc.File; +import hirs.attestationca.portal.utils.xjc.FilesystemItem; +import hirs.attestationca.portal.utils.xjc.Link; +import hirs.attestationca.portal.utils.xjc.Meta; +import hirs.attestationca.portal.utils.xjc.ResourceCollection; +import hirs.attestationca.portal.utils.xjc.SoftwareIdentity; +import hirs.attestationca.portal.utils.xjc.SoftwareMeta; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.UnmarshalException; +import jakarta.xml.bind.Unmarshaller; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import javax.xml.namespace.QName; +import javax.xml.validation.Schema; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; +import java.util.Map; + +/** + * + */ +@Getter +@Setter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class BaseReferenceManifest extends ReferenceManifest { + + private static final Logger LOGGER = LogManager.getLogger(BaseReferenceManifest.class); + /** + * Holds the name of the 'base64Hash' field. + */ + public static final String BASE_64_HASH_FIELD = "base64Hash"; + + private static JAXBContext jaxbContext; + + @Column + @JsonIgnore + private String base64Hash = ""; + @Column + private String swidName = null; + @Column + private int swidCorpus = 0; + @Column + private String colloquialVersion = null; + @Column + private String product = null; + @Column + private String revision = null; + @Column + private String edition = null; + @Column + private String rimLinkHash = null; + @Column + private String bindingSpec = null; + @Column + private String bindingSpecVersion = null; + @Column + private String platformVersion = null; + @Column + private String payloadType = null; + @Column + private String pcURIGlobal = null; + @Column + private String pcURILocal = null; + + private String entityName = null; + private String entityRegId = null; + private String entityRole = null; + private String entityThumbprint = null; + private String linkHref = null; + private String linkRel = null; + + /** + * Support constructor for the RIM object. + * + * @param fileName - string representation of the uploaded file. + * @param rimBytes - the file content of the uploaded file. + * @throws IOException - thrown if the file is invalid. + */ + public BaseReferenceManifest(final String fileName, final byte[] rimBytes) throws IOException { + this(rimBytes); + this.setFileName(fileName); + } + + /** + * Main constructor for the RIM object. This takes in a byte array of a + * valid swidtag file and parses the information. + * + * @param rimBytes byte array representation of the RIM + * @throws IOException if unable to unmarshal the string + */ + @SuppressWarnings("checkstyle:AvoidInlineConditionals") + public BaseReferenceManifest(final byte[] rimBytes) throws IOException { + super(rimBytes); + this.setRimType(BASE_RIM); + this.setFileName(""); + SoftwareIdentity si = validateSwidTag(new ByteArrayInputStream(rimBytes)); + + MessageDigest digest = null; + this.base64Hash = ""; + try { + digest = MessageDigest.getInstance("SHA-256"); + this.base64Hash = Base64.getEncoder().encodeToString( + digest.digest(rimBytes)); + } catch (NoSuchAlgorithmException noSaEx) { + LOGGER.error(noSaEx); + } + + // begin parsing valid swid tag + if (si != null) { + setTagId(si.getTagId()); + this.swidName = si.getName(); + this.swidCorpus = si.isCorpus() ? 1 : 0; + this.setSwidPatch(si.isPatch()); + this.setSwidSupplemental(si.isSupplemental()); + this.setSwidVersion(si.getVersion()); + if (si.getTagVersion() != null) { + this.setSwidTagVersion(si.getTagVersion().toString()); + } + + for (Object object : si.getEntityOrEvidenceOrLink()) { + if (object instanceof JAXBElement) { + JAXBElement element = (JAXBElement) object; + String elementName = element.getName().getLocalPart(); + switch (elementName) { + case "Meta": + parseSoftwareMeta((SoftwareMeta) element.getValue()); + break; + case "Entity": + hirs.attestationca.portal.utils.xjc.Entity entity + = (hirs.attestationca.portal.utils.xjc.Entity) element.getValue(); + if (entity != null) { + this.entityName = entity.getName(); + this.entityRegId = entity.getRegid(); + StringBuilder sb = new StringBuilder(); + for (String role : entity.getRole()) { + sb.append(String.format("%s%n", role)); + } + this.entityRole = sb.toString(); + this.entityThumbprint = entity.getThumbprint(); + } + break; + case "Link": + Link link + = (Link) element.getValue(); + if (link != null) { + this.linkHref = link.getHref(); + this.linkRel = link.getRel(); + } + break; + case "Payload": + parseResource((ResourceCollection) element.getValue()); + break; + case "Signature": + // left blank for a followup issue enhancement + default: + } + } + } + } + } + + /** + * This is a helper method that parses the SoftwareMeta tag and stores the + * information in the class fields. + * + * @param softwareMeta The object to parse. + */ + private void parseSoftwareMeta(final SoftwareMeta softwareMeta) { + if (softwareMeta != null) { + for (Map.Entry entry + : softwareMeta.getOtherAttributes().entrySet()) { + switch (entry.getKey().getLocalPart()) { + case "colloquialVersion": + this.colloquialVersion = entry.getValue(); + break; + case "product": + this.product = entry.getValue(); + break; + case "revision": + this.revision = entry.getValue(); + break; + case "edition": + this.edition = entry.getValue(); + break; + case "rimLinkHash": + this.rimLinkHash = entry.getValue(); + break; + case "bindingSpec": + this.bindingSpec = entry.getValue(); + break; + case "bindingSpecVersion": + this.bindingSpecVersion = entry.getValue(); + break; + case "platformManufacturerId": + this.setPlatformManufacturerId(entry.getValue()); + break; + case "platformModel": + this.setPlatformModel(entry.getValue()); + break; + case "platformManufacturerStr": + this.setPlatformManufacturer(entry.getValue()); + break; + case "platformVersion": + this.platformVersion = entry.getValue(); + break; + case "payloadType": + this.payloadType = entry.getValue(); + break; + case "pcURIGlobal": + this.pcURIGlobal = entry.getValue(); + break; + case "pcURILocal": + this.pcURILocal = entry.getValue(); + break; + default: + } + } + } + } + + /** + * This method and code is pulled and adopted from the TCG Tool. Since this + * is taking in an file stored in memory through http, this was changed from + * a file to a stream as the input. + * + * @param fileStream stream of the swidtag file. + * @return a {@link SoftwareIdentity} object + * @throws IOException Thrown by the unmarhsallSwidTag method. + */ + private SoftwareIdentity validateSwidTag(final InputStream fileStream) throws IOException { + JAXBElement jaxbe = unmarshallSwidTag(fileStream); + SoftwareIdentity swidTag = (SoftwareIdentity) jaxbe.getValue(); + + LOGGER.info(String.format("SWID Tag found: %nname: %s;%ntagId: %s%n%s", + swidTag.getName(), swidTag.getTagId(), SCHEMA_STATEMENT)); + return swidTag; + } + + /** + * Helper method that is used to parse a specific element of the SwidTag + * based on an already established and stored byte array. + * + * @param elementName string of an xml tag in the file. + * @return the object value of the element, if it exists + */ + private BaseElement getBaseElementFromBytes(final String elementName) { + BaseElement baseElement = null; + + if (getRimBytes() != null && elementName != null) { + try { + SoftwareIdentity si = validateSwidTag(new ByteArrayInputStream(getRimBytes())); + JAXBElement element; + for (Object object : si.getEntityOrEvidenceOrLink()) { + if (object instanceof JAXBElement) { + element = (JAXBElement) object; + if (element.getName().getLocalPart().equals(elementName)) { + // found the element + baseElement = (BaseElement) element.getValue(); + } + } + } + + } catch (IOException ioEx) { + LOGGER.error("Failed to parse Swid Tag bytes.", ioEx); + } + } + + return baseElement; + } + + /** + * This method unmarshalls the swidtag found at [path] and validates it + * according to the schema. + * + * @param stream to the input swidtag + * @return the SoftwareIdentity element at the root of the swidtag + * @throws IOException if the swidtag cannot be unmarshalled or validated + */ + private JAXBElement unmarshallSwidTag(final InputStream stream) throws IOException { + JAXBElement jaxbe = null; + Schema schema; + + try { + schema = ReferenceManifestServiceImpl.getSchemaObject(); + if (jaxbContext == null) { + jaxbContext = JAXBContext.newInstance(SCHEMA_PACKAGE); + } + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + unmarshaller.setSchema(schema); + jaxbe = (JAXBElement) unmarshaller.unmarshal(stream); + } catch (UnmarshalException umEx) { + LOGGER.error(String.format("Error validating swidtag file!%n%s%n%s", + umEx.getMessage(), umEx.toString())); + for (StackTraceElement ste : umEx.getStackTrace()) { + LOGGER.error(ste.toString()); + } + } catch (IllegalArgumentException iaEx) { + LOGGER.error("Input file empty."); + } catch (JAXBException jaxEx) { + for (StackTraceElement ste : jaxEx.getStackTrace()) { + LOGGER.error(ste.toString()); + } + } + + if (jaxbe != null) { + return jaxbe; + } else { + throw new IOException("Invalid Base RIM, swidtag format expected."); + } + } + + /** + * Default method for parsing the payload element. + * + * @return a collection of payload objects. + */ + public final List parseResource() { + return parseResource((ResourceCollection) this.getBaseElementFromBytes("Payload")); + } + + /** + * This method parses the payload method of a {@link ResourceCollection}. + * + * @param rc Resource Collection object. + * @return a collection of payload objects. + */ + public final List parseResource(final ResourceCollection rc) { + List resources = new ArrayList<>(); + + try { + if (rc != null) { + for (Meta meta : rc.getDirectoryOrFileOrProcess()) { + if (meta != null) { + if (meta instanceof Directory) { + Directory directory = (Directory) meta; + for (FilesystemItem fsi : directory.getDirectoryOrFile()) { + if (fsi != null) { + resources.add(new SwidResource( + (File) fsi, null)); + } + } + } else if (meta instanceof File) { + resources.add(new SwidResource((File) meta, null)); + } + } + } + } + } catch (ClassCastException ccEx) { + LOGGER.error(ccEx); + LOGGER.error("At this time, the code does not support the " + + "particular formatting of this SwidTag's Payload."); + } + + return resources; + } + + @Override + public String toString() { + return String.format("ReferenceManifest{swidName=%s," + + "platformManufacturer=%s," + + " platformModel=%s," + + "tagId=%s, rimHash=%s}", + swidName, this.getPlatformManufacturer(), + this.getPlatformModel(), getTagId(), this.getBase64Hash()); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/rim/EventLogMeasurements.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/rim/EventLogMeasurements.java new file mode 100644 index 00000000..de762ccb --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/rim/EventLogMeasurements.java @@ -0,0 +1,67 @@ +package hirs.attestationca.portal.entity.userdefined.rim; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import hirs.attestationca.portal.entity.userdefined.ReferenceManifest; +import hirs.attestationca.portal.enums.AppraisalStatus; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import lombok.Getter; +import lombok.Setter; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; + +/** + * Sub class that will just focus on PCR Values and Events. + * Similar to {@link hirs.attestationca.portal.entity.userdefined.rim.SupportReferenceManifest} + * however this is the live log from the client. + */ +@Entity +public class EventLogMeasurements extends ReferenceManifest { + + private static final Logger LOGGER = LogManager.getLogger(EventLogMeasurements.class); + + @Column + @JsonIgnore + @Getter @Setter + private int pcrHash = 0; + @Enumerated(EnumType.STRING) + @Getter @Setter + private AppraisalStatus.Status overallValidationResult = AppraisalStatus.Status.FAIL; + + /** + * Support constructor for the RIM object. + * + * @param rimBytes byte array representation of the RIM + * @throws java.io.IOException if unable to unmarshal the string + */ + public EventLogMeasurements(final byte[] rimBytes) throws IOException { + this("blank.measurement", rimBytes); + } + /** + * Support constructor for the RIM object. + * + * @param fileName - string representation of the uploaded file. + * @param rimBytes byte array representation of the RIM + * @throws java.io.IOException if unable to unmarshal the string + */ + public EventLogMeasurements(final String fileName, + final byte[] rimBytes) throws IOException { + super(rimBytes); + this.setFileName(fileName); + this.archive("Event Log Measurement"); + this.setRimType(MEASUREMENT_RIM); + this.pcrHash = 0; + } + + /** + * Default constructor necessary for Hibernate. + */ + protected EventLogMeasurements() { + super(); + this.pcrHash = 0; + } +} \ No newline at end of file diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/rim/SupportReferenceManifest.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/rim/SupportReferenceManifest.java new file mode 100644 index 00000000..17b18147 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/entity/userdefined/rim/SupportReferenceManifest.java @@ -0,0 +1,115 @@ +package hirs.attestationca.portal.entity.userdefined.rim; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import hirs.attestationca.portal.entity.userdefined.ReferenceManifest; +import hirs.attestationca.portal.utils.tpm.eventlog.TCGEventLog; +import hirs.attestationca.portal.utils.tpm.eventlog.TpmPcrEvent; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import lombok.Getter; +import lombok.Setter; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; + +/** + * Sub class that will just focus on PCR Values and Events. + */ +@Getter +@Setter +@Entity +public class SupportReferenceManifest extends ReferenceManifest { + + private static final Logger LOGGER = LogManager.getLogger(SupportReferenceManifest.class); + @Column + @JsonIgnore + private int pcrHash = 0; + @Column + private boolean updated = false; + @Column + private boolean processed = false; + + /** + * Main constructor for the RIM object. This takes in a byte array of a + * valid swidtag file and parses the information. + * + * @param fileName - string representation of the uploaded file. + * @param rimBytes byte array representation of the RIM + * @throws IOException if unable to unmarshal the string + */ + public SupportReferenceManifest(final String fileName, + final byte[] rimBytes) throws IOException { + super(rimBytes); + this.setFileName(fileName); + this.setRimType(SUPPORT_RIM); + this.pcrHash = 0; + } + + /** + * Main constructor for the RIM object. This takes in a byte array of a + * valid swidtag file and parses the information. + * + * @param rimBytes byte array representation of the RIM + * @throws IOException if unable to unmarshal the string + */ + public SupportReferenceManifest(final byte[] rimBytes) throws IOException { + this("blank.rimel", rimBytes); + } + + /** + * Default constructor necessary for Hibernate. + */ + protected SupportReferenceManifest() { + super(); + this.pcrHash = 0; + } + + + /** + * Getter method for the expected PCR values contained within the support + * RIM. + * @return a string array of the pcr values. + */ + public String[] getExpectedPCRList() { + try { + TCGEventLog logProcessor = new TCGEventLog(this.getRimBytes()); + this.pcrHash = Arrays.hashCode(logProcessor.getExpectedPCRValues()); + return logProcessor.getExpectedPCRValues(); + } catch (CertificateException cEx) { + LOGGER.error(cEx); + } catch (NoSuchAlgorithmException noSaEx) { + LOGGER.error(noSaEx); + } catch (IOException ioEx) { + LOGGER.error(ioEx); + } + + return new String[0]; + } + + /** + * Getter method for the event log that should be present in the support RIM. + * + * @return list of TPM PCR Events for display + */ + public Collection getEventLog() { + TCGEventLog logProcessor = null; + try { + logProcessor = new TCGEventLog(this.getRimBytes()); + return logProcessor.getEventList(); + } catch (CertificateException cEx) { + LOGGER.error(cEx); + } catch (NoSuchAlgorithmException noSaEx) { + LOGGER.error(noSaEx); + } catch (IOException ioEx) { + LOGGER.error(ioEx); + } + + return new ArrayList<>(); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/service/ReferenceManifestServiceImpl.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/service/ReferenceManifestServiceImpl.java new file mode 100644 index 00000000..914ad641 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/service/ReferenceManifestServiceImpl.java @@ -0,0 +1,71 @@ +package hirs.attestationca.portal.service; + +import hirs.attestationca.portal.entity.manager.ReferenceManifestRepository; +import hirs.attestationca.portal.entity.userdefined.ReferenceManifest; +import jakarta.persistence.EntityManager; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.xml.sax.SAXException; + +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import java.io.IOException; +import java.io.InputStream; + +@Service +public class ReferenceManifestServiceImpl { + + private static final Logger LOGGER = LogManager.getLogger(ReferenceManifestServiceImpl.class); + /** + * The variable that establishes a schema factory for xml processing. + */ + public static final SchemaFactory SCHEMA_FACTORY + = SchemaFactory.newInstance(ReferenceManifest.SCHEMA_LANGUAGE); + + @Autowired(required = false) + private EntityManager entityManager; + + @Autowired + private ReferenceManifestRepository repository; + + private static Schema schema; + + public ReferenceManifestServiceImpl() { + getSchemaObject(); + } + + /** + * This method sets the xml schema for processing RIMs. + * + * @return the schema + */ + public static final Schema getSchemaObject() { + if (schema == null) { + InputStream is = null; + try { + is = ReferenceManifest.class + .getClassLoader() + .getResourceAsStream(ReferenceManifest.SCHEMA_URL); + schema = SCHEMA_FACTORY.newSchema(new StreamSource(is)); + } catch (SAXException saxEx) { + LOGGER.error(String.format("Error setting schema for validation!%n%s", + saxEx.getMessage())); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException ioEx) { + LOGGER.error(String.format("Error closing input stream%n%s", + ioEx.getMessage())); + } + } else { + LOGGER.error("Input stream variable is null"); + } + } + } + return schema; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/HexUtils.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/HexUtils.java new file mode 100644 index 00000000..d1f9e664 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/HexUtils.java @@ -0,0 +1,115 @@ +package hirs.attestationca.portal.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.math.BigInteger; + +/** + * Utilities for working with hex strings and byte arrays. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class HexUtils { + + /** + * The mathematical base for the hexadecimal representation. + */ + public static final int HEX_BASIS = 16; + + /** + * An integer representation of the byte 0xff or 255. + */ + public static final int FF_BYTE = 0xff; + + /** + * Converts a binary hex string to a byte array. + * @param s string to convert + * @return byte array representation of s + */ + public static byte[] hexStringToByteArray(final String s) { + int sizeInt = s.length() / 2; + byte[] returnArray = new byte[sizeInt]; + String byteVal; + for (int i = 0; i < sizeInt; i++) { + int index = 2 * i; + byteVal = s.substring(index, index + 2); + returnArray[i] = (byte) (Integer.parseInt(byteVal, HEX_BASIS)); + } + return returnArray; + } + + /** + * Converts a byte array to a hex represented binary string. + * @param b byte array to convert + * @return hex string representation of array + */ + public static String byteArrayToHexString(final byte[] b) { + StringBuilder sb = new StringBuilder(); + String returnStr = ""; + for (int i = 0; i < b.length; i++) { + String singleByte = Integer.toHexString(b[i] & FF_BYTE); + if (singleByte.length() != 2) { + singleByte = "0" + singleByte; + } + returnStr = sb.append(singleByte).toString(); + } + return returnStr; + } + + /** + * Converts an individual hex string to an integer. + * @param s an individual hex string + * @return an integer representation of a hex string + */ + public static Integer hexToInt(final String s) { + Integer i = Integer.parseInt(s, HEX_BASIS); + return i; + } + + /** + * Takes a byte array returns a subset of the array. + * @param b the array to take a subset of + * @param start the first index to copy + * @param end the last index to copy (inclusive) + * @return a new array of bytes from start to end + */ + public static byte[] subarray(final byte[] b, final int start, final int end) { + byte[] copy = new byte[end - start + 1]; + System.arraycopy(b, start, copy, 0, end - start + 1); + return copy; + } + + /** + * Takes in a byte array and reverses the order. + * @param in byte array to reverse + * @return reversed byte array + */ + public static byte[] leReverseByte(final byte[] in) { + byte[] finished = new byte[in.length]; + for (int i = 0; i < finished.length; i++) { + finished[i] = in[(in.length - 1) - i]; + } + return finished; + } + + /** + * Takes in a byte array and reverses the order then converts to an int. + * @param in byte array to reverse + * @return integer that represents the reversed byte array + */ + public static int leReverseInt(final byte[] in) { + byte[] finished = leReverseByte(in); + return new BigInteger(finished).intValue(); + } + + /** + * Takes in a byte array of 4 bytes and returns a long. + * @param bytes byte array to convert + * @return long representation of the bytes + */ + public static long bytesToLong(final byte[] bytes) { + BigInteger lValue = new BigInteger(bytes); + + return lValue.abs().longValue(); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/JsonUtils.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/JsonUtils.java new file mode 100644 index 00000000..babe300b --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/JsonUtils.java @@ -0,0 +1,102 @@ +package hirs.attestationca.portal.utils; + +import com.eclipsesource.json.Json; +import com.eclipsesource.json.JsonObject; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * A utility class for common JSON operations using the {@link com.eclipsesource} + * library. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class JsonUtils { + + private static final Logger LOGGER = LoggerFactory.getLogger(JsonUtils.class); + + /** + * Getter for the JSON Object that is associated with the elementName value + * mapped in the associated JSON file. + * Default {@link java.nio.charset.Charset} is UTF 8 + * + * @param jsonPath the object holding the location of the file to parse. + * @param elementName the specific object to pull from the file + * @return a JSON object + */ + public static JsonObject getSpecificJsonObject(final Path jsonPath, final String elementName) { + // find the file and load it + return getSpecificJsonObject(jsonPath, elementName, StandardCharsets.UTF_8); + } + + /** + * Getter for the JSON Object that is associated with the elementName value + * mapped in the associated JSON file. + * Default {@link java.nio.charset.Charset} is UTF 8 + * + * @param jsonPath the object holding the location of the file to parse. + * @param elementName the specific object to pull from the file + * @param charset the character set to use + * @return a JSON object + */ + public static JsonObject getSpecificJsonObject(final Path jsonPath, + final String elementName, + final Charset charset) { + // find the file and load it + JsonObject jsonObject = getJsonObject(jsonPath, charset); + + if (jsonObject != null && jsonObject.get(elementName) != null) { + return jsonObject.get(elementName).asObject(); + } + + return new JsonObject(); + } + + /** + * Getter for the JSON Object that is mapped in the associated JSON file. + * Default {@link java.nio.charset.Charset} is UTF 8 + * + * @param jsonPath the object holding the location of the file to parse. + * @return a JSON object + */ + public static JsonObject getJsonObject(final Path jsonPath) { + return getJsonObject(jsonPath, StandardCharsets.UTF_8); + } + + /** + * Getter for the JSON Object that is mapped in the associated JSON file. + * + * @param jsonPath the object holding the location of the file to parse. + * @param charset the character set to use + * @return a JSON object + */ + public static JsonObject getJsonObject(final Path jsonPath, final Charset charset) { + // find the file and load it + JsonObject jsonObject = new JsonObject(); + + if (Files.notExists(jsonPath)) { + LOGGER.warn(String.format("No file found at %s.", jsonPath.toString())); + } else { + try { + InputStream inputStream = new FileInputStream(jsonPath.toString()); + jsonObject = Json.parse(new InputStreamReader(inputStream, + charset)).asObject(); + } catch (IOException ex) { + // add log file thing here indication issue with JSON File + jsonObject = new JsonObject(); + } + } + + return jsonObject; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/SwidResource.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/SwidResource.java new file mode 100644 index 00000000..55ed1140 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/SwidResource.java @@ -0,0 +1,146 @@ +package hirs.attestationca.portal.utils; + +import com.google.common.base.Preconditions; +import hirs.attestationca.portal.utils.digest.DigestAlgorithm; +import lombok.Getter; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import hirs.attestationca.portal.utils.xjc.File; +import javax.xml.namespace.QName; +import java.math.BigInteger; +import java.util.Map; + +/** + * This object is used to represent the content of a Swid Tags Directory + * section. + */ +public class SwidResource { + + private static final Logger LOGGER = LogManager.getLogger(SwidResource.class); + + @Getter + private String name, size; + @Getter + private String rimFormat, rimType, rimUriGlobal, hashValue; +// private TpmWhiteListBaseline tpmWhiteList; + private DigestAlgorithm digest = DigestAlgorithm.SHA1; + @Getter + private boolean validFileSize = false; + + /** + * Default constructor. + */ + public SwidResource() { + name = null; + size = null; + rimFormat = null; + rimType = null; + rimUriGlobal = null; + hashValue = null; + } + + /** + * The main constructor that processes a {@code hirs.utils.xjc.File}. + * + * @param file {@link File} + * @param digest algorithm associated with pcr values + */ + public SwidResource(final File file, final DigestAlgorithm digest) { + Preconditions.checkArgument(file != null, + "Cannot construct a RIM Resource from a null File object"); + + this.name = file.getName(); + // at this time, there is a possibility to get an object with + // no size even though it is required. + if (file.getSize() != null) { + this.size = file.getSize().toString(); + } else { + this.size = BigInteger.ZERO.toString(); + } + + for (Map.Entry entry + : file.getOtherAttributes().entrySet()) { + switch (entry.getKey().getLocalPart()) { + case "supportRIMFormat": + this.rimFormat = entry.getValue(); + break; + case "supportRIMType": + this.rimType = entry.getValue(); + break; + case "supportRIMURIGlobal": + this.rimUriGlobal = entry.getValue(); + break; + case "hash": + this.hashValue = entry.getValue(); + break; + default: + } + } + + this.digest = digest; +// tpmWhiteList = new TpmWhiteListBaseline(this.name); + } + + /** + * Getter for the file name. + * + * @return string of the file name + */ + public String getName() { + return name; + } + + /** + * Getter for the file size. + * + * @return string of the file size. + */ + public String getSize() { + return size; + } + + /** + * Getter for the RIM format for the resource. + * + * @return string of the format + */ + public String getRimFormat() { + return rimFormat; + } + + /** + * Getter for the RIM resource type. + * + * @return string of the resource type. + */ + public String getRimType() { + return rimType; + } + + /** + * Getter for the RIM Global URI. + * + * @return string of the URI + */ + public String getRimUriGlobal() { + return rimUriGlobal; + } + + /** + * Getter for the associated Hash of the file. + * + * @return string of the hash + */ + public String getHashValue() { + return hashValue; + } + + /** + * flag for if the file sizes match with the swidtag. + * @return true if they match + */ + public boolean isValidFileSize() { + return validFileSize; + } +} \ No newline at end of file diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/AbstractDigest.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/AbstractDigest.java new file mode 100644 index 00000000..f6d8d5e4 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/AbstractDigest.java @@ -0,0 +1,247 @@ +package hirs.attestationca.portal.utils.digest; + +import jakarta.xml.bind.DatatypeConverter; +import org.apache.commons.codec.binary.Hex; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.util.ArrayUtils; + +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * This abstract class represents a message digest. Extending classes include + * {@link hirs.attestationca.portal.utils.digest.Digest} and {@link hirs.attestationca.portal.utils.digest.OptionalDigest}. + *

+ * Two classes were made to facilitate persisting them with Hibernate in different ways. + * To persist non-nullable entries in an embedded collection, use {@link hirs.attestationca.portal.utils.digest.Digest} (see + * {@link TPMBaseline} for reference.) To persist nullable entries, use {@link hirs.attestationca.portal.utils.digest.OptionalDigest} + * (see {@link ImaBlacklistRecord} for reference.) + */ +public abstract class AbstractDigest { + private static final org.apache.logging.log4j.Logger LOGGER = + LogManager.getLogger(AbstractDigest.class); + /** + * Length of MD2 digest. + */ + public static final int MD2_DIGEST_LENGTH = 16; + /** + * Length of MD5 digest. + */ + public static final int MD5_DIGEST_LENGTH = 16; + /** + * Length of SHA1 digest. + */ + public static final int SHA1_DIGEST_LENGTH = 20; + /** + * Length of SHA256 digest. + */ + public static final int SHA256_DIGEST_LENGTH = 32; + /** + * Length of SHA384 digest. + */ + public static final int SHA384_DIGEST_LENGTH = 48; + /** + * Length of SHA512 digest. + */ + public static final int SHA512_DIGEST_LENGTH = 64; + + /** + * Ensures the given algorithm type and digest byte array represent a valid digest. + * This includes ensuring they are both not null or empty and ensuring that the length of the + * digest matches the expected amount of data for the given algorithm. + * + * @param algorithm a digest algorithm + * @param digest the digest computed by this algorithm + * @throws IllegalArgumentException if the provided input does not represent a valid digest + */ + void validateInput(final DigestAlgorithm algorithm, final byte[] digest) + throws IllegalArgumentException { + if (algorithm == null) { + throw new IllegalArgumentException("Algorithm must not be null"); + } + + if (ArrayUtils.isEmpty(digest)) { + throw new IllegalArgumentException("Digest must have at least one byte"); + } + + if (digest.length != algorithm.getLengthInBytes()) { + throw new AbstractDigest.IllegalDigestLength(algorithm, digest); + } + } + + /** + * This method will help class determine the algorithm associated with the + * pcr values given. + * + * @param digest list of pcr values. + * @return the associated algorithm. + */ + public static final DigestAlgorithm getDigestAlgorithm(final byte[] digest) { + if (digest == null || ArrayUtils.isEmpty(digest)) { + return DigestAlgorithm.UNSPECIFIED; + } + + switch (digest.length) { + case MD2_DIGEST_LENGTH: + return DigestAlgorithm.MD5; + case SHA1_DIGEST_LENGTH: + return DigestAlgorithm.SHA1; + case SHA256_DIGEST_LENGTH: + return DigestAlgorithm.SHA256; + case SHA384_DIGEST_LENGTH: + return DigestAlgorithm.SHA384; + case SHA512_DIGEST_LENGTH: + return DigestAlgorithm.SHA512; + default: + return DigestAlgorithm.UNSPECIFIED; + } + } + + /** + * This method will help class determine the algorithm associated with the + * pcr values given. + * + * @param digest list of pcr values. + * @return the associated algorithm. + */ + public static final DigestAlgorithm getDigestAlgorithm(final String digest) { + try { + return getDigestAlgorithm(Hex.decodeHex(digest.toCharArray())); + } catch (Exception deEx) { + LOGGER.error(deEx); + } + + return DigestAlgorithm.UNSPECIFIED; + } + + /** + * Retrieves the DigestAlgorithm that identifies which hash + * function generated the digest. + * + * @return digest algorithm + */ + public abstract DigestAlgorithm getAlgorithm(); + + /** + * Retrieves the digest. + * + * @return digest + */ + public abstract byte[] getDigest(); + + /** + * Returns a hex String representing the binary digest. + * + * @return hex representation of digest + */ + public String getDigestString() { + return Hex.encodeHexString(getDigest()); + } + + /** + * Compares this digest's hash with another digest's hash. + * @param otherDigest a Digest to compare to. + * @return the comparison result type. + */ + public DigestComparisonResultType compare(final Digest otherDigest) { + if (null == otherDigest) { + return DigestComparisonResultType.UNKNOWN; + } + + if (this.equals(otherDigest)) { + return DigestComparisonResultType.MATCH; + } + + return DigestComparisonResultType.MISMATCH; + } + + /** + * Parses a {@link DigestAlgorithm} from a String returned by {@link AbstractDigest#toString()}. + * + * @param digest the digest string as computed above + * @return the DigestAlgorithm component of the String + */ + static DigestAlgorithm algorithmFromString(final String digest) { + return DigestAlgorithm.findByString(matchString(digest).group(1)); + } + + /** + * Parses a digest from a String returned by {@link AbstractDigest#toString()}. + * + * @param digest the digest string as computed above + * @return the byte array representing the actual digest + */ + static byte[] digestFromString(final String digest) { + return DatatypeConverter.parseHexBinary(matchString(digest).group(2)); + } + + private static Matcher matchString(final String digest) { + Pattern digestPattern = Pattern.compile("(.*) - 0x(.*)"); + Matcher matcher = digestPattern.matcher(digest); + if (!matcher.matches()) { + String message = String.format("String \"%s\" did not match pattern \"%s\"", digest, + digestPattern.toString()); + throw new IllegalArgumentException(message); + } + return matcher; + } + + @Override + public final int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getAlgorithm().hashCode(); + result = prime * result + Arrays.hashCode(getDigest()); + return result; + } + + @Override + public final boolean equals(final Object obj) { + if (this == obj) { + return true; + } + + if (obj == null || !(obj instanceof AbstractDigest)) { + return false; + } + + AbstractDigest other = (AbstractDigest) obj; + + if (getAlgorithm() != other.getAlgorithm()) { + return false; + } + + if (!Arrays.equals(getDigest(), other.getDigest())) { + return false; + } + + return true; + } + + /** + * Returns the standard algorithm name and a hexadecimal representation of + * the bytes. + * + * @return string representation + */ + @Override + public String toString() { + //NOTE: Any updates here should also be reflected in fromString() + return String.format("%s - 0x%s", getAlgorithm().getStandardAlgorithmName(), + Hex.encodeHexString(getDigest())); + } + + private static final class IllegalDigestLength extends + IllegalArgumentException { + + private static final long serialVersionUID = 8782184397041237374L; + + private IllegalDigestLength(final DigestAlgorithm algorithm, + final byte[] digest) { + super(String.format( + "digest length (%d) does not match that of algorithm (%s)", + digest.length, algorithm.toString())); + } + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/Digest.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/Digest.java new file mode 100644 index 00000000..51d31e6d --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/Digest.java @@ -0,0 +1,136 @@ +package hirs.attestationca.portal.utils.digest; + +import jakarta.persistence.Access; +import jakarta.persistence.AccessType; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.xml.bind.annotation.XmlElement; +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; + +import java.util.Arrays; + +/** + * This class represents a message digest. This stores the bytes of a message + * digest as computed by a hash function. + *

+ * This class differs from Java's provided MessageDigest class by the + * fact that it does not compute a digest. This class simply stores the result + * of a digest. This is useful for scenarios where the digest is already known. + * This is the case for IMA reports that already have the digest computed. The + * MessageDigest class does not provide a means to store that value. + * The value must be computed. + */ +@Embeddable +@Access(AccessType.FIELD) +public final class Digest extends AbstractDigest { + /** + * A SHA1 digest whose content is all zeros. + */ + public static final Digest SHA1_ZERO = new Digest( + DigestAlgorithm.SHA1, + new byte[SHA1_DIGEST_LENGTH] + ); + + private static final String SHA1_EMPTY_HEX = + "da39a3ee5e6b4b0d3255bfef95601890afd80709"; + + /** + * A SHA1 digest whose content is the hash of an empty buffer. + */ + public static final Digest SHA1_OF_NO_DATA; + + static { + try { + SHA1_OF_NO_DATA = new Digest( + DigestAlgorithm.SHA1, + Hex.decodeHex(SHA1_EMPTY_HEX.toCharArray()) + ); + } catch (DecoderException e) { + throw new RuntimeException("Could not decode hex value", e); + } + } + + @XmlElement + @Column(nullable = false, name = "digest", length = SHA512_DIGEST_LENGTH, + columnDefinition = "varbinary(64)") + private final byte[] digest; + + @XmlElement + @Column(nullable = false) + @Enumerated(EnumType.ORDINAL) + private final DigestAlgorithm algorithm; + + /** + * Creates a new Digest. + * + * @param algorithm algorithm used to generate the digest + * @param digest digest value + * @throws IllegalArgumentException if digest length does not match that of the algorithm + */ + public Digest(final DigestAlgorithm algorithm, final byte[] digest) + throws IllegalArgumentException { + validateInput(algorithm, digest); + this.algorithm = algorithm; + this.digest = Arrays.copyOf(digest, digest.length); + } + + /** + * Creates a new Digest when an algorithm isn't specified. + * @param digest byte array value + */ + public Digest(final byte[] digest) { + this(AbstractDigest.getDigestAlgorithm(digest), digest); + } + + /** + * Default constructor necessary for Hibernate. + */ + protected Digest() { + this.algorithm = null; + this.digest = null; + } + + /** + * Retrieves the DigestAlgorithm that identifies which hash + * function generated the digest. + * + * @return digest algorithm + */ + @Override + public DigestAlgorithm getAlgorithm() { + return this.algorithm; + } + + /** + * Retrieves the digest. + * + * @return digest + */ + @Override + public byte[] getDigest() { + return Arrays.copyOf(this.digest, this.digest.length); + } + + /** + * Returns a new Digest with the same attributes as this instance. + * + * @return a new equivalent Digest + */ + public OptionalDigest asOptionalDigest() { + return new OptionalDigest(algorithm, digest); + } + + /** + * Helper method to reverse the toString method. Returns a Digest given a String + * that was created using an AbstractDigest's toString method. + * + * @param digest String representation of an AbstractDigest + * @return Digest object recreated from the String passed in + */ + public static Digest fromString(final String digest) { + return new Digest(algorithmFromString(digest), digestFromString(digest)); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/DigestAlgorithm.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/DigestAlgorithm.java new file mode 100644 index 00000000..bae0307a --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/DigestAlgorithm.java @@ -0,0 +1,66 @@ +package hirs.attestationca.portal.utils.digest; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Enum of digest algorithms. The enum values also provide a standardized + * algorithm name. The standardized algorithm name is a String of the algorithm + * name as defined by Java. + */ +@Getter +@AllArgsConstructor +public enum DigestAlgorithm { + /** + * MD2 digest algorithm. + */ + MD2("MD2", AbstractDigest.MD2_DIGEST_LENGTH), + /** + * MD5 digest algorithm. + */ + MD5("MD5", AbstractDigest.MD5_DIGEST_LENGTH), + /** + * SHA-1 digest algorithm. + */ + SHA1("SHA-1", AbstractDigest.SHA1_DIGEST_LENGTH), + /** + * SHA-256 digest algorithm. + */ + SHA256("SHA-256", AbstractDigest.SHA256_DIGEST_LENGTH), + /** + * SHA-384 digest algorithm. + */ + SHA384("SHA-384", AbstractDigest.SHA384_DIGEST_LENGTH), + /** + * SHA-512 digest algorithm. + */ + SHA512("SHA-512", AbstractDigest.SHA512_DIGEST_LENGTH), + /** + * Condition used when an algorithm is not specified and + * the size doesn't match known digests. + */ + UNSPECIFIED("NOT SPECIFIED", Integer.BYTES); + + private final String standardAlgorithmName; + private final int lengthInBytes; + + /** + * Returns a DigestAlgorithm object given a String. The String is expected to be one of the + * options for standardAlgorithmName. Throws an IllegalArgumentException if no Enum exists with + * that value. + * + * @param standardAlgorithmName + * String value of the Enum + * @return DigestAlgorithm object + */ + public static DigestAlgorithm findByString(final String standardAlgorithmName) { + for (DigestAlgorithm algorithm: DigestAlgorithm.values()) { + if (algorithm.getStandardAlgorithmName().equals(standardAlgorithmName)) { + return algorithm; + } + } + throw new IllegalArgumentException(String.format("No constant with text \"%s\" found", + standardAlgorithmName)); + } +} \ No newline at end of file diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/DigestComparisonResultType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/DigestComparisonResultType.java new file mode 100644 index 00000000..26285893 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/DigestComparisonResultType.java @@ -0,0 +1,24 @@ +package hirs.attestationca.portal.utils.digest; + +/** + * Enumeration identifying the different outcomes of a comparison between + * two {@link Digest} objects. + * + */ +public enum DigestComparisonResultType { + /** + * When one of the Digests compared has a hash that is uninitialized, defaulted, or + * is a byte array equal to zero. + */ + UNKNOWN, + + /** + * When the two digest hashes are equal, and are not zeroized / defaulted hash arrays. + */ + MATCH, + + /** + * When the two digest hashes are not equal, and are not zeroized / defaulted hash arrays. + */ + MISMATCH, +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/OptionalDigest.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/OptionalDigest.java new file mode 100644 index 00000000..0c59e1f6 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/digest/OptionalDigest.java @@ -0,0 +1,96 @@ +package hirs.attestationca.portal.utils.digest; + +import jakarta.persistence.Access; +import jakarta.persistence.AccessType; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.xml.bind.annotation.XmlElement; + +import java.util.Arrays; + +/** + * This class is identical to {@link Digest} except its fields are nullable. However, in practice, + * an instance of this class cannot have null values assigned to its fields. The fields are marked + * as nullable to allow Hibernate to set a reference an embedded instance of this class to null + * (as there is no way for Hibernate to distinguish between a null reference and completely + * null fields on an embedded entity.) Otherwise, there is no operational difference between + * this class and {@link Digest}. + */ +@Embeddable +@Access(AccessType.FIELD) +public final class OptionalDigest extends AbstractDigest { + @XmlElement + @Column(nullable = true, name = "digest", length = SHA512_DIGEST_LENGTH, + columnDefinition = "varbinary(64)") + private final byte[] digest; + + @XmlElement + @Column(nullable = true) + @Enumerated(EnumType.ORDINAL) + private final DigestAlgorithm algorithm; + + /** + * Creates a new OptionalDigest. + * + * @param algorithm algorithm used to generate the digest + * @param digest digest value + * @throws IllegalArgumentException if digest length does not match that of the algorithm + */ + public OptionalDigest(final DigestAlgorithm algorithm, final byte[] digest) + throws IllegalArgumentException { + validateInput(algorithm, digest); + this.algorithm = algorithm; + this.digest = Arrays.copyOf(digest, digest.length); + } + + /** + * Default constructor necessary for Hibernate. + */ + protected OptionalDigest() { + this.algorithm = null; + this.digest = null; + } + + /** + * Returns the DigestAlgorithm that identifies which hash + * function generated the digest. + * + * @return digest algorithm + */ + @Override + public DigestAlgorithm getAlgorithm() { + return algorithm; + } + + /** + * Returns the digest. + * + * @return digest + */ + @Override + public byte[] getDigest() { + return Arrays.copyOf(this.digest, this.digest.length); + } + + /** + * Returns a new Digest with the same attributes as this instance. + * + * @return a new equivalent Digest + */ + public Digest asDigest() { + return new Digest(algorithm, digest); + } + + /** + * Helper method to reverse the toString method. Returns an OptionalDigest given a String + * that was created using an AbstractDigest's toString method. + * + * @param digest String representation of an AbstractDigest + * @return OptionalDigest object recreated from the String passed in + */ + public static OptionalDigest fromString(final String digest) { + return new OptionalDigest(algorithmFromString(digest), digestFromString(digest)); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/TPMBaselineGeneratorException.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/TPMBaselineGeneratorException.java new file mode 100644 index 00000000..d86e7356 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/TPMBaselineGeneratorException.java @@ -0,0 +1,46 @@ +package hirs.attestationca.portal.utils.tpm; + +/** + * This class represents an Exception generated by + * CreateTPMBaseline. + */ +public class TPMBaselineGeneratorException extends Exception { + + private static final long serialVersionUID = 8850867303391694668L; + + /** + * Creates a new CreateTPMBaselineException that has the + * message msg. + * + * @param msg + * exception message + */ + TPMBaselineGeneratorException(final String msg) { + super(msg); + } + + /** + * Creates a new CreateTPMBaselineException that wraps the + * given Throwable. + * + * @param t + * root cause + */ + TPMBaselineGeneratorException(final Throwable t) { + super(t); + } + + /** + * Creates a new CreateTPMBaselineException that has the + * message msg and wraps the root cause. + * + * @param msg + * exception message + * @param t + * root cause + */ + TPMBaselineGeneratorException(final String msg, final Throwable t) { + super(msg, t); + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TCGEventLog.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TCGEventLog.java new file mode 100644 index 00000000..e6d67fc6 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TCGEventLog.java @@ -0,0 +1,350 @@ +package hirs.attestationca.portal.utils.tpm.eventlog; + +import hirs.attestationca.portal.utils.digest.AbstractDigest; +import hirs.attestationca.portal.utils.HexUtils; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvConstants; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiConstants; +import lombok.Getter; +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.util.Collection; +import java.util.LinkedHashMap; + +/** + * Class for handling different formats of TCG Event logs. + */ +public final class TCGEventLog { + + /** Logger. */ + private static final Logger LOGGER = LogManager.getLogger(TCGEventLog.class); + /** Name of the hash algorithm used to process the Event Log, default is SHA256. */ + @Getter + private String algorithm = "TPM_ALG_SHA256"; + /** Parsed event log array. */ + private static final int SIG_OFFSET = 32; + /** TEV_NO_ACTION signature size. */ + private static final int SIG_SIZE = 16; + /** Initial value for SHA 256 values.*/ + public static final String INIT_SHA256_LIST = "00000000000000000000000000" + + "00000000000000000000000000000000000000"; + /** Initial value for SHA 256 values.*/ + public static final String LOCALITY4_SHA256_LIST = "ffffffffffffffffffffffffff" + + "ffffffffffffffffffffffffffffffffffffff"; + /** Initial value for SHA 1 values. */ + public static final String INIT_SHA1_LIST = "0000000000000000000000000000000000000000"; + /** Initial value for SHA 1 values. */ + public static final String LOCALITY4_SHA1_LIST = "ffffffffffffffffffffffffffffffffffffffff"; + /** PFP defined EV_NO_ACTION identifier. */ + public static final int NO_ACTION_EVENT = 0x00000003; + /** String value of SHA1 hash.*/ + public static final String HASH_STRING = "SHA1"; + /** String value of SHA256 hash. */ + public static final String HASH256_STRING = "SHA-256"; + /** Each PCR bank holds 24 registers. */ + public static final int PCR_COUNT = 24; + /** Locality 4 starts at PCR 17. */ + public static final int PCR_LOCALITY4_MIN = 17; + /** Locality 4 Ends at PCR 23. */ + public static final int PCR_LOCALITY4_MAX = 23; + /** 2 dimensional array holding the PCR values. */ + private byte[][] pcrList; + /** List of parsed events within the log. */ + private LinkedHashMap eventList = new LinkedHashMap<>(); + /** Length of PCR. Indicates which hash algorithm is used. */ + private int pcrLength; + /** Name of hash algorithm. */ + private String hashType; + /** Initial PCR Value to use. */ + private String initValue; + /** Initial PcR Value to use for locality 4. */ + private String initLocalityFourValue; + /** Content Output Flag use. */ + private boolean bContent = false; + /** Event Output Flag use. */ + private boolean bHexEvent = false; + /** Event Output Flag use. */ + private boolean bEvent = false; + /** Event Output Flag use. */ + @Getter + private boolean bCryptoAgile = false; + + /** + * Default blank object constructor. + */ + public TCGEventLog() { + this.pcrList = new byte[PCR_COUNT][EvConstants.SHA1_LENGTH]; + initValue = INIT_SHA1_LIST; + initLocalityFourValue = LOCALITY4_SHA1_LIST; + pcrLength = EvConstants.SHA1_LENGTH; + hashType = HASH_STRING; + algorithm = "TPM_ALG_SHA1"; + initPcrList(); + } + + /** + * Simple constructor for Event Log. + * @param rawlog data for the event log file. + * @throws java.security.NoSuchAlgorithmException if an unknown algorithm is encountered. + * @throws java.security.cert.CertificateException if a certificate in the log cannot be parsed. + * @throws java.io.IOException IO Stream if event cannot be parsed. + */ + public TCGEventLog(final byte[] rawlog) + throws CertificateException, NoSuchAlgorithmException, IOException { + this(rawlog, false, false, false); + } + + /** + * Default constructor for just the rawlog that'll set up SHA1 Log. + * @param rawlog data for the event log file. + * @param bEventFlag if true provides human readable event descriptions. + * @param bContentFlag if true provides hex output for Content in the description. + * @param bHexEventFlag if true provides hex event structure in the description. + * @throws java.security.NoSuchAlgorithmException if an unknown algorithm is encountered. + * @throws java.security.cert.CertificateException if a certificate in the log cannot be parsed. + * @throws java.io.IOException IO Stream if event cannot be parsed. + */ + public TCGEventLog(final byte[] rawlog, final boolean bEventFlag, + final boolean bContentFlag, final boolean bHexEventFlag) + throws CertificateException, NoSuchAlgorithmException, IOException { + + bCryptoAgile = isLogCrytoAgile(rawlog); + if (bCryptoAgile) { + initValue = INIT_SHA256_LIST; + initLocalityFourValue = LOCALITY4_SHA256_LIST; + algorithm = "TPM_ALG_SHA256"; + hashType = HASH256_STRING; + pcrLength = EvConstants.SHA256_LENGTH; + } else { + initValue = INIT_SHA1_LIST; + initLocalityFourValue = LOCALITY4_SHA1_LIST; + hashType = HASH_STRING; + algorithm = "TPM_ALG_SHA1"; + pcrLength = EvConstants.SHA1_LENGTH; + } + this.pcrList = new byte[PCR_COUNT][pcrLength]; + int eventNumber = 0; + bContent = bContentFlag; + bEvent = bEventFlag; + bHexEvent = bHexEventFlag; + ByteArrayInputStream is = new ByteArrayInputStream(rawlog); + // Process the 1st entry as a SHA1 format (per the spec) + eventList.put(eventNumber, new TpmPcrEvent1(is, eventNumber++)); + // put all events into an event list for further processing + + while (is.available() > 0) { + if (bCryptoAgile) { + eventList.put(eventNumber, new TpmPcrEvent2(is, eventNumber++)); + } else { + eventList.put(eventNumber, new TpmPcrEvent1(is, eventNumber++)); + } + } + calculatePcrValues(); + } + + /** + * This method puts blank values in the pcrList. + */ + private void initPcrList() { + try { + for (int i = 0; i < PCR_COUNT; i++) { + System.arraycopy(Hex.decodeHex(initValue.toCharArray()), + 0, pcrList[i], 0, pcrLength); + } + for (int i = PCR_LOCALITY4_MIN; i < PCR_LOCALITY4_MAX; i++) { + System.arraycopy(Hex.decodeHex(initLocalityFourValue.toCharArray()), + 0, pcrList[i], 0, pcrLength); + } + } catch (DecoderException deEx) { + LOGGER.error(deEx); + } + } + + /** + * Creates a TPM baseline using the expected PCR Values. + * Expected PCR Values were Calculated from the EventLog (RIM Support file). + * + * @param name name to call the TPM Baseline + * @return whitelist baseline + */ +// public TpmWhiteListBaseline createTPMBaseline(final String name) { +// TpmWhiteListBaseline baseline = new TpmWhiteListBaseline(name); +// TPMMeasurementRecord record; +// String pcrValue; +// for (int i = 0; i < PCR_COUNT; i++) { +// if (algorithm.compareToIgnoreCase("TPM_ALG_SHA1") == 0) { // Log Was SHA1 Format +// pcrValue = getExpectedPCRValue(i); +// byte[] hexValue = HexUtils.hexStringToByteArray(pcrValue); +// final Digest hash = new Digest(DigestAlgorithm.SHA1, hexValue); +// record = new TPMMeasurementRecord(i, hash); +// } else { // Log was Crypto Agile, currently assumes SHA256 +// pcrValue = getExpectedPCRValue(i); +// byte[] hexValue = HexUtils.hexStringToByteArray(pcrValue); +// final Digest hash = new Digest(DigestAlgorithm.SHA256, hexValue); +// record = new TPMMeasurementRecord(i, hash); +// } +// baseline.addToBaseline(record); +// } +// return baseline; +// } + + /** + * Calculates the "Expected Values for TPM PCRs based upon Event digests in the Event Log. + * Uses the algorithm and eventList passed into the constructor, + */ + private void calculatePcrValues() { + byte[] extendedPCR; + initPcrList(); + for (TpmPcrEvent currentEvent : eventList.values()) { + if (currentEvent.getPcrIndex() >= 0) { // Ignore NO_EVENTS which can have a PCR=-1 + try { + if (currentEvent.getEventType() != NO_ACTION_EVENT) { + // Don't include EV_NO_ACTION event + extendedPCR = extendPCR(pcrList[currentEvent.getPcrIndex()], + currentEvent.getEventDigest()); + System.arraycopy(extendedPCR, 0, pcrList[currentEvent.getPcrIndex()], + 0, currentEvent.getDigestLength()); + } + } catch (NoSuchAlgorithmException e) { + LOGGER.error(e); + } + } + } + } + + /** + * Extends a hash with a hash of new data. + * + * @param currentValue value to extend + * @param newEvent value to extend with + * @return new hash resultant hash + * @throws java.security.NoSuchAlgorithmException if hash algorithm not supported + */ + private byte[] extendPCR(final byte[] currentValue, final byte[] newEvent) + throws NoSuchAlgorithmException { + MessageDigest md = MessageDigest.getInstance(hashType); + StringBuilder sb = new StringBuilder(AbstractDigest.SHA512_DIGEST_LENGTH); + sb.append(Hex.encodeHexString(currentValue).toCharArray()); + sb.append(Hex.encodeHexString(newEvent).toCharArray()); + + try { + md.update(Hex.decodeHex(sb.toString().toCharArray())); + } catch (DecoderException deEx) { + LOGGER.error(deEx); + } + return md.digest(); + } + + /** + * Returns all 24 PCR values for display purposes. + * + * @return Returns an array of strings representing the expected hash values for all 24 PCRs + */ + public String[] getExpectedPCRValues() { + String[] pcrs = new String[PCR_COUNT]; + for (int i = 0; i < PCR_COUNT; i++) { + pcrs[i] = Hex.encodeHexString(pcrList[i]); + } + return pcrs; + } + + /** + * Returns a list of event found in the Event Log. + * @return an arraylist of event. + */ + public Collection getEventList() { + return eventList.values(); + } + + /** + * Returns a specific element of the Event Log that corresponds to the requested + * event number. + * @param eventNumber specific event to find in the list. + * @return TPM Event in the position of the list + */ + public TpmPcrEvent getEventByNumber(final int eventNumber) { + return eventList.get(eventNumber); + } + + /** + * Returns a single PCR value given an index (PCR Number). + * + * @param index pcr index + * @return String representing the PCR contents + */ + public String getExpectedPCRValue(final int index) { + return HexUtils.byteArrayToHexString(pcrList[index]); + } + + /** + * Human readable string representing the contents of the Event Log. + * @return Description of the log. + */ + public String toString() { + StringBuilder sb = new StringBuilder(); + for (TpmPcrEvent event : eventList.values()) { + sb.append(event.toString(bEvent, bHexEvent, bContent)); + } + sb.append("Event Log processing completed.\n"); + return sb.toString(); + } + + /** + * Human readable string representing the contents of the Event Log. + * @param bEvent flag to set + * @param bHexEvent flag to set + * @param bContent flag to set + * @return Description of the log. + */ + public String toString(final boolean bEvent, + final boolean bHexEvent, + final boolean bContent) { + this.bEvent = bEvent; + this.bHexEvent = bHexEvent; + this.bContent = bContent; + + return this.toString(); + } + + /** + * Returns the TCG Algorithm Registry defined ID for the Digest Algorithm + * used in the event log. + * @return TCG Defined Algorithm name + */ + public int getEventLogHashAlgorithmID() { + return TcgTpmtHa.tcgAlgStringToId(algorithm); + } + + /** + * Determines if an event is an EfiSpecIdEvent indicating that the log format is crypto agile. + * The EfiSpecIdEvent should be the first event in the TCG TPM Event Log. + * + * @param log The Event Log + * @return true if EfiSpecIDEvent is found and indicates that the format is crypto agile + */ + private boolean isLogCrytoAgile(final byte[] log) { + byte[] eType = new byte[UefiConstants.SIZE_4]; + System.arraycopy(log, UefiConstants.SIZE_4, eType, 0, UefiConstants.SIZE_4); + byte[] eventType = HexUtils.leReverseByte(eType); + int eventID = new BigInteger(eventType).intValue(); + if (eventID != TCGEventLog.NO_ACTION_EVENT) { + return false; + } // Event Type should be EV_NO_ACTION + byte[] signature = new byte[SIG_SIZE]; + // should be "Spec ID Event03" + System.arraycopy(log, SIG_OFFSET, signature, 0, SIG_SIZE); + // remove null char + String sig = new String(signature, StandardCharsets.UTF_8).substring(0, SIG_SIZE - 1); + + return sig.equals("Spec ID Event03"); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TcgTpmtHa.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TcgTpmtHa.java new file mode 100644 index 00000000..408291e1 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TcgTpmtHa.java @@ -0,0 +1,215 @@ +package hirs.attestationca.portal.utils.tpm.eventlog; + +import hirs.attestationca.portal.utils.HexUtils; +import lombok.AccessLevel; +import lombok.Getter; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.math.BigInteger; + +/** + * Class to for the TCG defined TPMT_HA structure used to support the Crypto Agile Log format. + *

+ * typedef struct { + * TPMI_ALG_HASH hashAlg; + * TPMU_HA digest; + * } TPMT_HA; + */ +public class TcgTpmtHa { + /** + * TCG Defined Algorithm Identifiers. + */ + @Getter + private int hashAlgId = 0; + /** + * Length of the hash. + */ + @Getter + private int hashLength = 0; + /** + * Human readable name of the hash algorithm. + */ + @Getter + private String hashName = ""; + /** + * Hash data. + */ + @Getter(value = AccessLevel.PROTECTED) + private byte[] digest = null; + /** + * TCG ID for SHA1. + */ + public static final int TPM_ALG_SHA1 = 0x04; + /** + * TCG ID for SHA1. + */ + public static final int TPM_ALG_SHA256 = 0x0B; + /** + * TCG ID for SHA 384. + */ + public static final int TPM_ALG_SHA384 = 0x0C; + /** + * TCG ID for SHA512. + */ + public static final int TPM_ALG_SHA_512 = 0x0D; + /** + * TCG ID for Null algorithm. + */ + public static final int TPM_ALG_NULL = 0x10; + /** + * TCG ID for SHA1. + */ + public static final int TPM_ALG_SHA1_LENGTH = 20; + /** + * TCG ID for SHA1. + */ + public static final int TPM_ALG_SHA256_LENGTH = 32; + /** + * TCG ID for SHA 384. + */ + public static final int TPM_ALG_SHA384_LENGTH = 48; + /** + * TCG ID for SHA512. + */ + public static final int TPM_ALG_SHA512_LENGTH = 64; + /** + * TCG ID for Null algorithm. + */ + public static final int TPM_ALG_NULL_LENGTH = 0; + /** + * buffer to hold the structure. + */ + private byte[] buffer = null; + + /** + * Constructor. + * + * @param is ByteArrayInputStream holding the TcgTPMT_HA structured data + * @throws java.io.IOException if TPMT_HA structure cannot be parsed + */ + public TcgTpmtHa(final ByteArrayInputStream is) throws IOException { + byte[] algID = new byte[2]; + is.read(algID); + byte[] rAlgID = HexUtils.leReverseByte(algID); + hashAlgId = new BigInteger(rAlgID).intValue(); + hashName = tcgAlgIdToString(algID[0]); + hashLength = tcgAlgLength(algID[0]); + digest = new byte[hashLength]; + is.read(digest); + buffer = new byte[algID.length + digest.length]; + System.arraycopy(algID, 0, buffer, 0, algID.length); + System.arraycopy(digest, 0, buffer, algID.length, digest.length); + } + + /** + * Returns the contents of the TPMT_HA structure buffer. + * + * @return contents of the TPMT_HA structure. + */ + public byte[] getBuffer() { + return java.util.Arrays.copyOf(buffer, buffer.length); + } + + /** + * Readable description of the Algorithm. + * + * @return Readable Algorithm name + */ + @Override + public String toString() { + return String.format("%s hash = %s", hashName, HexUtils.byteArrayToHexString(digest)); + } + + /** + * Returns the hash name via a lookup. + * Lookup based upon section 6.3 for the TPM-Rev-2.0-Part-2-Structures.pdf document. + * Only hash algorithms found in Table 7 are used. + * + * @param algId int to convert to string + * @return name of the algorithm + */ + public static String tcgAlgIdToString(final int algId) { + String alg; + switch (algId) { + case TPM_ALG_SHA1: + alg = "TPM_ALG_SHA1"; + break; + case TPM_ALG_SHA256: + alg = "TPM_ALG_SHA256"; + break; + case TPM_ALG_SHA384: + alg = "TPM_ALG_SHA384"; + break; + case TPM_ALG_SHA_512: + alg = "TPM_ALG_SHA512"; + break; + case TPM_ALG_NULL: + alg = "TPM_ALG_NULL"; + break; + default: + alg = "Unknown or invalid Hash"; + } + return alg; + } + + /** + * Returns the TCG defined ID via a lookup o the TCG Defined Algorithm String. + * Lookup based upon section 6.3 for the TPM-Rev-2.0-Part-2-Structures.pdf document. + * Only hash algorithms found in Table 7 are used. + * + * @param algorithm String to convert to an id + * @return id of hash algorithm + */ + public static int tcgAlgStringToId(final String algorithm) { + int alg; + switch (algorithm) { + case "TPM_ALG_SHA1": + alg = TPM_ALG_SHA1; + break; + case "TPM_ALG_SHA256": + alg = TPM_ALG_SHA256; + break; + case "TPM_ALG_SHA384": + alg = TPM_ALG_SHA384; + break; + case "TPM_ALG_SHA512": + alg = TPM_ALG_SHA_512; + break; + case "TPM_ALG_NULL": + default: + alg = TPM_ALG_NULL; + } + return alg; + } + + /** + * Sets the length of a given TPM ALG Identifier. + * (lookup based upon section 6.3 for the TPM-Rev-2.0-Part-2-Structures.pdf document) + * Only hash algorithms found in Table 7 are used. + * + * @param algId TCG defined Algorithm identifier + * @return length of hash data in bytes + */ + public static int tcgAlgLength(final int algId) { + int length; + switch (algId) { + case TPM_ALG_SHA1: + length = TPM_ALG_SHA1_LENGTH; + break; + case TPM_ALG_SHA256: + length = TPM_ALG_SHA256_LENGTH; + break; + case TPM_ALG_SHA384: + length = TPM_ALG_SHA384_LENGTH; + break; + case TPM_ALG_SHA_512: + length = TPM_ALG_SHA512_LENGTH; + break; + case TPM_ALG_NULL: + default: + length = TPM_ALG_NULL_LENGTH; + } + return length; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TpmPcrEvent.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TpmPcrEvent.java new file mode 100644 index 00000000..154d4be2 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TpmPcrEvent.java @@ -0,0 +1,731 @@ +package hirs.attestationca.portal.utils.tpm.eventlog; + +import hirs.attestationca.portal.utils.HexUtils; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvCompactHash; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvConstants; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvEfiBootServicesApp; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvEfiGptPartition; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvEfiHandoffTable; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvEfiSpecIdEvent; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvEventTag; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvIPL; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvNoAction; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvPostCode; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvSCrtmContents; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvSCrtmVersion; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiConstants; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiFirmware; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiVariable; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.codec.binary.Hex; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.util.Arrays; + +/** + * Class to process a TCG_PCR_EVENT. + * TCG_PCR_EVENT is used when the Event log uses the SHA1 Format as described in the + * TCG Platform Firmware Profile (PFP) specification. + * typedef struct { + * TCG_PCRINDEX PCRIndex; //PCR Index value that either + * //matches the PCRIndex of a + * //previous extend operation or + * //indicates that this Event Log + * //entry is not associated with + * //an extend operation + * TCG_EVENTTYPE EventType; //See Log event types defined in toStrng() + * TCG_DIGEST digest; //The hash of the event data + * UINT32 EventSize; //Size of the event data + * UINT8 Event[EventSize]; //The event data + * } TCG_PCR_EVENT; + */ +public class TpmPcrEvent { + private static final Logger LOGGER = LogManager.getLogger(TpmPcrEvent.class); + /** + * Indent Offset. + */ + private static final int INDENT_3 = 3; + /** + * Log format. SHA1=1, Crytpo agile=2. + * this can be refactored out + */ + @Getter @Setter(value = AccessLevel.PROTECTED) + private int logFormat = -1; + /** + * PCR index. + */ + @Getter + private int pcrIndex = -1; + /** + * Event Type (long). + */ + @Getter + private long eventType = 0; + /** + * Event digest. + */ + private byte[] digest = null; + /** + * Event data (no content). + */ + private byte[] event; + /** + * Event content data. + */ + private byte[] eventContent; + /** + * TCG Event Log spec version. + */ + @Getter + private String specVersion = "Unknown"; + /** + * TCG Event Log errata version. + */ + @Getter + private String specErrataVersion = "Unknown"; + /** + * Description for toString support. + */ + private String description = ""; + /** + * Length (in bytes) of a pcr. + */ + @Setter @Getter + private int digestLength = 0; + /** + * Event hash for SHA1 event logs. + */ + private byte[] eventDataSha1hash; + /** + * Event hash for Crypto Agile events. + */ + private byte[] eventDataSha256hash; + private EvPostCode evPostCode; + @Setter @Getter + private int eventNumber; + @Setter @Getter + private boolean error = false; + + /** + * Constructor. + * + * @param is ByteArrayInputStream holding the event + * @throws java.io.IOException when event can't be parsed + */ + public TpmPcrEvent(final ByteArrayInputStream is) throws IOException { + + } + + /** + * Sets the digest from a TCG_PCR_EVENT digest field. + * This can be SHA1 for older event structures or any algorithm for newer structure. + * + * @param digestData cryptographic hash + * @param digestLength length of the cryptographic hash + */ + protected void setEventDigest(final byte[] digestData, final int digestLength) { + digest = new byte[digestLength]; + System.arraycopy(digestData, 0, digest, 0, digestLength); + } + + /** + * Retrieves the digest from a TCG Event. + * This can be SHA1 for older event structures or any algorithm for newer structure. + * + * @return the digest data for the event + */ + public byte[] getEventDigest() { + byte[] digestCopy = new byte[digestLength]; + System.arraycopy(digest, 0, digestCopy, 0, this.digestLength); + return digestCopy; + } + + /** + * Returns a hex representation of the event digest. + * @return hex string + */ + public String getEventDigestStr() { + return Hex.encodeHexString(this.digest); + } + + /** + * Sets the event PCR index value from a TCG Event. + * + * @param eventIndex TCG Event PCR Index as defined in the PFP + */ + protected void setPcrIndex(final byte[] eventIndex) { + pcrIndex = HexUtils.leReverseInt(eventIndex); + } + + /** + * Sets the EventType. + * + * @param type byte array holding the PFP defined log event type + */ + protected void setEventType(final byte[] type) { + eventType = new BigInteger(1, HexUtils.leReverseByte(type)).longValue(); + } + + /** + * Returns a formatted string of the type for the event. + * @return a string formatted to be human readable + */ + public String getEventTypeStr() { + return String.format("0x%s %s", Long.toHexString(eventType), eventString((int) eventType)); + } + + /** + * Returns a formatted string of the type for the event minus the byte code. + * @return a string formatted to be human readable + */ + public String getEventTypeString() { + return eventString((int) eventType); + } + + /** + * Sets the event data after processing. + * + * @param eventData The PFP defined event content + */ + protected void setEventData(final byte[] eventData) { + event = new byte[eventData.length]; + System.arraycopy(eventData, 0, event, 0, eventData.length); + } + + /** + * Gets the Event Data (no event content) for the event. + * event log format. + * + * @return byte array holding the event structure. + */ + public byte[] getEvent() { + return Arrays.copyOf(event, event.length); + } + + /** + * Sets the event content after processing. + * + * @param eventData The PFP defined event content + */ + protected void setEventContent(final byte[] eventData) { + eventContent = new byte[eventData.length]; + evPostCode = new EvPostCode(eventContent); + System.arraycopy(eventData, 0, eventContent, 0, eventData.length); + } + + /** + * Gets the event Content Data (not the entire event structure). + * + * @return byte array holding the events content field + */ + public byte[] getEventContent() { + return Arrays.copyOf(eventContent, eventContent.length); + } + + /** + * A getter that parses the content based on the type and returns the proper string + * value for the content. + * @return an appended string of human readable data + */ + public String getEventContentStr() { + StringBuilder sb = new StringBuilder(); + + switch ((int) this.eventType) { + case EvConstants.EV_PREBOOT_CERT: + sb.append(" EV_PREBOOT_CERT"); + break; + case EvConstants.EV_POST_CODE: + sb.append(new EvPostCode(eventContent).toString()); + break; + case EvConstants.EV_UNUSED: + break; + case EvConstants.EV_NO_ACTION: + EvNoAction noAction = null; + try { + noAction = new EvNoAction(eventContent); + sb.append(noAction.toString()); + if (noAction.isSpecIDEvent()) { + // this should be in the constructor + EvEfiSpecIdEvent specID = noAction.getSpecIDEvent(); + specVersion = String.format("%s.%s", + specID.getVersionMajor(), + specID.getVersionMinor()); + specErrataVersion = specID.getErrata(); + } + } catch (UnsupportedEncodingException ueEx) { + LOGGER.error(ueEx); + sb.append(ueEx.toString()); + } + break; + case EvConstants.EV_SEPARATOR: + if (EvPostCode.isAscii(eventContent) + && !this.isBlank(eventContent)) { + sb.append(String.format("Separator event content = %s", + new String(eventContent, StandardCharsets.UTF_8))); + } + break; + case EvConstants.EV_EVENT_TAG: + sb.append(new EvEventTag(eventContent).toString()); + break; + case EvConstants.EV_S_CRTM_CONTENTS: + sb.append(new EvSCrtmContents(eventContent).toString()); + break; + case EvConstants.EV_S_CRTM_VERSION: + try { + sb.append(new EvSCrtmVersion(eventContent).toString()); + } catch (UnsupportedEncodingException ueEx) { + LOGGER.error(ueEx); + sb.append(ueEx.toString()); + } + break; + case EvConstants.EV_CPU_MICROCODE: + case EvConstants.EV_PLATFORM_CONFIG_FLAGS: + case EvConstants.EV_TABLE_OF_DEVICES: + break; + case EvConstants.EV_COMPACT_HASH: + try { + sb.append(new EvCompactHash(eventContent).toString()); + } catch (UnsupportedEncodingException ueEx) { + LOGGER.error(ueEx); + sb.append(ueEx.toString()); + } + break; + case EvConstants.EV_IPL: + sb.append(new EvIPL(eventContent).toString()); + break; + case EvConstants.EV_IPL_PARTITION_DATA: + case EvConstants.EV_NONHOST_CODE: + case EvConstants.EV_NONHOST_CONFIG: + case EvConstants.EV_NONHOST_INFO: + case EvConstants.EV_EV_OMIT_BOOT_DEVICES_EVENTS: + case EvConstants.EV_EFI_EVENT_BASE: + break; + case EvConstants.EV_EFI_VARIABLE_DRIVER_CONFIG: + UefiVariable efiVar = null; + try { + efiVar = new UefiVariable(eventContent); + String efiVarDescription = efiVar.toString().replace("\n", "\n "); + sb.append(efiVarDescription.substring(0, + efiVarDescription.length() - INDENT_3)); + } catch (CertificateException cEx) { + LOGGER.error(cEx); + sb.append(cEx.toString()); + } catch (NoSuchAlgorithmException noSaEx) { + LOGGER.error(noSaEx); + sb.append(noSaEx.toString()); + } catch (IOException ioEx) { + LOGGER.error(ioEx); + sb.append(ioEx.toString()); + } + break; + case EvConstants.EV_EFI_VARIABLE_BOOT: + case EvConstants.EV_EFI_VARIABLE_AUTHORITY: + try { + sb.append(new UefiVariable(eventContent).toString()); + } catch (CertificateException cEx) { + LOGGER.error(cEx); + sb.append(cEx.toString()); + } catch (NoSuchAlgorithmException noSaEx) { + LOGGER.error(noSaEx); + sb.append(noSaEx.toString()); + } catch (IOException ioEx) { + LOGGER.error(ioEx); + sb.append(ioEx.toString()); + } + break; + case EvConstants.EV_EFI_BOOT_SERVICES_APPLICATION: + case EvConstants.EV_EFI_BOOT_SERVICES_DRIVER: // same as EV_EFI_BOOT_SERVICES_APP + try { + sb.append(new EvEfiBootServicesApp(eventContent).toString()); + } catch (UnsupportedEncodingException ueEx) { + LOGGER.error(ueEx); + sb.append(ueEx.toString()); + } + break; + case EvConstants.EV_EFI_RUNTIME_SERVICES_DRIVER: + break; + case EvConstants.EV_EFI_GPT_EVENT: + try { + sb.append(new EvEfiGptPartition(eventContent).toString()); + } catch (UnsupportedEncodingException ueEx) { + LOGGER.error(ueEx); + sb.append(ueEx.toString()); + } + break; + case EvConstants.EV_EFI_ACTION: + case EvConstants.EV_ACTION: + sb.append(new String(eventContent, StandardCharsets.UTF_8)); + break; + case EvConstants.EV_EFI_PLATFORM_FIRMWARE_BLOB: + sb.append(new UefiFirmware(eventContent).toString()); + break; + case EvConstants.EV_EFI_HANDOFF_TABLES: + sb.append(new EvEfiHandoffTable(eventContent).toString()); + break; + case EvConstants.EV_EFI_HCRTM_EVENT: + break; + default: + sb.append("Unknown Event found\n"); + } + + return cleanTextContent(sb.toString()); + } + + /** + * Parses the event content and creates a human readable description of each event. + * + * @param event the byte array holding the event data. + * @param eventContent the byte array holding the event content. + * @param eventNumber event position within the event log. + * @param hashName name of the hash algorithm used by the event log + * @return String description of the event. + * @throws java.security.cert.CertificateException if the event contains an event that cannot be processed. + * @throws java.security.NoSuchAlgorithmException if an event contains an unsupported algorithm. + * @throws java.io.IOException if the event cannot be parsed. + */ + public String processEvent(final byte[] event, final byte[] eventContent, final int eventNumber, + final String hashName) + throws CertificateException, NoSuchAlgorithmException, IOException { + int eventID = (int) eventType; + this.eventNumber = eventNumber; + description += "Event# " + eventNumber + ": "; + description += "Index PCR[" + getPcrIndex() + "]\n"; + description += "Event Type: 0x" + Long.toHexString(eventType) + " " + eventString(eventID); + description += "\n"; + if (hashName.compareToIgnoreCase("TPM_ALG_SHA1") == 0) { // Digest + description += "digest (SHA-1): " + Hex.encodeHexString(this.digest); + } else if (hashName.compareToIgnoreCase("TPM_ALG_SHA256") == 0) { // Digest + description += "digest (SHA256): " + Hex.encodeHexString(this.digest); + } else if (hashName.compareToIgnoreCase("TPM_ALG_SHA384") == 0) { // Digest + description += "digest (SHA384): " + Hex.encodeHexString(this.digest); + } else if (hashName.compareToIgnoreCase("TPM_ALG_SHA512") == 0) { // Digest + description += "digest (SHA512): " + Hex.encodeHexString(this.digest); + } else { + description += "Unsupported Hash Algorithm encoutered"; + } + if (eventID != UefiConstants.SIZE_4) { + description += "\n"; + } + // Calculate both the SHA1 and SHA256 on the event since this will equal the digest + // field of about half the log messages. + MessageDigest md1 = MessageDigest.getInstance("SHA-1"); + md1.update(event); + eventDataSha1hash = md1.digest(); + MessageDigest md2 = MessageDigest.getInstance("SHA-256"); + md2.update(event); + eventDataSha256hash = md2.digest(); + + switch (eventID) { + case EvConstants.EV_PREBOOT_CERT: + description += " EV_PREBOOT_CERT" + "\n"; + break; + case EvConstants.EV_POST_CODE: + EvPostCode postCode = new EvPostCode(eventContent); + description += "Event Content:\n" + postCode.toString(); + break; + case EvConstants.EV_UNUSED: + break; + case EvConstants.EV_NO_ACTION: + EvNoAction noAction = new EvNoAction(eventContent); + description += "Event Content:\n" + noAction.toString(); + if (noAction.isSpecIDEvent()) { + EvEfiSpecIdEvent specID = noAction.getSpecIDEvent(); + specVersion = specID.getVersionMajor() + "." + specID.getVersionMinor(); + specErrataVersion = specID.getErrata(); + } + break; + case EvConstants.EV_SEPARATOR: + if (EvPostCode.isAscii(eventContent)) { + String separatorEventData = new String(eventContent, StandardCharsets.UTF_8); + if (!this.isBlank(eventContent)) { + description += "Separator event content = " + separatorEventData; + } + } + break; + case EvConstants.EV_ACTION: + description += "Event Content:\n" + + new String(eventContent, StandardCharsets.UTF_8); + break; + case EvConstants.EV_EVENT_TAG: + EvEventTag eventTag = new EvEventTag(eventContent); + description += eventTag.toString(); + break; + case EvConstants.EV_S_CRTM_CONTENTS: + EvSCrtmContents sCrtmContents = new EvSCrtmContents(eventContent); + description += "Event Content:\n " + sCrtmContents.toString(); + break; + case EvConstants.EV_S_CRTM_VERSION: + EvSCrtmVersion sCrtmVersion = new EvSCrtmVersion(eventContent); + description += "Event Content:\n" + sCrtmVersion.toString(); + break; + case EvConstants.EV_CPU_MICROCODE: + break; + case EvConstants.EV_PLATFORM_CONFIG_FLAGS: + break; + case EvConstants.EV_TABLE_OF_DEVICES: + break; + case EvConstants.EV_COMPACT_HASH: + EvCompactHash compactHash = new EvCompactHash(eventContent); + description += "Event Content:\n" + compactHash.toString(); + break; + case EvConstants.EV_IPL: + EvIPL ipl = new EvIPL(eventContent); + description += "Event Content:\n" + ipl.toString(); + break; + case EvConstants.EV_IPL_PARTITION_DATA: + break; + case EvConstants.EV_NONHOST_CODE: + break; + case EvConstants.EV_NONHOST_CONFIG: + break; + case EvConstants.EV_NONHOST_INFO: + break; + case EvConstants.EV_EV_OMIT_BOOT_DEVICES_EVENTS: + break; + case EvConstants.EV_EFI_EVENT_BASE: + break; + case EvConstants.EV_EFI_VARIABLE_DRIVER_CONFIG: + UefiVariable efiVar = new UefiVariable(eventContent); + String efiVarDescription = efiVar.toString().replace("\n", "\n "); + description += "Event Content:\n " + efiVarDescription.substring(0, + efiVarDescription.length() - INDENT_3); + break; + case EvConstants.EV_EFI_VARIABLE_BOOT: + description += "Event Content:\n" + new UefiVariable(eventContent).toString(); + break; + case EvConstants.EV_EFI_BOOT_SERVICES_APPLICATION: + EvEfiBootServicesApp bootServices = new EvEfiBootServicesApp(eventContent); + description += "Event Content:\n" + bootServices.toString(); + break; + case EvConstants.EV_EFI_BOOT_SERVICES_DRIVER: // same as EV_EFI_BOOT_SERVICES_APP + EvEfiBootServicesApp bootDriver = new EvEfiBootServicesApp(eventContent); + description += "Event Content:\n" + bootDriver.toString(); + break; + case EvConstants.EV_EFI_RUNTIME_SERVICES_DRIVER: + break; + case EvConstants.EV_EFI_GPT_EVENT: + description += "Event Content:\n" + new EvEfiGptPartition(eventContent).toString(); + break; + case EvConstants.EV_EFI_ACTION: + description += new String(eventContent, StandardCharsets.UTF_8); + break; + case EvConstants.EV_EFI_PLATFORM_FIRMWARE_BLOB: + description += "Event Content:\n" + + new UefiFirmware(eventContent).toString(); + break; + case EvConstants.EV_EFI_HANDOFF_TABLES: + EvEfiHandoffTable efiTable = new EvEfiHandoffTable(eventContent); + description += "Event Content:\n" + efiTable.toString(); + break; + case EvConstants.EV_EFI_HCRTM_EVENT: + break; + case EvConstants.EV_EFI_VARIABLE_AUTHORITY: + description += "Event Content:\n" + new UefiVariable(eventContent).toString(); + break; + default: + description += " Unknown Event found" + "\n"; + } + return description; + } + + /** + * Converts the Event ID into a String As defined in the TCG PC Client FW Profile. + * Event IDs have values larger than an integer,so a Long is used hold the value. + * + * @param event the event id. + * @return TCG defined String that represents the event id + */ + private static String eventString(final long event) { + + if (event == EvConstants.EV_PREBOOT_CERT) { + return "EV_PREBOOT_CERT"; + } else if (event == EvConstants.EV_POST_CODE) { + return "EV_POST_CODE"; + } else if (event == EvConstants.EV_UNUSED) { + return "EV_Unused"; + } else if (event == EvConstants.EV_NO_ACTION) { + return "EV_NO_ACTION"; + } else if (event == EvConstants.EV_SEPARATOR) { + return "EV_SEPARATOR"; + } else if (event == EvConstants.EV_ACTION) { + return "EV_ACTION"; + } else if (event == EvConstants.EV_EVENT_TAG) { + return "EV_EVENT_TAG"; + } else if (event == EvConstants.EV_S_CRTM_CONTENTS) { + return "EV_S_CRTM_CONTENTS"; + } else if (event == EvConstants.EV_S_CRTM_VERSION) { + return "EV_S_CRTM_VERSION"; + } else if (event == EvConstants.EV_CPU_MICROCODE) { + return "EV_CPU_MICROCODE"; + } else if (event == EvConstants.EV_PLATFORM_CONFIG_FLAGS) { + return "EV_PLATFORM_CONFIG_FLAGS "; + } else if (event == EvConstants.EV_TABLE_OF_DEVICES) { + return "EV_TABLE_OF_DEVICES"; + } else if (event == EvConstants.EV_COMPACT_HASH) { + return "EV_COMPACT_HASH"; + } else if (event == EvConstants.EV_IPL) { + return "EV_IPL"; + } else if (event == EvConstants.EV_IPL_PARTITION_DATA) { + return "EV_IPL_PARTITION_DATA"; + } else if (event == EvConstants.EV_NONHOST_CODE) { + return "EV_NONHOST_CODE"; + } else if (event == EvConstants.EV_NONHOST_CONFIG) { + return "EV_NONHOST_CONFIG"; + } else if (event == EvConstants.EV_NONHOST_INFO) { + return "EV_NONHOST_INFO"; + } else if (event == EvConstants.EV_EV_OMIT_BOOT_DEVICES_EVENTS) { + return "EV_EV_OMIT_BOOT_DEVICES_EVENTS"; + } else if (event == EvConstants.EV_EFI_EVENT_BASE) { + return "EV_EFI_EVENT_BASE"; + } else if (event == EvConstants.EV_EFI_VARIABLE_DRIVER_CONFIG) { + return "EV_EFI_VARIABLE_DRIVER_CONFIG"; + } else if (event == EvConstants.EV_EFI_VARIABLE_BOOT) { + return "EV_EFI_VARIABLE_BOOT"; + } else if (event == EvConstants.EV_EFI_BOOT_SERVICES_APPLICATION) { + return "EV_EFI_BOOT_SERVICES_APPLICATION"; + } else if (event == EvConstants.EV_EFI_BOOT_SERVICES_DRIVER) { + return "EV_EFI_BOOT_SERVICES_DRIVER"; + } else if (event == EvConstants.EV_EFI_RUNTIME_SERVICES_DRIVER) { + return "EV_EFI_RUNTIME_SERVICES_DRIVER"; + } else if (event == EvConstants.EV_EFI_GPT_EVENT) { + return "EV_EFI_GPT_EVENT"; + } else if (event == EvConstants.EV_EFI_ACTION) { + return "EV_EFI_ACTION"; + } else if (event == EvConstants.EV_EFI_PLATFORM_FIRMWARE_BLOB) { + return "EV_EFI_PLATFORM_FIRMWARE_BLOB"; + } else if (event == EvConstants.EV_EFI_HANDOFF_TABLES) { + return "EV_EFI_HANDOFF_TABLES"; + } else if (event == EvConstants.EV_EFI_HCRTM_EVENT) { + return "EV_EFI_HCRTM_EVENT"; + } else if (event == EvConstants.EV_EFI_VARIABLE_AUTHORITY) { + return "EV_EFI_VARIABLE_AUTHORITY"; + } else { + return "Unknown Event ID " + event + " encountered"; + } + } + + /** + * Human readable output of a check of input against the current event hash. + * + * @return human readable string. + */ + private String eventHashCheck() { + String result = ""; + if (logFormat == 1) { + if (Arrays.equals(this.digest, eventDataSha1hash)) { + result + += "Event digest matched hash of the event data " + "\n"; + } else { + result += "Event digest DID NOT match the hash of the event data :" + + Hex.encodeHexString(getEventDigest()) + "\n"; + } + } else { + if (Arrays.equals(this.digest, eventDataSha256hash)) { + result += "Event digest matched hash of the event data " + "\n"; + } else { + result += "Event digest DID NOT match the hash of the event data :" + + Hex.encodeHexString(getEventDigest()) + "\n"; + } + } + return result; + } + + /** + * This method takes in an event and compares the hashes to verify that they match. + * @param tpmPcrEvent an event to match. + * @return true if the event # matches and the hash is correct. + */ + public boolean eventCompare(final TpmPcrEvent tpmPcrEvent) { + if (tpmPcrEvent.getPcrIndex() != this.getPcrIndex()) { + return false; + } + + return Arrays.equals(this.digest, tpmPcrEvent.getEventDigest()); + } + + /** + * Checks a byte array for all zeros. + * + * @param array holds data to check. + * @return true of all zeros are found. + */ + public boolean isBlank(final byte[] array) { + for (int i = 0; i < array.length; i++) { + if (array[i] != 0) { + return false; + } + } + return true; + } + + /** + * Human readable string representing the contents of the Event Log. + * + * @return Description of the log. + */ + public String toString() { + return description + "\n"; + } + + /** + * Human readable string representing the contents of the Event Log. + * + * @param bEvent event Flag. + * @param bContent content flag. + * @param bHexEvent hex event flag. + * @return Description of the log. + */ + public String toString(final boolean bEvent, final boolean bContent, final boolean bHexEvent) { + StringBuilder sb = new StringBuilder(); + if (bEvent) { + sb.append(description); + } + if (bHexEvent) { + if (bEvent || bContent) { + sb.append("\n"); + } + byte[] eventData = getEvent(); + sb.append("Event (Hex no Content) (" + eventData.length + " bytes): " + + Hex.encodeHexString(eventData)); + } + if (bContent) { + byte[] evContent = getEventContent(); + if (bEvent) { + sb.append("\n"); + } + sb.append("Event content (Hex) (" + evContent.length + " bytes): " + + Hex.encodeHexString(evContent)); + } + return sb.toString() + "\n"; + } + + /** + * Remove bad visual value text. + * @param text content to operate over. + * @return cleared string + */ + public String cleanTextContent(final String text) { + String result; + // strips off all non-ASCII characters + result = text.replaceAll("[^\\x00-\\x7F]", ""); + + // erases all the ASCII control characters + result = result.replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", ""); + + // removes non-printable characters from Unicode + result = result.replaceAll("\\p{C}", ""); + + return result.trim(); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TpmPcrEvent1.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TpmPcrEvent1.java new file mode 100644 index 00000000..3a9567d0 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TpmPcrEvent1.java @@ -0,0 +1,85 @@ +package hirs.attestationca.portal.utils.tpm.eventlog; + +import hirs.attestationca.portal.utils.HexUtils; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvConstants; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiConstants; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; + +/** + * Class to process a TCG_PCR_EVENT. + * TCG_PCR_EVENT is used when the Event log uses the SHA1 Format as described in the + * TCG Platform Firmware Profile specification. + * typedef struct { + * UINT32 PCRIndex; //PCR Index value that either + * //matches the PCRIndex of a + * //previous extend operation or + * //indicates that this Event Log + * //entry is not associated with + * //an extend operation + * UINT32 EventType; //See Log event types + * BYTE digest[20]; //The SHA1 hash of the event data + * UINT32 EventSize; //Size of the event data + * UINT8 Event[1]; // + * } TCG_PCR_EVENT; //The event data structure to be added + */ +public class TpmPcrEvent1 extends TpmPcrEvent { + + /** + * Constructor. + * + * @param is ByteArrayInputStream holding the TCG Log event. + * @param eventNumber event position within the event log. + * @throws java.io.IOException if an error occurs in parsing the event. + * @throws java.security.NoSuchAlgorithmException if an undefined algorithm is encountered. + * @throws java.security.cert.CertificateException If a certificate within an event can't be processed. + */ + public TpmPcrEvent1(final ByteArrayInputStream is, final int eventNumber) + throws IOException, CertificateException, NoSuchAlgorithmException { + super(is); + setDigestLength(EvConstants.SHA1_LENGTH); + setLogFormat(1); + /** Event data. */ + byte[] event = null; + byte[] rawIndex = new byte[UefiConstants.SIZE_4]; + byte[] rawType = new byte[UefiConstants.SIZE_4]; + byte[] rawEventSize = new byte[UefiConstants.SIZE_4]; + byte[] eventDigest = new byte[EvConstants.SHA1_LENGTH]; + byte[] eventContent = null; + int digestSize = EvConstants.SHA1_LENGTH; + int eventSize = 0; + String hashName = "TPM_ALG_SHA1"; + if (is.available() > UefiConstants.SIZE_32) { + is.read(rawIndex); + setPcrIndex(rawIndex); + is.read(rawType); + setEventType(rawType); + is.read(eventDigest); + setEventDigest(eventDigest, digestSize); + is.read(rawEventSize); + eventSize = HexUtils.leReverseInt(rawEventSize); + eventContent = new byte[eventSize]; + is.read(eventContent); + setEventContent(eventContent); + // copy entire event into a byte array for processing + int eventLength = rawIndex.length + rawType.length + eventDigest.length + + rawEventSize.length; + int offset = 0; + event = new byte[eventLength]; + System.arraycopy(rawIndex, 0, event, offset, rawIndex.length); + offset += rawIndex.length; + System.arraycopy(rawType, 0, event, offset, rawType.length); + offset += rawType.length; + System.arraycopy(eventDigest, 0, event, offset, eventDigest.length); + offset += eventDigest.length; + System.arraycopy(rawEventSize, 0, event, offset, rawEventSize.length); + offset += rawEventSize.length; + setEventData(event); + //System.arraycopy(eventContent, 0, event, offset, eventContent.length); + this.processEvent(event, eventContent, eventNumber, hashName); + } + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TpmPcrEvent2.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TpmPcrEvent2.java new file mode 100644 index 00000000..be666a5e --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/TpmPcrEvent2.java @@ -0,0 +1,135 @@ +package hirs.attestationca.portal.utils.tpm.eventlog; + +import hirs.attestationca.portal.utils.HexUtils; +import hirs.attestationca.portal.utils.tpm.eventlog.events.EvConstants; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiConstants; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.util.ArrayList; + +/** + * Class to process a TCG_PCR_EVENT2 which is used + * when the Event log uses the Crypto Agile (SHA256) format as described in the + * TCG Platform Firmware Profile specification. + * This class will only process SHA-256 digests. + * typedef struct { + * UINT32 PCRIndex; //PCR Index value that either + * //matches the PCRIndex of a + * //previous extend operation or + * //indicates that this Event Log + * //entry is not associated with + * //an extend operation + * UINT32 EventType; //See Log event types + * TPML_DIGEST_VALUES digest; //The hash of the event data + * UINT32 EventSize; //Size of the event data + * BYTE Event[1]; //The event data + * } TCG_PCR_EVENT2; //The event data structure to be added + * typedef struct { + * UINT32 count; + * TPMT_HA digests[HASH_COUNT]; + * } TPML_DIGEST_VALUES; + * typedef struct { + * TPMI_ALG_HASH hashAlg; + * TPMU_HA digest; + * } TPMT_HA; + * typedef union { + * BYTE sha1[SHA1_DIGEST_SIZE]; + * BYTE sha256[SHA256_DIGEST_SIZE]; + * BYTE sha384[SHA384_DIGEST_SIZE]; + * BYTE sha512[SHA512_DIGEST_SIZE]; + * } TPMU_HA; + * define SHA1_DIGEST_SIZE 20 + * define SHA256_DIGEST_SIZE 32 + * define SHA384_DIGEST_SIZE 48 + * define SHA512_DIGEST_SIZE 64 + * typedef TPM_ALG_ID TPMI_ALG_HASH; + * typedef UINT16 TPM_ALG_ID; + * define TPM_ALG_SHA1 (TPM_ALG_ID)(0x0004) + * define TPM_ALG_SHA256 (TPM_ALG_ID)(0x000B) + * define TPM_ALG_SHA384 (TPM_ALG_ID)(0x000C) + * define TPM_ALG_SHA512 (TPM_ALG_ID)(0x000D) + */ +public class TpmPcrEvent2 extends TpmPcrEvent { + /** + * algorithms found. + */ + private int algCount = 0; + + /** + * list of digests. + */ + private ArrayList hashList = new ArrayList<>(); + + /** + * Constructor. + * + * @param is ByteArrayInputStream holding the TCG Log event + * @param eventNumber event position within the event log. + * @throws java.io.IOException if an error occurs in parsing the event + * @throws java.security.NoSuchAlgorithmException if an undefined algorithm is encountered. + * @throws java.security.cert.CertificateException If a certificate within an event can't be processed. + */ + public TpmPcrEvent2(final ByteArrayInputStream is, final int eventNumber) + throws IOException, CertificateException, NoSuchAlgorithmException { + super(is); + setDigestLength(EvConstants.SHA256_LENGTH); + setLogFormat(2); + /** Event data. */ + int eventDigestLength = 0; + String hashName = ""; + byte[] event; + byte[] rawIndex = new byte[UefiConstants.SIZE_4]; + byte[] algCountBytes = new byte[UefiConstants.SIZE_4]; + byte[] rawType = new byte[UefiConstants.SIZE_4]; + byte[] rawEventSize = new byte[UefiConstants.SIZE_4]; + byte[] eventDigest = null; + byte[] eventContent = null; + TcgTpmtHa hashAlg = null; + int eventSize = 0; + //TCG_PCR_EVENT2 + if (is.available() > UefiConstants.SIZE_32) { + is.read(rawIndex); + setPcrIndex(rawIndex); + is.read(rawType); + setEventType(rawType); + // TPML_DIGEST_VALUES + is.read(algCountBytes); + algCount = HexUtils.leReverseInt(algCountBytes); + // Process TPMT_HA, + for (int i = 0; i < algCount; i++) { + hashAlg = new TcgTpmtHa(is); + hashName = hashAlg.getHashName(); + hashList.add(hashAlg); + eventDigest = new byte[hashAlg.getHashLength()]; + setEventDigest(hashAlg.getDigest(), hashAlg.getHashLength()); + } + is.read(rawEventSize); + eventSize = HexUtils.leReverseInt(rawEventSize); + eventContent = new byte[eventSize]; + is.read(eventContent); + setEventContent(eventContent); + int eventLength = rawIndex.length + rawType.length + eventDigest.length + + rawEventSize.length; + int offset = 0; + for (TcgTpmtHa hash : hashList) { + eventLength += hash.getBuffer().length; + } + event = new byte[eventLength]; + System.arraycopy(rawIndex, 0, event, offset, rawIndex.length); + offset += rawIndex.length; + System.arraycopy(rawType, 0, event, offset, rawType.length); + offset += rawType.length; + System.arraycopy(eventDigest, 0, event, offset, eventDigest.length); + offset += eventDigest.length; + System.arraycopy(rawEventSize, 0, event, offset, rawEventSize.length); + offset += rawEventSize.length; + //System.arraycopy(eventContent, 0, event, offset, eventContent.length); + setEventData(event); + //setDigestLength(eventDigestLength); + this.processEvent(event, eventContent, eventNumber, hashName); + } + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvCompactHash.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvCompactHash.java new file mode 100644 index 00000000..8e4236ce --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvCompactHash.java @@ -0,0 +1,59 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.events; + +import hirs.attestationca.portal.utils.HexUtils; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiConstants; + +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; + +/** + * Class to process the EV_COMPACT_HASH event. + * The Old 2005 PFP description of EV_COMPACT_HASH which provides 4 byte ESI field (a pointer). + * The 2019 PFP description allow the vendor to create event data that is "specified by the caller" + * however the for PCR 6 there is a constraint that it contain + * "The Event Data field SHALL be a unique string". + */ +public class EvCompactHash { + + /** + * Holds the Compact Hash description. + */ + private String eventInfo = ""; + + /** + * Constructor that takes in the event data (hex string) and passes to function below. + * + * @param event byte array of the Event Compact Hash. + * @throws java.io.UnsupportedEncodingException if compact hash has non utf-8 characters. + */ + public EvCompactHash(final byte[] event) throws UnsupportedEncodingException { + hashEvent(event); + } + + /** + * Takes the event data (hex string) converts to readable output. + * This may be somewhat limited due to the unpublished nature of vendor specific data. + * + * @param event data to process. + * @return a human readable description. + * @throws java.io.UnsupportedEncodingException if compact hash has non utf-8 characters. + */ + public String hashEvent(final byte[] event) throws UnsupportedEncodingException { + // determine if old format is used + if (event.length == UefiConstants.SIZE_4) { // older PFP defines as 4 byte ESI pointer. + eventInfo = " ESI = " + HexUtils.byteArrayToHexString(event); + } else { // otherwise assume the event content is a string + eventInfo = " " + new String(event, StandardCharsets.UTF_8); + } + return eventInfo; + } + + /** + * Readable description of the Event Content, however limiting that may be. + * + * @return Event description. + */ + public String toString() { + return eventInfo; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvConstants.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvConstants.java new file mode 100644 index 00000000..b4df48bd --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvConstants.java @@ -0,0 +1,166 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.events; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * Class for defining constants referenced in the PC Client + * Platform Firmware Profile specification. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class EvConstants { + + /** + * Type length = 4 bytes. + */ + public static final int EV_TYPE_SIZE = 4; + /** + * Event Log spec version. + */ + public static final int MIN_SIZE = 32; + /** + * Event Type (byte array). + */ + public static final int INT_LENGTH = 4; + /** + * Event Type (byte array). + */ + public static final int SHA1_LENGTH = 20; + /** + * Event Type (byte array). + */ + public static final int SHA256_LENGTH = 32; + /** + * Event Type (byte array). + */ + public static final int SHA384_LENGTH = 48; + /** + * Each PCR bank holds 24 registers. + */ + public static final int PCR_COUNT = 24; + // Event IDs + /** + * Pre boot cert Event ID. + */ + public static final int EV_PREBOOT_CERT = 0x00000000; + /** + * POST Code Event ID. + */ + public static final int EV_POST_CODE = 0x00000001; + /** + * Unused Event ID. + */ + public static final int EV_UNUSED = 0x00000002; + /** + * NoAction Event ID. + */ + public static final int EV_NO_ACTION = 0x00000003; + /** + * NoAction Event ID. + */ + public static final int EV_SEPARATOR = 0x00000004; + /** + * Action Event ID. + */ + public static final int EV_ACTION = 0x00000005; + /** + * Event ID. + */ + public static final int EV_EVENT_TAG = 0x00000006; + /** + * SCRTM Contents Event ID. + */ + public static final int EV_S_CRTM_CONTENTS = 0x00000007; + /** + * SCRTM Version Event ID. + */ + public static final int EV_S_CRTM_VERSION = 0x00000008; + /** + * CPU Microcode Event ID. + */ + public static final int EV_CPU_MICROCODE = 0x00000009; + /** + * Platform Config Flags Event ID. + */ + public static final int EV_PLATFORM_CONFIG_FLAGS = 0x0000000A; + /** + * Table of Devices Event ID. + */ + public static final int EV_TABLE_OF_DEVICES = 0x0000000B; + /** + * Compact Hash Event ID. + */ + public static final int EV_COMPACT_HASH = 0x0000000C; + /** + * IPL Event ID. + */ + public static final int EV_IPL = 0x0000000D; + /** + * Partition Data Event ID. + */ + public static final int EV_IPL_PARTITION_DATA = 0x0000000E; + /** + * Non Host Event ID. + */ + public static final int EV_NONHOST_CODE = 0x0000000F; + /** + * Non Host Config Event ID. + */ + public static final int EV_NONHOST_CONFIG = 0x00000010; + /** + * Non Host Info Event ID. + */ + public static final int EV_NONHOST_INFO = 0x00000011; + /** + * Omit Boot Device Event ID. + */ + public static final int EV_EV_OMIT_BOOT_DEVICES_EVENTS = 0x00000012; + /** + * EFI Event ID. + */ + public static final int EV_EFI_EVENT_BASE = 0x80000000; + /** + * EFI Variable Driver Event ID. + */ + public static final int EV_EFI_VARIABLE_DRIVER_CONFIG = 0x80000001; + /** + * EFI Variable Boot Driver Event ID. + */ + public static final int EV_EFI_VARIABLE_BOOT = 0x80000002; + /** + * EFI Boot Services Application Event ID. + */ + public static final int EV_EFI_BOOT_SERVICES_APPLICATION = 0x80000003; + /** + * EFI Boot Services Application Event ID. + */ + public static final int EV_EFI_BOOT_SERVICES_DRIVER = 0x80000004; + /** + * EFI Runtime Services Driver Event ID. + */ + public static final int EV_EFI_RUNTIME_SERVICES_DRIVER = 0x80000005; + /** + * EFI GPT Event ID. + */ + public static final int EV_EFI_GPT_EVENT = 0x80000006; + /** + * EFI GPT Event ID. + */ + public static final int EV_EFI_ACTION = 0x80000007; + /** + * Platform Firmware Blob Event ID. + */ + public static final int EV_EFI_PLATFORM_FIRMWARE_BLOB = 0x80000008; + /** + * EFI Handoff Tables Event ID. + */ + public static final int EV_EFI_HANDOFF_TABLES = 0x80000009; + /** + * HRCTM Event ID. + */ + public static final int EV_EFI_HCRTM_EVENT = 0x80000010; + /** + * EFI Variable Authority Event ID. + */ + public static final int EV_EFI_VARIABLE_AUTHORITY = 0x800000E0; +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEfiBootServicesApp.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEfiBootServicesApp.java new file mode 100644 index 00000000..53628936 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEfiBootServicesApp.java @@ -0,0 +1,132 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.events; + +import hirs.attestationca.portal.utils.HexUtils; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiConstants; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiDevicePath; +import lombok.Getter; + +import java.io.UnsupportedEncodingException; +import java.util.Arrays; + +/** + * Class to process the PC Client Firmware profile defined EV_EFI_BOOT_SERVICES_APPLICATION event. + * The EV_EFI_BOOT_SERVICES_APPLICATION event data contains the UEFI_IMAGE_LOAD_EVENT structure: + * struct tdUEFI_IMAGE_LOAD_EVENT { + * UEFI_PHYSICAL_ADDRESS ImageLocationInMemory; // PE/COFF image same as UINT64 + * UINT64 ImageLengthInMemory; + * UINT64 ImageLinkTimeAddress; + * UINT64 LengthOfDevicePath; + * UEFI_DEVICE_PATH DevicePath[LengthOfDevicePath]; // See UEFI spec for the encodings. + * } UEFI_IMAGE_LOAD_EVENT; + *

+ * DEVICE_PATH_PROTOCOL from the UEFI spec Section 10.1 page 284 of v2.8 + *

+ * #define EFI_DEVICE_PATH_PROTOCOL_GUID \09576e91-6d3f-11d2-8e39-00a0c969723b + * typedef struct _EFI_DEVICE_PATH_PROTOCOL { + * UINT8 Type; + * UINT8 SubType; + * UINT8 Length[2]; + * } EFI_DEVICE_PATH_PROTOCOL; // ref page of the UEFI spec + *

+ * Where Type and Subtype are defined the UEFI spec section 10.3.1 + * Type 0x01 Hardware Device Path + * Type 0x02 ACPI Device Path + * Type 0x03 Messaging Device Path + * Type 0x04 Media Device Path + * Type 0x05 BIOS Boot Specification Device Path + * Type 0x7F End of Hardware Device Path + */ +public class EvEfiBootServicesApp { + /** + * UEFI Address. + */ + private byte[] physicalAddress = null; + /** + * UEFI Image Length. + */ + @Getter + private int imageLength = 0; + /** + * UEFI Link Time image address. + */ + private byte[] linkTimeAddress = null; + /** + * UEFI Device Path Length. + */ + @Getter + private int devicePathLength = 0; + /** + * UEFI Device path. + */ + @Getter + private UefiDevicePath devicePath = null; + /** + * Is the Device Path Valid. + */ + private boolean devicePathValid = false; + + /** + * EvEFIBootServicesApp constructor. + * + * @param bootServices byte array holding the event data. + * @throws java.io.UnsupportedEncodingException if parsing issues exists. + */ + public EvEfiBootServicesApp(final byte[] bootServices) throws UnsupportedEncodingException { + physicalAddress = new byte[UefiConstants.SIZE_8]; + System.arraycopy(bootServices, 0, physicalAddress, 0, UefiConstants.SIZE_8); + byte[] lengthBytes = new byte[UefiConstants.SIZE_8]; + System.arraycopy(bootServices, UefiConstants.OFFSET_8, lengthBytes, 0, UefiConstants.SIZE_8); + imageLength = HexUtils.leReverseInt(lengthBytes); + linkTimeAddress = new byte[UefiConstants.SIZE_8]; + System.arraycopy(bootServices, UefiConstants.OFFSET_16, linkTimeAddress, 0, + UefiConstants.SIZE_8); + System.arraycopy(bootServices, UefiConstants.SIZE_24, lengthBytes, 0, UefiConstants.SIZE_8); + // if (imageLength != 0) { + devicePathLength = HexUtils.leReverseInt(lengthBytes); + if (devicePathLength != 0) { + byte[] devPathBytes = new byte[devicePathLength]; + System.arraycopy(bootServices, UefiConstants.SIZE_32, devPathBytes, + 0, devicePathLength); + devicePath = new UefiDevicePath(devPathBytes); + devicePathValid = true; + } + } + + /** + * Returns the address of the physical image of the boot services application. + * + * @return address of the physical image. + */ + public byte[] getImagePhysicalAddress() { + return Arrays.copyOf(physicalAddress, physicalAddress.length); + } + + /** + * Returns the length of a link time image referenced by this event. + * + * @return length of the link time image. + */ + public byte[] getImageLinkTimeAddress() { + return Arrays.copyOf(linkTimeAddress, linkTimeAddress.length); + } + + + /** + * Returns a human readable string of the Boot Service info. + * + * @return a human readable string. + */ + public String toString() { + String info = "Image info: "; + info += " Image physical address: " + HexUtils.byteArrayToHexString(physicalAddress); + info += " Image length = " + imageLength; + info += " Image link time address: " + HexUtils.byteArrayToHexString(physicalAddress); + info += " Device path length = " + devicePathLength; + if (devicePathValid) { + info += "\n" + devicePath.toString(); + } else { + info += "\n No uefi device paths were specified"; + } + return info; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEfiGptPartition.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEfiGptPartition.java new file mode 100644 index 00000000..c39f0f23 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEfiGptPartition.java @@ -0,0 +1,148 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.events; + +import hirs.attestationca.portal.utils.HexUtils; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiConstants; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiPartition; +import lombok.Getter; + +import java.io.UnsupportedEncodingException; +import java.math.BigInteger; +import java.util.ArrayList; + +/** + * Class to process the PC Client Firmware profile defined EV_EFI_GPT_EVENT event. + * The EV_EFI_GPT_EVENT event data contains the UEFI_GPT_DATA structure as defined in the PFP + * line 2860: + *

+ * typedef struct { + * UEFI_PARTITION_TABLE_HEADER UEFIPartitionHeader; // same as UINT64 for current x86 devices + * UINT64 NumberOfPartitions; + * UEFI_PARTITION_ENTRY Partitions [NumberOfPartitions]; + * }UEFI_GPT_DATA; + *

+ * The UEFI spec defines the EFI_TABLE_HEADER and EFI_PARTITION_ENTRY + *

+ * * typedef struct { + * UINT64 Signature; // A 64-bit signature that identifies the type of table that follows. + * UINT32 Revision; + * UINT32 HeaderSize; + * UINT32 CRC32; + * UINT32 Reserved; + * } EFI_TABLE_HEADER; + *

+ * typedef struct { + * EFI_GUID PartitionTypeGUID; + * EFI_GUID UniquePartitionGUID; + * EFI_LBA StartingLBA; // Same as UINT64. + * EFI_LBA EndingLBA; + * UINT64 Attributes; + * CHAR16 PartitionName[36]; // 36 CHAR16 = 72 Bytes + * } EFI_PARTITION_ENTRY; + *

+ * EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249 + * EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42 + * EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552 + *

+ * UEFI Table 23. Defined GPT Partition Entry - Partition Type GUIDs + * Unused Entry 00000000-0000-0000-0000-000000000000 + * EFI System Partition C12A7328-F81F-11D2-BA4B-00A0C93EC93B + * Partition containing a legacy MBR 024DEE41-33E7-11D3-9D69-0008C781F39F + */ +public class EvEfiGptPartition { + /** + * Header Size. + */ + private int headerSize = 0; + /** + * Header bytes. + */ + private byte[] header = new byte[UefiConstants.SIZE_8]; + /** + * Number of partitions in this event. + */ + private int numberOfPartitions; + /** + * Partition Length. + */ + private int partitonEntryLength = UefiConstants.SIZE_128; + /** + * List of Partitions. + */ + @Getter + private ArrayList partitionList = new ArrayList<>(); + + /** + * GPT Partition Event Type constructor. + * + * @param eventDataBytes GPT Event to process + * @throws java.io.UnsupportedEncodingException if Event Data fails to parse + */ + public EvEfiGptPartition(final byte[] eventDataBytes) throws UnsupportedEncodingException { + //byte[] eventDataBytes = event.getEventContent(); + // Process the partition header + System.arraycopy(eventDataBytes, 0, header, 0, UefiConstants.SIZE_8); // Signature + byte[] revision = new byte[UefiConstants.SIZE_4]; + System.arraycopy(eventDataBytes, UefiConstants.SIZE_8, revision, 0, UefiConstants.SIZE_4); + byte[] hsize = new byte[UefiConstants.SIZE_4]; + System.arraycopy(eventDataBytes, UefiConstants.SIZE_12, hsize, 0, UefiConstants.SIZE_4); + headerSize = getIntFromBytes(hsize); + byte[] partitions = new byte[UefiConstants.SIZE_8]; + System.arraycopy(eventDataBytes, headerSize, partitions, 0, UefiConstants.SIZE_8); + numberOfPartitions = getIntFromBytes(partitions); + int partitionLength = numberOfPartitions * partitonEntryLength; + byte[] partitionEntries = new byte[partitionLength]; + System.arraycopy(eventDataBytes, headerSize + UefiConstants.SIZE_8, partitionEntries, + 0, partitionLength); + processesPartitions(partitionEntries, numberOfPartitions); + // Mystery Structure get processed here (skipped for now), still part of the header + } + + /** + * Processes an individual GPT partition entry. + * + * @param partitions byte array holding partition data. + * @param numberOfPartitions number of partitions included in the data. + * @throws java.io.UnsupportedEncodingException if partition data fails to parse. + */ + private void processesPartitions(final byte[] partitions, final int numberOfPartitions) + throws UnsupportedEncodingException { + byte[] partitionData = new byte[UefiConstants.SIZE_128]; + for (int i = 0; i < numberOfPartitions; i++) { + System.arraycopy(partitions, i * partitonEntryLength, partitionData, 0, + partitonEntryLength); + partitionList.add(new UefiPartition(partitionData)); + } + } + + /** + * Provides a human readable string describing the GPT Partition information. + * + * @return a human readable string holding the partition information. + */ + public String toString() { + String headerStr = HexUtils.byteArrayToHexString(header); + StringBuilder partitionInfo = new StringBuilder(); + partitionInfo.append("GPT Header Signature = " + headerStr + " : Number of Partitions = " + + numberOfPartitions + "\n"); + for (int i = 0; i < numberOfPartitions; i++) { + if (i > 0) { + partitionInfo.append("\n"); + } + partitionInfo.append(" Partition " + i + " information\n"); + partitionInfo.append(partitionList.get(i).toString()); + } + return partitionInfo.toString(); + } + + /** + * Helper method for converting little Endian byte arrays into Big Endian integers. + * + * @param data data to convert. + * @return an integer. + */ + public int getIntFromBytes(final byte[] data) { + byte[] bigEndData = HexUtils.leReverseByte(data); + BigInteger bigInt = new BigInteger(bigEndData); + return bigInt.intValue(); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEfiHandoffTable.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEfiHandoffTable.java new file mode 100644 index 00000000..0cabdffe --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEfiHandoffTable.java @@ -0,0 +1,142 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.events; + +import hirs.attestationca.portal.utils.HexUtils; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiConstants; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiGuid; +import lombok.Getter; + +import java.math.BigInteger; +import java.nio.file.Path; +import java.util.ArrayList; + +/** + * Class to process the PC Client Firmware profile defined EV_EFI_HANDOFF_TABLES event. + * The Event data holds a structure called UEFI_HANDOFF_TABLE_POINTERS: + *

+ * tdUEFI_HANDOFF_TABLE_POINTERS { + * UINT64 NumberOfTables; + * UEFI_CONFIGURATION_TABLE TableEntry[NumberOfTables]; + * }UEFI_HANDOFF_TABLE_POINTERS; + *

+ * The UEFI_CONFIGURATION_TABLE id defined in the UEFI spec as: + *

+ * typedef struct{ + * EFI_GUID VendorGuid; + * VOID *VendorTable; + * } EFI_CONFIGURATION_TABLE; + * Where the defines + * VendorGuid: The 128-bit GUID value that uniquely identifies the system configuration table. + * VendorTable: A pointer to the table associated with VendorGuid. + * Section 4.6 of the UEFI spec has a listing of some of the industry defined + * standard that define the particular table. + */ +public class EvEfiHandoffTable { + /** + * Number of Tables. + */ + @Getter + private int numberOfTables = 0; + /** + * List of Vendor GUIDs. + */ + private ArrayList vendorGuids = new ArrayList<>(); + /** + * List of Vendors. + */ + private ArrayList vendorTables = new ArrayList<>(); + + private Path vendorPathString; + + /** + * EvEFIHandoffTable constructor. + * + * @param tpmEventData byte array holding the Handoff table data. + */ + public EvEfiHandoffTable(final byte[] tpmEventData) { + // Get NumberOfTables from the EventData + byte[] count = new byte[UefiConstants.SIZE_8]; + System.arraycopy(tpmEventData, 0, count, 0, UefiConstants.SIZE_8); + byte[] bigEndCount = HexUtils.leReverseByte(count); + BigInteger countInt = new BigInteger(bigEndCount); + numberOfTables = countInt.intValue(); + // process each UEFI_CONFIGURATION_TABLE table + int offset = UefiConstants.OFFSET_8; + for (int tables = 0; tables < numberOfTables; tables++) { + vendorGuids.add(getNextGUID(tpmEventData, offset)); + vendorTables.add(getNextTable(tpmEventData, offset + UefiConstants.OFFSET_16)); + offset += UefiConstants.OFFSET_24; + } + } + + /** + * EvEFIHandoffTable constructor. + * + * @param tpmEventData byte array holding the Handoff table data. + * @param vendorPathString the string for the vendor file + */ + public EvEfiHandoffTable(final byte[] tpmEventData, final Path vendorPathString) { + // Get NumberOfTables from the EventData + byte[] count = new byte[UefiConstants.SIZE_8]; + System.arraycopy(tpmEventData, 0, count, 0, UefiConstants.SIZE_8); + byte[] bigEndCount = HexUtils.leReverseByte(count); + BigInteger countInt = new BigInteger(bigEndCount); + numberOfTables = countInt.intValue(); + this.vendorPathString = vendorPathString; + // process each UEFI_CONFIGURATION_TABLE table + int offset = UefiConstants.OFFSET_8; + for (int tables = 0; tables < numberOfTables; tables++) { + vendorGuids.add(getNextGUID(tpmEventData, offset)); + vendorTables.add(getNextTable(tpmEventData, offset + UefiConstants.OFFSET_16)); + offset += UefiConstants.OFFSET_24; + } + } + + /** + * Returns the next GUI in the table. + * + * @param eventData byte array holding the guids. + * @param offset offset to the guid. + * @return Vendor Guid + */ + private UefiGuid getNextGUID(final byte[] eventData, final int offset) { + byte[] guid = new byte[UefiConstants.SIZE_16]; + System.arraycopy(eventData, offset, guid, 0, UefiConstants.SIZE_16); + if (vendorPathString == null || vendorPathString.toString().isEmpty()) { + return new UefiGuid(guid); + } else { + return new UefiGuid(guid, vendorPathString); + } + } + + /** + * Copies the next table to a new array. + * + * @param eventData byte array holding the next table. + * @param offset offset within the table to fond the data. + * @return a byte array holding the new table. + */ + private byte[] getNextTable(final byte[] eventData, final int offset) { + byte[] table = new byte[UefiConstants.SIZE_8]; + System.arraycopy(eventData, offset, table, 0, UefiConstants.SIZE_8); + return table; + } + + /** + * Returns a human readable description of the hand off tables. + * + * @return a human readable description. + */ + public String toString() { + StringBuilder tableInfo = new StringBuilder(); + tableInfo.append("Number of UEFI_CONFIGURATION_TABLEs = " + numberOfTables + "\n"); + for (int i = 0; i < numberOfTables; i++) { + UefiGuid currentGuid = vendorGuids.get(i); + tableInfo.append(" Table " + i + ": " + currentGuid.toString()); + tableInfo.append(" UEFI industry standard table type = " + + currentGuid.getVendorTableReference() + "\n"); + tableInfo.append(" VendorTable " + i + " address: " + + HexUtils.byteArrayToHexString(vendorTables.get(i))); + } + return tableInfo.toString(); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEfiSpecIdEvent.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEfiSpecIdEvent.java new file mode 100644 index 00000000..b7ea4779 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEfiSpecIdEvent.java @@ -0,0 +1,150 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.events; + +import hirs.attestationca.portal.utils.HexUtils; +import hirs.attestationca.portal.utils.tpm.eventlog.TcgTpmtHa; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiConstants; +import lombok.Getter; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; + +/** + * Class to process the TCG_EfiSpecIDEvent. + * The first 16 bytes of a Event Data MUST be String based identifier (Signature). + * The only currently defined Signature is "Spec ID Event03" which implies the data is + * a TCG_EfiSpecIDEvent. TCG_EfiSpecIDEvent is the first event in a TPM Event Log + * and is used to determine the format of the Log (SHA1 vs Crypt Agile). + *

+ * typedef struct tdTCG_EfiSpecIdEvent { + * BYTE Signature[16]; + * UINT32 platformClass; + * UINT8 specVersionMinor; + * UINT8 specVersionMajor; + * UINT8 specErrata; + * UINT8 uintnSize; + * UINT32 numberOfAlgorithms; + * TCG_EfiSpecIdEventAlgorithmSize digestSizes[numberOfAlgorithms]; + * UINT8 vendorInfoSize; + * BYTE vendorInfo[VendorInfoSize]; + * } TCG_EfiSpecIDEvent; + *

+ * typedef struct tdTCG_EfiSpecIdEventAlgorithmSize { + * UINT16 algorithmId; + * UINT16 digestSize; + * } TCG_EfiSpecIdEventAlgorithmSize; + *

+ * define TPM_ALG_SHA1 (TPM_ALG_ID)(0x0004) + * define TPM_ALG_SHA256 (TPM_ALG_ID)(0x000B) + * define TPM_ALG_SHA384 (TPM_ALG_ID)(0x000C) + * define TPM_ALG_SHA512 (TPM_ALG_ID)(0x000D) + *

+ * Notes: Parses event data for an EfiSpecID per Table 5 TCG_EfiSpecIdEvent Example. + * 1. Should be the first Structure in the log + * 2. Has an EventType of EV_NO_ACTION (0x00000003) + * 3. Digest of 20 bytes of all 0's + * 4. Event content defined as TCG_EfiSpecIDEvent Struct. + * 5. First 16 bytes of the structure is an ASCII "Spec ID Event03" + * 6. The version of the log is used to determine which format the Log + * is to use (sha1 or Crypto Agile) + */ +@Getter +public class EvEfiSpecIdEvent { + /** + * Minor Version. + */ + private String versionMinor = ""; + /** + * Major Version. + */ + private String versionMajor = ""; + /** + * Specification errata version. + */ + private String errata = ""; + /** + * Signature (text) data. + */ + private String signature = ""; + /** + * Platform class. + */ + private String platformClass = ""; + /** + * Algorithm count. + */ + private int numberOfAlg = 0; + /** + * True if event log uses Crypto Agile format. + */ + private boolean cryptoAgile = false; + /** + * Algorithm list. + */ + private ArrayList algList = new ArrayList(); + + /** + * EvEfiSpecIdEvent Constructor. + * + * @param efiSpecId byte array holding the spec ID Event. + */ + public EvEfiSpecIdEvent(final byte[] efiSpecId) { + byte[] signatureBytes = new byte[UefiConstants.SIZE_16]; + System.arraycopy(efiSpecId, 0, signatureBytes, 0, UefiConstants.SIZE_16); + signature = HexUtils.byteArrayToHexString(signatureBytes); + signature = new String(signatureBytes, StandardCharsets.UTF_8) + .substring(0, UefiConstants.SIZE_15); + + byte[] platformClassBytes = new byte[UefiConstants.SIZE_4]; + System.arraycopy(efiSpecId, UefiConstants.OFFSET_16, platformClassBytes, 0, + UefiConstants.SIZE_4); + platformClass = HexUtils.byteArrayToHexString(platformClassBytes); + + byte[] specVersionMinorBytes = new byte[1]; + System.arraycopy(efiSpecId, UefiConstants.OFFSET_20, specVersionMinorBytes, 0, 1); + versionMinor = HexUtils.byteArrayToHexString(specVersionMinorBytes); + + byte[] specVersionMajorBytes = new byte[1]; + System.arraycopy(efiSpecId, UefiConstants.OFFSET_21, specVersionMajorBytes, 0, 1); + versionMajor = HexUtils.byteArrayToHexString(specVersionMajorBytes); + + byte[] specErrataBytes = new byte[1]; + System.arraycopy(efiSpecId, UefiConstants.OFFSET_22, specErrataBytes, 0, 1); + errata = HexUtils.byteArrayToHexString(specErrataBytes); + + byte[] numberOfAlgBytes = new byte[UefiConstants.SIZE_4]; + System.arraycopy(efiSpecId, UefiConstants.OFFSET_24, numberOfAlgBytes, 0, + UefiConstants.SIZE_4); + numberOfAlg = HexUtils.leReverseInt(numberOfAlgBytes); + + byte[] algorithmIDBytes = new byte[UefiConstants.SIZE_2]; + int algLocation = UefiConstants.SIZE_28; + for (int i = 0; i < numberOfAlg; i++) { + System.arraycopy(efiSpecId, algLocation + UefiConstants.OFFSET_4 * i, algorithmIDBytes, + 0, UefiConstants.SIZE_2); + String alg = TcgTpmtHa.tcgAlgIdToString(HexUtils.leReverseInt(algorithmIDBytes)); + algList.add(alg); + } + if ((algList.size() == 1) && (algList.get(0).compareTo("SHA1") == 0)) { + cryptoAgile = false; + } else { + cryptoAgile = true; + } + } + + /** + * Returns a human readable description of the data within this event. + * + * @return a description of this event.. + */ + public String toString() { + String specInfo = ""; + if (signature.equals("Spec ID Event#")) { + specInfo += "Platform Profile Specification version = " + versionMajor + "." + versionMinor + + " using errata version" + errata; + } else { + specInfo = "EV_NO_ACTION event named " + signature + + " encountered but support for processing it has not been added to this application"; + } + return specInfo; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEventTag.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEventTag.java new file mode 100644 index 00000000..bd58dab0 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvEventTag.java @@ -0,0 +1,68 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.events; + +import hirs.attestationca.portal.utils.HexUtils; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiConstants; +import lombok.Getter; + +/** + * Class for processing the EV_EVENT_TAG. + * The structure for the Event Data is defined as: + * structure tdTCG_PCClientTaggedEvent{ + * UINT32 taggedEventID; + * UINT32 taggedEventDataSize; + * BYTE taggedEventData[taggedEventDataSize]; + * } TCG_PCClientTaggedEvent; + * ToDo: Find lookup of taggedEventID and figure out how to process. + */ +public class EvEventTag { + /** + * Event Tag Information. + */ + private String eventTagInfo = ""; + /** + * Event Tag ID. + */ + @Getter + private int tagEventID = 0; + /** + * Event ID. + */ + private int eventID = 0; + /** + * Data size. + */ + @Getter + private int dataSize = 0; + + /** + * Processes event tag. + * + * @param eventTag byte array holding the eventTag data. + */ + public EvEventTag(final byte[] eventTag) { + if (eventTag.length < UefiConstants.SIZE_8) { + eventTagInfo = "Invalid EV Event Tag data"; + } else { + byte[] tagEventIdBytes = new byte[UefiConstants.SIZE_4]; + System.arraycopy(eventTag, 0, tagEventIdBytes, 0, UefiConstants.SIZE_4); + eventID = HexUtils.leReverseInt(tagEventIdBytes); + byte[] tagEventDataSize = new byte[UefiConstants.SIZE_4]; + System.arraycopy(eventTag, UefiConstants.OFFSET_4, tagEventDataSize, 0, + UefiConstants.SIZE_4); + dataSize = HexUtils.leReverseInt(tagEventDataSize); + } + } + + /** + * Returns a human readable string of the Event Tag. + * + * @return human readable string. + */ + public String toString() { + if (eventTagInfo.isEmpty()) { + eventTagInfo = " Tagged Event ID = " + eventID; + eventTagInfo += " Data Size = " + dataSize; + } + return eventTagInfo; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvIPL.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvIPL.java new file mode 100644 index 00000000..8a822f55 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvIPL.java @@ -0,0 +1,43 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.events; + +import java.nio.charset.StandardCharsets; + +/** + * Processes event type EV_IPL which is deprecated in the current spec, + * but defined in older version of the specification(1.0.0) as contain + * "informative information about the IPL code" (ascii strings). + */ +public class EvIPL { + + private String description = ""; + + /** + *IPL Event Constructor. + * @param event byte array holding the IPL Event data. + */ + public EvIPL(final byte[] event) { + event(event); + } + + /** + * Processes IPL event. + * @param event byte array holding the IPL Event data. + * @return a description of the IPl event. + */ + public String event(final byte[] event) { + if (event == null) { + description = "Invalid IPL event data"; + } else { + description = " \"" + new String(event, StandardCharsets.UTF_8) + "\""; + } + return description; + } + + /** + * Returns a human readable description of the IPL Event. + * @return human readable description. + */ + public String toString() { + return description; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvNoAction.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvNoAction.java new file mode 100644 index 00000000..eb307363 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvNoAction.java @@ -0,0 +1,86 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.events; + +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiConstants; +import lombok.Getter; + +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; + +/** + * Class to process the EV_NO_ACTION event using a structure of TCG_EfiSpecIDEvent. + * The first 16 bytes of the event data MUST be a String based identifier (Signature). + * The only currently defined Signature is "Spec ID Event03" + * which implies the data is a TCG_EfiSpecIDEvent. + * TCG_EfiSpecIDEvent is the first event in a TPM Event Log and is used to determine + * if the format of the Log (SHA1 vs Crypto Agile). + *

+ * Notes: + * 1. First 16 bytes of the structure is an ASCII with a fixed Length of 16 + * 2. Add processing of other NoEvent types when new ones get defined + */ +public class EvNoAction { + + /** + * Signature (text) data. + */ + private String signature = ""; + /** + * True of the event is a SpecIDEvent. + */ + private boolean bSpecIDEvent = false; + /** + * EvEfiSpecIdEvent Object. + */ + @Getter + private EvEfiSpecIdEvent specIDEvent = null; + + /** + * EvNoAction constructor. + * + * @param eventData byte array holding the event to process. + * @throws java.io.UnsupportedEncodingException if input fails to parse. + */ + public EvNoAction(final byte[] eventData) throws UnsupportedEncodingException { + byte[] signatureBytes = new byte[UefiConstants.SIZE_15]; + System.arraycopy(eventData, 0, signatureBytes, 0, UefiConstants.SIZE_15); + signature = new String(signatureBytes, StandardCharsets.UTF_8); + signature = signature.replaceAll("[^\\P{C}\t\r\n]", ""); // remove null characters + if (signature.contains("Spec ID Event03")) { // implies CryptAgileFormat + specIDEvent = new EvEfiSpecIdEvent(eventData); + bSpecIDEvent = true; + } + } + + /** + * Determines if this event is a SpecIDEvent. + * + * @return true of the event is a SpecIDEvent. + */ + public boolean isSpecIDEvent() { + return bSpecIDEvent; + } + + /** + * Returns a description of this event. + * + * @return Human readable description of this event. + */ + public String toString() { + String specInfo = ""; + if (bSpecIDEvent) { + specInfo += " Signature = Spec ID Event03 : "; + if (specIDEvent.isCryptoAgile()) { + specInfo += "Log format is Crypto Agile\n"; + } else { + specInfo += "Log format is SHA 1 (NOT Crypto Agile)\n"; + } + specInfo += " Platform Profile Specification version = " + + specIDEvent.getVersionMajor() + "." + specIDEvent.getVersionMinor() + + " using errata version " + specIDEvent.getErrata(); + } else { + specInfo = "EV_NO_ACTION event named " + signature + + " encountered but support for processing it has not been added to this application.\n"; + } + return specInfo; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvPostCode.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvPostCode.java new file mode 100644 index 00000000..9393df2f --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvPostCode.java @@ -0,0 +1,78 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.events; + +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiFirmware; +import lombok.Getter; + +import java.nio.charset.StandardCharsets; + +/** + * Class for processing EV_POST_CODE event types + * + * typedef struct tdUEFI_PLATFORM_FIRMWARE_BLOB { + * UEFI_PHYSICAL_ADDRESS BlobBase; // Same as UINT64 for most systems + * UINT64 BlobLength; + * } UEFI_PLATFORM_FIRMWARE_BLOB; + * + * However Table 9 of the PC Client Platform firmware profile states that even content is a string + * For POST code, the event data SHOULD be POST CODE. + * For embedded SMM code, the event data SHOULD be SMM CODE. + * For ACPI flash data, the event data SHOULD be ACPI DATA. + * For BIS code, the event data SHOULD be BIS CODE. + * For embedded option ROMs, the event data SHOULD be Embedded UEFI Driver. + */ +public class EvPostCode { + /** Event Description. */ + private String codeInfo = ""; + /** String type flag. */ + private boolean bisString = false; + /** Firmware object. */ + @Getter + private UefiFirmware firmwareBlob = null; + + /** + * EcPostCode constructor. + * @param postCode byte array holding the post code content. + */ + public EvPostCode(final byte[] postCode) { + // 2 ways post code has been implemented, check for the ascii string first + if (isAscii(postCode)) { + codeInfo = new String(postCode, StandardCharsets.UTF_8); + bisString = true; + } else { + firmwareBlob = new UefiFirmware(postCode); + } + } + + /** + * Flag set to true if Post Code is a string. + * @return true if Post Code is a string. + */ + public boolean isString() { + return bisString; + } + + /** + * Returns a human readable string of the Post Code information. + * @return human readable string. + */ + public String toString() { + if (bisString) { + return codeInfo; + } + return firmwareBlob.toString(); + } + + /** + * Determines if the byte array is a string. + * @param postCode byte array input. + * @return true if byte array is a string. + */ + public static boolean isAscii(final byte[] postCode) { + for (byte b : postCode) { + if (!Character.isDefined(b)) { + return false; + } + } + return true; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvSCrtmContents.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvSCrtmContents.java new file mode 100644 index 00000000..0f33be7e --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvSCrtmContents.java @@ -0,0 +1,41 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.events; + +import java.nio.charset.StandardCharsets; + +/** + * Class to process the PC Client Firmware profile defined EV_S_CRTM_CONTENTS event. + */ +public class EvSCrtmContents { + + private String description = ""; + + /** + * Constructor that takes in the event data and waits to be called. + * @param event byte array holding the event content data. + */ + public EvSCrtmContents(final byte[] event) { + scrtmContents(event); + } + + /** + * Checks if event data is null and if not it converts to a String. + * @param event byte array holding the event data. + * @return String contents contained within the event. + */ + public String scrtmContents(final byte[] event) { + if (event == null) { + description = "invalid content event data"; + } else { + description = new String(event, StandardCharsets.UTF_8); + } + return description; + } + + /** + * Human readable string contained within the CRTM Contents event. + * @return Human readable string. + */ + public String toString() { + return description; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvSCrtmVersion.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvSCrtmVersion.java new file mode 100644 index 00000000..7e384d15 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/EvSCrtmVersion.java @@ -0,0 +1,63 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.events; + +import hirs.attestationca.portal.utils.HexUtils; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiConstants; +import hirs.attestationca.portal.utils.tpm.eventlog.uefi.UefiGuid; + +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; + +/** + * Class to process the PC Client Firmware profile defined EV_S_CRTM_VERSION event. + */ +public class EvSCrtmVersion { + + private String description = ""; + + /** + * Constructor that takes in the event data and waits to be called. + * + * @param event byte array holding the event content data. + * @throws java.io.UnsupportedEncodingException if parsing issues exist. + */ + public EvSCrtmVersion(final byte[] event) throws UnsupportedEncodingException { + sCrtmVersion(event); + } + + /** + * Checks if event data is null and if not it converts to a String. + * + * @param data byte array holding the vent content. + * @return String representation of the version. + */ + public String sCrtmVersion(final byte[] data) { + UefiGuid guid = null; + if (data == null) { + description = "invalid content event data"; + } else { + if (data.length == UefiConstants.SIZE_16) { + if (UefiGuid.isValidUUID(data)) { + guid = new UefiGuid(data); + String guidInfo = guid.toStringNoLookup(); + description = " SCRM Version = " + guidInfo; + } + } else if (data.length < UefiConstants.SIZE_4) { + description = HexUtils.byteArrayToHexString(data); + } else if (EvPostCode.isAscii(data)) { + description = new String(data, StandardCharsets.UTF_8); + } else { + description = "Unknown Version format"; + } + } + return (description); + } + + /** + * Return function to send data to the toString. + * + * @return String representation of the version. + */ + public String toString() { + return description; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/package-info.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/package-info.java new file mode 100644 index 00000000..7a472b06 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/events/package-info.java @@ -0,0 +1,6 @@ +/** + * Non-persistant classes related to TGC Event Logs. + */ + +package hirs.attestationca.portal.utils.tpm.eventlog.events; + diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/package-info.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/package-info.java new file mode 100644 index 00000000..26cb77db --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/package-info.java @@ -0,0 +1,6 @@ +/** + * Non-persistant classes related to TGC Event Logs. + */ + +package hirs.attestationca.portal.utils.tpm.eventlog; + diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiBootOrder.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiBootOrder.java new file mode 100644 index 00000000..d28e9bc1 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiBootOrder.java @@ -0,0 +1,41 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + +/** + * Class to process a UEFI BootOrder variable. + * UEFI spec version 2.8 section 3.3 on page 83 defines the Boot Order as: + * an array of UINT16s that make up an ordered list of the Boot#### options. + */ +public class UefiBootOrder { + /** + * list of UINT16 Boot#### numbers. + */ + private char[] bootOrder = null; + + /** + * Process the BootOrder UEFI variable. + * + * @param order byte array holding the UEFI boot order variable. + */ + UefiBootOrder(final byte[] order) { + bootOrder = new char[order.length / UefiConstants.SIZE_2]; + for (int i = 0; i < order.length; i += UefiConstants.SIZE_2) { + bootOrder[i / UefiConstants.SIZE_2] = + (char) (order[i + 1] * UefiConstants.SIZE_256 + order[i]); + } + } + + /** + * Provides a human readable Boot Order list on single line. + * + * @return A human readable Boot Order + */ + public String toString() { + StringBuilder orderList = new StringBuilder(); + orderList.append("BootOrder = "); + for (int i = 0; i < bootOrder.length; i++) { + orderList.append(String.format("Boot %04d", (int) bootOrder[i])); + } + //orderList.append("\n"); + return orderList.toString(); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiBootVariable.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiBootVariable.java new file mode 100644 index 00000000..4eb904a9 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiBootVariable.java @@ -0,0 +1,111 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + +import hirs.attestationca.portal.utils.HexUtils; + +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +/** + * Class to process a UEFI Boot#### variable. + * Data is defined using the EFI_LOAD_OptionStructure: + * typedef struct _EFI_LOAD_OPTION { + * UINT32 Attributes; + * UINT16 FilePathListLength; + * // CHAR16 Description[]; + * // EFI_DEVICE_PATH_PROTOCOL FilePathList[]; + * // UINT8 OptionalData[]; + * } EFI_LOAD_OPTION; + *

+ * No length field for the Description is given + * so we need to calculate it by search for a null termination on the Description field + * Data following the Description should be an EFI Device Path + */ +public class UefiBootVariable { + /** + * Human readable description of the variable. + */ + private String description = ""; + /** + * Variable attributes. + */ + private byte[] attributes = null; + /** + * Firmware memory blob. + */ + private byte[] blob = null; + /** + * UEFI Device Path. + */ + private UefiDevicePath efiDevPath = null; + + /** + * UefiBootVariable Constructor. + * + * @param bootVar byte array holding the boot variable. + * @throws java.io.UnsupportedEncodingException if the data fails to parse. + */ + public UefiBootVariable(final byte[] bootVar) throws UnsupportedEncodingException { + attributes = new byte[UefiConstants.SIZE_4]; + System.arraycopy(bootVar, 0, attributes, 0, UefiConstants.SIZE_4); + byte[] blobLen = new byte[UefiConstants.SIZE_2]; + System.arraycopy(bootVar, UefiConstants.OFFSET_4, blobLen, 0, UefiConstants.SIZE_2); + int blobLength = HexUtils.leReverseInt(blobLen); + if (blobLength % UefiConstants.SIZE_2 == 0) { + blob = new byte[blobLength]; + } else { + blob = new byte[blobLength + 1]; + } + System.arraycopy(bootVar, UefiConstants.OFFSET_6, blob, 0, blobLength); + int descLength = getChar16ArrayLength(blob); + byte[] desc = new byte[descLength * UefiConstants.SIZE_2]; + System.arraycopy(bootVar, UefiConstants.OFFSET_6, desc, 0, descLength * UefiConstants.SIZE_2); + description = new String(UefiDevicePath.convertChar16tobyteArray(desc), StandardCharsets.UTF_8); + // Data following the Description should be EFI Partition Data (EFI_DEVICE_PATH_PROTOCOL) + int devPathLength = blobLength; + int devPathOffset = UefiConstants.OFFSET_6 + descLength; //attributes+bloblength+desc+length+2 + byte[] devPath = new byte[devPathLength]; + System.arraycopy(bootVar, devPathOffset, devPath, 0, devPathLength); + efiDevPath = new UefiDevicePath(devPath); + } + + /** + * Returns a string that represents a UEFI boot variable. + * Some devices have not properly terminated the Description filed with null characters + * so garbage bytes are appended to the string that we must strip off. + * All non-alpha numeric is stripped from the string. + * + * @return string that represents a UEFI boot variable. + */ + public String toString() { + StringBuilder bootInfo = new StringBuilder("Description = "); + String bootVar = description.replaceAll("[^a-zA-Z_0-0\\s]", ""); // remove all non ascii chars + bootInfo.append(bootVar + "\n" + efiDevPath.toString()); + return bootInfo.toString(); + } + + /** + * Searches for the first char16 based null character (2 bytes of zeros). + * Searches in a given byte array and returns the length of data up to that point in bytes. + * + * @param data a byte array to search for the data. + * @return the length of the data in bytes at the beginning of the byte array. + * which was terminated by a null character. + */ + public int getChar16ArrayLength(final byte[] data) { + int count = 0; + byte[] nullTerminator = new byte[UefiConstants.SIZE_2]; + byte[] char16 = new byte[UefiConstants.SIZE_2]; + nullTerminator[0] = 0; + nullTerminator[1] = 0; + for (int i = 0; i < data.length; i += UefiConstants.SIZE_2) { + char16[0] = data[i]; + char16[1] = data[i + 1]; + count++; + if (Arrays.equals(nullTerminator, char16)) { + return count * UefiConstants.SIZE_2; + } + } + return count * UefiConstants.SIZE_2 + 1; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiConstants.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiConstants.java new file mode 100644 index 00000000..2578ee62 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiConstants.java @@ -0,0 +1,274 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * This class contains the String constants that are referenced by UEFI. + * It is expected that member properties of this class will expand as + * more functionality is added. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class UefiConstants { + + /** + * 2 byte size. + */ + public static final int SIZE_2 = 2; + /** + * 4 byte size. + */ + public static final int SIZE_4 = 4; + /** + * 5 byte size. + */ + public static final int SIZE_5 = 5; + /** + * 8 byte size. + */ + public static final int SIZE_8 = 8; + /** + * 12 byte size. + */ + public static final int SIZE_12 = 12; + /** + * 15 byte size. + */ + public static final int SIZE_15 = 15; + /** + * 16 byte size. + */ + public static final int SIZE_16 = 16; + /** + * 20 byte size. + */ + public static final int SIZE_20 = 20; + /** + * 21 byte size. + */ + public static final int SIZE_21 = 21; + /** + * 22 byte size. + */ + public static final int SIZE_22 = 22; + /** + * 23 byte size. + */ + public static final int SIZE_23 = 23; + /** + * 24 byte size. + */ + public static final int SIZE_24 = 24; + /** + * 28 byte size. + */ + public static final int SIZE_28 = 28; + /** + * 32 byte size. + */ + public static final int SIZE_32 = 32; + /** + * 40 byte size. + */ + public static final int SIZE_40 = 40; + /** + * 128 byte size. + */ + public static final int SIZE_128 = 128; + /** + * 256 byte size. + */ + public static final int SIZE_256 = 256; + /** + * 1 byte offset. + */ + public static final int OFFSET_1 = 1; + /** + * 2 byte offset. + */ + public static final int OFFSET_2 = 2; + /** + * 3 byte offset. + */ + public static final int OFFSET_3 = 3; + /** + * 4 byte offset. + */ + public static final int OFFSET_4 = 4; + /** + * 5 byte offset. + */ + public static final int OFFSET_5 = 5; + /** + * 6 byte offset. + */ + public static final int OFFSET_6 = 4; + /** + * 8 byte offset. + */ + public static final int OFFSET_8 = 8; + /** + * 16 byte offset. + */ + public static final int OFFSET_16 = 16; + /** + * 20 byte offset. + */ + public static final int OFFSET_20 = 20; + /** + * 21 byte offset. + */ + public static final int OFFSET_21 = 21; + /** + * 22 byte offset. + */ + public static final int OFFSET_22 = 22; + /** + * 24 byte offset. + */ + public static final int OFFSET_24 = 24; + /** + * 28 byte offset. + */ + public static final int OFFSET_28 = 28; + /** + * 28 byte offset. + */ + public static final int OFFSET_32 = 32; + /** + * 40 byte offset. + */ + public static final int OFFSET_40 = 40; + /** + * 41 byte offset. + */ + public static final int OFFSET_41 = 41; + /** + * Device path terminator. + */ + public static final int TERMINATOR = 0x7f; + /** + * Device path end flag. + */ + public static final int END_FLAG = 0xff; + /** + * Device Type Hardware. + */ + public static final int DEV_HW = 0x01; + /** + * Device Type ACPI. + */ + public static final int DEV_ACPI = 0x02; + /** + * Device Type Messaging. + */ + public static final int DEV_MSG = 0x03; + /** + * Device Type Media. + */ + public static final int DEV_MEDIA = 0x04; + /** + * Device Type Hardware. + */ + public static final int DEV_BIOS = 0x05; + /** + * Device Sub-Type USV. + */ + public static final int DEV_SUB_USB = 0x05; + /** + * Device Sub-Type Sata. + */ + public static final int DEV_SUB_SATA = 0x12; + /** + * Device Sub-Type nvm. + */ + public static final int DEV_SUB_NVM = 0x17; + /** + * BIOS Device Path reserved. + */ + public static final int DEVPATH_BIOS_RESERVED = 0x0; + /** + * BIOS Device Path for Floppy disks. + */ + public static final int DEVPATH_BIOS_FLOPPY = 0x01; + /** + * BIOS Device Path Hard drives. + */ + public static final int DEVPATH_BIOS_HD = 0x02; + /** + * BIOS Device Path for CD Drives. + */ + public static final int DEVPATH_BIOS_CD = 0x03; + /** + * BIOS Device Path for PCM CIA drives. + */ + public static final int DEVPATH_BIOS_PCM = 0x04; + /** + * BIOS Device Path for USB Drives. + */ + public static final int DEVPATH_BIOS_USB = 0x05; + /** + * BIOS Device Path for embedded network. + */ + public static final int DEVPATH_BIOS_EN = 0x06; + /** + * BIOS Device Path for a Bootstrap Entry Vector (BEV) from an option ROM. + */ + public static final int DEVPATH_BIOS_BEV = 0x80; + /** + * Hardware Device Path. + */ + public static final int DEVPATH_HARWARE = 0x1; + /** + * 2 byte size. + */ + public static final int DEVPATH_VENDOR = 0x03; + /** + * 2 byte size. + */ + public static final int DEVPATH_FILE = 0x04; + /** + * PIWG File device path type. + */ + public static final int DEVPATH_PWIG_FILE = 0x06; + /** + * PIWG Volume device path type. + */ + public static final int DEVPATH_PWIG_VOL = 0x07; + /** + * PC-AT compatible legacy MBR. + */ + public static final int DRIVE_TYPE_PC_AT = 0x01; + /** + * GUID Partition Table type. + */ + public static final int DRIVE_TYPE_GPT = 0x02; + /** + * Drive Signature type. + */ + public static final int DRIVE_SIG_NONE = 0x00; + /** + * Drive Signature type. + */ + public static final int DRIVE_SIG_32BIT = 0x01; + /** + * Drive Signature type. + */ + public static final int DRIVE_SIG_GUID = 0x02; + /** + * standard byte length. + */ + public static final int BYTE_LENGTH = 8; + /** + * standard byte length. + */ + public static final int ATTRIBUTE_LENGTH = 48; + /** + * standard byte length. + */ + public static final int PART_NAME_LENGTH = 56; + /** + * standard UEFI partition table lengh. + */ + public static final int UEFI_PT_LENGTH = 72; +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiDevicePath.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiDevicePath.java new file mode 100644 index 00000000..6274c7af --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiDevicePath.java @@ -0,0 +1,488 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + +import hirs.attestationca.portal.utils.HexUtils; +import lombok.Getter; + +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; + +/** + * Class to process EFI_DEVICE_PATH_PROTOCOL which is referred to as the UEFI_DEVICE_PATH + *

+ * #define EFI_DEVICE_PATH_PROTOCOL_GUID \09576e91-6d3f-11d2-8e39-00a0c969723b + * typedef struct _EFI_DEVICE_PATH_PROTOCOL { + * UINT8 Type; + * UINT8 SubType; + * UINT8 Length[2]; + * } EFI_DEVICE_PATH_PROTOCOL; + *

+ * Where Type is defined in the UEFI spec section 10: + * Type 0x01 Hardware Device Path + * Type 0x02 ACPI Device Path + * Type 0x03 Messaging Device Path + * Type 0x04 Media Device Path + * Type 0x05 BIOS Boot Specification Device Path + * Type 0x7F End of Hardware Device Path + * Each Type has a sub-type that may or may no be defined in the section + *

+ * Only a few of the SubTypes have been implemented as there are many, + * but only those that were reported using the test devices at hand. + * Without test patterns, the processing may lead to an un-handled exception + */ +public class UefiDevicePath { + /** + * UEFI Device path type. + */ + @Getter + private String type = ""; + /** + * UEFI Device path sub-type. + */ + private String subType = ""; + /** + * UEFI Device path human readable description. + */ + private String devPathInfo = ""; + /** + * UEFI Device path length. + */ + @Getter + private int length = 0; + + /** + * UEFI Device path constructor. + * + * @param path byte array holding device path data + * @throws java.io.UnsupportedEncodingException if path byte array contains unexpected values + */ + public UefiDevicePath(final byte[] path) throws UnsupportedEncodingException { + devPathInfo = processDevPath(path); + byte[] lengthBytes = new byte[UefiConstants.SIZE_2]; + System.arraycopy(path, UefiConstants.OFFSET_2, lengthBytes, 0, UefiConstants.OFFSET_2); + length = HexUtils.leReverseInt(lengthBytes); + } + + /** + * Returns the UEFI device sub-type. + * + * @return uefi sub-type + */ + public String getSubType() { + return subType.trim(); + } + + /** + * Processes the UEFI device path. + * UEFI device path is a collection of EFI_DEVICE_PATH_PROTOCOL structures of variable length. + * length must be calculated for each device path and used as an offset. + * devPath is terminated by 07f and 0xff per the UEFi spec. + * + * @param path byte array holding the Device path + * @return Human readable string containing the device path description. + * @throws java.io.UnsupportedEncodingException + */ + private String processDevPath(final byte[] path) throws UnsupportedEncodingException { + StringBuilder pInfo = new StringBuilder(); + int devLength = 0, pathOffset = 0, devCount = 0; + while (true) { + Byte devPath = Byte.valueOf(path[pathOffset]); + if ((devPath.intValue() == UefiConstants.TERMINATOR) + || (devPath.intValue() == UefiConstants.END_FLAG)) { + break; + } + if (devCount++ > 0) { + pInfo.append("\n"); + } + pInfo.append(processDev(path, pathOffset)); + devLength = path[pathOffset + UefiConstants.OFFSET_3] * UefiConstants.SIZE_256 + + path[pathOffset + UefiConstants.OFFSET_2]; + pathOffset = pathOffset + devLength; + if (pathOffset >= path.length) { + break; + } + } + return pInfo.toString(); + } + + /** + * Processes a specific UEFI device path, only limited set of types and subtypes are supported. + * Current types processed include Hardware Device Path, ACPI Device Path, + * Messaging Device Path, and Media Device Path. + * + * @param path + * @param offset + * @return human readable string representing the UEFI device path + * @throws java.io.UnsupportedEncodingException + */ + private String processDev(final byte[] path, final int offset) + throws UnsupportedEncodingException { + String devInfo = " "; + int devPath = path[offset]; + byte unknownSubType = path[offset + UefiConstants.OFFSET_1]; + switch (path[0 + offset]) { + case UefiConstants.DEV_HW: + type = "Hardware Device Path"; + if (devPath == UefiConstants.DEVPATH_HARWARE) { + devInfo += type + ": " + pciSubType(path, offset); + } + break; + case UefiConstants.DEV_ACPI: + type = "ACPI Device Path"; + devInfo += type + ": " + acpiSubType(path, offset); + break; + case UefiConstants.DEV_MSG: + type = "Messaging Device Path"; + if (path[offset + UefiConstants.OFFSET_1] == UefiConstants.DEV_SUB_SATA) { + devInfo += type + ": " + sataSubType(path, offset); + } else if (path[offset + UefiConstants.OFFSET_1] == UefiConstants.DEV_SUB_NVM) { + devInfo += type + ": " + nvmSubType(path, offset); + } else if (path[offset + UefiConstants.OFFSET_1] == UefiConstants.DEV_SUB_USB) { + devInfo += type + ": " + usbSubType(path, offset); + } else { + devInfo += "UEFI Messaging Device Path Type " + Integer.valueOf(unknownSubType); + } + break; + case UefiConstants.DEV_MEDIA: + type = "Media Device Path"; + if (path[offset + UefiConstants.OFFSET_1] == 0x01) { + devInfo += type + ": " + hardDriveSubType(path, offset); + } else if (path[offset + UefiConstants.OFFSET_1] == UefiConstants.DEVPATH_VENDOR) { + devInfo += type + ": " + vendorSubType(path, offset); + } else if (path[offset + UefiConstants.OFFSET_1] == UefiConstants.DEVPATH_FILE) { + devInfo += type + ": " + filePathSubType(path, offset); + } else if (path[offset + UefiConstants.OFFSET_1] == UefiConstants.DEVPATH_PWIG_FILE) { + devInfo += type + ": " + piwgFirmVolFile(path, offset); + } else if (path[offset + UefiConstants.OFFSET_1] == UefiConstants.DEVPATH_PWIG_VOL) { + devInfo += type + ": " + piwgFirmVolPath(path, offset); + } else { + devInfo += "UEFI Media Device Path Type " + Integer.valueOf(unknownSubType); + } + break; + case UefiConstants.DEV_BIOS: + type = "BIOS Device Path"; + devInfo += type + ": " + biosDevicePath(path, offset); + break; + case UefiConstants.TERMINATOR: + devInfo += "End of Hardware Device Path"; + break; + default: + devInfo += "UEFI Device Path Type " + Integer.valueOf(unknownSubType); + } + return devInfo; + } + + /** + * processes the ACPI UEFI device subtype. + * + * @param path + * @param offset + * @return acpi device info + */ + private String acpiSubType(final byte[] path, final int offset) { + subType = ""; + switch (path[offset + UefiConstants.OFFSET_1]) { + case 0x01: + subType = "(Short): "; + subType += acpiShortSubType(path, offset); + break; + case 0x02: + subType = "Expanded ACPI Device Path"; + break; + default: + subType = "Invalid ACPI Device Path sub type"; + } + return subType; + } + + /** + * Processes the ACPI short subtype. + * + * @param path + * @param offset + * @return short acpi info. + */ + private String acpiShortSubType(final byte[] path, final int offset) { + subType = ""; + byte[] hid = new byte[UefiConstants.SIZE_4]; + System.arraycopy(path, UefiConstants.OFFSET_4 + offset, hid, 0, UefiConstants.SIZE_4); + subType += "_HID = " + HexUtils.byteArrayToHexString(hid); + System.arraycopy(path, 2 * UefiConstants.SIZE_4 + offset, hid, 0, UefiConstants.SIZE_4); + subType += "_UID = " + HexUtils.byteArrayToHexString(hid); + return subType; + } + + /** + * Processes the PCI subType. + * + * @param path + * @param offset + * @return pci device info. + */ + private String pciSubType(final byte[] path, final int offset) { + subType = "PCI: PCI Function Number = "; + subType += String.format("0x%x", path[offset + UefiConstants.SIZE_4]); + subType += " PCI Device Number = "; + subType += String.format("0x%x", path[offset + UefiConstants.SIZE_5]); + return subType; + } + + /** + * processes the SATA sub type. + * + * @param path + * @param offset + * @return SATA drive info. + */ + private String sataSubType(final byte[] path, final int offset) { + subType = "SATA: HBA Port Number = "; + byte[] data = new byte[UefiConstants.SIZE_2]; + System.arraycopy(path, UefiConstants.OFFSET_4 + offset, data, 0, UefiConstants.SIZE_2); + subType += HexUtils.byteArrayToHexString(data); + System.arraycopy(path, UefiConstants.OFFSET_6 + offset, data, 0, UefiConstants.SIZE_2); + subType += " Port Multiplier = " + HexUtils.byteArrayToHexString(data); + System.arraycopy(path, UefiConstants.OFFSET_8 + offset, data, 0, UefiConstants.SIZE_2); + subType += " Logical Unit Number = " + HexUtils.byteArrayToHexString(data); + return subType; + } + + /** + * Processes the hard drive sub type. + * + * @param path + * @param offset + * @return hard drive info. + */ + private String hardDriveSubType(final byte[] path, final int offset) { + subType = "Partition Number = "; + byte[] partnumber = new byte[UefiConstants.SIZE_4]; + System.arraycopy(path, UefiConstants.OFFSET_4 + offset, partnumber, 0, UefiConstants.SIZE_4); + subType += HexUtils.byteArrayToHexString(partnumber); + byte[] data = new byte[UefiConstants.SIZE_8]; + System.arraycopy(path, UefiConstants.OFFSET_8 + offset, data, 0, UefiConstants.SIZE_8); + subType += " Partition Start = " + HexUtils.byteArrayToHexString(data); + System.arraycopy(path, UefiConstants.OFFSET_16 + offset, data, 0, UefiConstants.SIZE_8); + subType += " Partition Size = " + HexUtils.byteArrayToHexString(data); + byte[] signature = new byte[UefiConstants.SIZE_16]; + System.arraycopy(path, UefiConstants.OFFSET_24 + offset, signature, 0, UefiConstants.SIZE_16); + subType += "\n Partition Signature = "; + if (path[UefiConstants.OFFSET_41 + offset] == UefiConstants.DRIVE_SIG_NONE) { + subType += "None"; + } else if (path[UefiConstants.OFFSET_41 + offset] == UefiConstants.DRIVE_SIG_32BIT) { + subType += HexUtils.byteArrayToHexString(signature); + } else if (path[UefiConstants.OFFSET_41 + offset] == UefiConstants.DRIVE_SIG_GUID) { + UefiGuid guid = new UefiGuid(signature); + subType += guid.toString(); + } else { + subType += "invalid partition signature type"; + } + subType += " Partition Format = "; + if (path[UefiConstants.OFFSET_40 + offset] == UefiConstants.DRIVE_TYPE_PC_AT) { + subType += " PC-AT compatible legacy MBR"; + } else if (path[UefiConstants.OFFSET_40 + offset] == UefiConstants.DRIVE_TYPE_GPT) { + subType += " GUID Partition Table"; + } else { + subType += " Invalid partition table type"; + } + return subType; + } + + /** + * Process the File path sub type. + * + * @param path + * @param offset + * @return file path info. + */ + private String filePathSubType(final byte[] path, final int offset) { + subType = "File Path = "; + byte[] lengthBytes = new byte[UefiConstants.SIZE_2]; + System.arraycopy(path, 2 + offset, lengthBytes, 0, UefiConstants.SIZE_2); + int subTypeLength = HexUtils.leReverseInt(lengthBytes); + byte[] filePath = new byte[subTypeLength]; + System.arraycopy(path, UefiConstants.OFFSET_4 + offset, filePath, 0, subTypeLength); + byte[] fileName = convertChar16tobyteArray(filePath); + subType += new String(fileName, StandardCharsets.UTF_8); + return subType; + } + + /** + * Process a vendor sub-type on a Media Type. + * Length of this structure in bytes. Length is 20 + n bytes + * Vendor-assigned GUID that defines the data that follows. + * Vendor-defined variable size data. + * + * @param path + * @param offset + * @return vendor device info. + */ + private String vendorSubType(final byte[] path, final int offset) { + subType = "Vendor Subtype GUID = "; + byte[] lengthBytes = new byte[UefiConstants.SIZE_2]; + System.arraycopy(path, UefiConstants.OFFSET_2 + offset, lengthBytes, 0, UefiConstants.SIZE_2); + int subTypeLength = HexUtils.leReverseInt(lengthBytes); + byte[] guidData = new byte[UefiConstants.SIZE_16]; + System.arraycopy(path, UefiConstants.OFFSET_4 + offset, guidData, 0, UefiConstants.SIZE_16); + UefiGuid guid = new UefiGuid(guidData); + subType += guid.toString() + " "; + if (subTypeLength - UefiConstants.SIZE_16 > 0) { + byte[] vendorData = new byte[subTypeLength - UefiConstants.SIZE_16]; + System.arraycopy(path, UefiConstants.OFFSET_20 + + offset, vendorData, 0, subTypeLength - UefiConstants.SIZE_16); + subType += " : Vendor Data = " + HexUtils.byteArrayToHexString(vendorData); + } else { + subType += " : No Vendor Data pesent"; + } + return subType; + } + + /** + * Returns USB device info. + * UEFI Specification, Version 2.8. + * + * @param path + * @param offset + * @return USB device info. + */ + private String usbSubType(final byte[] path, final int offset) { + subType = " USB "; + subType += " port = " + Integer.valueOf(path[offset + UefiConstants.OFFSET_4]); + subType += " interface = " + Integer.valueOf(path[offset + UefiConstants.OFFSET_5]); + byte[] lengthBytes = new byte[UefiConstants.SIZE_2]; + System.arraycopy(path, UefiConstants.OFFSET_2 + offset, lengthBytes, 0, UefiConstants.SIZE_2); + int subTypeLength = HexUtils.leReverseInt(lengthBytes); + byte[] usbData = new byte[subTypeLength]; + System.arraycopy(path, UefiConstants.OFFSET_4 + offset, usbData, 0, subTypeLength); + // Todo add further USB processing ... + return subType; + } + + /** + * Returns NVM device info. + * UEFI Specification, Version 2.8. + * Name space Identifier (NSID) and IEEE Extended Unique Identifier (EUI-64): + * See Links to UEFI Related Documents + * (http://uefi.org/uefi under the headings NVM Express Specification. + * + * @param path + * @param offset + * @return NVM device info. + */ + private String nvmSubType(final byte[] path, final int offset) { + subType = "NVM Express Namespace = "; + byte[] lengthBytes = new byte[UefiConstants.SIZE_2]; + System.arraycopy(path, UefiConstants.OFFSET_2 + offset, lengthBytes, 0, UefiConstants.SIZE_2); + int subTypeLength = HexUtils.leReverseInt(lengthBytes); + byte[] nvmData = new byte[subTypeLength]; + System.arraycopy(path, UefiConstants.OFFSET_4 + offset, nvmData, 0, subTypeLength); + subType += HexUtils.byteArrayToHexString(nvmData); + return subType; + } + + /** + * BIOS Device Type definition. + * From Appendix A of the BIOS Boot Specification. + * Only processes the Device type. + * Status bootHandler pointer, and description String pointer are ignored. + * + * @param path byte array holding the device path. + * @return String that represents the UEFI defined BIOS Device Type. + */ + private String biosDevicePath(final byte[] path, final int offset) { + subType = "Legacy BIOS : Type = "; + Byte pathType = Byte.valueOf(path[offset + 1]); + switch (pathType.intValue()) { + case UefiConstants.DEVPATH_BIOS_RESERVED: + subType += "Reserved"; + break; + case UefiConstants.DEVPATH_BIOS_FLOPPY: + subType += "Floppy"; + break; + case UefiConstants.DEVPATH_BIOS_HD: + subType += "Hard Disk"; + break; + case UefiConstants.DEVPATH_BIOS_CD: + subType += "CD-ROM"; + break; + case UefiConstants.DEVPATH_BIOS_PCM: + subType += "PCMCIA"; + break; + case UefiConstants.DEVPATH_BIOS_USB: + subType += "USB"; + break; + case UefiConstants.DEVPATH_BIOS_EN: + subType += "Embedded network"; + break; + case UefiConstants.DEVPATH_BIOS_BEV: + subType += + "Bootstrap Entry Vector (BEV) from an Option ROM"; + break; + default: + subType += "Unknown"; + break; + } + return subType; + } + + /** + * Returns PIWG firmware volume info. + * UEFI Specification, Version 2.8. + * PIWG Firmware File Section 10.3.5.6: + * Contents are defined in the UEFI PI Specification. + * + * @param path + * @param offset + * @return String that represents the PIWG Firmware Volume Path + */ + private String piwgFirmVolFile(final byte[] path, final int offset) { + subType = "PIWG Firmware File "; + byte[] guidData = new byte[UefiConstants.SIZE_16]; + System.arraycopy(path, UefiConstants.OFFSET_4 + offset, guidData, 0, UefiConstants.SIZE_16); + UefiGuid guid = new UefiGuid(guidData); + subType += guid.toString(); + return subType; + } + + /** + * Returns PIWG firmware file info. + * UEFI Specification, Version 2.8. + * PIWG Firmware Volume Section 10.3.5.7: + * Contents are defined in the UEFI PI Specification. + * + * @param path + * @param offset + * @return String that represents the PIWG Firmware Volume Path + */ + private String piwgFirmVolPath(final byte[] path, final int offset) { + subType = "PIWG Firmware Volume "; + byte[] guidData = new byte[UefiConstants.SIZE_16]; + System.arraycopy(path, UefiConstants.OFFSET_4 + offset, guidData, 0, UefiConstants.SIZE_16); + UefiGuid guid = new UefiGuid(guidData); + subType += guid.toString(); + return subType; + } + + /** + * Returns a string that represents the UEFi Device path. + * + * @return UEFi Device path. + */ + public String toString() { + return devPathInfo; + } + + /** + * Converts from a char array to byte array. + * Removes the upper byte (typically set to 0) of each char. + * + * @param data Character array. + * @return byte array. + */ + public static byte[] convertChar16tobyteArray(final byte[] data) { + byte[] hexdata = new byte[data.length]; + int j = 0; + for (int i = 0; i < data.length; i = i + UefiConstants.SIZE_2) { + hexdata[j++] = data[i]; + } + return hexdata; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiFirmware.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiFirmware.java new file mode 100644 index 00000000..3dd34f52 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiFirmware.java @@ -0,0 +1,75 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + +import hirs.attestationca.portal.utils.HexUtils; +import lombok.Getter; + +import java.math.BigInteger; + +/** + * Class to process the PFP defined UEFI_PLATFORM_FIRMWARE_BLOB structure. + *

+ * typedef struct tdUEFI_PLATFORM_FIRMWARE_BLOB { + * UEFI_PHYSICAL_ADDRESS BlobBase; + * UINT64 BlobLength; + * } UEFI_PLATFORM_FIRMWARE_BLOB; + */ +public class UefiFirmware { + private boolean bError = false; + /** + * byte array holding the firmwares physical address. + */ + private byte[] physicalAddress = null; + /** + * byte array holding the uefi address length. + */ + private byte[] addressLength = null; + /** + * uefi physical address. + */ + @Getter + private int physicalBlobAddress = 0; + /** + * uefi address length. + */ + @Getter + private int blobLength = 0; + + /** + * UefiFirmware constructor. + * + * @param blob byte array holding a Firmware Blob. + */ + public UefiFirmware(final byte[] blob) { + if (blob.length != UefiConstants.SIZE_16) { + bError = true; + } else { + physicalAddress = new byte[UefiConstants.SIZE_8]; + addressLength = new byte[UefiConstants.SIZE_8]; + System.arraycopy(blob, 0, physicalAddress, 0, UefiConstants.SIZE_8); + System.arraycopy(blob, UefiConstants.SIZE_8, addressLength, 0, UefiConstants.SIZE_8); + byte[] lelength = HexUtils.leReverseByte(addressLength); + BigInteger bigIntLength = new BigInteger(lelength); + blobLength = bigIntLength.intValue(); + byte[] leAddress = HexUtils.leReverseByte(physicalAddress); + BigInteger bigIntAddress = new BigInteger(leAddress); + physicalBlobAddress = bigIntAddress.intValue(); + } + } + + /** + * Returns a description of the firmware blobs location. + * + * @return a description of the the firmware blobs location. + */ + public String toString() { + StringBuilder blobInfo = new StringBuilder(); + if (!bError) { + blobInfo.append(String.format(" Platform Firmware Blob Address = %s", + Integer.toHexString(physicalBlobAddress))); + blobInfo.append(String.format(" length = %d", blobLength)); + } else { + blobInfo.append(" Invalid Firmware Blob event encountered"); + } + return blobInfo.toString(); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiGuid.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiGuid.java new file mode 100644 index 00000000..5372dd80 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiGuid.java @@ -0,0 +1,193 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + +import com.eclipsesource.json.JsonObject; +import hirs.attestationca.portal.utils.HexUtils; +import hirs.attestationca.portal.utils.JsonUtils; + +import java.math.BigInteger; +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.util.UUID; + +/** + * Class to process GUID per the UEFI specification + * GUIDs are essentially UUID as defined by RFC-1422, however Microsoft refers to GUIDS. + */ +public class UefiGuid { + /** + * number of 100ns intervals since UUID Epoch. + */ + private static final long UUID_EPOCH_INTERVALS = 0x01b21dd213814000L; + /** + * used for conversion to uuid time. + */ + private static final int UUID_EPOCH_DIVISOR = 10000; + + private static final Path JSON_PATH = FileSystems.getDefault().getPath("/opt", + "hirs", "default-properties", "vendor-table.json"); + private JsonObject uefiVendorRef; + /** + * guid byte array. + */ + private byte[] guid; + /** + * UUID object. + */ + private UUID uuid; + + /** + * UefiGUID constructor. + * + * @param guidBytes byte array holding a valid guid. + */ + public UefiGuid(final byte[] guidBytes) { + guid = new byte[UefiConstants.SIZE_16]; + System.arraycopy(guidBytes, 0, guid, 0, UefiConstants.SIZE_16); + uuid = processGuid(guidBytes); + uefiVendorRef = JsonUtils.getSpecificJsonObject(JSON_PATH, "VendorTable"); + } + + /** + * UefiGUID constructor. + * + * @param guidBytes byte array holding a valid guid. + * @param vendorPathString string path for vendor + */ + public UefiGuid(final byte[] guidBytes, final Path vendorPathString) { + guid = new byte[UefiConstants.SIZE_16]; + System.arraycopy(guidBytes, 0, guid, 0, UefiConstants.SIZE_16); + uuid = processGuid(guidBytes); + uefiVendorRef = JsonUtils.getSpecificJsonObject(vendorPathString, + "VendorTable"); + } + + /** + * Converts a GUID with a byte array to a RFC-1422 UUID object. + * Assumes a MS format and converts to Big Endian format used by most others , including Linux + * Matched uuids found in /sys/firmware/efi/efivars on Centos 7. + */ + private static UUID processGuid(final byte[] guid) { + byte[] msb1 = new byte[UefiConstants.SIZE_4]; + System.arraycopy(guid, 0, msb1, 0, UefiConstants.SIZE_4); + byte[] msb1r = HexUtils.leReverseByte(msb1); + byte[] msb2 = new byte[UefiConstants.SIZE_4]; + System.arraycopy(guid, UefiConstants.OFFSET_4, msb2, 0, UefiConstants.SIZE_4); + byte[] msb2r = HexUtils.leReverseByte(msb2); + byte[] msb2rs = new byte[UefiConstants.SIZE_4]; + System.arraycopy(msb2r, 0, msb2rs, UefiConstants.OFFSET_2, UefiConstants.SIZE_2); + System.arraycopy(msb2r, UefiConstants.OFFSET_2, msb2rs, 0, UefiConstants.SIZE_2); + byte[] msbt = new byte[UefiConstants.SIZE_8]; + System.arraycopy(msb1r, 0, msbt, 0, UefiConstants.SIZE_4); + System.arraycopy(msb2rs, 0, msbt, UefiConstants.OFFSET_4, UefiConstants.SIZE_4); + long msbl = new BigInteger(msbt).longValue(); + byte[] lsb = new byte[UefiConstants.SIZE_8]; + System.arraycopy(guid, UefiConstants.OFFSET_8, lsb, 0, UefiConstants.SIZE_8); + long lsbl = new BigInteger(lsb).longValue(); + return new UUID(msbl, lsbl); + } + + /** + * Returns the standard GUID length. + * + * @return guid length + */ + public static int getGuidLength() { + return UefiConstants.SIZE_16; + } + + /** + * Returns a String that represents a specification name referenced by the + * EFI_CONFIGURATION_TABLE VendorGUID field. For structure of + * EFI_CONFIGURATION_TABLE type, the UEFI specification has set of GUIDs + * published that represent standards that one can find further information on + * the configuration table being referenced. + * Refer to section 4.6 of UEFI spec v 2.8, page 101. + * + * @return A String of major UUID parameters + */ + public String getVendorTableReference() { + return getVendorTableReference(uuid.toString().toLowerCase()); + } + + /** + * Returns a String that represents a specification name referenced by the + * EFI_CONFIGURATION_TABLE VendorGUID field. For structure of + * EFI_CONFIGURATION_TABLE type, the UEFI specification has set of GUIDs + * published that represent standards that one can find further + * information on the configuration table being referenced. + * Refer to section 4.6 of UEFI spec v 2.8, page 101. + * + * @param lookupValue specific value to look up + * @return A String of major UUID parameters + */ + public String getVendorTableReference(final String lookupValue) { + return uefiVendorRef.getString(lookupValue, "Unknown GUID reference"); + } + + /** + * Returns a string of the entity that the UUID represents. + * Contains a Vendor String lookup on the UUID. + * + * @return UUID description. + */ + public String toString() { + return String.format("%s : %s", uuid.toString(), getVendorTableReference()); + } + + /** + * Returns a string of the entity that the UUID represents. + * Does not contain a vendor lookup on the UUID. + * + * @return UUID description. + */ + public String toStringNoLookup() { + return uuid.toString(); + } + + /** + * Returns a string of the entity that the UUID represents. + * Does not contain a vendor lookup on the UUID. + * + * @param guid byte array holding the guid data. + * @return true if the UUID has a valid structure. + */ + public static boolean isValidUUID(final byte[] guid) { + boolean valid = false; + UUID tmpUuid = processGuid(guid); + if (tmpUuid.toString().length() != 0) { + valid = true; + } + return valid; + } + + /** + * Checks to see if the uuid is the test or Empty UUID ("00000000-0000-0000-0000-000000000000"). + * + * @return true if the uuid is the Empty UUID, false if not + */ + public boolean isEmptyUUID() { + return uuid.toString().equals("00000000-0000-0000-0000-000000000000"); + } + + /** + * Checks to see if the uuid is the Empty UUID or an unknown. + * + * @return true if the uuid is the Empty UUID, false if not + */ + public boolean isUnknownUUID() { + if (getVendorTableReference().equals("Unknown GUID reference")) { + return true; + } + return false; + } + + /** + * Retrieves the timestamp within a time based GUID. + * + * @param uuid uuid object + * @return long representing the time stamp from the GUID + */ + public long getTimeFromUUID(final UUID uuid) { + return (uuid.timestamp() - UUID_EPOCH_INTERVALS) / UUID_EPOCH_DIVISOR; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiPartition.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiPartition.java new file mode 100644 index 00000000..d9460bcf --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiPartition.java @@ -0,0 +1,93 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + +import hirs.attestationca.portal.utils.HexUtils; +import lombok.Getter; + +import java.nio.charset.StandardCharsets; + +/** + * Class to process EFI Partitions for EFI Partition tables defined in UEFI section 5.3.3 + * typedef struct { + * EFI_GUID PartitionTypeGUID; + * EFI_GUID UniquePartitionGUID; + * EFI_LBA StartingLBA; // Same as UINT64. + * EFI_LBA EndingLBA; + * UINT64 Attributes; + * CHAR16 PartitionName[36]; // 36 CHAR16 = 72 Bytes + * } EFI_PARTITION_ENTRY; + *

+ * UEFI Table 23. Defined GPT Partition Entry - Partition Type GUIDs (implemented in EFIGui.java) + * Examples: + * Unused Entry 00000000-0000-0000-0000-000000000000 + * EFI System Partition C12A7328-F81F-11D2-BA4B-00A0C93EC93B + * Partition containing a legacy MBR 024DEE41-33E7-11D3-9D69-0008C781F39F + * Linux filesystem data 0FC63DAF-8483-4772-8E79-3D69D8477DE4 + * Logical Volume Manager (LVM) partition E6D6D379-F507-44C2-A23C-238F2A3DF928 + * Plain dm-crypt partition 7FFEC5C9-2D00-49B7-8941-3EA10A5586B7 + * Root partition (x86-64) 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 + * RAID partition A19D880F-05FC-4D3B-A006-743F0F84911E + * LUKS partition CA7D7CCB-63ED-4C53-861C-1742536059CC + *

+ * linux commands to check uuids: + * blkid list //unique parition guids + * ls /dev/disk/by-partuuid + */ +@Getter +public class UefiPartition { + private UefiGuid partitionTypeGUID = null; + private UefiGuid uniquePartitionGUID = null; + private String partitionName = ""; + private String attributes = ""; + + /** + * Processes a UEFI defined partition entry. + * + * @param table byte array holding the partition table. + */ + public UefiPartition(final byte[] table) { + byte[] partitionGuidBytes = new byte[UefiConstants.SIZE_16]; + System.arraycopy(table, 0, partitionGuidBytes, 0, UefiConstants.SIZE_16); + partitionTypeGUID = new UefiGuid(partitionGuidBytes); + byte[] uniquePartGuidBytes = new byte[UefiConstants.SIZE_16]; + System.arraycopy(table, UefiConstants.SIZE_16, uniquePartGuidBytes, 0, UefiConstants.SIZE_16); + uniquePartitionGUID = new UefiGuid(uniquePartGuidBytes); + byte[] attributeBytes = new byte[UefiConstants.SIZE_8]; + System.arraycopy(table, UefiConstants.ATTRIBUTE_LENGTH, attributeBytes, + 0, UefiConstants.SIZE_8); + attributes = HexUtils.byteArrayToHexString(attributeBytes); + byte[] partitionNameBytes = new byte[UefiConstants.UEFI_PT_LENGTH]; + System.arraycopy(table, UefiConstants.PART_NAME_LENGTH, partitionNameBytes, + 0, UefiConstants.UEFI_PT_LENGTH); + byte[] pName = convertChar16tobyteArray(partitionNameBytes); + partitionName = new String(pName, StandardCharsets.UTF_8).trim(); + } + + /** + * Returns a description of the partition. + * + * @return partition description. + */ + public String toString() { + String partitionInfo = ""; + partitionInfo += " Partition Name : " + partitionName + "\n"; + partitionInfo += " Partition Type GUID : " + partitionTypeGUID.toString() + "\n"; + partitionInfo += " Unique Partition GUID : " + uniquePartitionGUID.toStringNoLookup() + "\n"; + partitionInfo += " Attributes : " + attributes; + return partitionInfo; + } + + /** + * Copies character array to a byte by removing upper byte of character array. + * + * @param data input char array + * @return byte array + */ + private byte[] convertChar16tobyteArray(final byte[] data) { + byte[] hexdata = new byte[data.length]; + int j = 0; + for (int i = 0; i < data.length; i += 2) { + hexdata[j++] = data[i]; + } + return hexdata; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiSecureBoot.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiSecureBoot.java new file mode 100644 index 00000000..3afdfabc --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiSecureBoot.java @@ -0,0 +1,57 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + +import lombok.Getter; + +import java.math.BigInteger; + +/** + * Class that processes the UEFI defined SecureBoot Variable. + * Currently this variable only specifies if SecureBoot is on/off. + */ +public class UefiSecureBoot { + /** + * Variable value. + */ + @Getter + private int secureBootVariable = 0; + /** + * Error flag. + */ + private boolean berror = false; + /** + * Human readable description. + */ + private String info = ""; + + /** + * Constructor to process the EFI Secure Boot Variable. + * + * @param data UEFI variable data. + */ + public UefiSecureBoot(final byte[] data) { + if (data.length == 0) { + berror = true; + info = "Unknown State: Empty Secure Boot variable\n"; + } else { + secureBootVariable = new BigInteger(data).intValue(); + } + } + + /** + * Provides a human readable value for the Secure Boot variable. + * + * @return Human readable description. + */ + public String toString() { + if (!berror) { + if (secureBootVariable == 1) { + info += " Secure Boot is enabled "; + } else if (secureBootVariable == 0) { + info += " Secure Boot is NOT enabled "; + } else { + info += " Unkown State: Secure Variable is undefined "; + } + } + return info; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiSignatureData.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiSignatureData.java new file mode 100644 index 00000000..4a47258f --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiSignatureData.java @@ -0,0 +1,172 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + +import hirs.attestationca.portal.utils.HexUtils; +import lombok.Getter; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.math.BigInteger; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; + +/** + * Class for processing the contents of a Secure Boot DB or DBX contents. + * used for EFIVariables associated with Secure Boot + * as defined by Section 32.4.1 Signature Database from the UEFI 2.8 specification + *

+ * typedef struct _EFI_SIGNATURE_DATA { + * EFI_GUID SignatureOwner; + * UINT8 SignatureData[...]; + * } EFI_SIGNATURE_DATA; + *

+ * However page 1729 0f UEFI 2.8 implies that SignatureListType of EFI_CERT_SHA256_GUID + * will contain the "the SHA-256 hash of the binary". + * So the Signature Data depends upon the Signature Type from the EFI Signature List. + */ +public class UefiSignatureData { + /** + * UEFI Certificate GUID. + */ + private byte[] guid = new byte[UefiConstants.SIZE_16]; + /** + * UEFI Signature data. + */ + private byte[] sigData = null; + /** + * UEFI Certificate object . + */ + @Getter + private UefiX509Cert cert = null; + /** + * UEFI Certificate GUID. + */ + @Getter + private UefiGuid efiVarGuid = null; + /** + * UEFI Signature type. + */ + @Getter + private UefiGuid signatureType = null; + /** + * UEFI Signature validity. + */ + @Getter + private boolean valid = false; + /** + * UEFI Certificate SHA1 hash. + */ + private byte[] binaryHash = new byte[UefiConstants.SIZE_40]; + /** + * UEFI Signature data status. + */ + @Getter + private String status = "Signature Data contains a valid Certificate"; + + /** + * UefiSignatureData constructor. + * + * @param inputStream The Signature data. + * @param sigType UEFI defined signature type. + * @throws java.io.IOException if there's an problem reading the input stream. + * @throws java.security.cert.CertificateException If there a problem parsing the X509 certificate. + * @throws java.security.NoSuchAlgorithmException if there's a problem hashing the certificate. + */ + UefiSignatureData(final ByteArrayInputStream inputStream, final UefiGuid sigType) + throws IOException, CertificateException, NoSuchAlgorithmException { + signatureType = sigType; + // UEFI spec section 32.5.3.3 states that SignatureListType of EFI_CERT_SHA256_GUID + // only contains a hash, not a cert + if (sigType.getVendorTableReference().equals("EFI_CERT_SHA256_GUID")) { + inputStream.read(guid); + efiVarGuid = new UefiGuid(guid); + // Should be a SHA256 hash of the "binary" + inputStream.read(binaryHash); + } else if (sigType.getVendorTableReference().equals("EFI_CERT_X509_GUID")) { + inputStream.read(guid); + efiVarGuid = new UefiGuid(guid); + // Read in Type and Length separately so we calculate the rest of the cert size + byte[] certType = new byte[UefiConstants.SIZE_2]; + inputStream.read(certType); + byte[] certLength = new byte[UefiConstants.SIZE_2]; + inputStream.read(certLength); + int cLength = new BigInteger(certLength).intValue() + UefiConstants.SIZE_4; + byte[] certData = new byte[cLength]; + inputStream.read(certData); + // put the cert back together + byte[] certBlob = new byte[cLength + UefiConstants.SIZE_4]; + System.arraycopy(certType, 0, certBlob, 0, UefiConstants.SIZE_2); + System.arraycopy(certLength, 0, certBlob, UefiConstants.OFFSET_2, UefiConstants.SIZE_2); + System.arraycopy(certData, 0, certBlob, UefiConstants.OFFSET_4, cLength); + cert = new UefiX509Cert(certBlob); + } else if (sigType.isUnknownUUID()) { + //status = "Signature List Type has an unknown GUID: " + efiGuid.toString(); + status = "Signature List Type has an unknown GUID"; + return; + } else { // else process as a cert (RH SHIM does this) + processC509Cert(inputStream); + efiVarGuid = sigType; + } + valid = true; + } + + /** + * Default EFISignatureData Constructor. + * + * @param data byte array of the EFISignatureData to process + * @throws java.security.cert.CertificateException If there a problem parsing the X509 certificate. + * @throws java.security.NoSuchAlgorithmException if there's a problem hashing the certificate. + */ + UefiSignatureData(final byte[] data) throws CertificateException, NoSuchAlgorithmException { + System.arraycopy(data, 0, guid, 0, UefiConstants.SIZE_16); + sigData = new byte[data.length - UefiConstants.SIZE_16]; + System.arraycopy(data, UefiConstants.OFFSET_16, sigData, 0, data.length - UefiConstants.SIZE_16); + cert = new UefiX509Cert(sigData); + efiVarGuid = new UefiGuid(guid); + } + + /** + * Processes an x509 Cert used by secure DB or DBx. + * + * @param inputStream x509 certificate data. + * @throws java.io.IOException is there's a problem reading the data. + * @throws java.security.cert.CertificateException if there's a problem parsing the certificate. + * @throws java.security.NoSuchAlgorithmException if there's a problem creating a hash. + */ + private void processC509Cert(final ByteArrayInputStream inputStream) + throws IOException, CertificateException, NoSuchAlgorithmException { + byte[] certType = new byte[UefiConstants.SIZE_2]; + inputStream.read(certType); + byte[] certLength = new byte[UefiConstants.SIZE_2]; + inputStream.read(certLength); + int cLength = new BigInteger(certLength).intValue() + UefiConstants.SIZE_4; + byte[] certData = new byte[cLength]; + inputStream.read(certData); + // put the cert back together + byte[] certBlob = new byte[cLength + UefiConstants.SIZE_4]; + System.arraycopy(certType, 0, certBlob, 0, 2); + System.arraycopy(certLength, 0, certBlob, 2, 2); + System.arraycopy(certData, 0, certBlob, UefiConstants.OFFSET_4, cLength); + cert = new UefiX509Cert(certBlob); + } + + /** + * Provides a description of the fields within the EFI Signature Data. + * + * @return X509Cert human readable description. + */ + public String toString() { + String sigInfo = ""; + if (!valid) { + sigInfo = status; + } else { + if (signatureType.getVendorTableReference().equals("EFI_CERT_SHA256_GUID")) { + sigInfo += "UEFI Signature Owner = " + efiVarGuid.toString() + "\n"; + sigInfo += " Binary Hash = " + HexUtils.byteArrayToHexString(binaryHash) + "\n"; + } else { + sigInfo += "UEFI Signature Owner = " + efiVarGuid.toString() + "\n"; + sigInfo += cert.toString(); + } + } + return sigInfo; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiSignatureList.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiSignatureList.java new file mode 100644 index 00000000..237966a4 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiSignatureList.java @@ -0,0 +1,225 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + +import hirs.attestationca.portal.utils.HexUtils; +import lombok.Getter; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.util.ArrayList; + +/** + * Class for processing the contents of a Secure Boot DB or DBX contents. + * used for EFIVariables associated with Secure Boot + * as defined by Section 32.4.1 Signature Database from the UEFI 2.8 specification. + *

+ * An EFI Signature List is actual a list of Certificates used to verify a Signature. + * This is mainly found in PCR[7] UEFI variables for the Secure Boot PK, KEK, Db and DBx variables. + *

+ * typedef struct _EFI_SIGNATURE_LIST { + * EFI_GUID SignatureType; + * UINT32 SignatureListSize; + * UINT32 SignatureHeaderSize; + * UINT32 SignatureSize; + * // UINT8 SignatureHeader[SignatureHeaderSize]; + * // EFI_SIGNATURE_DATA Signatures[...][SignatureSize]; + * } EFI_SIGNATURE_LIST; + */ +public class UefiSignatureList { + /** + * Size of the signature list. + */ + private int listSize = 0; + /** + * Size of a signature. + */ + private int signatureSize = 0; + /** + * Signature data. + */ + private byte[] sigData = null; + /** + * Number of Items in the list. + */ + @Getter + private int numberOfCerts = 0; + /** + * Signature validity. + */ + private boolean valid = true; + /** + * Current status. + */ + private String status = "Signature List is Valid"; + /** + * Array List of Signature found in the list. + */ + private ArrayList sigList = new ArrayList(); + /** + * Input Stream for processing. + */ + private ByteArrayInputStream efiSigDataIS = null; + /** + * Type of signature. + */ + private UefiGuid signatureType = null; + + /** + * UefiSignatureList constructor. + * + * @param list byte array holding the signature list. + * @throws java.security.cert.CertificateException If there a problem parsing the X509 certificate. + * @throws java.security.NoSuchAlgorithmException if there's a problem hashing the certificate. + * @throws java.io.IOException If there's a problem parsing the signature data. + */ + UefiSignatureList(final byte[] list) + throws CertificateException, NoSuchAlgorithmException, IOException { + + byte[] guid = new byte[UefiConstants.SIZE_16]; + System.arraycopy(list, 0, guid, 0, UefiConstants.SIZE_16); + signatureType = new UefiGuid(guid); + + byte[] lSize = new byte[UefiConstants.SIZE_4]; + System.arraycopy(list, UefiConstants.OFFSET_16, lSize, 0, UefiConstants.SIZE_4); + listSize = HexUtils.leReverseInt(lSize); + + byte[] hSize = new byte[UefiConstants.SIZE_4]; + System.arraycopy(list, UefiConstants.OFFSET_20, hSize, 0, UefiConstants.SIZE_4); + + byte[] sSize = new byte[UefiConstants.SIZE_4]; + System.arraycopy(list, UefiConstants.OFFSET_24, sSize, 0, UefiConstants.SIZE_4); + signatureSize = HexUtils.leReverseInt(sSize); + + sigData = new byte[signatureSize]; + System.arraycopy(list, UefiConstants.OFFSET_28, sigData, 0, signatureSize); + processSignatureList(sigData); + } + + /** + * EFI Signature list constructor. + * + * @param lists ByteArrayInputStream containing an EFI Signature list. + * @throws java.io.IOException If there's a problem in reading he input stream. + * @throws java.security.cert.CertificateException If there's a problem parsing the X509 certificate. + * @throws java.security.NoSuchAlgorithmException if there's a problem hashing the certificate. + */ + UefiSignatureList(final ByteArrayInputStream lists) + throws IOException, CertificateException, NoSuchAlgorithmException { + byte[] guid = new byte[UefiConstants.SIZE_16]; + lists.read(guid); + signatureType = new UefiGuid(guid); + + if (!isValidSigListGUID(signatureType)) { + processSignatureData(lists); + } else { // valid SigData Processing + byte[] lSize = new byte[UefiConstants.SIZE_4]; + lists.read(lSize); + listSize = HexUtils.leReverseInt(lSize); + + byte[] hSize = new byte[UefiConstants.SIZE_4]; + lists.read(hSize); + + byte[] sSize = new byte[UefiConstants.SIZE_4]; + lists.read(sSize); + signatureSize = listSize - UefiConstants.SIZE_28; + sigData = new byte[signatureSize]; + lists.read(sigData); + processSignatureList(sigData); + } + } + + /** + * Method for processing a set of EFI SignatureList(s). + * + * @param efiSigData Byte array holding one or more SignatureLists + * @throws java.security.cert.CertificateException If there's a problem parsing the X509 certificate. + * @throws java.security.NoSuchAlgorithmException if there's a problem hashing the certificate. + * @throws java.io.IOException If there's a problem parsing the signature data. + */ + private void processSignatureList(final byte[] efiSigData) + throws CertificateException, NoSuchAlgorithmException, IOException { + efiSigDataIS = new ByteArrayInputStream(efiSigData); + while (efiSigDataIS.available() > 0) { + UefiSignatureData tmpSigData = new UefiSignatureData(efiSigDataIS, signatureType); + if (!tmpSigData.isValid()) { + valid = false; + status = tmpSigData.getStatus(); + break; + } + sigList.add(tmpSigData); + numberOfCerts++; + } + } + + /** + * Method for processing a set of EFI SignatureList(s). + * + * @param sigDataIS Byte array holding one or more SignatureLists. + * @throws java.security.cert.CertificateException If there's a problem parsing the X509 certificate. + * @throws java.security.NoSuchAlgorithmException if there's a problem hashing the certificate. + * @throws java.io.IOException If there's a problem parsing the signature data. + */ + private void processSignatureData(final ByteArrayInputStream sigDataIS) + throws CertificateException, NoSuchAlgorithmException, IOException { + while (sigDataIS.available() > 0) { + UefiSignatureData tmpigData = new UefiSignatureData(sigDataIS, signatureType); + if (!tmpigData.isValid()) { + valid = false; + status = tmpigData.getStatus(); + break; + } + sigList.add(tmpigData); + numberOfCerts++; + } + } + + /** + * Returns an ArrayList of EFISignatureData objects. + * + * @return ArrayList of EFISignatureData objects. + */ + public ArrayList getSignatureDataList() { + return sigList; + } + + /** + * Checks to see if GUID is listed on page 1729 of UEFI spec version 2.8. + * + * @param guid GUID of the has algorithm. + * @return true if the GUID is a valid GUID for Signature List Type, false if not. + */ + public boolean isValidSigListGUID(final UefiGuid guid) { + switch (guid.getVendorTableReference()) { + case "EFI_CERT_SHA256_GUID": + case "EFI_CERT_X509_SHA256": + case "EFI_CERT_X509_SHA384": + case "EFI_CERT_X509_SHA512": + case "EFI_CERT_X509_GUID": + return true; + default: + return false; + } + } + + /** + * Provides a description of the fields within the EFI Signature Data field. + * Which is essentially a list of X509 certificates. + * + * @return human readable description. + */ + public String toString() { + StringBuilder sigInfo = new StringBuilder(); + sigInfo.append("UEFI Signature List Type = " + signatureType.toString() + "\n"); + sigInfo.append("Number if items = " + numberOfCerts + "\n"); + sigList.iterator(); + for (int i = 0; i < sigList.size(); i++) { + UefiSignatureData certData = sigList.get(i); + sigInfo.append(certData.toString()); + } + if (!valid) { + sigInfo.append("*** Invalid UEFI Signature data encountered: " + status + "\n"); + } + return sigInfo.toString(); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiVariable.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiVariable.java new file mode 100644 index 00000000..dc3c60fa --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiVariable.java @@ -0,0 +1,204 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + +import hirs.attestationca.portal.utils.HexUtils; +import lombok.Getter; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.util.ArrayList; + +/** + * Class to process a UEFI variable within a TPM Event. + * typedef struct tdUEFI_VARIABLE_DATA{ + * UEFI_GUID VariableName; (16 bytes) + * UINT64 UnicodeNameLength; (8 bytes) + * UINT64 VariableDataLength; (8 bytes) + * CHAR16 UnicodeName[]; + * INT8 VariableData[]; + * } UEFI_VARIABLE_DATA + */ +public class UefiVariable { + + /** + * UEFI defined variable identifier GUID. + */ + @Getter + private UefiGuid uefiVarGuid = null; + /** + * List of Signature lists. + */ + @Getter + private ArrayList certSuperList = new ArrayList<>(); + /** + * Name of the UEFI variable. + */ + @Getter + private String efiVarName = ""; + /** + * UEFI defined Boot Variable. + */ + private UefiBootVariable bootv = null; + /** + * UEFI Defined boot order. + */ + private UefiBootOrder booto = null; + /** + * UEFI defined secure boot. + */ + private UefiSecureBoot sb = null; + /** + * UEFI variable data. + */ + private byte[] uefiVariableData = null; + + /** + * EFIVariable constructor. + * The UEFI_VARIABLE_DATA contains a "VariableName" field which is used to determine + * the class used to parse the data within the "VariableData". + * + * @param variableData byte array holding the UEFI Variable. + * @throws java.security.cert.CertificateException If there a problem parsing the X509 certificate. + * @throws java.security.NoSuchAlgorithmException if there's a problem hashing the certificate. + * @throws java.io.IOException If there's a problem parsing the signature data. + */ + public UefiVariable(final byte[] variableData) + throws CertificateException, NoSuchAlgorithmException, IOException { + byte[] guid = new byte[UefiConstants.SIZE_16]; + byte[] nameLength = new byte[UefiConstants.SIZE_8]; + byte[] nameTemp = null; + byte[] dataLength = new byte[UefiConstants.SIZE_8]; + byte[] name = null; + int variableLength = 0; + + System.arraycopy(variableData, 0, guid, 0, UefiConstants.SIZE_16); + uefiVarGuid = new UefiGuid(guid); + System.arraycopy(variableData, UefiConstants.SIZE_16, nameLength, 0, UefiConstants.SIZE_8); + int nlength = HexUtils.leReverseInt(nameLength); + System.arraycopy(variableData, UefiConstants.OFFSET_24, dataLength, 0, UefiConstants.SIZE_8); + nameTemp = new byte[nlength * UefiConstants.SIZE_2]; + + System.arraycopy(variableData, UefiConstants.OFFSET_32, + nameTemp, 0, nlength * UefiConstants.SIZE_2); + byte[] name1 = UefiDevicePath.convertChar16tobyteArray(nameTemp); + name = new byte[nlength]; + System.arraycopy(name1, 0, name, 0, nlength); + variableLength = HexUtils.leReverseInt(dataLength); + uefiVariableData = new byte[variableLength]; + System.arraycopy(variableData, UefiConstants.OFFSET_32 + + nlength * UefiConstants.SIZE_2, uefiVariableData, 0, variableLength); + efiVarName = new String(name, StandardCharsets.UTF_8); + String tmpName = efiVarName; + if (efiVarName.contains("Boot00")) { + tmpName = "Boot00"; + } + switch (tmpName) { + case "PK": + case "KEK": + case "db": + case "dbx": + processSigList(uefiVariableData); + break; + case "Boot00": + bootv = new UefiBootVariable(uefiVariableData); + break; + case "BootOrder": + booto = new UefiBootOrder(uefiVariableData); + break; + case "SecureBoot": + sb = new UefiSecureBoot(uefiVariableData); + break; + default: + } + } + + /** + * Processes the data as a UEFI defined Signature List. + * + * @param data the bye array holding the Signature List. + * @throws java.security.cert.CertificateException If there a problem parsing the X509 certificate. + * @throws java.security.NoSuchAlgorithmException if there's a problem hashing the certificate. + * @throws java.io.IOException If there's a problem parsing the signature data. + */ + private void processSigList(final byte[] data) + throws CertificateException, NoSuchAlgorithmException, IOException { + ByteArrayInputStream certData = new ByteArrayInputStream(data); + while (certData.available() > 0) { + UefiSignatureList list; + list = new UefiSignatureList(certData); + certSuperList.add(list); + } + } + + /** + * Print out all the interesting characteristics available on this UEFI Variable. + * + * @return human readable description of the UEFi variable. + */ + public String toString() { + StringBuilder efiVariable = new StringBuilder(); + efiVariable.append("UEFI Variable Name:" + efiVarName + "\n"); + efiVariable.append("UEFI_GUID = " + uefiVarGuid.toString() + "\n "); + if (efiVarName != "") { + efiVariable.append("UEFI Variable Contents => " + "\n "); + } + String tmpName = efiVarName; + if (efiVarName.contains("Boot00")) { + tmpName = "Boot00"; + } else { + tmpName = efiVarName; + } + switch (tmpName) { + case "Shim": + case "MokList": + efiVariable.append(printCert(uefiVariableData, 0)); + break; + case "Boot00": + efiVariable.append(bootv.toString()); + break; + case "BootOrder": + efiVariable.append(booto.toString()); + break; + case "SecureBoot": + efiVariable.append(sb.toString()); + break; + default: + if (!tmpName.isEmpty()) { + efiVariable.append(String.format("Data not provided for UEFI variable named %s ", + tmpName)); + } else { + efiVariable.append("Data not provided "); + } + } + for (int i = 0; i < certSuperList.size(); i++) { + efiVariable.append(certSuperList.get(i).toString()); + } + return efiVariable.toString(); + } + + /** + * Retrieves human readable description from a Certificate. + * + * @param data byte[] holding the certificate. + * @param offset offset to start of the certificate within the byte array. + * @return human readable description of a certificate. + */ + public String printCert(final byte[] data, final int offset) { + String certInfo = ""; + byte[] certLength = new byte[UefiConstants.SIZE_2]; + System.arraycopy(data, offset + UefiConstants.OFFSET_2, certLength, 0, UefiConstants.SIZE_2); + int cLength = new BigInteger(certLength).intValue() + UefiConstants.SIZE_4; + byte[] certData = new byte[cLength]; + System.arraycopy(data, offset, certData, 0, cLength); + try { + UefiX509Cert cert = new UefiX509Cert(certData); + certInfo = cert.toString(); + } catch (Exception e) { + certInfo = "Error Processing Certificate : " + e.getMessage(); + } + return (certInfo); + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiX509Cert.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiX509Cert.java new file mode 100644 index 00000000..a2589d31 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/UefiX509Cert.java @@ -0,0 +1,92 @@ +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + +import jakarta.xml.bind.DatatypeConverter; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; + +/** + * Class for processing a Secure Boot certificate stored in the UEFI DB or DBX. + * X509 certs are used by Secure Boot for validating EFI files. + */ +public class UefiX509Cert { + /** + * Certificate object . + */ + private java.security.cert.Certificate cert = null; + + /** + * Constructor for the certificate. + * + * @param certData byte array holding the certificate. + * @throws java.security.cert.CertificateException If the certificate cannot parse. + * @throws java.security.NoSuchAlgorithmException if a hash cannot be generated from the cert. + */ + public UefiX509Cert(final byte[] certData) throws CertificateException, NoSuchAlgorithmException { + CertificateFactory cf; + cf = CertificateFactory.getInstance("X.509"); + InputStream targetStream = new ByteArrayInputStream(certData); + cert = cf.generateCertificate(targetStream); + MessageDigest md = MessageDigest.getInstance("SHA1"); + md.update(certData); + } + + /** + * Finds the byte length of the certificate. + * + * @return the certificate length. + * @throws java.security.cert.CertificateEncodingException if the certificate failed to parse. + */ + public int getLength() throws CertificateEncodingException { + int length = 0; + X509Certificate x509Cert = (X509Certificate) cert; + length = x509Cert.getEncoded().length; + return length; + } + + /** + * Calculates the fingerprint per Microsoft's specs using SHA1 and colon based notation. + * e.g. "44:d6:41:ca:ca:08:09:00:23:98:b4:87:7b:8e:98:2e:d2:6f:7b:76" + * + * @return a string representation of the certificate fingerprint + */ + public String getSHA1FingerPrint() { + byte[] der = null; + MessageDigest md = null; + try { + md = MessageDigest.getInstance("SHA-1"); + der = cert.getEncoded(); + } catch (Exception e) { + return ("Error creating Certificate Fingerprint: " + e.getMessage()); + } + md.update(der); + byte[] digest = md.digest(); + String digestHex = DatatypeConverter.printHexBinary(digest); + digestHex = digestHex.replaceAll("..(?!$)", "$0:"); // places : every 2 digits + return digestHex.toLowerCase(); + } + + /** + * Provides a Sting of select fields of the Certificate data. + * + * @return A string detailing select fields of the certificate. + */ + public String toString() { + X509Certificate x509Cert = (X509Certificate) cert; + String certData = ""; + certData += " Certificate Serial Number = " + + x509Cert.getSerialNumber().toString(UefiConstants.SIZE_16) + "\n"; + certData += " Subject DN = " + x509Cert.getSubjectDN() + "\n"; + certData += " Issuer DN = " + x509Cert.getIssuerDN() + "\n"; + certData += " Not Before Date = " + x509Cert.getNotBefore() + "\n"; + certData += " Not After Date = " + x509Cert.getNotAfter() + "\n"; + certData += " Signature Algorithm = " + x509Cert.getSigAlgName() + "\n"; + certData += " SHA1 Fingerprint = " + getSHA1FingerPrint() + "\n"; + return certData; + } +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/package-info.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/package-info.java new file mode 100644 index 00000000..cbaba95a --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/eventlog/uefi/package-info.java @@ -0,0 +1,6 @@ +/** + * Non-persistant classes related to TGC Event Logs. + */ + +package hirs.attestationca.portal.utils.tpm.eventlog.uefi; + diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/package-info.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/package-info.java new file mode 100644 index 00000000..b214a14d --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/tpm/package-info.java @@ -0,0 +1,6 @@ +/** + * Non-persistant classes related to TPM. + */ + +package hirs.attestationca.portal.utils.tpm; + diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/BaseElement.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/BaseElement.java new file mode 100644 index 00000000..2a5d88ee --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/BaseElement.java @@ -0,0 +1,104 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.HashMap; +import java.util.Map; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyAttribute; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.bind.annotation.XmlType; +import javax.xml.namespace.QName; + + +/** + * + * Attributes common to all Elements in this schema + * + * + *

Java class for BaseElement complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="BaseElement">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <attribute ref="{http://www.w3.org/XML/1998/namespace}lang"/>
+ *       <anyAttribute processContents='lax' namespace='##other'/>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "BaseElement", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd") +@XmlSeeAlso({ + SoftwareIdentity.class, + Entity.class, + Link.class, + Meta.class, + ResourceCollection.class +}) +public class BaseElement { + + @XmlAttribute(name = "lang", namespace = "http://www.w3.org/XML/1998/namespace") + protected String lang; + @XmlAnyAttribute + private Map otherAttributes = new HashMap(); + + /** + * + * Allow xml:lang attribute on any element. + * + * + * @return + * possible object is + * {@link String } + * + */ + public String getLang() { + return lang; + } + + /** + * Sets the value of the lang property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLang(String value) { + this.lang = value; + } + + /** + * Gets a map that contains attributes that aren't bound to any typed property on this class. + * + *

+ * the map is keyed by the name of the attribute and + * the value is the string value of the attribute. + * + * the map returned by this method is live, and you can add new attribute + * by updating the map directly. Because of this design, there's no setter. + * + * + * @return + * always non-null + */ + public Map getOtherAttributes() { + return otherAttributes; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/CanonicalizationMethodType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/CanonicalizationMethodType.java new file mode 100644 index 00000000..f88b1a4b --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/CanonicalizationMethodType.java @@ -0,0 +1,109 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for CanonicalizationMethodType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="CanonicalizationMethodType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <any maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "CanonicalizationMethodType", propOrder = { + "content" +}) +public class CanonicalizationMethodType { + + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Algorithm", required = true) + @XmlSchemaType(name = "anyURI") + protected String algorithm; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Object } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the algorithm property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAlgorithm() { + return algorithm; + } + + /** + * Sets the value of the algorithm property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAlgorithm(String value) { + this.algorithm = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/DSAKeyValueType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/DSAKeyValueType.java new file mode 100644 index 00000000..5087243d --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/DSAKeyValueType.java @@ -0,0 +1,227 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for DSAKeyValueType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="DSAKeyValueType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <sequence minOccurs="0">
+ *           <element name="P" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/>
+ *           <element name="Q" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/>
+ *         </sequence>
+ *         <element name="G" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary" minOccurs="0"/>
+ *         <element name="Y" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/>
+ *         <element name="J" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary" minOccurs="0"/>
+ *         <sequence minOccurs="0">
+ *           <element name="Seed" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/>
+ *           <element name="PgenCounter" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/>
+ *         </sequence>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "DSAKeyValueType", propOrder = { + "p", + "q", + "g", + "y", + "j", + "seed", + "pgenCounter" +}) +public class DSAKeyValueType { + + @XmlElement(name = "P") + protected byte[] p; + @XmlElement(name = "Q") + protected byte[] q; + @XmlElement(name = "G") + protected byte[] g; + @XmlElement(name = "Y", required = true) + protected byte[] y; + @XmlElement(name = "J") + protected byte[] j; + @XmlElement(name = "Seed") + protected byte[] seed; + @XmlElement(name = "PgenCounter") + protected byte[] pgenCounter; + + /** + * Gets the value of the p property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getP() { + return p; + } + + /** + * Sets the value of the p property. + * + * @param value + * allowed object is + * byte[] + */ + public void setP(byte[] value) { + this.p = value; + } + + /** + * Gets the value of the q property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getQ() { + return q; + } + + /** + * Sets the value of the q property. + * + * @param value + * allowed object is + * byte[] + */ + public void setQ(byte[] value) { + this.q = value; + } + + /** + * Gets the value of the g property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getG() { + return g; + } + + /** + * Sets the value of the g property. + * + * @param value + * allowed object is + * byte[] + */ + public void setG(byte[] value) { + this.g = value; + } + + /** + * Gets the value of the y property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getY() { + return y; + } + + /** + * Sets the value of the y property. + * + * @param value + * allowed object is + * byte[] + */ + public void setY(byte[] value) { + this.y = value; + } + + /** + * Gets the value of the j property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getJ() { + return j; + } + + /** + * Sets the value of the j property. + * + * @param value + * allowed object is + * byte[] + */ + public void setJ(byte[] value) { + this.j = value; + } + + /** + * Gets the value of the seed property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getSeed() { + return seed; + } + + /** + * Sets the value of the seed property. + * + * @param value + * allowed object is + * byte[] + */ + public void setSeed(byte[] value) { + this.seed = value; + } + + /** + * Gets the value of the pgenCounter property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getPgenCounter() { + return pgenCounter; + } + + /** + * Sets the value of the pgenCounter property. + * + * @param value + * allowed object is + * byte[] + */ + public void setPgenCounter(byte[] value) { + this.pgenCounter = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/DigestMethodType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/DigestMethodType.java new file mode 100644 index 00000000..f3d8a188 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/DigestMethodType.java @@ -0,0 +1,111 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java class for DigestMethodType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="DigestMethodType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "DigestMethodType", propOrder = { + "content" +}) +public class DigestMethodType { + + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Algorithm", required = true) + @XmlSchemaType(name = "anyURI") + protected String algorithm; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Object } + * {@link Element } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the algorithm property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAlgorithm() { + return algorithm; + } + + /** + * Sets the value of the algorithm property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAlgorithm(String value) { + this.algorithm = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Directory.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Directory.java new file mode 100644 index 00000000..8e63b7a5 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Directory.java @@ -0,0 +1,86 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElements; +import jakarta.xml.bind.annotation.XmlType; + +import java.util.ArrayList; +import java.util.List; + + +/** + *

Java class for Directory complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="Directory">
+ *   <complexContent>
+ *     <extension base="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}FilesystemItem">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element name="Directory" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Directory"/>
+ *         <element name="File" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}File"/>
+ *       </choice>
+ *       <anyAttribute processContents='lax'/>
+ *     </extension>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "Directory", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", propOrder = { + "directoryOrFile" +}) +public class Directory + extends FilesystemItem +{ + + @XmlElements({ + @XmlElement(name = "Directory", type = Directory.class), + @XmlElement(name = "File", type = File.class) + }) + protected List directoryOrFile; + + /** + * Gets the value of the directoryOrFile property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the directoryOrFile property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getDirectoryOrFile().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Directory } + * {@link File } + * + * + */ + public List getDirectoryOrFile() { + if (directoryOrFile == null) { + directoryOrFile = new ArrayList(); + } + return this.directoryOrFile; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Entity.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Entity.java new file mode 100644 index 00000000..f807977b --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Entity.java @@ -0,0 +1,200 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for Entity complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="Entity">
+ *   <complexContent>
+ *     <extension base="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}BaseElement">
+ *       <sequence maxOccurs="unbounded" minOccurs="0">
+ *         <element name="Meta" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Meta"/>
+ *       </sequence>
+ *       <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="regid" type="{http://www.w3.org/2001/XMLSchema}anyURI" default="http://invalid.unavailable" />
+ *       <attribute name="role" use="required" type="{http://www.w3.org/2001/XMLSchema}NMTOKENS" />
+ *       <attribute name="thumbprint" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <anyAttribute processContents='lax' namespace='##other'/>
+ *     </extension>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "Entity", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", propOrder = { + "meta" +}) +public class Entity + extends BaseElement +{ + + @XmlElement(name = "Meta") + protected List meta; + @XmlAttribute(name = "name", required = true) + protected String name; + @XmlAttribute(name = "regid") + @XmlSchemaType(name = "anyURI") + protected String regid; + @XmlAttribute(name = "role", required = true) + @XmlSchemaType(name = "NMTOKENS") + protected List role; + @XmlAttribute(name = "thumbprint") + protected String thumbprint; + + /** + * Gets the value of the meta property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the meta property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getMeta().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Meta } + * + * + */ + public List getMeta() { + if (meta == null) { + meta = new ArrayList(); + } + return this.meta; + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + /** + * Gets the value of the regid property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getRegid() { + if (regid == null) { + return "http://invalid.unavailable"; + } else { + return regid; + } + } + + /** + * Sets the value of the regid property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setRegid(String value) { + this.regid = value; + } + + /** + * Gets the value of the role property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the role property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getRole().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * + * + */ + public List getRole() { + if (role == null) { + role = new ArrayList(); + } + return this.role; + } + + /** + * Gets the value of the thumbprint property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getThumbprint() { + return thumbprint; + } + + /** + * Sets the value of the thumbprint property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setThumbprint(String value) { + this.thumbprint = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Evidence.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Evidence.java new file mode 100644 index 00000000..1502c3d1 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Evidence.java @@ -0,0 +1,98 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.datatype.XMLGregorianCalendar; + + +/** + *

Java class for Evidence complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="Evidence">
+ *   <complexContent>
+ *     <extension base="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}ResourceCollection">
+ *       <attribute name="date" type="{http://www.w3.org/2001/XMLSchema}dateTime" />
+ *       <attribute name="deviceId" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <anyAttribute processContents='lax' namespace='##other'/>
+ *     </extension>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "Evidence", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd") +public class Evidence + extends ResourceCollection +{ + + @XmlAttribute(name = "date") + @XmlSchemaType(name = "dateTime") + protected XMLGregorianCalendar date; + @XmlAttribute(name = "deviceId") + protected String deviceId; + + /** + * Gets the value of the date property. + * + * @return + * possible object is + * {@link XMLGregorianCalendar } + * + */ + public XMLGregorianCalendar getDate() { + return date; + } + + /** + * Sets the value of the date property. + * + * @param value + * allowed object is + * {@link XMLGregorianCalendar } + * + */ + public void setDate(XMLGregorianCalendar value) { + this.date = value; + } + + /** + * Gets the value of the deviceId property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getDeviceId() { + return deviceId; + } + + /** + * Sets the value of the deviceId property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setDeviceId(String value) { + this.deviceId = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/File.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/File.java new file mode 100644 index 00000000..8736dff0 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/File.java @@ -0,0 +1,96 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.math.BigInteger; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for File complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="File">
+ *   <complexContent>
+ *     <extension base="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}FilesystemItem">
+ *       <attribute name="size" type="{http://www.w3.org/2001/XMLSchema}integer" />
+ *       <attribute name="version" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <anyAttribute processContents='lax'/>
+ *     </extension>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "File", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd") +public class File + extends FilesystemItem +{ + + @XmlAttribute(name = "size") + protected BigInteger size; + @XmlAttribute(name = "version") + protected String version; + + /** + * Gets the value of the size property. + * + * @return + * possible object is + * {@link BigInteger } + * + */ + public BigInteger getSize() { + return size; + } + + /** + * Sets the value of the size property. + * + * @param value + * allowed object is + * {@link BigInteger } + * + */ + public void setSize(BigInteger value) { + this.size = value; + } + + /** + * Gets the value of the version property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getVersion() { + return version; + } + + /** + * Sets the value of the version property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setVersion(String value) { + this.version = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/FilesystemItem.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/FilesystemItem.java new file mode 100644 index 00000000..4e0189bf --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/FilesystemItem.java @@ -0,0 +1,154 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for FilesystemItem complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="FilesystemItem">
+ *   <complexContent>
+ *     <extension base="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Meta">
+ *       <attribute name="key" type="{http://www.w3.org/2001/XMLSchema}boolean" />
+ *       <attribute name="location" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="root" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <anyAttribute processContents='lax'/>
+ *     </extension>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "FilesystemItem", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd") +@XmlSeeAlso({ + File.class, + Directory.class +}) +public class FilesystemItem + extends Meta +{ + + @XmlAttribute(name = "key") + protected Boolean key; + @XmlAttribute(name = "location") + protected String location; + @XmlAttribute(name = "name", required = true) + protected String name; + @XmlAttribute(name = "root") + protected String root; + + /** + * Gets the value of the key property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isKey() { + return key; + } + + /** + * Sets the value of the key property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setKey(Boolean value) { + this.key = value; + } + + /** + * Gets the value of the location property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getLocation() { + return location; + } + + /** + * Sets the value of the location property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setLocation(String value) { + this.location = value; + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + /** + * Gets the value of the root property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getRoot() { + return root; + } + + /** + * Sets the value of the root property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setRoot(String value) { + this.root = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/KeyInfoType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/KeyInfoType.java new file mode 100644 index 00000000..a910c501 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/KeyInfoType.java @@ -0,0 +1,142 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlID; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import org.w3c.dom.Element; + + +/** + *

Java class for KeyInfoType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="KeyInfoType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded">
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}KeyName"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}KeyValue"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}RetrievalMethod"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}X509Data"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}PGPData"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}SPKIData"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}MgmtData"/>
+ *         <any processContents='lax' namespace='##other'/>
+ *       </choice>
+ *       <attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "KeyInfoType", propOrder = { + "content" +}) +public class KeyInfoType { + + @XmlElementRefs({ + @XmlElementRef(name = "KeyValue", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "X509Data", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "MgmtData", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "KeyName", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "SPKIData", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "PGPData", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "RetrievalMethod", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false) + }) + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link KeyValueType }{@code >} + * {@link JAXBElement }{@code <}{@link X509DataType }{@code >} + * {@link JAXBElement }{@code <}{@link String }{@code >} + * {@link String } + * {@link JAXBElement }{@code <}{@link String }{@code >} + * {@link Object } + * {@link JAXBElement }{@code <}{@link SPKIDataType }{@code >} + * {@link Element } + * {@link JAXBElement }{@code <}{@link PGPDataType }{@code >} + * {@link JAXBElement }{@code <}{@link RetrievalMethodType }{@code >} + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/KeyValueType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/KeyValueType.java new file mode 100644 index 00000000..ceb75a5b --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/KeyValueType.java @@ -0,0 +1,92 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java class for KeyValueType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="KeyValueType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}DSAKeyValue"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}RSAKeyValue"/>
+ *         <any processContents='lax' namespace='##other'/>
+ *       </choice>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "KeyValueType", propOrder = { + "content" +}) +public class KeyValueType { + + @XmlElementRefs({ + @XmlElementRef(name = "DSAKeyValue", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "RSAKeyValue", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false) + }) + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link RSAKeyValueType }{@code >} + * {@link Element } + * {@link String } + * {@link JAXBElement }{@code <}{@link DSAKeyValueType }{@code >} + * {@link Object } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Link.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Link.java new file mode 100644 index 00000000..c61fd234 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Link.java @@ -0,0 +1,236 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for Link complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="Link">
+ *   <complexContent>
+ *     <extension base="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}BaseElement">
+ *       <attribute name="artifact" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="href" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
+ *       <attribute name="media" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Media" />
+ *       <attribute name="ownership" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Ownership" />
+ *       <attribute name="rel" use="required" type="{http://www.w3.org/2001/XMLSchema}NMTOKEN" />
+ *       <attribute name="type" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}MediaType" />
+ *       <attribute name="use" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Use" />
+ *       <anyAttribute processContents='lax' namespace='##other'/>
+ *     </extension>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "Link", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd") +public class Link + extends BaseElement +{ + + @XmlAttribute(name = "artifact") + protected String artifact; + @XmlAttribute(name = "href", required = true) + @XmlSchemaType(name = "anyURI") + protected String href; + @XmlAttribute(name = "media") + protected String media; + @XmlAttribute(name = "ownership") + protected Ownership ownership; + @XmlAttribute(name = "rel", required = true) + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlSchemaType(name = "NMTOKEN") + protected String rel; + @XmlAttribute(name = "type") + protected String type; + @XmlAttribute(name = "use") + protected Use use; + + /** + * Gets the value of the artifact property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getArtifact() { + return artifact; + } + + /** + * Sets the value of the artifact property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setArtifact(String value) { + this.artifact = value; + } + + /** + * Gets the value of the href property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getHref() { + return href; + } + + /** + * Sets the value of the href property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setHref(String value) { + this.href = value; + } + + /** + * Gets the value of the media property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMedia() { + return media; + } + + /** + * Sets the value of the media property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMedia(String value) { + this.media = value; + } + + /** + * Gets the value of the ownership property. + * + * @return + * possible object is + * {@link Ownership } + * + */ + public Ownership getOwnership() { + return ownership; + } + + /** + * Sets the value of the ownership property. + * + * @param value + * allowed object is + * {@link Ownership } + * + */ + public void setOwnership(Ownership value) { + this.ownership = value; + } + + /** + * Gets the value of the rel property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getRel() { + return rel; + } + + /** + * Sets the value of the rel property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setRel(String value) { + this.rel = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + + /** + * Gets the value of the use property. + * + * @return + * possible object is + * {@link Use } + * + */ + public Use getUse() { + return use; + } + + /** + * Sets the value of the use property. + * + * @param value + * allowed object is + * {@link Use } + * + */ + public void setUse(Use value) { + this.use = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ManifestType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ManifestType.java new file mode 100644 index 00000000..5e264ce1 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ManifestType.java @@ -0,0 +1,111 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlID; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for ManifestType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="ManifestType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}Reference" maxOccurs="unbounded"/>
+ *       </sequence>
+ *       <attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "ManifestType", propOrder = { + "reference" +}) +public class ManifestType { + + @XmlElement(name = "Reference", required = true) + protected List reference; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the reference property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the reference property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getReference().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link ReferenceType } + * + * + */ + public List getReference() { + if (reference == null) { + reference = new ArrayList(); + } + return this.reference; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Meta.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Meta.java new file mode 100644 index 00000000..39dbdab5 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Meta.java @@ -0,0 +1,47 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for Meta complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="Meta">
+ *   <complexContent>
+ *     <extension base="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}BaseElement">
+ *       <anyAttribute processContents='lax'/>
+ *     </extension>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "Meta", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd") +@XmlSeeAlso({ + SoftwareMeta.class, + Resource.class, + Process.class, + FilesystemItem.class +}) +public class Meta + extends BaseElement +{ + + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ObjectFactory.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ObjectFactory.java new file mode 100644 index 00000000..5bb42216 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ObjectFactory.java @@ -0,0 +1,723 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.math.BigInteger; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlElementDecl; +import javax.xml.bind.annotation.XmlRegistry; +import javax.xml.namespace.QName; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the hirs.attestationca.portal.utils.xjc package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + private final static QName _SPKIData_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SPKIData"); + private final static QName _KeyInfo_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "KeyInfo"); + private final static QName _SignatureValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignatureValue"); + private final static QName _KeyValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "KeyValue"); + private final static QName _Transforms_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Transforms"); + private final static QName _DigestMethod_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "DigestMethod"); + private final static QName _X509Data_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509Data"); + private final static QName _SignatureProperty_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignatureProperty"); + private final static QName _KeyName_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "KeyName"); + private final static QName _RSAKeyValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "RSAKeyValue"); + private final static QName _SoftwareIdentity_QNAME = new QName("http://standards.iso.org/iso/19770/-2/2015/schema.xsd", "SoftwareIdentity"); + private final static QName _Signature_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Signature"); + private final static QName _MgmtData_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "MgmtData"); + private final static QName _SignatureMethod_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignatureMethod"); + private final static QName _Object_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Object"); + private final static QName _SignatureProperties_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignatureProperties"); + private final static QName _Transform_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Transform"); + private final static QName _PGPData_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "PGPData"); + private final static QName _Reference_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Reference"); + private final static QName _RetrievalMethod_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "RetrievalMethod"); + private final static QName _DSAKeyValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "DSAKeyValue"); + private final static QName _DigestValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "DigestValue"); + private final static QName _CanonicalizationMethod_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "CanonicalizationMethod"); + private final static QName _SignedInfo_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignedInfo"); + private final static QName _Manifest_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Manifest"); + private final static QName _SPKIDataTypeSPKISexp_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SPKISexp"); + private final static QName _PGPDataTypePGPKeyID_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "PGPKeyID"); + private final static QName _PGPDataTypePGPKeyPacket_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "PGPKeyPacket"); + private final static QName _TransformTypeXPath_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "XPath"); + private final static QName _SignatureMethodTypeHMACOutputLength_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "HMACOutputLength"); + private final static QName _X509DataTypeX509IssuerSerial_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509IssuerSerial"); + private final static QName _X509DataTypeX509CRL_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509CRL"); + private final static QName _X509DataTypeX509SubjectName_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509SubjectName"); + private final static QName _X509DataTypeX509SKI_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509SKI"); + private final static QName _X509DataTypeX509Certificate_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509Certificate"); + private final static QName _SoftwareIdentityLink_QNAME = new QName("http://standards.iso.org/iso/19770/-2/2015/schema.xsd", "Link"); + private final static QName _SoftwareIdentityEvidence_QNAME = new QName("http://standards.iso.org/iso/19770/-2/2015/schema.xsd", "Evidence"); + private final static QName _SoftwareIdentityPayload_QNAME = new QName("http://standards.iso.org/iso/19770/-2/2015/schema.xsd", "Payload"); + private final static QName _SoftwareIdentityEntity_QNAME = new QName("http://standards.iso.org/iso/19770/-2/2015/schema.xsd", "Entity"); + private final static QName _SoftwareIdentityMeta_QNAME = new QName("http://standards.iso.org/iso/19770/-2/2015/schema.xsd", "Meta"); + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: hirs.attestationca.portal.utils.xjc + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link SoftwareIdentity } + * + */ + public SoftwareIdentity createSoftwareIdentity() { + return new SoftwareIdentity(); + } + + /** + * Create an instance of {@link SoftwareMeta } + * + */ + public SoftwareMeta createSoftwareMeta() { + return new SoftwareMeta(); + } + + /** + * Create an instance of {@link Entity } + * + */ + public Entity createEntity() { + return new Entity(); + } + + /** + * Create an instance of {@link Meta } + * + */ + public Meta createMeta() { + return new Meta(); + } + + /** + * Create an instance of {@link FilesystemItem } + * + */ + public FilesystemItem createFilesystemItem() { + return new FilesystemItem(); + } + + /** + * Create an instance of {@link Resource } + * + */ + public Resource createResource() { + return new Resource(); + } + + /** + * Create an instance of {@link Process } + * + */ + public Process createProcess() { + return new Process(); + } + + /** + * Create an instance of {@link BaseElement } + * + */ + public BaseElement createBaseElement() { + return new BaseElement(); + } + + /** + * Create an instance of {@link Evidence } + * + */ + public Evidence createEvidence() { + return new Evidence(); + } + + /** + * Create an instance of {@link File } + * + */ + public File createFile() { + return new File(); + } + + /** + * Create an instance of {@link Link } + * + */ + public Link createLink() { + return new Link(); + } + + /** + * Create an instance of {@link Directory } + * + */ + public Directory createDirectory() { + return new Directory(); + } + + /** + * Create an instance of {@link ResourceCollection } + * + */ + public ResourceCollection createResourceCollection() { + return new ResourceCollection(); + } + + /** + * Create an instance of {@link PGPDataType } + * + */ + public PGPDataType createPGPDataType() { + return new PGPDataType(); + } + + /** + * Create an instance of {@link KeyValueType } + * + */ + public KeyValueType createKeyValueType() { + return new KeyValueType(); + } + + /** + * Create an instance of {@link DSAKeyValueType } + * + */ + public DSAKeyValueType createDSAKeyValueType() { + return new DSAKeyValueType(); + } + + /** + * Create an instance of {@link ReferenceType } + * + */ + public ReferenceType createReferenceType() { + return new ReferenceType(); + } + + /** + * Create an instance of {@link RetrievalMethodType } + * + */ + public RetrievalMethodType createRetrievalMethodType() { + return new RetrievalMethodType(); + } + + /** + * Create an instance of {@link TransformsType } + * + */ + public TransformsType createTransformsType() { + return new TransformsType(); + } + + /** + * Create an instance of {@link CanonicalizationMethodType } + * + */ + public CanonicalizationMethodType createCanonicalizationMethodType() { + return new CanonicalizationMethodType(); + } + + /** + * Create an instance of {@link DigestMethodType } + * + */ + public DigestMethodType createDigestMethodType() { + return new DigestMethodType(); + } + + /** + * Create an instance of {@link ManifestType } + * + */ + public ManifestType createManifestType() { + return new ManifestType(); + } + + /** + * Create an instance of {@link SignaturePropertyType } + * + */ + public SignaturePropertyType createSignaturePropertyType() { + return new SignaturePropertyType(); + } + + /** + * Create an instance of {@link X509DataType } + * + */ + public X509DataType createX509DataType() { + return new X509DataType(); + } + + /** + * Create an instance of {@link SignedInfoType } + * + */ + public SignedInfoType createSignedInfoType() { + return new SignedInfoType(); + } + + /** + * Create an instance of {@link RSAKeyValueType } + * + */ + public RSAKeyValueType createRSAKeyValueType() { + return new RSAKeyValueType(); + } + + /** + * Create an instance of {@link SPKIDataType } + * + */ + public SPKIDataType createSPKIDataType() { + return new SPKIDataType(); + } + + /** + * Create an instance of {@link SignatureValueType } + * + */ + public SignatureValueType createSignatureValueType() { + return new SignatureValueType(); + } + + /** + * Create an instance of {@link KeyInfoType } + * + */ + public KeyInfoType createKeyInfoType() { + return new KeyInfoType(); + } + + /** + * Create an instance of {@link SignatureType } + * + */ + public SignatureType createSignatureType() { + return new SignatureType(); + } + + /** + * Create an instance of {@link SignaturePropertiesType } + * + */ + public SignaturePropertiesType createSignaturePropertiesType() { + return new SignaturePropertiesType(); + } + + /** + * Create an instance of {@link SignatureMethodType } + * + */ + public SignatureMethodType createSignatureMethodType() { + return new SignatureMethodType(); + } + + /** + * Create an instance of {@link ObjectType } + * + */ + public ObjectType createObjectType() { + return new ObjectType(); + } + + /** + * Create an instance of {@link TransformType } + * + */ + public TransformType createTransformType() { + return new TransformType(); + } + + /** + * Create an instance of {@link X509IssuerSerialType } + * + */ + public X509IssuerSerialType createX509IssuerSerialType() { + return new X509IssuerSerialType(); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SPKIDataType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SPKIData") + public JAXBElement createSPKIData(SPKIDataType value) { + return new JAXBElement(_SPKIData_QNAME, SPKIDataType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link KeyInfoType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "KeyInfo") + public JAXBElement createKeyInfo(KeyInfoType value) { + return new JAXBElement(_KeyInfo_QNAME, KeyInfoType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SignatureValueType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignatureValue") + public JAXBElement createSignatureValue(SignatureValueType value) { + return new JAXBElement(_SignatureValue_QNAME, SignatureValueType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link KeyValueType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "KeyValue") + public JAXBElement createKeyValue(KeyValueType value) { + return new JAXBElement(_KeyValue_QNAME, KeyValueType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link TransformsType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Transforms") + public JAXBElement createTransforms(TransformsType value) { + return new JAXBElement(_Transforms_QNAME, TransformsType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link DigestMethodType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "DigestMethod") + public JAXBElement createDigestMethod(DigestMethodType value) { + return new JAXBElement(_DigestMethod_QNAME, DigestMethodType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link X509DataType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509Data") + public JAXBElement createX509Data(X509DataType value) { + return new JAXBElement(_X509Data_QNAME, X509DataType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SignaturePropertyType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignatureProperty") + public JAXBElement createSignatureProperty(SignaturePropertyType value) { + return new JAXBElement(_SignatureProperty_QNAME, SignaturePropertyType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "KeyName") + public JAXBElement createKeyName(String value) { + return new JAXBElement(_KeyName_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link RSAKeyValueType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "RSAKeyValue") + public JAXBElement createRSAKeyValue(RSAKeyValueType value) { + return new JAXBElement(_RSAKeyValue_QNAME, RSAKeyValueType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SoftwareIdentity }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", name = "SoftwareIdentity") + public JAXBElement createSoftwareIdentity(SoftwareIdentity value) { + return new JAXBElement(_SoftwareIdentity_QNAME, SoftwareIdentity.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SignatureType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Signature") + public JAXBElement createSignature(SignatureType value) { + return new JAXBElement(_Signature_QNAME, SignatureType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "MgmtData") + public JAXBElement createMgmtData(String value) { + return new JAXBElement(_MgmtData_QNAME, String.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SignatureMethodType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignatureMethod") + public JAXBElement createSignatureMethod(SignatureMethodType value) { + return new JAXBElement(_SignatureMethod_QNAME, SignatureMethodType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link ObjectType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Object") + public JAXBElement createObject(ObjectType value) { + return new JAXBElement(_Object_QNAME, ObjectType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SignaturePropertiesType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignatureProperties") + public JAXBElement createSignatureProperties(SignaturePropertiesType value) { + return new JAXBElement(_SignatureProperties_QNAME, SignaturePropertiesType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link TransformType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Transform") + public JAXBElement createTransform(TransformType value) { + return new JAXBElement(_Transform_QNAME, TransformType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link PGPDataType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "PGPData") + public JAXBElement createPGPData(PGPDataType value) { + return new JAXBElement(_PGPData_QNAME, PGPDataType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link ReferenceType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Reference") + public JAXBElement createReference(ReferenceType value) { + return new JAXBElement(_Reference_QNAME, ReferenceType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link RetrievalMethodType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "RetrievalMethod") + public JAXBElement createRetrievalMethod(RetrievalMethodType value) { + return new JAXBElement(_RetrievalMethod_QNAME, RetrievalMethodType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link DSAKeyValueType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "DSAKeyValue") + public JAXBElement createDSAKeyValue(DSAKeyValueType value) { + return new JAXBElement(_DSAKeyValue_QNAME, DSAKeyValueType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "DigestValue") + public JAXBElement createDigestValue(byte[] value) { + return new JAXBElement(_DigestValue_QNAME, byte[].class, null, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link CanonicalizationMethodType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "CanonicalizationMethod") + public JAXBElement createCanonicalizationMethod(CanonicalizationMethodType value) { + return new JAXBElement(_CanonicalizationMethod_QNAME, CanonicalizationMethodType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SignedInfoType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignedInfo") + public JAXBElement createSignedInfo(SignedInfoType value) { + return new JAXBElement(_SignedInfo_QNAME, SignedInfoType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link ManifestType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Manifest") + public JAXBElement createManifest(ManifestType value) { + return new JAXBElement(_Manifest_QNAME, ManifestType.class, null, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SPKISexp", scope = SPKIDataType.class) + public JAXBElement createSPKIDataTypeSPKISexp(byte[] value) { + return new JAXBElement(_SPKIDataTypeSPKISexp_QNAME, byte[].class, SPKIDataType.class, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "PGPKeyID", scope = PGPDataType.class) + public JAXBElement createPGPDataTypePGPKeyID(byte[] value) { + return new JAXBElement(_PGPDataTypePGPKeyID_QNAME, byte[].class, PGPDataType.class, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "PGPKeyPacket", scope = PGPDataType.class) + public JAXBElement createPGPDataTypePGPKeyPacket(byte[] value) { + return new JAXBElement(_PGPDataTypePGPKeyPacket_QNAME, byte[].class, PGPDataType.class, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "XPath", scope = TransformType.class) + public JAXBElement createTransformTypeXPath(String value) { + return new JAXBElement(_TransformTypeXPath_QNAME, String.class, TransformType.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link BigInteger }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "HMACOutputLength", scope = SignatureMethodType.class) + public JAXBElement createSignatureMethodTypeHMACOutputLength(BigInteger value) { + return new JAXBElement(_SignatureMethodTypeHMACOutputLength_QNAME, BigInteger.class, SignatureMethodType.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link X509IssuerSerialType }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509IssuerSerial", scope = X509DataType.class) + public JAXBElement createX509DataTypeX509IssuerSerial(X509IssuerSerialType value) { + return new JAXBElement(_X509DataTypeX509IssuerSerial_QNAME, X509IssuerSerialType.class, X509DataType.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509CRL", scope = X509DataType.class) + public JAXBElement createX509DataTypeX509CRL(byte[] value) { + return new JAXBElement(_X509DataTypeX509CRL_QNAME, byte[].class, X509DataType.class, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509SubjectName", scope = X509DataType.class) + public JAXBElement createX509DataTypeX509SubjectName(String value) { + return new JAXBElement(_X509DataTypeX509SubjectName_QNAME, String.class, X509DataType.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509SKI", scope = X509DataType.class) + public JAXBElement createX509DataTypeX509SKI(byte[] value) { + return new JAXBElement(_X509DataTypeX509SKI_QNAME, byte[].class, X509DataType.class, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}} + * + */ + @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509Certificate", scope = X509DataType.class) + public JAXBElement createX509DataTypeX509Certificate(byte[] value) { + return new JAXBElement(_X509DataTypeX509Certificate_QNAME, byte[].class, X509DataType.class, ((byte[]) value)); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Link }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", name = "Link", scope = SoftwareIdentity.class) + public JAXBElement createSoftwareIdentityLink(Link value) { + return new JAXBElement(_SoftwareIdentityLink_QNAME, Link.class, SoftwareIdentity.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Evidence }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", name = "Evidence", scope = SoftwareIdentity.class) + public JAXBElement createSoftwareIdentityEvidence(Evidence value) { + return new JAXBElement(_SoftwareIdentityEvidence_QNAME, Evidence.class, SoftwareIdentity.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link ResourceCollection }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", name = "Payload", scope = SoftwareIdentity.class) + public JAXBElement createSoftwareIdentityPayload(ResourceCollection value) { + return new JAXBElement(_SoftwareIdentityPayload_QNAME, ResourceCollection.class, SoftwareIdentity.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link Entity }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", name = "Entity", scope = SoftwareIdentity.class) + public JAXBElement createSoftwareIdentityEntity(Entity value) { + return new JAXBElement(_SoftwareIdentityEntity_QNAME, Entity.class, SoftwareIdentity.class, value); + } + + /** + * Create an instance of {@link JAXBElement }{@code <}{@link SoftwareMeta }{@code >}} + * + */ + @XmlElementDecl(namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", name = "Meta", scope = SoftwareIdentity.class) + public JAXBElement createSoftwareIdentityMeta(SoftwareMeta value) { + return new JAXBElement(_SoftwareIdentityMeta_QNAME, SoftwareMeta.class, SoftwareIdentity.class, value); + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ObjectType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ObjectType.java new file mode 100644 index 00000000..159d3d94 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ObjectType.java @@ -0,0 +1,171 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlID; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import org.w3c.dom.Element; + + +/** + *

Java class for ObjectType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="ObjectType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence maxOccurs="unbounded" minOccurs="0">
+ *         <any processContents='lax'/>
+ *       </sequence>
+ *       <attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" />
+ *       <attribute name="MimeType" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="Encoding" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "ObjectType", propOrder = { + "content" +}) +public class ObjectType { + + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + @XmlAttribute(name = "MimeType") + protected String mimeType; + @XmlAttribute(name = "Encoding") + @XmlSchemaType(name = "anyURI") + protected String encoding; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Object } + * {@link Element } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + + /** + * Gets the value of the mimeType property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMimeType() { + return mimeType; + } + + /** + * Sets the value of the mimeType property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMimeType(String value) { + this.mimeType = value; + } + + /** + * Gets the value of the encoding property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getEncoding() { + return encoding; + } + + /** + * Sets the value of the encoding property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setEncoding(String value) { + this.encoding = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Ownership.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Ownership.java new file mode 100644 index 00000000..6d93c65b --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Ownership.java @@ -0,0 +1,85 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlEnumValue; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for Ownership. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="Ownership">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}NMTOKEN">
+ *     <enumeration value="abandon"/>
+ *     <enumeration value="private"/>
+ *     <enumeration value="shared"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "Ownership", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd") +@XmlEnum +public enum Ownership { + + + /** + * + * Determines the relative strength of ownership of the target + * piece of software. + * + * + */ + @XmlEnumValue("abandon") + ABANDON("abandon"), + + /** + * + * If this is uninstalled, then the [Link]'d software should be removed + * too. + * + * + */ + @XmlEnumValue("private") + PRIVATE("private"), + + /** + * + * If this is uninstalled, then the [Link]'d software should be removed + * if nobody else is sharing it + * + * + */ + @XmlEnumValue("shared") + SHARED("shared"); + private final String value; + + Ownership(String v) { + value = v; + } + + public String value() { + return value; + } + + public static Ownership fromValue(String v) { + for (Ownership c: Ownership.values()) { + if (c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/PGPDataType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/PGPDataType.java new file mode 100644 index 00000000..560497d4 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/PGPDataType.java @@ -0,0 +1,105 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java class for PGPDataType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="PGPDataType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice>
+ *         <sequence>
+ *           <element name="PGPKeyID" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/>
+ *           <element name="PGPKeyPacket" type="{http://www.w3.org/2001/XMLSchema}base64Binary" minOccurs="0"/>
+ *           <any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *         </sequence>
+ *         <sequence>
+ *           <element name="PGPKeyPacket" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/>
+ *           <any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *         </sequence>
+ *       </choice>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "PGPDataType", propOrder = { + "content" +}) +public class PGPDataType { + + @XmlElementRefs({ + @XmlElementRef(name = "PGPKeyID", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "PGPKeyPacket", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false) + }) + @XmlAnyElement(lax = true) + protected List content; + + /** + * Gets the rest of the content model. + * + *

+ * You are getting this "catch-all" property because of the following reason: + * The field name "PGPKeyPacket" is used by two different parts of a schema. See: + * line 218 of http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd + * line 213 of http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd + *

+ * To get rid of this property, apply a property customization to one + * of both of the following declarations to change their names: + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Element } + * {@link JAXBElement }{@code <}{@link byte[]}{@code >} + * {@link Object } + * {@link JAXBElement }{@code <}{@link byte[]}{@code >} + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Process.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Process.java new file mode 100644 index 00000000..553a9af3 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Process.java @@ -0,0 +1,96 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.math.BigInteger; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for Process complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="Process">
+ *   <complexContent>
+ *     <extension base="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Meta">
+ *       <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="pid" type="{http://www.w3.org/2001/XMLSchema}integer" />
+ *       <anyAttribute processContents='lax'/>
+ *     </extension>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "Process", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd") +public class Process + extends Meta +{ + + @XmlAttribute(name = "name", required = true) + protected String name; + @XmlAttribute(name = "pid") + protected BigInteger pid; + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + /** + * Gets the value of the pid property. + * + * @return + * possible object is + * {@link BigInteger } + * + */ + public BigInteger getPid() { + return pid; + } + + /** + * Sets the value of the pid property. + * + * @param value + * allowed object is + * {@link BigInteger } + * + */ + public void setPid(BigInteger value) { + this.pid = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/RSAKeyValueType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/RSAKeyValueType.java new file mode 100644 index 00000000..5e129509 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/RSAKeyValueType.java @@ -0,0 +1,93 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for RSAKeyValueType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="RSAKeyValueType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="Modulus" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/>
+ *         <element name="Exponent" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "RSAKeyValueType", propOrder = { + "modulus", + "exponent" +}) +public class RSAKeyValueType { + + @XmlElement(name = "Modulus", required = true) + protected byte[] modulus; + @XmlElement(name = "Exponent", required = true) + protected byte[] exponent; + + /** + * Gets the value of the modulus property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getModulus() { + return modulus; + } + + /** + * Sets the value of the modulus property. + * + * @param value + * allowed object is + * byte[] + */ + public void setModulus(byte[] value) { + this.modulus = value; + } + + /** + * Gets the value of the exponent property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getExponent() { + return exponent; + } + + /** + * Sets the value of the exponent property. + * + * @param value + * allowed object is + * byte[] + */ + public void setExponent(byte[] value) { + this.exponent = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ReferenceType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ReferenceType.java new file mode 100644 index 00000000..7adc059b --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ReferenceType.java @@ -0,0 +1,214 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlID; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for ReferenceType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="ReferenceType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}Transforms" minOccurs="0"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}DigestMethod"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}DigestValue"/>
+ *       </sequence>
+ *       <attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" />
+ *       <attribute name="URI" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
+ *       <attribute name="Type" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "ReferenceType", propOrder = { + "transforms", + "digestMethod", + "digestValue" +}) +public class ReferenceType { + + @XmlElement(name = "Transforms") + protected TransformsType transforms; + @XmlElement(name = "DigestMethod", required = true) + protected DigestMethodType digestMethod; + @XmlElement(name = "DigestValue", required = true) + protected byte[] digestValue; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + @XmlAttribute(name = "URI") + @XmlSchemaType(name = "anyURI") + protected String uri; + @XmlAttribute(name = "Type") + @XmlSchemaType(name = "anyURI") + protected String type; + + /** + * Gets the value of the transforms property. + * + * @return + * possible object is + * {@link TransformsType } + * + */ + public TransformsType getTransforms() { + return transforms; + } + + /** + * Sets the value of the transforms property. + * + * @param value + * allowed object is + * {@link TransformsType } + * + */ + public void setTransforms(TransformsType value) { + this.transforms = value; + } + + /** + * Gets the value of the digestMethod property. + * + * @return + * possible object is + * {@link DigestMethodType } + * + */ + public DigestMethodType getDigestMethod() { + return digestMethod; + } + + /** + * Sets the value of the digestMethod property. + * + * @param value + * allowed object is + * {@link DigestMethodType } + * + */ + public void setDigestMethod(DigestMethodType value) { + this.digestMethod = value; + } + + /** + * Gets the value of the digestValue property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getDigestValue() { + return digestValue; + } + + /** + * Sets the value of the digestValue property. + * + * @param value + * allowed object is + * byte[] + */ + public void setDigestValue(byte[] value) { + this.digestValue = value; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + + /** + * Gets the value of the uri property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getURI() { + return uri; + } + + /** + * Sets the value of the uri property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setURI(String value) { + this.uri = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Resource.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Resource.java new file mode 100644 index 00000000..c380db36 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Resource.java @@ -0,0 +1,68 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for Resource complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="Resource">
+ *   <complexContent>
+ *     <extension base="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Meta">
+ *       <attribute name="type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <anyAttribute processContents='lax'/>
+ *     </extension>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "Resource", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd") +public class Resource + extends Meta +{ + + @XmlAttribute(name = "type", required = true) + protected String type; + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ResourceCollection.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ResourceCollection.java new file mode 100644 index 00000000..c539cd0c --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/ResourceCollection.java @@ -0,0 +1,96 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElements; +import jakarta.xml.bind.annotation.XmlSeeAlso; +import jakarta.xml.bind.annotation.XmlType; + +import java.util.ArrayList; +import java.util.List; + + +/** + *

Java class for ResourceCollection complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="ResourceCollection">
+ *   <complexContent>
+ *     <extension base="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}BaseElement">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <element name="Directory" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Directory"/>
+ *         <element name="File" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}File"/>
+ *         <element name="Process" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Process"/>
+ *         <element name="Resource" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Resource"/>
+ *       </choice>
+ *       <anyAttribute processContents='lax' namespace='##other'/>
+ *     </extension>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "ResourceCollection", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", propOrder = { + "directoryOrFileOrProcess" +}) +@XmlSeeAlso({ + Evidence.class +}) +public class ResourceCollection + extends BaseElement +{ + + @XmlElements({ + @XmlElement(name = "Directory", type = Directory.class), + @XmlElement(name = "File", type = File.class), + @XmlElement(name = "Process", type = Process.class), + @XmlElement(name = "Resource", type = Resource.class) + }) + protected List directoryOrFileOrProcess; + + /** + * Gets the value of the directoryOrFileOrProcess property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the directoryOrFileOrProcess property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getDirectoryOrFileOrProcess().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Directory } + * {@link File } + * {@link Process } + * {@link Resource } + * + * + */ + public List getDirectoryOrFileOrProcess() { + if (directoryOrFileOrProcess == null) { + directoryOrFileOrProcess = new ArrayList(); + } + return this.directoryOrFileOrProcess; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/RetrievalMethodType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/RetrievalMethodType.java new file mode 100644 index 00000000..565f3ef9 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/RetrievalMethodType.java @@ -0,0 +1,127 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for RetrievalMethodType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="RetrievalMethodType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}Transforms" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="URI" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
+ *       <attribute name="Type" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "RetrievalMethodType", propOrder = { + "transforms" +}) +public class RetrievalMethodType { + + @XmlElement(name = "Transforms") + protected TransformsType transforms; + @XmlAttribute(name = "URI") + @XmlSchemaType(name = "anyURI") + protected String uri; + @XmlAttribute(name = "Type") + @XmlSchemaType(name = "anyURI") + protected String type; + + /** + * Gets the value of the transforms property. + * + * @return + * possible object is + * {@link TransformsType } + * + */ + public TransformsType getTransforms() { + return transforms; + } + + /** + * Sets the value of the transforms property. + * + * @param value + * allowed object is + * {@link TransformsType } + * + */ + public void setTransforms(TransformsType value) { + this.transforms = value; + } + + /** + * Gets the value of the uri property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getURI() { + return uri; + } + + /** + * Sets the value of the uri property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setURI(String value) { + this.uri = value; + } + + /** + * Gets the value of the type property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getType() { + return type; + } + + /** + * Sets the value of the type property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setType(String value) { + this.type = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SPKIDataType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SPKIDataType.java new file mode 100644 index 00000000..1196b231 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SPKIDataType.java @@ -0,0 +1,83 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java class for SPKIDataType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="SPKIDataType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence maxOccurs="unbounded">
+ *         <element name="SPKISexp" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/>
+ *         <any processContents='lax' namespace='##other' minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SPKIDataType", propOrder = { + "spkiSexpAndAny" +}) +public class SPKIDataType { + + @XmlElementRef(name = "SPKISexp", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class) + @XmlAnyElement(lax = true) + protected List spkiSexpAndAny; + + /** + * Gets the value of the spkiSexpAndAny property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the spkiSexpAndAny property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getSPKISexpAndAny().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Object } + * {@link Element } + * {@link JAXBElement }{@code <}{@link byte[]}{@code >} + * + * + */ + public List getSPKISexpAndAny() { + if (spkiSexpAndAny == null) { + spkiSexpAndAny = new ArrayList(); + } + return this.spkiSexpAndAny; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignatureMethodType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignatureMethodType.java new file mode 100644 index 00000000..cfe09c9f --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignatureMethodType.java @@ -0,0 +1,115 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for SignatureMethodType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="SignatureMethodType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="HMACOutputLength" type="{http://www.w3.org/2000/09/xmldsig#}HMACOutputLengthType" minOccurs="0"/>
+ *         <any namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SignatureMethodType", propOrder = { + "content" +}) +public class SignatureMethodType { + + @XmlElementRef(name = "HMACOutputLength", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false) + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Algorithm", required = true) + @XmlSchemaType(name = "anyURI") + protected String algorithm; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link BigInteger }{@code >} + * {@link Object } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the algorithm property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAlgorithm() { + return algorithm; + } + + /** + * Sets the value of the algorithm property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAlgorithm(String value) { + this.algorithm = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignaturePropertiesType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignaturePropertiesType.java new file mode 100644 index 00000000..877251c4 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignaturePropertiesType.java @@ -0,0 +1,111 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlID; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for SignaturePropertiesType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="SignaturePropertiesType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}SignatureProperty" maxOccurs="unbounded"/>
+ *       </sequence>
+ *       <attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SignaturePropertiesType", propOrder = { + "signatureProperty" +}) +public class SignaturePropertiesType { + + @XmlElement(name = "SignatureProperty", required = true) + protected List signatureProperty; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the signatureProperty property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the signatureProperty property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getSignatureProperty().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link SignaturePropertyType } + * + * + */ + public List getSignatureProperty() { + if (signatureProperty == null) { + signatureProperty = new ArrayList(); + } + return this.signatureProperty; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignaturePropertyType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignaturePropertyType.java new file mode 100644 index 00000000..424c32a0 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignaturePropertyType.java @@ -0,0 +1,144 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlID; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import org.w3c.dom.Element; + + +/** + *

Java class for SignaturePropertyType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="SignaturePropertyType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded">
+ *         <any processContents='lax' namespace='##other'/>
+ *       </choice>
+ *       <attribute name="Target" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
+ *       <attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SignaturePropertyType", propOrder = { + "content" +}) +public class SignaturePropertyType { + + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Target", required = true) + @XmlSchemaType(name = "anyURI") + protected String target; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Object } + * {@link Element } + * {@link String } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the target property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getTarget() { + return target; + } + + /** + * Sets the value of the target property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setTarget(String value) { + this.target = value; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignatureType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignatureType.java new file mode 100644 index 00000000..616e659c --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignatureType.java @@ -0,0 +1,195 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlID; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for SignatureType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="SignatureType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}SignedInfo"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}SignatureValue"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}KeyInfo" minOccurs="0"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}Object" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SignatureType", propOrder = { + "signedInfo", + "signatureValue", + "keyInfo", + "object" +}) +public class SignatureType { + + @XmlElement(name = "SignedInfo", required = true) + protected SignedInfoType signedInfo; + @XmlElement(name = "SignatureValue", required = true) + protected SignatureValueType signatureValue; + @XmlElement(name = "KeyInfo") + protected KeyInfoType keyInfo; + @XmlElement(name = "Object") + protected List object; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the signedInfo property. + * + * @return + * possible object is + * {@link SignedInfoType } + * + */ + public SignedInfoType getSignedInfo() { + return signedInfo; + } + + /** + * Sets the value of the signedInfo property. + * + * @param value + * allowed object is + * {@link SignedInfoType } + * + */ + public void setSignedInfo(SignedInfoType value) { + this.signedInfo = value; + } + + /** + * Gets the value of the signatureValue property. + * + * @return + * possible object is + * {@link SignatureValueType } + * + */ + public SignatureValueType getSignatureValue() { + return signatureValue; + } + + /** + * Sets the value of the signatureValue property. + * + * @param value + * allowed object is + * {@link SignatureValueType } + * + */ + public void setSignatureValue(SignatureValueType value) { + this.signatureValue = value; + } + + /** + * Gets the value of the keyInfo property. + * + * @return + * possible object is + * {@link KeyInfoType } + * + */ + public KeyInfoType getKeyInfo() { + return keyInfo; + } + + /** + * Sets the value of the keyInfo property. + * + * @param value + * allowed object is + * {@link KeyInfoType } + * + */ + public void setKeyInfo(KeyInfoType value) { + this.keyInfo = value; + } + + /** + * Gets the value of the object property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the object property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getObject().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link ObjectType } + * + * + */ + public List getObject() { + if (object == null) { + object = new ArrayList(); + } + return this.object; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignatureValueType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignatureValueType.java new file mode 100644 index 00000000..1ef14f94 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignatureValueType.java @@ -0,0 +1,99 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlID; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.XmlValue; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for SignatureValueType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="SignatureValueType">
+ *   <simpleContent>
+ *     <extension base="<http://www.w3.org/2001/XMLSchema>base64Binary">
+ *       <attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" />
+ *     </extension>
+ *   </simpleContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SignatureValueType", propOrder = { + "value" +}) +public class SignatureValueType { + + @XmlValue + protected byte[] value; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the value property. + * + * @return + * possible object is + * byte[] + */ + public byte[] getValue() { + return value; + } + + /** + * Sets the value of the value property. + * + * @param value + * allowed object is + * byte[] + */ + public void setValue(byte[] value) { + this.value = value; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignedInfoType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignedInfoType.java new file mode 100644 index 00000000..89958bfd --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SignedInfoType.java @@ -0,0 +1,167 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlID; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + + +/** + *

Java class for SignedInfoType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="SignedInfoType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}CanonicalizationMethod"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}SignatureMethod"/>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}Reference" maxOccurs="unbounded"/>
+ *       </sequence>
+ *       <attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SignedInfoType", propOrder = { + "canonicalizationMethod", + "signatureMethod", + "reference" +}) +public class SignedInfoType { + + @XmlElement(name = "CanonicalizationMethod", required = true) + protected CanonicalizationMethodType canonicalizationMethod; + @XmlElement(name = "SignatureMethod", required = true) + protected SignatureMethodType signatureMethod; + @XmlElement(name = "Reference", required = true) + protected List reference; + @XmlAttribute(name = "Id") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlID + @XmlSchemaType(name = "ID") + protected String id; + + /** + * Gets the value of the canonicalizationMethod property. + * + * @return + * possible object is + * {@link CanonicalizationMethodType } + * + */ + public CanonicalizationMethodType getCanonicalizationMethod() { + return canonicalizationMethod; + } + + /** + * Sets the value of the canonicalizationMethod property. + * + * @param value + * allowed object is + * {@link CanonicalizationMethodType } + * + */ + public void setCanonicalizationMethod(CanonicalizationMethodType value) { + this.canonicalizationMethod = value; + } + + /** + * Gets the value of the signatureMethod property. + * + * @return + * possible object is + * {@link SignatureMethodType } + * + */ + public SignatureMethodType getSignatureMethod() { + return signatureMethod; + } + + /** + * Sets the value of the signatureMethod property. + * + * @param value + * allowed object is + * {@link SignatureMethodType } + * + */ + public void setSignatureMethod(SignatureMethodType value) { + this.signatureMethod = value; + } + + /** + * Gets the value of the reference property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the reference property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getReference().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link ReferenceType } + * + * + */ + public List getReference() { + if (reference == null) { + reference = new ArrayList(); + } + return this.reference; + } + + /** + * Gets the value of the id property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getId() { + return id; + } + + /** + * Sets the value of the id property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setId(String value) { + this.id = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SoftwareIdentity.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SoftwareIdentity.java new file mode 100644 index 00000000..ef614fa9 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SoftwareIdentity.java @@ -0,0 +1,375 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import org.w3c.dom.Element; + + +/** + *

Java class for SoftwareIdentity complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="SoftwareIdentity">
+ *   <complexContent>
+ *     <extension base="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}BaseElement">
+ *       <choice maxOccurs="unbounded">
+ *         <element name="Entity" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Entity" maxOccurs="unbounded"/>
+ *         <element name="Evidence" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Evidence" minOccurs="0"/>
+ *         <element name="Link" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Link" maxOccurs="unbounded" minOccurs="0"/>
+ *         <element name="Meta" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}SoftwareMeta" maxOccurs="unbounded" minOccurs="0"/>
+ *         <element name="Payload" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}ResourceCollection" minOccurs="0"/>
+ *         <any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       </choice>
+ *       <attribute name="corpus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *       <attribute name="patch" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *       <attribute name="media" type="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Media" />
+ *       <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="supplemental" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
+ *       <attribute name="tagId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="tagVersion" type="{http://www.w3.org/2001/XMLSchema}integer" default="0" />
+ *       <attribute name="version" type="{http://www.w3.org/2001/XMLSchema}string" default="0.0" />
+ *       <attribute name="versionScheme" type="{http://www.w3.org/2001/XMLSchema}NMTOKEN" default="multipartnumeric" />
+ *       <anyAttribute processContents='lax' namespace='##other'/>
+ *     </extension>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SoftwareIdentity", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", propOrder = { + "entityOrEvidenceOrLink" +}) +public class SoftwareIdentity + extends BaseElement +{ + + @XmlElementRefs({ + @XmlElementRef(name = "Meta", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", type = JAXBElement.class, required = false), + @XmlElementRef(name = "Evidence", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", type = JAXBElement.class, required = false), + @XmlElementRef(name = "Link", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", type = JAXBElement.class, required = false), + @XmlElementRef(name = "Payload", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", type = JAXBElement.class, required = false), + @XmlElementRef(name = "Entity", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd", type = JAXBElement.class, required = false) + }) + @XmlAnyElement(lax = true) + protected List entityOrEvidenceOrLink; + @XmlAttribute(name = "corpus") + protected Boolean corpus; + @XmlAttribute(name = "patch") + protected Boolean patch; + @XmlAttribute(name = "media") + protected String media; + @XmlAttribute(name = "name", required = true) + protected String name; + @XmlAttribute(name = "supplemental") + protected Boolean supplemental; + @XmlAttribute(name = "tagId", required = true) + protected String tagId; + @XmlAttribute(name = "tagVersion") + protected BigInteger tagVersion; + @XmlAttribute(name = "version") + protected String version; + @XmlAttribute(name = "versionScheme") + @XmlJavaTypeAdapter(CollapsedStringAdapter.class) + @XmlSchemaType(name = "NMTOKEN") + protected String versionScheme; + + /** + * Gets the value of the entityOrEvidenceOrLink property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the entityOrEvidenceOrLink property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getEntityOrEvidenceOrLink().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link SoftwareMeta }{@code >} + * {@link Object } + * {@link JAXBElement }{@code <}{@link Evidence }{@code >} + * {@link Element } + * {@link JAXBElement }{@code <}{@link Link }{@code >} + * {@link JAXBElement }{@code <}{@link ResourceCollection }{@code >} + * {@link JAXBElement }{@code <}{@link Entity }{@code >} + * + * + */ + public List getEntityOrEvidenceOrLink() { + if (entityOrEvidenceOrLink == null) { + entityOrEvidenceOrLink = new ArrayList(); + } + return this.entityOrEvidenceOrLink; + } + + /** + * Gets the value of the corpus property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isCorpus() { + if (corpus == null) { + return false; + } else { + return corpus; + } + } + + /** + * Sets the value of the corpus property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setCorpus(Boolean value) { + this.corpus = value; + } + + /** + * Gets the value of the patch property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isPatch() { + if (patch == null) { + return false; + } else { + return patch; + } + } + + /** + * Sets the value of the patch property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setPatch(Boolean value) { + this.patch = value; + } + + /** + * Gets the value of the media property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMedia() { + return media; + } + + /** + * Sets the value of the media property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMedia(String value) { + this.media = value; + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + + /** + * Gets the value of the supplemental property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public boolean isSupplemental() { + if (supplemental == null) { + return false; + } else { + return supplemental; + } + } + + /** + * Sets the value of the supplemental property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setSupplemental(Boolean value) { + this.supplemental = value; + } + + /** + * Gets the value of the tagId property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getTagId() { + return tagId; + } + + /** + * Sets the value of the tagId property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setTagId(String value) { + this.tagId = value; + } + + /** + * Gets the value of the tagVersion property. + * + * @return + * possible object is + * {@link BigInteger } + * + */ + public BigInteger getTagVersion() { + if (tagVersion == null) { + return new BigInteger("0"); + } else { + return tagVersion; + } + } + + /** + * Sets the value of the tagVersion property. + * + * @param value + * allowed object is + * {@link BigInteger } + * + */ + public void setTagVersion(BigInteger value) { + this.tagVersion = value; + } + + /** + * Gets the value of the version property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getVersion() { + if (version == null) { + return "0.0"; + } else { + return version; + } + } + + /** + * Sets the value of the version property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setVersion(String value) { + this.version = value; + } + + /** + * Gets the value of the versionScheme property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getVersionScheme() { + if (versionScheme == null) { + return "multipartnumeric"; + } else { + return versionScheme; + } + } + + /** + * Sets the value of the versionScheme property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setVersionScheme(String value) { + this.versionScheme = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SoftwareMeta.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SoftwareMeta.java new file mode 100644 index 00000000..a0643766 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/SoftwareMeta.java @@ -0,0 +1,446 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for SoftwareMeta complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="SoftwareMeta">
+ *   <complexContent>
+ *     <extension base="{http://standards.iso.org/iso/19770/-2/2015/schema.xsd}Meta">
+ *       <attribute name="activationStatus" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="channelType" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="colloquialVersion" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="description" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="edition" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="entitlementDataRequired" type="{http://www.w3.org/2001/XMLSchema}boolean" />
+ *       <attribute name="entitlementKey" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="generator" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="persistentId" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="product" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="productFamily" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="revision" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="summary" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="unspscCode" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <attribute name="unspscVersion" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *       <anyAttribute processContents='lax'/>
+ *     </extension>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "SoftwareMeta", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd") +public class SoftwareMeta + extends Meta +{ + + @XmlAttribute(name = "activationStatus") + protected String activationStatus; + @XmlAttribute(name = "channelType") + protected String channelType; + @XmlAttribute(name = "colloquialVersion") + protected String colloquialVersion; + @XmlAttribute(name = "description") + protected String description; + @XmlAttribute(name = "edition") + protected String edition; + @XmlAttribute(name = "entitlementDataRequired") + protected Boolean entitlementDataRequired; + @XmlAttribute(name = "entitlementKey") + protected String entitlementKey; + @XmlAttribute(name = "generator") + protected String generator; + @XmlAttribute(name = "persistentId") + protected String persistentId; + @XmlAttribute(name = "product") + protected String product; + @XmlAttribute(name = "productFamily") + protected String productFamily; + @XmlAttribute(name = "revision") + protected String revision; + @XmlAttribute(name = "summary") + protected String summary; + @XmlAttribute(name = "unspscCode") + protected String unspscCode; + @XmlAttribute(name = "unspscVersion") + protected String unspscVersion; + + /** + * Gets the value of the activationStatus property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getActivationStatus() { + return activationStatus; + } + + /** + * Sets the value of the activationStatus property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setActivationStatus(String value) { + this.activationStatus = value; + } + + /** + * Gets the value of the channelType property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getChannelType() { + return channelType; + } + + /** + * Sets the value of the channelType property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setChannelType(String value) { + this.channelType = value; + } + + /** + * Gets the value of the colloquialVersion property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getColloquialVersion() { + return colloquialVersion; + } + + /** + * Sets the value of the colloquialVersion property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setColloquialVersion(String value) { + this.colloquialVersion = value; + } + + /** + * Gets the value of the description property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getDescription() { + return description; + } + + /** + * Sets the value of the description property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setDescription(String value) { + this.description = value; + } + + /** + * Gets the value of the edition property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getEdition() { + return edition; + } + + /** + * Sets the value of the edition property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setEdition(String value) { + this.edition = value; + } + + /** + * Gets the value of the entitlementDataRequired property. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isEntitlementDataRequired() { + return entitlementDataRequired; + } + + /** + * Sets the value of the entitlementDataRequired property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setEntitlementDataRequired(Boolean value) { + this.entitlementDataRequired = value; + } + + /** + * Gets the value of the entitlementKey property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getEntitlementKey() { + return entitlementKey; + } + + /** + * Sets the value of the entitlementKey property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setEntitlementKey(String value) { + this.entitlementKey = value; + } + + /** + * Gets the value of the generator property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getGenerator() { + return generator; + } + + /** + * Sets the value of the generator property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setGenerator(String value) { + this.generator = value; + } + + /** + * Gets the value of the persistentId property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getPersistentId() { + return persistentId; + } + + /** + * Sets the value of the persistentId property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setPersistentId(String value) { + this.persistentId = value; + } + + /** + * Gets the value of the product property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getProduct() { + return product; + } + + /** + * Sets the value of the product property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setProduct(String value) { + this.product = value; + } + + /** + * Gets the value of the productFamily property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getProductFamily() { + return productFamily; + } + + /** + * Sets the value of the productFamily property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setProductFamily(String value) { + this.productFamily = value; + } + + /** + * Gets the value of the revision property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getRevision() { + return revision; + } + + /** + * Sets the value of the revision property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setRevision(String value) { + this.revision = value; + } + + /** + * Gets the value of the summary property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSummary() { + return summary; + } + + /** + * Sets the value of the summary property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSummary(String value) { + this.summary = value; + } + + /** + * Gets the value of the unspscCode property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getUnspscCode() { + return unspscCode; + } + + /** + * Sets the value of the unspscCode property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setUnspscCode(String value) { + this.unspscCode = value; + } + + /** + * Gets the value of the unspscVersion property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getUnspscVersion() { + return unspscVersion; + } + + /** + * Sets the value of the unspscVersion property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setUnspscVersion(String value) { + this.unspscVersion = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/TransformType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/TransformType.java new file mode 100644 index 00000000..9e3bcef0 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/TransformType.java @@ -0,0 +1,116 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlMixed; +import javax.xml.bind.annotation.XmlSchemaType; +import javax.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java class for TransformType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="TransformType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <choice maxOccurs="unbounded" minOccurs="0">
+ *         <any processContents='lax' namespace='##other'/>
+ *         <element name="XPath" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *       </choice>
+ *       <attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "TransformType", propOrder = { + "content" +}) +public class TransformType { + + @XmlElementRef(name = "XPath", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false) + @XmlMixed + @XmlAnyElement(lax = true) + protected List content; + @XmlAttribute(name = "Algorithm", required = true) + @XmlSchemaType(name = "anyURI") + protected String algorithm; + + /** + * Gets the value of the content property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the content property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getContent().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link Element } + * {@link String } + * {@link JAXBElement }{@code <}{@link String }{@code >} + * {@link Object } + * + * + */ + public List getContent() { + if (content == null) { + content = new ArrayList(); + } + return this.content; + } + + /** + * Gets the value of the algorithm property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAlgorithm() { + return algorithm; + } + + /** + * Sets the value of the algorithm property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAlgorithm(String value) { + this.algorithm = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/TransformsType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/TransformsType.java new file mode 100644 index 00000000..2d2acc80 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/TransformsType.java @@ -0,0 +1,76 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for TransformsType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="TransformsType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{http://www.w3.org/2000/09/xmldsig#}Transform" maxOccurs="unbounded"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "TransformsType", propOrder = { + "transform" +}) +public class TransformsType { + + @XmlElement(name = "Transform", required = true) + protected List transform; + + /** + * Gets the value of the transform property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the transform property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getTransform().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link TransformType } + * + * + */ + public List getTransform() { + if (transform == null) { + transform = new ArrayList(); + } + return this.transform; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Use.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Use.java new file mode 100644 index 00000000..f35efb55 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/Use.java @@ -0,0 +1,82 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlEnumValue; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for Use. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="Use">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}NMTOKEN">
+ *     <enumeration value="required"/>
+ *     <enumeration value="recommended"/>
+ *     <enumeration value="optional"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "Use", namespace = "http://standards.iso.org/iso/19770/-2/2015/schema.xsd") +@XmlEnum +public enum Use { + + + /** + * + * The [Link]'d software is absolutely required for installation + * + * + */ + @XmlEnumValue("required") + REQUIRED("required"), + + /** + * + * Not absolutely required, but install unless directed not to + * + * + */ + @XmlEnumValue("recommended") + RECOMMENDED("recommended"), + + /** + * + * Not absolutely required, install only when asked + * + * + */ + @XmlEnumValue("optional") + OPTIONAL("optional"); + private final String value; + + Use(String v) { + value = v; + } + + public String value() { + return value; + } + + public static Use fromValue(String v) { + for (Use c: Use.values()) { + if (c.value.equals(v)) { + return c; + } + } + throw new IllegalArgumentException(v); + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/X509DataType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/X509DataType.java new file mode 100644 index 00000000..360cf773 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/X509DataType.java @@ -0,0 +1,100 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlElementRef; +import javax.xml.bind.annotation.XmlElementRefs; +import javax.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java class for X509DataType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="X509DataType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence maxOccurs="unbounded">
+ *         <choice>
+ *           <element name="X509IssuerSerial" type="{http://www.w3.org/2000/09/xmldsig#}X509IssuerSerialType"/>
+ *           <element name="X509SKI" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/>
+ *           <element name="X509SubjectName" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *           <element name="X509Certificate" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/>
+ *           <element name="X509CRL" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/>
+ *           <any processContents='lax' namespace='##other'/>
+ *         </choice>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "X509DataType", propOrder = { + "x509IssuerSerialOrX509SKIOrX509SubjectName" +}) +public class X509DataType { + + @XmlElementRefs({ + @XmlElementRef(name = "X509SubjectName", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "X509Certificate", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "X509IssuerSerial", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "X509SKI", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false), + @XmlElementRef(name = "X509CRL", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class, required = false) + }) + @XmlAnyElement(lax = true) + protected List x509IssuerSerialOrX509SKIOrX509SubjectName; + + /** + * Gets the value of the x509IssuerSerialOrX509SKIOrX509SubjectName property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the x509IssuerSerialOrX509SKIOrX509SubjectName property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getX509IssuerSerialOrX509SKIOrX509SubjectName().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link JAXBElement }{@code <}{@link String }{@code >} + * {@link JAXBElement }{@code <}{@link byte[]}{@code >} + * {@link Object } + * {@link JAXBElement }{@code <}{@link X509IssuerSerialType }{@code >} + * {@link Element } + * {@link JAXBElement }{@code <}{@link byte[]}{@code >} + * {@link JAXBElement }{@code <}{@link byte[]}{@code >} + * + * + */ + public List getX509IssuerSerialOrX509SKIOrX509SubjectName() { + if (x509IssuerSerialOrX509SKIOrX509SubjectName == null) { + x509IssuerSerialOrX509SKIOrX509SubjectName = new ArrayList(); + } + return this.x509IssuerSerialOrX509SKIOrX509SubjectName; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/X509IssuerSerialType.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/X509IssuerSerialType.java new file mode 100644 index 00000000..4b913558 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/X509IssuerSerialType.java @@ -0,0 +1,98 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + + +package hirs.attestationca.portal.utils.xjc; + +import java.math.BigInteger; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for X509IssuerSerialType complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="X509IssuerSerialType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="X509IssuerName" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="X509SerialNumber" type="{http://www.w3.org/2001/XMLSchema}integer"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "X509IssuerSerialType", propOrder = { + "x509IssuerName", + "x509SerialNumber" +}) +public class X509IssuerSerialType { + + @XmlElement(name = "X509IssuerName", required = true) + protected String x509IssuerName; + @XmlElement(name = "X509SerialNumber", required = true) + protected BigInteger x509SerialNumber; + + /** + * Gets the value of the x509IssuerName property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getX509IssuerName() { + return x509IssuerName; + } + + /** + * Sets the value of the x509IssuerName property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setX509IssuerName(String value) { + this.x509IssuerName = value; + } + + /** + * Gets the value of the x509SerialNumber property. + * + * @return + * possible object is + * {@link BigInteger } + * + */ + public BigInteger getX509SerialNumber() { + return x509SerialNumber; + } + + /** + * Sets the value of the x509SerialNumber property. + * + * @param value + * allowed object is + * {@link BigInteger } + * + */ + public void setX509SerialNumber(BigInteger value) { + this.x509SerialNumber = value; + } + +} diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/package-info.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/package-info.java new file mode 100644 index 00000000..11c4c016 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/utils/xjc/package-info.java @@ -0,0 +1,9 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2023.02.16 at 04:29:40 PM UTC +// + +@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.w3.org/2000/09/xmldsig#", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) +package hirs.attestationca.portal.utils.xjc; diff --git a/HIRS_AttestationCAPortal/src/main/resources/component-class.json b/HIRS_AttestationCAPortal/src/main/resources/component-class.json new file mode 100644 index 00000000..c4b81213 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/resources/component-class.json @@ -0,0 +1,477 @@ +{ + "TCG": { + "Processors": { + "ID": "0x00010000", + "Types": { + "0x00000002": "CPU", + "0x00000003": "Math Processor", + "0x00000004": "DSP Processor", + "0x00000005": "Video Processor", + "0x00000006": "GPU" + } + }, + "Containers": { + "ID": "0x00020000", + "Types": { + "0x00000002": "Desktop", + "0x00000003": "Low Profile Desktop", + "0x00000004": "Pizza Box", + "0x00000005": "Mini Tower", + "0x00000006": "Tower", + "0x00000007": "Portable", + "0x00000008": "Laptop", + "0x00000009": "Notebook", + "0x0000000A": "Hand Held", + "0x0000000B": "Docking Station", + "0x0000000C": "All in One", + "0x0000000D": "Sub Notebook", + "0x0000000E": "Space-saving", + "0x0000000F": "Lunch Box", + "0x00000010": "Main Server Chassis", + "0x00000011": "Expansion Chassis", + "0x00000012": "Sub Chassis", + "0x00000013": "Bus Expansion Chassis", + "0x00000014": "Peripheral Chassis", + "0x00000015": "RAID Chassis", + "0x00000016": "Rack Mount Chassis", + "0x00000017": "Sealed-case PC", + "0x00000018": "Multi-system Chassis", + "0x00000019": "Compact PCI", + "0x0000001A": "Advanced TCA", + "0x0000001B": "Blade", + "0x0000001C": "Blade Enclosure", + "0x0000001D": "Tablet", + "0x0000001E": "Convertible", + "0x0000001F": "Detachable", + "0x00000020": "IoT Gateway", + "0x00000021": "Embedded PC", + "0x00000022": "MiniPC", + "0x00000023": "Stick PC", + "0x00000024": "1U Rack Mount Chassis", + "0x00000025": "2U Rack Mount Chassis", + "0x00000026": "3U Rack Mount Chassis", + "0x00000027": "4U Rack Mount Chassis", + "0x00000028": "5U Rack Mount Chassis", + "0x00000029": "6U Rack Mount Chassis", + "0x0000002A": "7U Rack Mount Chassis", + "0x0000002B": "8U Rack Mount Chassis" + } + }, + "IC Boards": { + "ID": "0x00030000", + "Types": { + "0x00000002": "Daughter Board", + "0x00000003": "Motherboard", + "0x00000004": "Riser Card" + } + }, + "Modules": { + "ID": "0x00040000", + "Types": { + "0x00000002": "SAS Bridgeboard", + "0x00000003": "Processor Module", + "0x00000004": "I/O Module", + "0x00000005": "Memory Module", + "0x00000006": "Power Module", + "0x00000007": "Processor/Memory Module", + "0x00000008": "Processor/IO Module", + "0x00000009": "TPM" + } + }, + "Controllers": { + "ID": "0x00050000", + "Types": { + "0x00000002": "Video Controller", + "0x00000003": "SCSI Controller", + "0x00000004": "Ethernet Controller", + "0x00000005": "Token Ring Controller", + "0x00000006": "Audio/Sound Controller", + "0x00000007": "PATA Controller", + "0x00000008": "SATA Controller", + "0x00000009": "SAS Controller", + "0x0000000A": "LED Display Controller", + "0x0000000B": "RAID Controller", + "0x0000000C": "Remote Access Controller", + "0x0000000E": "USB Controller", + "0x0000000F": "Multi-function Storage Controller", + "0x00000010": "Multi-function Network Controller", + "0x00000011": "Smart IO Controller" + } + }, + "Memory": { + "ID": "0x00060000", + "Types": { + "0x00000002": "Port Controller", + "0x00000003": "Baseboard Management Controller", + "0x00000004": "DRAM Memory", + "0x00000005": "EDRAM Memory", + "0x00000006": "VRAM Memory", + "0x00000007": "SRAM Memory", + "0x00000008": "RAM Memory", + "0x00000009": "ROM Memory", + "0x0000000A": "FLASH Memory", + "0x0000000B": "EEPROM Memory", + "0x0000000C": "FEPROM Memory", + "0x0000000D": "EPROM Memory", + "0x0000000E": "CDRAM Memory", + "0x0000000F": "3DRAM Memory", + "0x00000010": "SDRAM Memory", + "0x00000011": "SGRAM Memory", + "0x00000012": "RDRAM Memory", + "0x00000013": "DDR Memory", + "0x00000014": "DDR2 Memory", + "0x00000015": "DDR3 Memory", + "0x00000016": "DDR4 Memory", + "0x00000017": "LPDDR Memory", + "0x00000018": "LPDDR2 Memory", + "0x00000019": "LPDDR3 Memory", + "0x0000001A": "LPDDR4 Memory", + "0x0000001B": "NVRAM Memory", + "0x0000001C": "3D Xpoint Memory" + } + }, + "Storage": { + "ID": "0x00070000", + "Types": { + "0x00000002": "Storage Drive", + "0x00000003": "SSD Drive", + "0x00000004": "M.2 Drive", + "0x00000005": "HDD Drive" + } + }, + "Media Drives": { + "ID": "0x00080000", + "Types": { + "0x00000002": "Floppy Drive", + "0x00000003": "Tape Drive", + "0x00000004": "PCIe Drive", + "0x00000005": "CD Drive", + "0x00000006": "DVD Drive", + "0x00000007": "Blu-Ray Drive" + } + }, + "Network Adapters": { + "ID": "0x00090000", + "Types": { + "0x00000002": "Ethernet Adapter", + "0x00000003": "WiFi Adapter", + "0x00000004": "Bluetooh Adapter", + "0x00000005": "Cellular Adapter", + "0x00000006": "Zigbee Adapter", + "0x00000007": "3G Cellular Adapter", + "0x00000008": "4G Cellular Adapter", + "0x00000009": "5G Cellular Adapter", + "0x0000000A": "Network Switch", + "0x0000000B": "Network Router" + } + }, + "Energy Object": { + "ID": "0x000A0000", + "Types": { + "0x00000002": "Power Supply", + "0x00000003": "Battery", + "0x00000004": "Coin Battery", + "0x00000005": "Capacitor Battery" + } + }, + "Sensors": { + "ID": "0x000B0000", + "Types": { + "0x00000002": "Optical Sensor", + "0x00000003": "Temperature Sensor", + "0x00000004": "Proximity Sensor", + "0x00000005": "IR Sensor", + "0x00000006": "Chemical Sensor", + "0x00000007": "Motion Detection Sensor", + "0x00000008": "Level Sensor", + "0x00000009": "Gyroscopic Sensor", + "0x0000000A": "Humidity Sensor", + "0x0000000B": "Accelerometer Sensor" + } + }, + "Display Devices": { + "ID": "0x000C0000", + "Types": { + "0x00000002": "LCD Display Panel", + "0x00000003": "LED Display Panel", + "0x00000004": "OLED Display Panel", + "0x00000005": "CRT Display Panel" + } + }, + "Cooling": { + "ID": "0x000D0000", + "Types": { + "0x00000002": "Thermal Assembly", + "0x00000003": "Fan", + "0x00000004": "Chassis Fan", + "0x00000005": "Socket Fan", + "0x00000006": "Heatsink", + "0x00000007": "Liquid Cooling" + } + }, + "Input Devices": { + "ID": "0x000E0000", + "Types": { + "0x00000002": "Mouse", + "0x00000003": "Track Ball", + "0x00000004": "Track Point", + "0x00000005": "Glide Point", + "0x00000006": "Touch Pad", + "0x00000007": "Touch Screen", + "0x00000008": "Camera", + "0x00000009": "Fingerprint Reader", + "0x0000000A": "Keyboard", + "0x0000000B": "Smartcard Reader", + "0x0000000C": "Biometric Reader", + "0x0000000D": "Joystick", + "0x0000000E": "Gaming Controller", + "0x0000000F": "IR Camera", + "0x00000010": "Facial Recognition Camera", + "0x00000011": "Scanner" + } + }, + "Slots": { + "ID": "0x000F0000", + "Types": { + "0x00000002": "Socket", + "0x00000003": "ISA Slot", + "0x00000004": "PCI Slot", + "0x00000005": "AGP Slot", + "0x00000006": "PCI-X Slot", + "0x00000007": "M.2 Slot", + "0x00000008": "MXM Slot", + "0x00000009": "PCI Express Slot", + "0x0000000A": "PCI Express Mini", + "0x0000000B": "PC-98 Slot", + "0x0000000C": "Memory Slot" + } + }, + "Ports": { + "ID": "0x00100000", + "Types": { + "0x00000002": "Parallel Port", + "0x00000003": "Serial Port", + "0x00000004": "SCSI Port", + "0x00000005": "MIDI Port", + "0x00000006": "USB Port", + "0x00000007": "Firewire Port", + "0x00000008": "PCMCIA Port", + "0x00000009": "ATA Port", + "0x0000000A": "SATA Port", + "0x0000000B": "SAS Port", + "0x0000000C": "Optical Port", + "0x0000000D": "DisplayPort", + "0x0000000E": "Mini DisplayPort", + "0x0000000F": "HDMI Port", + "0x00000010": "Mini HDMI Port", + "0x00000011": "Micro HDMI Port", + "0x00000012": "Thunderbolt Port", + "0x00000013": "VGA Port", + "0x00000014": "Mini VGA Port", + "0x00000015": "DVI Port", + "0x00000016": "DVI-I Port", + "0x00000017": "DVI-D Port", + "0x00000018": "DVI-A Port", + "0x00000019": "Mini DVI Port", + "0x0000001A": "Micro DVI Port", + "0x0000001B": "Ethernet Port", + "0x0000001C": "ADB Port", + "0x0000001D": "Mac Serial Port", + "0x0000001E": "PS/2 Port", + "0x0000001F": "Surround Sound Port", + "0x00000020": "Stereo Port", + "0x00000021": "Dolby 5.1 Port", + "0x00000022": "Dolby 7.1 Port", + "0x00000023": "Dolby 7.2 Port", + "0x00000024": "Line In Port", + "0x00000025": "Microphone Port", + "0x00000026": "Speaker Port", + "0x00000027": "Digital Audio Port", + "0x00000028": "TOSLINK Port" + } + }, + "Discrete Component": { + "ID": "0x00110000", + "Types": { + "0x00000002": "Capacitor", + "0x00000003": "Resistor", + "0x00000004": "Inductor", + "0x00000005": "Diode", + "0x00000006": "Crystal Oscilator", + "0x00000007": "Logic Gate", + "0x00000008": "Ferrite Beads", + "0x00000009": "Transistor", + "0x0000000A": "Fuse", + "0x0000000B": "Voltage Regulator", + "0x0000000C": "DC/DC Converter", + "0x0000000D": "Switching Regulator", + "0x0000000E": "Power Switch" + } + }, + "Cabling": { + "ID": "0x00120000", + "Types": { + "0x00000002": "AC Adapter", + "0x00000003": "Power Cord", + "0x00000004": "Serial ATA Cable", + "0x00000005": "Serial ATA Power Cable", + "0x00000006": "Drive Cable", + "0x00000007": "Power Supply Cable", + "0x00000008": "IDE Cable", + "0x00000009": "Molex Cable", + "0x0000000A": "Ribbon Cable", + "0x0000000B": "PCI Express Cable" + } + }, + "Firmware": { + "ID": "0x00130000", + "Types": { + "0x00000002": "UEFI", + "0x00000003": "System BIOS", + "0x00000004": "Drive BIOS", + "0x00000005": "Bootloader", + "0x00000006": "System Management Module" + } + } + }, + "SMBIOS": { + "BIOS": { + "ID": "0x00000000", + "Types": { + "0x00000001": "Other", + "0x00000002": "Unknown" + } + }, + "System": { + "ID": "0x00010000", + "Types": { + "0x00000001": "Other", + "0x00000002": "Unknown" + } + }, + "Baseboard": { + "ID": "0x00020000", + "Types": { + "0x00000001": "Other", + "0x00000002": "Unknown", + "0x00000003": "Server Blade", + "0x00000004": "Connectivity Switch", + "0x00000005": "System Management Module", + "0x00000006": "Processor Module", + "0x00000007": "I/O Module", + "0x00000008": "Memory Module", + "0x00000009": "Daughter board", + "0x0000000A": "Motherboard (includes processor, memory, and I/O)", + "0x0000000B": "Processor/Memory Module", + "0x0000000C": "Processor/IO Module", + "0x0000000D": "Interconnect board" + } + }, + "Chassis": { + "ID": "0x00030000", + "Types": { + "0x00000001": "Other", + "0x00000002": "Unknown", + "0x00000003": "Desktop", + "0x00000004": "Low Profile Desktop", + "0x00000005": "Pizza Box", + "0x00000006": "Mini Tower", + "0x00000007": "Tower", + "0x00000008": "Portable", + "0x00000009": "Laptop", + "0x0000000A": "Notebook", + "0x0000000B": "Hand Held", + "0x0000000C": "Docking Station", + "0x0000000D": "All in One", + "0x0000000E": "Sub Notebook", + "0x0000000F": "Space-saving", + "0x00000010": "Lunch Box", + "0x00000011": "Main Server Chassis", + "0x00000012": "Expansion Chassis", + "0x00000013": "SubChassis", + "0x00000014": "Bus Expansion Chassis", + "0x00000015": "Peripheral Chassis", + "0x00000016": "RAID Chassis", + "0x00000017": "Rack Mount Chassis", + "0x00000018": "Sealed-case PC", + "0x00000019": "Multi-system chassis", + "0x0000001A": "Compact PCI", + "0x0000001B": "Advanced TCA", + "0x0000001C": "Blade", + "0x0000001D": "Blade Enclosure", + "0x0000001E": "Tablet", + "0x0000001F": "Convertible", + "0x00000020": "Detachable", + "0x00000021": "IoT Gateway", + "0x00000022": "Embedded PC", + "0x00000023": "Mini PC", + "0x00000024": "Stick PC" + } + }, + "Processor": { + "ID": "0x00040000", + "Types": { + "0x00000001": "Other", + "0x00000002": "Unknown", + "0x00000003": "Central Processor", + "0x00000004": "Math Processor", + "0x00000005": "DSP Processor", + "0x00000006": "Video Processor" + } + }, + "RAM": { + "ID": "0x00110000", + "Types": { + "0x00000001": "Other", + "0x00000002": "Unknown", + "0x00000003": "DRAM", + "0x00000004": "EDRAM", + "0x00000005": "VRAM", + "0x00000006": "SRAM", + "0x00000007": "RAM", + "0x00000008": "ROM", + "0x00000009": "FLASH", + "0x0000000A": "EEPROM", + "0x0000000B": "FEPROM", + "0x0000000C": "EPROM", + "0x0000000D": "CDRAM", + "0x0000000E": "3DRAM", + "0x0000000F": "SDRAM", + "0x00000010": "SGRAM", + "0x00000011": "RDRAM", + "0x00000012": "DDR", + "0x00000013": "DDR2", + "0x00000014": "DDR2 FB-DIMM", + "0x00000015": "Reserved", + "0x00000016": "Reserved", + "0x00000017": "Reserved", + "0x00000018": "DDR3", + "0x00000019": "FBD2", + "0x0000001A": "DDR4", + "0x0000001B": "LPDDR", + "0x0000001C": "LPDDR2", + "0x0000001D": "LPDDR3", + "0x0000001E": "LPDDR4", + "0x0000001F": "Logical non-volatile device", + "0x00000020": "HBM (High Bandwidth Memory)", + "0x00000021": "HBM2 (High Bandwidth Memory Generation 2)", + "0x00000022": "DDR5", + "0x00000023": "LPDDR5" + } + }, + "Power Supply": { + "ID": "0x00270000", + "Types": { + "0x00000001": "Other", + "0x00000002": "Unknown" + } + }, + "TPM": { + "ID": "0x002B0000", + "Types": { + "0x00000001": "Other", + "0x00000002": "Unknown" + } + } + } +} \ No newline at end of file diff --git a/HIRS_AttestationCAPortal/src/main/resources/swid_schema.xsd b/HIRS_AttestationCAPortal/src/main/resources/swid_schema.xsd new file mode 100644 index 00000000..6a5c267a --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/resources/swid_schema.xsd @@ -0,0 +1,1338 @@ + + + + + + + + Schema for ISO-IEC 19770-2 Software Identification Tags + http://standards.iso.org/iso/19770/-2/2015/schema.xsd + + Copyright 2015 ISO/IEC, all rights reserved + + Copyright notice: ISO and IEC grant the users of this Standard the right + to use this XSD file free of charge for the purpose of implementing the + present Standard. + + Disclaimer: In no event shall ISO and/or IEC be liable for any damages + whatsoever (including, but not limited to, damages for loss of profits, + business interruption, loss of information, or any other pecuniary + loss) arising out of or related to the use of or inability to use the + XSD file. ISO and IEC disclaim all warranties, express or implied, + including but not limited to warranties of merchantability and fitness + for a particular purpose. + + + 3.0 + + + + + + + Represents the root element specifying data about a software component + + + + + + + + Attributes common to all Elements in this schema + + + + + + + Allow xml:lang attribute on any element. + + + + + + + + Allows any undeclared attributes on any element as long as the + attribute is placed in a different namespace. + + + + + + + + + + + + Specifies the organizations related to the software component + referenced by this SWID tag. + + + + + + + + An open-ended collection of elements that can be used to attach + arbitrary metadata to an Entity. + + + + + + + + + The name of the organization claiming a particular role in the + SWID tag. + + + + + + + + The regid of the organization. If the regid is unknown, the + value "invalid.unavailable" is provided by default (see + RFC 6761 for more details on the default value). + + + + + + + + The relationship between this organization and this tag e.g. tag, + softwareCreator, licensor, tagCreator, etc. The role of + tagCreator is required for every SWID tag. + + EntityRole may include any role value, but the pre-defined roles + include: aggregator, distributor, licensor, softwareCreator, + tagCreator + + Other roles will be defined as the market uses the SWID tags. + + + + + + + + this value provides a hexadecimal string that contains a hash + (or thumbprint) of the signing entities certificate. + + + + + + + + + + + + + + The element is used to provide results from a scan of a system + where software that does not have a SWID tag is discovered. + This information is not provided by the software creator, and + is instead created when a system is being scanned and the + evidence for why software is believed to be installed on the + device is provided in the Evidence element. + + + + + + Date and time the evidence was gathered. + + + + + + + + Identifier for the device the evidence was gathered from. + + + + + + + + + + + + + + Represents an individual file + + + + + + + Files that are considered important or required for the use of + a software component. Typical key files would be those which, + if not available on a system, would cause the software not to + execute. + + Key files will typically be used to validate that software + referenced by the SWID tag is actually installed on a specific + computing device + + + + + + + + The directory or location where a file was found or can expected + to be located. does not include the filename itself. This can + be relative path from the 'root' attribute. + + + + + + + + The filename without any path characters + + + + + + + + A system-specific root folder that the 'location' + attribute is an offset from. If this is not specified + the assumption is the 'root' is the same folder as + the location of the SWIDTAG. + + + + + + + + Permits any user-defined attributes in file tags + + + + + + + + + + + + + Provides the ability to apply a directory structure to the files + defined in a Payload or Evidence element. + + + + + + + + A Directory element allows one or more directories to be + defined in the file structure. + + + + + + + + A File element that allows one or more files to be specified + for a given location. + + + + + + + + + + + + + + + Represents an individual file + + + + + + + The file size in bytes of the file + + + + + + + + The file version + + + + + + + + + + + + + + Provides process information for data that will show up in a + devices process table. + + + + + + + The process name as it will be found in the devices process + table. + + + + + + + + The process ID for the executing process - note that this will + typically only be provided when the Process element is included as part + of Evidence. + + + + + + + + + + + + + + A container that can be used to provide arbitrary resource + information about an application installed on a device, or + evidence collected from a device. + + + + + + + The type of resource (ie, registrykey, port, rootUrl) + + + + + + + + + + + + + + This type is used by Payload to provide details on what may rbe + installed on a device, and by Evidence to indicate what an + inventory process discovered on a device. + + + + + + + + One or more directory elements + + + + + + + + One or more File elements + + + + + + + + One or more Process elements + + + + + + + + One or more generic resource elements + + + + + + + + + + + + + + + A reference to any another item (can include details that are + related to the SWID tag such as details on where software + downloads can be found, vulnerability database associations, + use rights, etc). + + This is modeled directly to match the HTML [LINK] element; it is + critical for streamlining software discovery scenarios that + these are kept consistent. + + + + + + + For installation media (rel="installationmedia") - dictates the + canonical name for the file. + + Items with the same artifact name should be considered mirrors + of each other (so download from wherever works). + + + + + + + + The link to the item being referenced. + + The href can point to several different things, and can be any + of the following: + + - a RELATIVE URI (no scheme) - which is interpreted depending on + context (ie, "./folder/supplemental.swidtag" ) + + - a physical file location with any system-acceptable + URI scheme (ie, file:// http:// https:// ftp:// ... etc ) + + - an URI with "swid:" as the scheme, which refers to another + swid by tagId. This URI would need to be resolved in the + context of the system by software that can lookup other + swidtags.( ie, "swid:2df9de35-0aff-4a86-ace6-f7dddd1ade4c" ) + + - an URI with "swidpath:" as the scheme, which refers to another + swid by an XPATH query. This URI would need to be resolved in + the context of the system by software that can lookup other + swidtags, and select the appropriate one based on an XPATH + query. Examples: + + swidpath://SoftwareIdentity[Entity/@regid='http://contoso.com'] + would retrieve all swidtags that had an entity where the + regid was Contoso + + swidpath://SoftwareIdentity[Meta/@persistentId='b0c55172-38e9-4e36-be86-92206ad8eddb'] + would retrieve swidtags that matched the persistentId + + See XPATH query standard : http://www.w3.org/TR/xpath20/ + + + + + + + + An attribute defined by the W3C Media Queries Recommendation + (see http://www.w3.org/TR/css3-mediaqueries/). + + A hint to the consumer of the link to what the target item is + applicable for. + + + + + + + + Determines the relative strength of ownership of the target + piece of software. + + + + + + + + The relationship between this SWID and the target file. + + Relationships can be identified by referencing the IANA + registration library - + https://www.iana.org/assignments/link-relations/link-relations.xhtml. + + + + + + + + The IANA MediaType for the target file; this provides the + consumer with intelligence of what to expect. + + See http://www.iana.org/assignments/media-types/media-types.xhtml + for more details on link type. + + + + + + + + Determines if the target software is a hard requirement or not + + + + + + + + + + + + + + An open-ended collection of key/value data related to this SWID. + + + + + + + Permits any user-defined attributes in Meta tags + + + + + + + + + + + + + + + + Specifies the organizations related to the software component + referenced by this SWID tag. + + This has a minOccurs of 1 because the spec declares that + you must have at least a Entity with role='tagCreator' + + + + + + + + This element is used to provide results from a scan of a + system where software that does not have a SWID tag is + discovered. This information is not provided by the + software creator, but is instead created when a system + is being scanned and the evidence for why software is + believed to be installed on the device is provided in the + Evidence element. + + + + + + + + A reference to any another item (can include details that + are related to the SWID tag such as details on where software + downloads can be found, vulnerability database associations, + use rights, etc). + + Note: This is modelled directly to match the HTML [LINK] + element; it is critical for streamlining software discovery + scenarios that these are kept consistent. + + + + + + + + An open-ended collection of key/value data related to this SWID. + + + + + + + + The items that may be installed on a device when the software is + installed. Note that Payload may be a superset of the items + installed and, depending on optimization systems for a device, + may or may not include every item that could be created or + executed on a device when software is installed. + + In general, payload will be used to indicate the files that + may be installed with a software product and will often be a + superset of those files (i.e. if a particular optional + component is not installed, the files associated with that + component may be included in payload, but not installed on + the device). + + + + + + + + Allows any undeclared elements in the SoftwareIdentity element + as long as the element is placed in a different namespace. + + As xs:any supercedes an xs:element declaration, this continues + to support digital signatures using the ds:Signature element: + + Signatures are not a mandatory part of the software + identification tag standard, and can be used as required + by any tag producer to ensure that sections of a tag are not + modified and/or to provide authentication of the signer. If + signatures are included in the software identification tag, + they shall follow the W3C recommendation defining the XML + signature syntax which provides message integrity + authentication as well as signer authentication services for + data of any type. + + + + + + + + + + Set to true, if this attribute specifies that this SWID tag is a + collection of information that describes the pre-installation + data of software component. + + + + + + + + Set to true if this SWID describes a product patch or + modification to a different software element. + + + + + + + + media is a hint to the tag consumer to understand what this + SWID tag applies to (see the [Link] tags media attribute). + + + + + + + + This attribute provides the software component name as it would + typically be referenced. For example, what would be seen in the + add/remove dialog on a Windows device, or what is specified as + the name of a packaged software product or a patch identifier + name on a Linux device. + + + + + + + + Specifies that this tag provides supplemental tag data that can + be merged with primary tag data to create a complete record of + the software information. + + Supplemental tags will often be provided at install time and may + be provided by different entities (such as the tag consumer, or + a Value Added Reseller). + + + + + + + + tagId shall be a globally unique identifier and should be + assigned a GUID reference (see ISO/IEC 19770-5 definition + for GUID). + + The tagID provides a unique reference for the specific product, + version, edition, revision, etc (essentially, the same binary + distribution). If two tagIDs match and the tagCreator is the + same, the underlying products they represent are expected to be + exactly the same. + + This allows IT systems to identify if a software item (for + example, a patch) is installed simply by referencing the + specific tagID value which is likely to be readily available + in a software inventory. + + It is recommended, when possible, that a 16 byte GUID + be used for this field as this provides global uniqueness without + a significant amount of overhead for space. + + If use of a 16 byte GUID is not possible, a text based globally + unique ID may be constructed, this ID should include a unique + naming authority for the tagCreator and sufficient additional + details that the tagId is unique for the software product, + version, edition, revision, etc. This would likely look as + follows (+ is used as a string concatenation symbol): + + regid + productName + version + edition + revision + ... + + + + + + + + The tagVersion indicates if a specific release of a software + product has more than one tag that can represent that specific + release. This may be the case if a software tag producer creates + and releases an incorrect tag that they subsequently want to fix, + but with no underlying changes to the product the SWID tag + represents. This could happen if, for example, a patch is + distributed that has a Link reference that does not cover all the + various software releases it can patch. A newer SWID tag for that + patch can be generated and the tagVersion value incremented to + indicate that the data is updated. + + + + + + + + Underlying development version for the software component. + + + + + + + + Scheme used for the version number. Some possible common values are: + + value="alphanumeric" + Strictly a string, sorting alphanumericaly + + value="decimal" + A floating point number : ( ie, 1.25 is less than 1.3 ) + + value="multipartnumeric" + Numbers seperated by dots, where the numbers are interpreted as + integers (ie, 1.2.3 , 1.4.5.6 , 1.2.3.4.5.6.7 ) + + value="multipartnumeric+suffix" + Numbers seperated by dots, where the numbers are interpreted as + integers with an additional string suffix: (ie, 1.2.3a) + + value="semver" + Follows the semver.org spec + + value="unknown" + Unknown, no attempt should be made to order these + + + + + + + + + + + + + + An open-ended collection of key/value data related to this SWID. + + The attributes included in this Element are predefined attributes + to ensure common usage across the industry. The schema allows for + any additional attribute to be included in a SWID tag, though it is + recommended that industry norms for new attributes are defined and + followed to the degree possible. + + + + + + + Identification of the activation status of this software title + (e.g. Trial, Serialized, Licensed, Unlicensed, etc). Typically, + this is used in supplemental tags. + + + + + + + + Provides information on which channel this particular + software was targeted for (e.g. Volume, Retail, OEM, + Academic, etc). Typically used in supplemental tags. + + + + + + + + The informal or colloquial version of the product (i.e. 2013). + Note that this version may be the same through multiple releases + of a software product where the version specified in + SoftwareEntity is much more specific and will change for each + software release. + + Note that this representation of version is typically used to + identify a group of specific software releases that are part of + the same release/support infrastructure + (i.e. Fabrikam Office 2013). This version is used for string + comparisons only and is not compared to be an earlier or later + release (that is done via the SoftwareEntity version). + + + + + + + + A longer, detailed description of the software. This description + can be multiple sentences (differentiated from summary which is + a very short, one-sentence description). + + + + + + + + The variation of the product (Extended, Enterprise, Professional, + Standard etc) + + + + + + + + An indicator to determine if there should be accompanying proof + of entitlement when a software license reconciliation is + completed. + + + + + + + + A vendor-specific textual key that can be used to reconcile the + validity of an entitlement. (e.g. serial number, product or + license key). + + + + + + + + The name of the software tool that created a SWID tag. This + element is typically used if tags are created on the fly, or + based on a catalogue based analysis for data found on a + computing device. + + + + + + + + A GUID used to represent products installed where the products + are related, but may be different versions. See one + representation of this value through the use of what, in a + windows installation process is referred to as an upgradeCode + - http://msdn.microsoft.com/en-us/library/aa372375(v=vs.85).aspx + as one example of the use of this value. + + + + + + + + The base name of the product (e.g. Office, Creative Suites, + Websphere, etc). + + + + + + + + The overall product family this software belongs to. Product + family is not used to identify that a product is part of a + suite, but is instead used when a set of products that are all + related may be installed on multiple different devices. + + For example, an Enterprise backup system may consist of a backup + server, multiple different backup systems that support mail + servers, databases and ERP systems as well as individual software + items that backup client devices. In this case all software + titles that are part of the backup system would have the same + productFamily name so they can be grouped together in reporting + systems. + + + + + + + + The informal or colloquial representation of the sub-version of + the given product (ie, SP1, R2, RC1, Beta 2, etc). Note that the + SoftwareIdentity.version will provide very exact version details, + the revision is intended for use in environments where reporting + on the informal or colloquial representation of the software is + important (for example, if for a certain business process, an + organization recognizes that it must have ServicePack 1 or later + of a specific product installed on all devices, they can use the + revision data value to quickly identify any devices that do not + meet this requirement). + + Depending on how a software organizations distributes revisions, + this value could be specified in a primary (if distributed as an + upgrade) or supplemental (if distributed as a patch) SWID tag. + + + + + + + + A short (one-sentence) description of the software. + + + + + + + + An 8 digit code that provides UNSPSC classification of the + software product this SWID tag identifies. For more + information see, http://www.unspsc.org/ + + + + + + + + The version of the UNSPSC code used to define the UNSPSC code + value. For more information see, http://www.unspsc.org/. + + + + + + + + + + + An expression that the document evaluator can use to determine if the + target of the link is applicable to the current platform (the host + environment) + + Used as an optimization hint to notify a system that it can + ignore something when it's not likely to be used. + + The format of this string is modeled upon the MediaQuery definition at + http://www.w3.org/TR/css3-mediaqueries/ + + This is one or more EXPRESSIONs where the items are connected + with an OPERATOR: + + media="EXPRESSION [[OPERATOR] [EXPRESSION]...]" + + EXPRESSION is processed case-insensitive and defined either : + (ENVIRONMENT) + indicates the presence of the environment + or + ([PREFIX-]ENVIRONMENT.ATTRIBUTE:VALUE) + indicates a comparison of an attribute of the environment. + + ENVIRONMENT is a text identifier that specifies any software,hardware + feature or aspect of the system the software is intended to run in. + + Common ENVIRONMENTs include (but not limited to): + linux + windows + java + powershell + ios + chipset + peripheral + + ATTRIBUTE is a property of an ENVIRONMENT with a specific value. + Common attributes include (but not limited to): + version + vendor + architecture + + PREFIX is defined as one of: + MIN # property has a minimum value of VALUE + MAX # property has a maximum value of VALUE + + if a PREFIX is not provided, then the property should equal VALUE + + OPERATOR is defined of one of: + AND + NOT + + Examples: + media="(windows)" + # applies to only systems that identify themselves as 'Windows' + + media="(windows) not (windows.architecture:x64)" + # applies to only systems that identify + # themselves as windows and are not for an x64 cpu + + media="(windows) and (min-windows.version:6.1)" + # applies to systems that identify themselves as + # windows and at least version 6.1 + + media="(linux) and (linux.vendor:redhat) and (min-linux.kernelversion:3.0)" + # applies to systems that identify themselves as + # linux, made by redhat and with a kernel version of at least 3.0 + + media="(freebsd) and (min-freebsd.kernelversion:6.6)" + # applies to systems that identify themselves as + # freebsd, with a kernel version of at least 6.6 + + media="(powershell) and (min-powershell.version:3.0)" + # applies to systems that have powershell 3.0 or greater + + Properties are expected to be able to be resolved by the host + environment without having to do significant computation. + + + + + + + + + The IANA MediaType for the target href; this provides the SWID tag + consumer with intelligence of what to expect. + + See http://www.iana.org/assignments/media-types/media-types.xhtml + for more details on link type. + + + + + + + + + + + + Determines the relative strength of ownership of the target + piece of software. + + + + + + + + If this is uninstalled, then the [Link]'d software should be removed + too. + + + + + + + + If this is uninstalled, then the [Link]'d software should be removed + if nobody else is sharing it + + + + + + + + + + + Determines if the target software is a hard requirement. + + + + + + + + The [Link]'d software is absolutely required for installation + + + + + + + + Not absolutely required, but install unless directed not to + + + + + + + + Not absolutely required, install only when asked + + + + + + + + \ No newline at end of file diff --git a/HIRS_AttestationCAPortal/src/main/resources/vendor-table.json b/HIRS_AttestationCAPortal/src/main/resources/vendor-table.json new file mode 100644 index 00000000..d411dd50 --- /dev/null +++ b/HIRS_AttestationCAPortal/src/main/resources/vendor-table.json @@ -0,0 +1,233 @@ +{ + "VendorTable": { + "_comment_1": "UUIDS listed in the UEFI Specification", + "eb9d2d30-2d88-11d3-9a16-0090273fc14d": "ACPI_TABLE_GUID", + "eb9d2d32-2d88-11d3-9a16-0090273fc14d": "SAL_SYSTEM_TABLE_GUID", + "eb9d2d31-2d88-11d3-9a16-0090273fc14d": "SMBIOS_TABLE_GUID", + "f2fd1544-9794-4a2c-992e-e5bbcf20e394": "SMBIOS3_TABLE_GUID", + "eb9d2d2f-2d88-11d3-9a16-0090273fc14d": "MPS_TABLE_GUID", + "8868e871-e4f1-11d3-bc22-0080c73c8881": "EFI_ACPI_TABLE_GUID", + "87367f87-1119-41ce-aaec-8be01101f558": "EFI_JSON_CONFIG_DATA_TABLE_GUID", + "35e7a725-8dd2-4cac-8011-33cda8109056": "EFI_JSON_CAPSULE_DATA_TABLE_GUID", + "dbc461c3-b3de-422a-b9b4-9886fd49a1e5": "EFI_JSON_CAPSULE_RESULT_TABLE_GUID", + "77ab535a-45fc-624b-5560-f7b281d1f96e": "EFI_VIRTUAL_DISK_GUID", + "3d5abd30-4175-87Ce-6d64-d2ADe523C4bb": "EFI_VIRTUAL_CD_GUID", + "5Cea02c9-4d07-69d3-269f-4496Fbe096f9": "EFI_PERSISTENT_VIRTUAL_DISK_GUID", + "08018188-42cd-bb48-100f-5387D53ded3d": "EFI_PERSISTENT_VIRTUAL_CD_GUID", + "_comment_2": "DXE GUIds from https://github.com/linuxboot/linuxboot/blob/master/boards/qemu/image-files.txt", + "fc510ee7-ffdc-11d4-bd41-0080c73c8881": "DXE Apriori-FVRECOVERY", + "1b45cc0a-156a-428a-62af-49864da0e6e6": "PEI Apriori file name", + "80cf7257-87ab-47f9-a3fe-d50b76d89541": "PcdDxe", + "b601f8c4-43b7-4784-95b1-f4226cb40cee": "RuntimeDxe", + "f80697e9-7fd6-4665-8646-88e33ef71dfc": "SecurityStubDxe", + "1a1e4886-9517-440e-9fde-3be44cee2136": "CpuDxe", + "11a6edf6-a9be-426d-a6cc-b22fe51d9224": "PciHotPlugInitDxe", + "128fb770-5e79-4176-9e51-9bb268a17dd1": "PciHostBridgeDxe", + "93b80004-9fb3-11d4-9a3a-0090273fc14d": "PCI Bus Driver - PciBusDxe", + "9b680fce-ad6b-4f3a-b60b-f59899003443": "DevicePathDxe", + "f9d88642-0737-49bc-81b5-6889cd57d9ea": "SmbiosDxe", + "4110465d-5ff3-4f4b-b580-24ed0d06747a": "SmbiosPlatformDxe", + "9622e42c-8e38-4a08-9e8f-54f784652f6b": "AcpiTableDxe", + "49970331-e3fa-4637-9abc-3b7868676970": "AcpiPlatform", + "7e374e25-8e01-4fee-87f2-390c23c606cd": "ACPI data", + "bdce85bb-fbaa-4f4e-9264-501a2c249581": "S3SaveStateDxe", + "d9dcc5df-4007-435e-9098-8970935504b2": "PlatformDxe", + "8657015b-ea43-440d-949a-af3be365c0fc": "IoMmuDxe", + "cbd2e4d5-7068-4ff5-b462-9822b4ad8d60": "VariableRuntimeDxe", + "_comment_3": "PIWG Dxe driver Files (FvFile)from https://bugs.launchpad.net/ubuntu/+source/edk2/+bug/1272444", + "70d57d67-7f05-494d-a014-b75d7345b700": "Storage Security Command Driver", + "3acc966d-8e33-45c6-b4fe-62724bcd15a9": "AHCI Bus Driver", + "67bbc344-84bc-4e5c-b4df-f5e4a00e1f3a": "Host Controller Driver", + "86edaae5-073c-4c89-b949-8984ac8a55f3": "MMC/SD Media Device Driver", + "9e863906-a40f-4875-977F-5b93ff237fc6": "Serial Terminal Driver", + "a6cc6bc8-2ada-46C3-bba4-e99672CC9530": "PCI Serial Driver", + "69fd8e47-a161-4550-b01a-5594ceb2b2b2": "PCI IDE/ATAPI Bus Driver", + "51ccf399-4fdf-4e55-a45b-e123f84d456a": "Platform Console Management Driver", + "6b38f7b4-ad98-40e9-9093-aca2b5a253c4": "Generic Disk I/O Driver", + "2d2e62cf-9ecf-43b7-8219-94e7fC713dfe": "Usb Keyboard Driver", + "9fb4b4a7-42C0-4bcd-8540-9bcc6711f83e": "Usb Mass Storage Driver", + "e3752948-b9a1-4770-90c4-df41c38986be": "QEMU Video Driver", + "240612B7-a063-11d4-9a3a-0090273fc14d": "Usb Bus Driver", + "bdfe430e-8F2a-4db0-9991-6f856594777e": "Usb Ehci Driver", + "2fb92efa-2ee0-4bae-9eB6-7464125E1EF7": "Usb Ehci Driver", + "a92cdb4b-82f1-4e0b-a516-8a655d371524": "Virtio Network Driver", + "4579b72d-7ec4-4dd4-8486-083c86b182a7": "iSCSI Driver", + "3b1deaB5-c75d-442e-9238-8e2ffb62b0bb": "UEFI PXE Base Code Driver", + "6b6963ab-906d-4a65-a7ca-bd40e5d6af2b": "UDP Network Service Driver", + "6d6963ab-906d-4a65-a7ca-bd40e5d6af4d": "Tcp Network Service Driver", + "dc3641b8-2fa8-4ed3-bc1f-f9962a03454b": "MTFTP4 Network Service Driver", + "9fb1a1f3-3b71-4324-b39a-745cbb015fff": "IP4 Network Service Driver", + "26841bde-920a-4e7a-9Fbe-637f477143a6": "IP4 CONFIG Network Service Driver", + "94734718-0bbc-47fb-96a5-ee7a5ae6a2ad": "DHCP Protocol Driver", + "529d3f93-e8e9-4e73-b1e1-bdf6a9d50113": "ARP Network Service Driver", + "e4f61863-fe2c-4b56-a8d4-08519bc439df": "VLAN Configuration Driver", + "a2f436ea-a127-4ef8-957c-8048606ff670": "Simple Network Protocol Driver", + "961578fe-b6b7-44c3-af35-6bc705cd2b1f": "FAT File System Driver", + "0abd8284-6da3-4616-971a-83a5148067ba": "ISA Floppy Driver", + "3dc82376-637b-40a6-a8fc-a565417f2c38": "PS/2 Keyboard Driver", + "93b80003-9fb3-11d4-9a3a-0090273fc14d": "ISA Serial Driver", + "240612b5-a063-11d4-9a3a-0090273fc14a": "ISA Bus Driver", + "99549f44-49bb-4820-b9d2-901329412d67": "IDE Controller Init Driver", + "0a66e322-3740-4cce-ad62-bd172cecca35": "Scsi Disk Driver", + "1fa1f39e-feff-4aae-bd7b-38a070a3b609": "Partition Driver", + "9e863906-a40f-4875-977f-5b93ff237fc6": "Serial Terminal Driver", + "cccb0c28-4b24-11d5-9a5a-0090273fc14d": "Graphics Console Driver", + "408edcec-cf6d-477c-a5a8-b4844e3de281": "Console Splitter Driver", + "fab5d4f4-83c0-4aaf-8480-442d11df6cea": "Virtio SCSI Host Driver", + "11d92dfb-3Ca9-4f93-ba2e-4780ed3e03b5": "Virtio Block Driver", + "33cb97af-6c33-4c42-986b-07581fa366d4": "Block MMIO to Block IO Driver", + "_comment_4": "PIWG Volumes (Fv)", + "a881d567-6cb0-4eee-8435-2e72d33e45B5": "PIWG Default Volume", + "_comment_5": "UEFI UUIDS for Certificates", + "3c5766e8-269c-4e34-aa14-ed776e85b3b6": "EFI_CERT_RSA2048_GUID", + "e2b36190-879b-4a3d-ad8d-f2e7bba32784": "EFI_CERT_RSA2048_SHA256_GUID", + "c1c41626-504c-4092-aca9-41f936934328": "EFI_CERT_SHA256_GUID", + "826ca512-cf10-4ac9-b187-be01496631bd": "EFI_CERT_SHA1_GUID", + "67f8444f-8743-48f1-a328-1eaab8736080": "EFI_CERT_RSA2048_SHA1_GUID", + "a5c059a1-94e4-4aa7-87b5-ab155c2bf072": "EFI_CERT_X509_GUID", + "0b6e5233-a65c-44c9-9407-d9ab83bfc8bd": "EFI_CERT_SHA224_GUID", + "ff3e5307-9fd0-48c9-85f1-8ad56c701e01": "EFI_CERT_SHA384_GUID", + "093e0fae-a6c4-4f50-9f1b-d41e2b89c19a": "EFI_CERT_SHA512_GUID", + "3bd2a492-96c0-4079-b420-fcf98ef103ed": "EFI_CERT_X509_SHA256_GUID", + "7076876e-80c2-4ee6-aad2-28b349a6865b": "EFI_CERT_X509_SHA384_GUID", + "446dbf63-2502-4cda-bcfa-2465d2b0fe9d": "EFI_CERT_X509_SHA512_GUID", + "a7717414-c616-4977-9420-844712a735bf": "EFI_CERT_TYPE_RSA2048_SHA256_GUID", + "_comment_6": "UEFI defined variables", + "452e8ced-dfff-4b8c-ae01-5118862e682c": "EFI_CERT_EXTERNAL_MANAGEMENT_GUID", + "d719b2cb-3d3a-4596-a3bc-dad00e67656f": "EFI_IMAGE_SECURITY_DATABASE_GUID", + "4aafd29d-68df-49ee-8aa9-347d375665a7": "EFI_CERT_TYPE_PKCS7_GUID", + "c12a7328-f81f-11d2-ba4b-00a0c93ec93b": "EFI System Partition", + "024DEE41-33E7-11D3-9D69-0008C781F39F": "Partition containing a legacy MBR", + "_comment_7": "RHBoot UEFI Application UUIDs From listed in RHBoot (RHShim) https://github.com/rhboot/efivar/blob/master/src/guids.txt", + "0abba7dc-e516-4167-bbf5-4d9d1c739416": "fwupdate:", + "3b8c8162-188c-46a4-aec9-be43f1d65697": "ux_capsule", + "605dab50-e046-4300-abb6-3dd810dd8b23": "RH_Shim", + "8be4df61-93ca-11d2-aa0d-00e098032b8c": "EFI_Global_Variable", + "91376aff-cba6-42be-949d-06fde81128e8": "GRUB", + "_comment_8": "Partition Table GUIDs", + "0fc63daf-8483-4772-8e79-3d69d8477de4": "Linux filesystem data", + "e6d6d379-f507-44c2-a23c-238f2a3df928": "Logical Volume Manager (LVM) partition", + "4f68bce3-e8cd-4db1-96e7-fbcaf984b709": "Root partition (x86-64)", + "a19d880f-05fc-4d3b-a006-743f0f84911e": "RAID partition", + "933ac7e1-2eb4-4f13-b844-0e14e2aef915": "/home partition[ (x86-64)", + "ebd0a0a2-b9e5-4433-87c0-68b6b72699c7": "GPT Basic data partition", + "_comment_9": "RHBoot Lenovo specific UUIDS", + "3cc24e96-22c7-41d8-8863-8e39dcdcc2cf": "lenovo", + "82988420-7467-4490-9059-feb448dd1963": "lenovo_me_config", + "f7e615b-0d45-4f80-88dc-26b234958560": "lenovo_diag", + "665d3f60-ad3e-4cad-8e26-db46eee9f1b5": "lenovo_rescue", + "721c8b66-426c-4e86-8e99-3457c46ab0b9": "lenovo_setup", + "f46ee6f4-4785-43a3-923d-7f786c3c8479": "lenovo_startup_interrupt", + "126a762d-5758-4fca-8531-201a7f57f850": "lenovo_boot_menu", + "a7d8d9a6-6ab0-4aeb-ad9d-163e59a7a380": "lenovo_diag_splash", + "_comment_10": "Company UUIDs (From Internet searches)", + "77fa9abd-0359-4d32-bd60-28f4e78f784b": "Microsoft Inc.", + "f5a96b31-dba0-4faa-a42a-7a0c9832768e": "HPE Inc.", + "2879c886-57ee-45cc-b126-f92f24f906b9": "SUSE Certificate", + "70564dce-9afc-4ee3-85fc-949649d7e45c": "Dell Inc.", + "_comment_11": "Intel GUIDS", + "bfcc0833-2125-42d1-8c6d-13821e23c078": "Intel(R) Desktop Boards", + "80b3ad5b-9880-4af9-a645-e56a68be89de": "Intel(R) CISD FW Update", + "_comment_12": "Microsoft GUIDS", + "e3c9e316-0b5c-4db8-817d-f92df00215ae": "Microsoft Reserved Partition (MSR)", + "5808c8aa-7e8f-42e0-85d2-e1e90434cfb3": "Logical Disk Manager (LDM) metadata partition ", + "af9b60a0-1431-4f62-bc68-3311714a69ad": "Logical Disk Manager data partition", + "de94bba4-06d1-4d40-a16a-bfd50179d6ac": "Windows Recovery Environment", + "9f25ee7a-e7b7-11db-94b5-f7e662935912": "Windows Boot Loader", + "_comment_13": "Linux specific GUIDS", + "0fc63daf-8483-4772-8e79-3d69d8477de": "Linux filesystem data", + "44479540-f297-41b2-9af7-d131d5f0458a4": "Root partition (x86)", + "69dad710-2ce4-4e3c-b16c-21a1d49abed3": "Root partition (32-bit ARM)", + "b921b045-1df0-41c3-af44-4c6f280d3fae": "Root partition (64-bit ARM/AArch64)", + "0657fd6d-a4ab-43c4-84e5-0933c84b4f4f": "Swap partition", + "3b8f8425-20e0-4f3b-907f-1a25a76f98e8": "/srv (server data) partition", + "7ffec5c9-2d00-49b7-8941-3ea10a5586b7": "Plain dm-crypt partitiont", + "ca7d7ccb-63ed-4c53-861c-1742536059cc": "LUKS partition", + "_comment_14": "Linux Boot GUIDS https://github.com/linuxboot/linuxboot/blob/master/boards/s2600wf/vendor-files.txt", + "9cfd802c-09a1-43d6-8217-aa49c1f90d2c": "Intel Management Engine BIOS Extension (Mebx)", + "b62efbbb-3923-4cb9-a6e8-db818e828a80": "Intel Management Engine BIOS Extension (Mebx) Setup Browser", + "9ce4325e-003e-11e3-b582-b8ac6f199a57": "Non-Volatile Dual In-line Memory Module (NVDIMM) Driver", + "ea9de6d5-7839-46f7-9e63-4de8b00e2e5d": "NVM DIMM Human Interface Infrastructure (HII)", + "56a1b86f-0d4a-485d-87de-ad0eba1c8c2a": "IBM C Video Gop", + "a1f436ea-a127-4ef8-957c-8048606ff670": "SnpDxe", + "a210f973-229d-4f4d-aa37-9895e6c9eaba": "DpcDxe", + "025bbfc7-e6a9-4b8b-82ad-6815a1aeaf4a": "MNP Network Service Driver - MnpDxe", + "b44b2005-42bc-41c9-80af-abd7dc7d6923": "RSTesSATAEFI", + "15e1e31a-9f9d-4c84-82fb-1a707fc0f63b": "RSTeSATAEFI", + "2cc25173-bd9f-4c89-89cc-29256a3fd9c3": "RSTesSATALegacy", + "bd5d4ca5-674f-4584-8cf9-ce4ea1f54dd1": "RSTeSATALegacy", + "_comment_15": "WinNt GUIDs, add if they are still found in use https://sourceforge.net/p/uefinotes/wiki/FV%20Sources/?version=3", + "fc5c7020-1a48-4198-9be2-ead5abc8cf2f": "BdsDxe", + "d0893f05-b06d-4161-b947-9be9b85ac3a1": "SnpNt32Dxe", + "9b3ada4f-ae56-4c24-8Dea-f03b7558ae50": "PcdPeim", + "34c8c28F-b61c-45a2-8f2e-89e46becc63b": "PeiVariable", + "fe5cea76-4f72-49e8-986f-2cd899dffe5d": "FaultTolerantWriteDxe", + "_comment_16": "Linux Boot Image files UEFI Platform Initialization (PI) specifications Driver Execution Environment (DXE) Architectural protocols and platform modules https://github.com/linuxboot/linuxboot/blob/master/boards/winterfell/image-files.txt", + "5ae3f37e-4eae-41ae-8240-35465b5e81eb": "CORE_DXE", + "cbc59c4a-383a-41eb-a8ee-4498aea567e4": "DXE Runtime", + "3c1de39f-d207-408a-aacc-731cfb7f1dd7": "DXE PciBus", + "80e66e0a-ccd1-43fa-a7b1-2d5ee0f13910": "DXE PciRootBridge", + "9f3a0016-ae55-4288-829d-d22fd344c347": "DXE AmiBoardInfo", + "13ac6dd0-73d0-11d4-b06b-00aa00bd6de7": "DXE EBC", + "e03abadf-e536-4e88-b3a0-b77f78eb34fe": "CPU DXE", + "b7d19491-e55a-470d-8508-85a5dfa41974": "SBDXE", + "e23f86e1-056e-4888-b685-cfcd67c179d4": "DXE SBRun", + "e4ecd0b2-e277-4f2b-becb-e4d75c9a812e": "NBDXE", + "5ad34ba6-f024-2149-52e4-da0398e2bb9": "DXE Services Table", + "_comment_17": "ACPI configuration and tables", + "750890a6-7acf-4f4f-81bd-b400c2bea95a": "AcpiModeEnable", + "d4c05cd1-5eae-431d-a095-13a9e5822045": "MPST", + "db93cb2c-bf1c-431a-abc8-8737bc2afc1f": "PRAD-ACPI-table", + "3bc5b795-a4e0-4d56-9321-316d18a7aefe": "PRAD", + "16d0a23e-c09c-407d-a14a-ad058fdd0ca1": "ACPI", + "26a2481e-4424-46a2-9943-cc4039ead8f8": "S3Save", + "efd652cc-0e99-40f0-96c0-e08c089070fc": "S3Restore", + "8c783970-f02a-4a4d-af09-8797a51eec8d": "PowerManagement", + "299141bb-211a-48a5-92c0-6f9a0a3a006e0": "PowerManagement-ACPI-table", + "2df10014-cf21-4280-8c3f-e539b8ee5150": "PpmPolicyInitDxe", + "4b680e2d-0d63-4f62-b930-7ae995b9b3a3": "SmBusDxe", + "_comment_18": "SMM handlers", + "4a37320b-3fb3-4365-9730-9e89c600395d": "SmmDispatcher", + "753630c9-fae5-47a9-bbbf-88d621cd7282": "SmmChildDispatcher", + "be216ba8-38c4-4535-a6ca-5dca5b43addf": "SmiVariable", + "a56897a1-a77f-4600-84db-22b0a801fa9a": "SmmRuntime", + "d2596f82-f0e1-49fa-95bc-62012c795728": "SmmBase Data", + "69009842-63f2-43db-964b-efad1c39ec85": "SmmBase Data", + "d0632c90-afd7-4492-b186-257c63143c61": "SmmBase", + "7e2d983f-f703-4a29-9761-77b51f5354ed": "SmmCommunicate", + "_comment_19": "CMOS and NVRAM handlers", + "6869c5b3-ac8d-4973-8b37-e354dbf34add": "CmosManagerSmm", + "842a454a-75e5-408b-8b1c-36420e4e3f21": "NvramSmi", + "5446c293-339b-47cd-b719-585de39408cc": "PostReport", + "71ca9ca1-325d-4bfe-afa3-2ec5c94a8680": "DmAcpi", + "cef68c66-06ab-4fb3-a3ed-5ffa885b5725": "SMBiosBoard", + "b13edd38-684c-41ed-a305-d7b7e32497df": "SMBios64", + "ded7956d-7e20-4f20-91a1-190439b04d5b": "SmbiosGetFlashData64", + "daf4bf89-ce71-4917-b522-c89d32fbc59f": "SmbiosStaticData", + "_comment_20": "Apple GUIDS", + "48465300-0000-11aa-aa11-00306543ecac": "Apple Hierarchical File System Plus (HFS+) partition ", + "7c3457ef-0000-11aa-aa11-00306543ecac": "Apple APFS container", + "55465300-0000-11aa-aa11-00306543ecac": "Apple UFS container", + "52414944-0000-11aa-aa11-00306543ecac": "Apple RAID partition", + "4c616265-6c00-11aa-aa11-00306543ecac": "Apple Label", + "53746f72-6167-11aa-aa11-00306543ecac": "Apple Core Storage Container", + "6a898cc3-1dd2-11b2-99a6-080020736631": "ZFS Partition", + "_comment_21": "Chrome OS GUIDS", + "2568845d-2332-4675-bc39-8fa5a4748d15": "Chrome OS kernel ", + "3cb8e202-3b7e-47dd-8a3c-7ff2a13cfcec": "Chrome OS rootfs ", + "2e0a753d-9e48-43b0-8337-b15192cb1b5e": "Chrome OS future use ", + "_comment_22": "Android GUIDS", + "fe3a2a5d-4f32-41a7-b725-accc3285a309": "Android Bootloader", + "114eaffe-1552-4022-b26e-9b053604cf84": "Android Bootloader 2", + "49a4d17f-93a3-45c1-a0de-f50b2ebe2599": "Android Boot", + "4177c722-9e92-4aab-8644-43502bfd5506": "Android Recovery", + "38f428e6-d326-425d-9140-6e0ea133647c": "Android System", + "bd59408b-4514-490d-bf12-9878d963f378": "Android Config", + "8f68cc74-c5e5-48da-be91-a0c8c15e9c80": "Android Factory", + "ac6d7924-eb71-4df8-b48d-e267b27148ff": "Android OEM", + "_comment_23": "MISC GUIDs", + "5023b95c-db26-429b-a648-bd47664c8012": "Built-in EFI Shell", + "610a0202-d308-00c4-0000-000004300d06": "Mystery UUID", + "00000000-0000-0000-0000-000000000000": "Empty UUID" + } +}