mirror of
https://github.com/nsacyber/HIRS.git
synced 2024-12-18 20:47:58 +00:00
issue_847: Made more styling fixes to the entity files. 300 more changes left to go.
This commit is contained in:
parent
63521a4075
commit
615bbc7547
@ -29,54 +29,55 @@ public interface IDevIDCertificateRepository extends JpaRepository<IDevIDCertifi
|
|||||||
*/
|
*/
|
||||||
Page<IDevIDCertificate> findByArchiveFlag(boolean archiveFlag, Pageable pageable);
|
Page<IDevIDCertificate> findByArchiveFlag(boolean archiveFlag, Pageable pageable);
|
||||||
|
|
||||||
/**
|
|
||||||
* Query that retrieves a list of IDevId certificates using the provided subject.
|
|
||||||
*
|
|
||||||
* @param subject string representation of the subject
|
|
||||||
* @return a list of IDevId certificates
|
|
||||||
*/
|
|
||||||
List<IDevIDCertificate> findBySubject(String subject);
|
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* Query that retrieves a sorted list of IDevId certificates using the provided subject.
|
// * Query that retrieves a list of IDevId certificates using the provided subject.
|
||||||
*
|
// *
|
||||||
* @param subject string representation of the subject
|
// * @param subject string representation of the subject
|
||||||
* @return a sorted list of IDevId certificates
|
// * @return a list of IDevId certificates
|
||||||
*/
|
// */
|
||||||
List<IDevIDCertificate> findBySubjectSorted(String subject);
|
// List<IDevIDCertificate> findBySubject(String subject);
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Query that retrieves a list of IDevId certificates using the provided subject and archive flag.
|
// * Query that retrieves a sorted list of IDevId certificates using the provided subject.
|
||||||
*
|
// *
|
||||||
* @param subject string representation of the subject
|
// * @param subject string representation of the subject
|
||||||
* @param archiveFlag archive flag
|
// * @return a sorted list of IDevId certificates
|
||||||
* @return a list of IDevId certificates
|
// */
|
||||||
*/
|
// List<IDevIDCertificate> findBySubjectSorted(String subject);
|
||||||
List<IDevIDCertificate> findBySubjectAndArchiveFlag(String subject, boolean archiveFlag);
|
//
|
||||||
|
// /**
|
||||||
/**
|
// * Query that retrieves a list of IDevId certificates using the provided subject and archive flag.
|
||||||
* Query that retrieves a sorted list of IDevId certificates using the provided subject and archive flag.
|
// *
|
||||||
*
|
// * @param subject string representation of the subject
|
||||||
* @param subject string representation of the subject
|
// * @param archiveFlag archive flag
|
||||||
* @param archiveFlag archive flag
|
// * @return a list of IDevId certificates
|
||||||
* @return a sorted list of IDevId certificates
|
// */
|
||||||
*/
|
// List<IDevIDCertificate> findBySubjectAndArchiveFlag(String subject, boolean archiveFlag);
|
||||||
List<IDevIDCertificate> findBySubjectSortedAndArchiveFlag(String subject, boolean archiveFlag);
|
//
|
||||||
|
// /**
|
||||||
/**
|
// * Query that retrieves a sorted list of IDevId certificates using the provided subject and archive flag.
|
||||||
* Query that retrieves an IDevId certificate using the provided subject key identifier.
|
// *
|
||||||
*
|
// * @param subject string representation of the subject
|
||||||
* @param subjectKeyIdentifier byte representation of the subject key identifier
|
// * @param archiveFlag archive flag
|
||||||
* @return an IDevId certificate
|
// * @return a sorted list of IDevId certificates
|
||||||
*/
|
// */
|
||||||
IDevIDCertificate findBySubjectKeyIdentifier(byte[] subjectKeyIdentifier);
|
// List<IDevIDCertificate> findBySubjectSortedAndArchiveFlag(String subject, boolean archiveFlag);
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* Query that retrieves an IDevId certificate using the provided subject key and archive flag.
|
// * Query that retrieves an IDevId certificate using the provided subject key identifier.
|
||||||
*
|
// *
|
||||||
* @param subjectKeyIdString string representation of the subject key id
|
// * @param subjectKeyIdentifier byte representation of the subject key identifier
|
||||||
* @param archiveFlag archive flag
|
// * @return an IDevId certificate
|
||||||
* @return an IDevId certificate
|
// */
|
||||||
*/
|
// IDevIDCertificate findBySubjectKeyIdentifier(byte[] subjectKeyIdentifier);
|
||||||
IDevIDCertificate findBySubjectKeyIdStringAndArchiveFlag(String subjectKeyIdString, boolean archiveFlag);
|
//
|
||||||
|
// /**
|
||||||
|
// * Query that retrieves an IDevId certificate using the provided subject key and archive flag.
|
||||||
|
// *
|
||||||
|
// * @param subjectKeyIdString string representation of the subject key id
|
||||||
|
// * @param archiveFlag archive flag
|
||||||
|
// * @return an IDevId certificate
|
||||||
|
// */
|
||||||
|
// IDevIDCertificate findBySubjectKeyIdStringAndArchiveFlag(String subjectKeyIdString, boolean archiveFlag);
|
||||||
}
|
}
|
||||||
|
@ -28,14 +28,15 @@ import java.util.UUID;
|
|||||||
* This class represents the Reference Integrity Manifest object that will be
|
* This class represents the Reference Integrity Manifest object that will be
|
||||||
* loaded into the DB and displayed in the ACA.
|
* loaded into the DB and displayed in the ACA.
|
||||||
*/
|
*/
|
||||||
@Getter @ToString
|
@Getter
|
||||||
|
@ToString
|
||||||
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
|
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Entity
|
@Entity
|
||||||
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
|
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
|
||||||
@Table(name = "ReferenceManifest")
|
@Table(name = "ReferenceManifest")
|
||||||
@Access(AccessType.FIELD)
|
@Access(AccessType.FIELD)
|
||||||
public class ReferenceManifest extends ArchivableEntity {
|
public class ReferenceManifest extends ArchivableEntity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds the name of the 'hexDecHash' field.
|
* Holds the name of the 'hexDecHash' field.
|
||||||
@ -74,56 +75,71 @@ public class ReferenceManifest extends ArchivableEntity {
|
|||||||
|
|
||||||
@EqualsAndHashCode.Include
|
@EqualsAndHashCode.Include
|
||||||
@Column(columnDefinition = "mediumblob", nullable = false)
|
@Column(columnDefinition = "mediumblob", nullable = false)
|
||||||
private byte[] rimBytes;
|
private final byte[] rimBytes;
|
||||||
@Setter
|
@Setter
|
||||||
@EqualsAndHashCode.Include
|
@EqualsAndHashCode.Include
|
||||||
@Column(nullable = false)
|
@Column(nullable = false)
|
||||||
private String rimType = "Base";
|
private String rimType = "Base";
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column
|
@Column
|
||||||
private String tagId = null;
|
private String tagId = null;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column
|
@Column
|
||||||
private boolean swidPatch = false;
|
private boolean swidPatch = false;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column
|
@Column
|
||||||
private boolean swidSupplemental = false;
|
private boolean swidSupplemental = false;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column
|
@Column
|
||||||
private String platformManufacturer = null;
|
private String platformManufacturer = null;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column
|
@Column
|
||||||
private String platformManufacturerId = null;
|
private String platformManufacturerId = null;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column
|
@Column
|
||||||
private String swidTagVersion = null;
|
private String swidTagVersion = null;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column
|
@Column
|
||||||
private String swidVersion = null;
|
private String swidVersion = null;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column
|
@Column
|
||||||
private String platformModel = null;
|
private String platformModel = null;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column(nullable = false)
|
@Column(nullable = false)
|
||||||
private String fileName = null;
|
private String fileName = null;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@JdbcTypeCode(java.sql.Types.VARCHAR)
|
@JdbcTypeCode(java.sql.Types.VARCHAR)
|
||||||
@Column
|
@Column
|
||||||
private UUID associatedRim;
|
private UUID associatedRim;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column
|
@Column
|
||||||
private String deviceName;
|
private String deviceName;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column
|
@Column
|
||||||
private String hexDecHash = "";
|
private String hexDecHash = "";
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column
|
@Column
|
||||||
private String eventLogHash = "";
|
private String eventLogHash = "";
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
@Column
|
@Column
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
private String base64Hash = "";
|
private String base64Hash = "";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor necessary for Hibernate.
|
* Default constructor necessary for Hibernate.
|
||||||
*/
|
*/
|
||||||
@ -141,6 +157,7 @@ public class ReferenceManifest extends ArchivableEntity {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor for ingesting the bytes of the file content.
|
* Default constructor for ingesting the bytes of the file content.
|
||||||
|
*
|
||||||
* @param rimBytes - file contents.
|
* @param rimBytes - file contents.
|
||||||
*/
|
*/
|
||||||
public ReferenceManifest(final byte[] rimBytes) {
|
public ReferenceManifest(final byte[] rimBytes) {
|
||||||
@ -183,10 +200,20 @@ public class ReferenceManifest extends ArchivableEntity {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if this reference manifest's rim type is a base rim.
|
||||||
|
*
|
||||||
|
* @return true if the rim type is a base rim, false otherwise
|
||||||
|
*/
|
||||||
public boolean isBase() {
|
public boolean isBase() {
|
||||||
return rimType.equals(BASE_RIM);
|
return rimType.equals(BASE_RIM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if this reference manifest's rim type is a support rim.
|
||||||
|
*
|
||||||
|
* @return true if the rim type is a support rim, false otherwise
|
||||||
|
*/
|
||||||
public boolean isSupport() {
|
public boolean isSupport() {
|
||||||
return rimType.equals(SUPPORT_RIM);
|
return rimType.equals(SUPPORT_RIM);
|
||||||
}
|
}
|
||||||
|
@ -203,6 +203,7 @@ public class SupplyChainValidationSummary extends ArchivableEntity {
|
|||||||
* Construct the criterion that can be used to query for supply chain validation summaries
|
* Construct the criterion that can be used to query for supply chain validation summaries
|
||||||
* matching the configuration of this Selector.
|
* matching the configuration of this Selector.
|
||||||
*
|
*
|
||||||
|
* @param criteriaBuilder criteria builder
|
||||||
* @return a Criterion that can be used to query for supply chain validation summaries
|
* @return a Criterion that can be used to query for supply chain validation summaries
|
||||||
* matching the configuration of this instance
|
* matching the configuration of this instance
|
||||||
*/
|
*/
|
||||||
|
@ -3,39 +3,36 @@ package hirs.attestationca.persist.entity.userdefined.certificate;
|
|||||||
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.apache.commons.codec.binary.Hex;
|
import org.apache.commons.codec.binary.Hex;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class persists Certificate Authority credentials by extending the base Certificate
|
* This class persists Certificate Authority credentials by extending the base Certificate
|
||||||
* class with fields unique to CA credentials.
|
* class with fields unique to CA credentials.
|
||||||
*/
|
*/
|
||||||
@Entity
|
@Entity
|
||||||
|
@EqualsAndHashCode
|
||||||
public class CertificateAuthorityCredential extends Certificate {
|
public class CertificateAuthorityCredential extends Certificate {
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("PMD.AvoidUsingHardCodedIP")
|
|
||||||
private static final String SUBJECT_KEY_IDENTIFIER_EXTENSION = "2.5.29.14";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds the name of the 'subjectKeyIdentifier' field.
|
* Holds the name of the 'subjectKeyIdentifier' field.
|
||||||
*/
|
*/
|
||||||
public static final String SUBJECT_KEY_IDENTIFIER_FIELD = "subjectKeyIdentifier";
|
public static final String SUBJECT_KEY_IDENTIFIER_FIELD = "subjectKeyIdentifier";
|
||||||
|
|
||||||
|
@SuppressWarnings("PMD.AvoidUsingHardCodedIP")
|
||||||
|
private static final String SUBJECT_KEY_IDENTIFIER_EXTENSION = "2.5.29.14";
|
||||||
|
|
||||||
private static final int CA_BYTE_SIZE = 20;
|
private static final int CA_BYTE_SIZE = 20;
|
||||||
|
|
||||||
private static final int PREFIX_BYTE_SIZE = 4;
|
private static final int PREFIX_BYTE_SIZE = 4;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private final byte[] subjectKeyIdentifier;
|
private final byte[] subjectKeyIdentifier;
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Column
|
|
||||||
private String subjectKeyIdString;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* this field is part of the TCG CA specification, but has not yet been found in
|
* this field is part of the TCG CA specification, but has not yet been found in
|
||||||
* manufacturer-provided CAs, and is therefore not currently parsed.
|
* manufacturer-provided CAs, and is therefore not currently parsed.
|
||||||
@ -44,6 +41,10 @@ public class CertificateAuthorityCredential extends Certificate {
|
|||||||
@Column
|
@Column
|
||||||
private final String credentialType = "TCPA Trusted Platform Module Endorsement";
|
private final String credentialType = "TCPA Trusted Platform Module Endorsement";
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Column
|
||||||
|
private String subjectKeyIdString;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new CertificateAuthorityCredential given its binary contents. The given
|
* Construct a new CertificateAuthorityCredential given its binary contents. The given
|
||||||
* certificate should represent either an X509 certificate or X509 attribute certificate.
|
* certificate should represent either an X509 certificate or X509 attribute certificate.
|
||||||
@ -117,35 +118,4 @@ public class CertificateAuthorityCredential extends Certificate {
|
|||||||
|
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("checkstyle:avoidinlineconditionals")
|
|
||||||
public boolean equals(final Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!super.equals(o)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
CertificateAuthorityCredential that = (CertificateAuthorityCredential) o;
|
|
||||||
|
|
||||||
// if (!Objects.equals(credentialType, that.credentialType)) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
|
|
||||||
return Arrays.equals(subjectKeyIdentifier, that.subjectKeyIdentifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings({"checkstyle:magicnumber", "checkstyle:avoidinlineconditionals"})
|
|
||||||
public int hashCode() {
|
|
||||||
int result = super.hashCode();
|
|
||||||
result = 31 * result + (credentialType != null ? credentialType.hashCode() : 0);
|
|
||||||
result = 31 * result + Arrays.hashCode(subjectKeyIdentifier);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -36,8 +36,9 @@ public class CertificateVariables {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public static final int MAX_NUMERIC_PRECISION = 49;
|
public static final int MAX_NUMERIC_PRECISION = 49;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Can store up to 160 bit values
|
* Can store up to 160 bit values.
|
||||||
*/
|
*/
|
||||||
public static final int MAX_PUB_KEY_MODULUS_HEX_LENGTH = 1024;
|
public static final int MAX_PUB_KEY_MODULUS_HEX_LENGTH = 1024;
|
||||||
|
|
||||||
@ -206,5 +207,8 @@ public class CertificateVariables {
|
|||||||
*/
|
*/
|
||||||
public static final String ECDSA_STRING = "SHA256WithECDSA";
|
public static final String ECDSA_STRING = "SHA256WithECDSA";
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
public static final String ECDSA_SHA224_STRING = "SHA224WithECDSA";
|
public static final String ECDSA_SHA224_STRING = "SHA224WithECDSA";
|
||||||
}
|
}
|
||||||
|
@ -26,50 +26,80 @@ import java.util.Objects;
|
|||||||
@NoArgsConstructor(access = AccessLevel.PROTECTED)
|
@NoArgsConstructor(access = AccessLevel.PROTECTED)
|
||||||
public class ComponentResult extends ArchivableEntity {
|
public class ComponentResult extends ArchivableEntity {
|
||||||
|
|
||||||
// String value for the Manufacturer title
|
/**
|
||||||
|
* String value for the Manufacturer title.
|
||||||
|
*/
|
||||||
public static final String ATTRIBUTE_MANUFACTURER = "Manufacturer";
|
public static final String ATTRIBUTE_MANUFACTURER = "Manufacturer";
|
||||||
// String value for the Model title
|
|
||||||
|
/**
|
||||||
|
* String value for the Model title.
|
||||||
|
*/
|
||||||
public static final String ATTRIBUTE_MODEL = "Model";
|
public static final String ATTRIBUTE_MODEL = "Model";
|
||||||
// String value for the Serial title
|
|
||||||
|
/**
|
||||||
|
* String value for the Serial title.
|
||||||
|
*/
|
||||||
public static final String ATTRIBUTE_SERIAL = "Serial";
|
public static final String ATTRIBUTE_SERIAL = "Serial";
|
||||||
// String value for the revision title
|
|
||||||
|
/**
|
||||||
|
* String value for the revision title.
|
||||||
|
*/
|
||||||
public static final String ATTRIBUTE_REVISION = "Revision";
|
public static final String ATTRIBUTE_REVISION = "Revision";
|
||||||
// embedded component info
|
|
||||||
|
/**
|
||||||
|
* Embedded component info.
|
||||||
|
*/
|
||||||
@Setter
|
@Setter
|
||||||
private String manufacturer;
|
private String manufacturer;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private String model;
|
private String model;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private String serialNumber;
|
private String serialNumber;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private String revisionNumber;
|
private String revisionNumber;
|
||||||
|
|
||||||
private boolean fieldReplaceable = false;
|
private boolean fieldReplaceable = false;
|
||||||
|
|
||||||
// this is a string because component class doesn't inherit serializable.
|
// this is a string because component class doesn't inherit serializable.
|
||||||
@Setter
|
@Setter
|
||||||
private String componentClassValue;
|
private String componentClassValue;
|
||||||
|
|
||||||
private String componentClassStr;
|
private String componentClassStr;
|
||||||
|
|
||||||
private String componentClassType;
|
private String componentClassType;
|
||||||
|
|
||||||
private AttributeStatus attributeStatus;
|
private AttributeStatus attributeStatus;
|
||||||
|
|
||||||
private String componentAddress;
|
private String componentAddress;
|
||||||
|
|
||||||
private boolean version2 = false;
|
private boolean version2 = false;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private boolean delta = false;
|
private boolean delta = false;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private boolean failedValidation;
|
private boolean failedValidation;
|
||||||
|
|
||||||
private String certificateType;
|
private String certificateType;
|
||||||
|
|
||||||
private String issuerDN;
|
private String issuerDN;
|
||||||
private String certificateSerialNumber;
|
|
||||||
private String boardSerialNumber;
|
|
||||||
private String uniformResourceIdentifier;
|
|
||||||
|
|
||||||
|
private String certificateSerialNumber;
|
||||||
|
|
||||||
|
private String boardSerialNumber;
|
||||||
|
|
||||||
|
private String uniformResourceIdentifier;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor.
|
* Default constructor.
|
||||||
* @param boardSerialNumber associated platform certificate serial number.
|
*
|
||||||
|
* @param boardSerialNumber associated platform certificate serial number.
|
||||||
* @param certificateSerialNumber unique number associated with header info.
|
* @param certificateSerialNumber unique number associated with header info.
|
||||||
* @param certificateType parameter holds version 1.2 or 2.0.
|
* @param certificateType parameter holds version 1.2 or 2.0.
|
||||||
* @param componentIdentifier object with information from the platform certificate components.
|
* @param componentIdentifier object with information from the platform certificate components.
|
||||||
*/
|
*/
|
||||||
public ComponentResult(final String boardSerialNumber, final String certificateSerialNumber,
|
public ComponentResult(final String boardSerialNumber, final String certificateSerialNumber,
|
||||||
final String certificateType,
|
final String certificateType,
|
||||||
@ -94,10 +124,9 @@ public class ComponentResult extends ArchivableEntity {
|
|||||||
|
|
||||||
// V2 fields
|
// V2 fields
|
||||||
if (componentIdentifier.isVersion2()
|
if (componentIdentifier.isVersion2()
|
||||||
&& componentIdentifier instanceof ComponentIdentifierV2) {
|
&& componentIdentifier instanceof ComponentIdentifierV2 ciV2) {
|
||||||
// this is a downside of findbugs, the code is set up to indicate if a CI is V2 or not
|
// this is a downside of findbugs, the code is set up to indicate if a CI is V2 or not
|
||||||
// but find bugs is throwing a flag because instanceof isn't being used.
|
// but find bugs is throwing a flag because instanceof isn't being used.
|
||||||
ComponentIdentifierV2 ciV2 = (ComponentIdentifierV2) componentIdentifier;
|
|
||||||
this.componentClassValue = ciV2.getComponentClass().getComponentIdentifier();
|
this.componentClassValue = ciV2.getComponentClass().getComponentIdentifier();
|
||||||
this.componentClassStr = ciV2.getComponentClass().toString();
|
this.componentClassStr = ciV2.getComponentClass().toString();
|
||||||
this.componentClassType = ciV2.getComponentClass().getRegistryType();
|
this.componentClassType = ciV2.getComponentClass().getRegistryType();
|
||||||
@ -117,6 +146,7 @@ public class ComponentResult extends ArchivableEntity {
|
|||||||
* This method is only used by the certificate-details.jsp page. This
|
* This method is only used by the certificate-details.jsp page. This
|
||||||
* method splits the compiled string of addresses into the component address
|
* method splits the compiled string of addresses into the component address
|
||||||
* object for display on the jsp page.
|
* object for display on the jsp page.
|
||||||
|
*
|
||||||
* @return a collection of component addresses.
|
* @return a collection of component addresses.
|
||||||
*/
|
*/
|
||||||
public List<ComponentAddress> getComponentAddresses() {
|
public List<ComponentAddress> getComponentAddresses() {
|
||||||
@ -135,6 +165,7 @@ public class ComponentResult extends ArchivableEntity {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a hash code that is associated with common fields for components.
|
* Returns a hash code that is associated with common fields for components.
|
||||||
|
*
|
||||||
* @return int value of the elements
|
* @return int value of the elements
|
||||||
*/
|
*/
|
||||||
public int hashCommonElements() {
|
public int hashCommonElements() {
|
||||||
@ -144,6 +175,7 @@ public class ComponentResult extends ArchivableEntity {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The string method for log entries.
|
* The string method for log entries.
|
||||||
|
*
|
||||||
* @return a string for the component result
|
* @return a string for the component result
|
||||||
*/
|
*/
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
@ -53,16 +53,15 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* This class persists an Endorsement Credential by extending the base Certificate
|
* This class persists an Endorsement Credential by extending the base Certificate
|
||||||
* class with fields unique to Endorsement credentials, as defined in the Trusted
|
* class with fields unique to Endorsement credentials, as defined in the Trusted
|
||||||
* Computing Group Credential Profiles, specification v.1.2.
|
* Computing Group Credential Profiles, specification v.1.2.
|
||||||
*
|
* <p>
|
||||||
* trustedcomputinggroup.org/wp-content/uploads/Credential_Profiles_V1.2_Level2_Revision8.pdf
|
* trustedcomputinggroup.org/wp-content/uploads/Credential_Profiles_V1.2_Level2_Revision8.pdf
|
||||||
*/
|
*/
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@EqualsAndHashCode(callSuper = false)
|
@EqualsAndHashCode(callSuper = false)
|
||||||
@NoArgsConstructor(access= AccessLevel.PROTECTED)
|
@NoArgsConstructor(access = AccessLevel.PROTECTED)
|
||||||
@Entity
|
@Entity
|
||||||
public class EndorsementCredential extends DeviceAssociatedCertificate {
|
public class EndorsementCredential extends DeviceAssociatedCertificate {
|
||||||
|
|
||||||
@ -105,11 +104,27 @@ public class EndorsementCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* this field is part of the TCG EC specification, but has not yet been found in
|
* this field is part of the TCG EC specification, but has not yet been found in
|
||||||
* manufacturer-provided ECs, and is therefore not currently parsed
|
* manufacturer-provided ECs, and is therefore not currently parsed.
|
||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Column
|
@Column
|
||||||
private String credentialType = "TCPA Trusted Platform Module Endorsement";
|
private final String credentialType = "TCPA Trusted Platform Module Endorsement";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* this field is part of the TCG EC specification, but has not yet been found in
|
||||||
|
* manufacturer-provided ECs, and is therefore not currently parsed.
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Column(nullable = true)
|
||||||
|
private final String policyReference = null; // optional
|
||||||
|
|
||||||
|
/**
|
||||||
|
* this field is part of the TCG EC specification, but has not yet been found in
|
||||||
|
* manufacturer-provided ECs, and is therefore not currently parsed.
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Column(nullable = true)
|
||||||
|
private final String revocationLocator = null; // optional
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Column
|
@Column
|
||||||
@ -131,22 +146,6 @@ public class EndorsementCredential extends DeviceAssociatedCertificate {
|
|||||||
@Embedded
|
@Embedded
|
||||||
private TPMSecurityAssertions tpmSecurityAssertions = null; //optional
|
private TPMSecurityAssertions tpmSecurityAssertions = null; //optional
|
||||||
|
|
||||||
/*
|
|
||||||
* this field is part of the TCG EC specification, but has not yet been found in
|
|
||||||
* manufacturer-provided ECs, and is therefore not currently parsed
|
|
||||||
*/
|
|
||||||
@Getter
|
|
||||||
@Column(nullable = true)
|
|
||||||
private String policyReference = null; // optional
|
|
||||||
|
|
||||||
/*
|
|
||||||
* this field is part of the TCG EC specification, but has not yet been found in
|
|
||||||
* manufacturer-provided ECs, and is therefore not currently parsed
|
|
||||||
*/
|
|
||||||
@Getter
|
|
||||||
@Column(nullable = true)
|
|
||||||
private String revocationLocator = null; // optional
|
|
||||||
|
|
||||||
@Transient
|
@Transient
|
||||||
private Set<String> expectedOids;
|
private Set<String> expectedOids;
|
||||||
|
|
||||||
@ -180,6 +179,7 @@ public class EndorsementCredential extends DeviceAssociatedCertificate {
|
|||||||
* Parses the bytes as an EK. If parsing fails initially, the optionally present header
|
* Parses the bytes as an EK. If parsing fails initially, the optionally present header
|
||||||
* is removed and tried again. The cert header, if present, contains some certificate length
|
* is removed and tried again. The cert header, if present, contains some certificate length
|
||||||
* information which isn't needed for parsing.
|
* information which isn't needed for parsing.
|
||||||
|
*
|
||||||
* @param certificateBytes the bytes of the EC
|
* @param certificateBytes the bytes of the EC
|
||||||
* @return the EC if a valid credential, null otherwise
|
* @return the EC if a valid credential, null otherwise
|
||||||
*/
|
*/
|
||||||
@ -228,6 +228,7 @@ public class EndorsementCredential extends DeviceAssociatedCertificate {
|
|||||||
* ASN1Primitives in the certificate and searches for matching OID keys of specific values. If
|
* ASN1Primitives in the certificate and searches for matching OID keys of specific values. If
|
||||||
* matching OID keys are found, their values are encoded in the fields of the current
|
* matching OID keys are found, their values are encoded in the fields of the current
|
||||||
* EndorsementCredential object.
|
* EndorsementCredential object.
|
||||||
|
*
|
||||||
* @throws IOException the input certificate bytes were not readable into an X509
|
* @throws IOException the input certificate bytes were not readable into an X509
|
||||||
* certificate format
|
* certificate format
|
||||||
*/
|
*/
|
||||||
@ -280,9 +281,10 @@ public class EndorsementCredential extends DeviceAssociatedCertificate {
|
|||||||
* however, the method is set to add the sequence to the OID mapping, it may search for
|
* however, the method is set to add the sequence to the OID mapping, it may search for
|
||||||
* patterns that correspond to the TPM Security Assertions and TPM Specification and set
|
* patterns that correspond to the TPM Security Assertions and TPM Specification and set
|
||||||
* those fields appropriately.
|
* those fields appropriately.
|
||||||
* @param seq the sequence to parse
|
*
|
||||||
|
* @param seq the sequence to parse
|
||||||
* @param addToMapping whether or not to store the sequence value as an OID key/value value
|
* @param addToMapping whether or not to store the sequence value as an OID key/value value
|
||||||
* @param key the associated OID key with this value necessary if addToMapping is true
|
* @param key the associated OID key with this value necessary if addToMapping is true
|
||||||
* @throws IOException parsing individual subcomponents failed
|
* @throws IOException parsing individual subcomponents failed
|
||||||
*/
|
*/
|
||||||
private void parseSequence(final ASN1Sequence seq, final boolean addToMapping,
|
private void parseSequence(final ASN1Sequence seq, final boolean addToMapping,
|
||||||
@ -315,7 +317,7 @@ public class EndorsementCredential extends DeviceAssociatedCertificate {
|
|||||||
ASN1Integer revision = (ASN1Integer) seq.getObjectAt(ASN1_REV_INDEX);
|
ASN1Integer revision = (ASN1Integer) seq.getObjectAt(ASN1_REV_INDEX);
|
||||||
tpmSpecification = new TPMSpecification(family.getString(), level.getValue(),
|
tpmSpecification = new TPMSpecification(family.getString(), level.getValue(),
|
||||||
revision.getValue());
|
revision.getValue());
|
||||||
log.debug("Found TPM Spec:" + tpmSpecification.toString());
|
log.debug("Found TPM Spec:" + tpmSpecification);
|
||||||
} else if (addToMapping && key.equals(TPM_SECURITY_ASSERTIONS)) {
|
} else if (addToMapping && key.equals(TPM_SECURITY_ASSERTIONS)) {
|
||||||
// Parse TPM Security Assertions
|
// Parse TPM Security Assertions
|
||||||
int seqPosition = 0;
|
int seqPosition = 0;
|
||||||
@ -341,7 +343,7 @@ public class EndorsementCredential extends DeviceAssociatedCertificate {
|
|||||||
tpmSecurityAssertions = new TPMSecurityAssertions(ver.getValue(),
|
tpmSecurityAssertions = new TPMSecurityAssertions(ver.getValue(),
|
||||||
fieldUpgradeable.isTrue());
|
fieldUpgradeable.isTrue());
|
||||||
|
|
||||||
log.debug("Found TPM Assertions: " + tpmSecurityAssertions.toString());
|
log.debug("Found TPM Assertions: " + tpmSecurityAssertions);
|
||||||
// Iterate through remaining fields to set optional attributes
|
// Iterate through remaining fields to set optional attributes
|
||||||
int tag;
|
int tag;
|
||||||
ASN1TaggedObject obj;
|
ASN1TaggedObject obj;
|
||||||
@ -392,10 +394,11 @@ public class EndorsementCredential extends DeviceAssociatedCertificate {
|
|||||||
* Parses the many different types of ASN1Primitives and searches for specific OID
|
* Parses the many different types of ASN1Primitives and searches for specific OID
|
||||||
* key/value pairs. Works by traversing the entire ASN1Primitive tree with a single
|
* key/value pairs. Works by traversing the entire ASN1Primitive tree with a single
|
||||||
* pass and populates relevant fields in the EndorsementCredential object.
|
* pass and populates relevant fields in the EndorsementCredential object.
|
||||||
* @param component the ASN1Primitive to parse
|
*
|
||||||
|
* @param component the ASN1Primitive to parse
|
||||||
* @param addToMapping whether or not the current component has been matched as the
|
* @param addToMapping whether or not the current component has been matched as the
|
||||||
* value in an expected TPM OID key/value pair
|
* value in an expected TPM OID key/value pair
|
||||||
* @param key if addToMapping is true, the key in the OID key/value pair
|
* @param key if addToMapping is true, the key in the OID key/value pair
|
||||||
* @throws IOException parsing of subcomponents in the tree failed.
|
* @throws IOException parsing of subcomponents in the tree failed.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("checkstyle:methodlength")
|
@SuppressWarnings("checkstyle:methodlength")
|
||||||
@ -421,13 +424,11 @@ public class EndorsementCredential extends DeviceAssociatedCertificate {
|
|||||||
parsedFields.put(key, ((ASN1ObjectIdentifier) component).getId());
|
parsedFields.put(key, ((ASN1ObjectIdentifier) component).getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (component instanceof ASN1TaggedObject) {
|
} else if (component instanceof ASN1TaggedObject taggedObj) {
|
||||||
ASN1TaggedObject taggedObj = (ASN1TaggedObject) component;
|
|
||||||
parseSingle(taggedObj.getBaseObject().toASN1Primitive(), addToMapping, key);
|
parseSingle(taggedObj.getBaseObject().toASN1Primitive(), addToMapping, key);
|
||||||
|
|
||||||
} else if (component instanceof ASN1OctetString) {
|
} else if (component instanceof ASN1OctetString octStr) {
|
||||||
// this may contain parseable data or may just be a OID key-pair value
|
// this may contain parseable data or may just be a OID key-pair value
|
||||||
ASN1OctetString octStr = (ASN1OctetString) component;
|
|
||||||
byte[] bytes = octStr.getOctets();
|
byte[] bytes = octStr.getOctets();
|
||||||
ByteArrayInputStream inStream = new ByteArrayInputStream(bytes);
|
ByteArrayInputStream inStream = new ByteArrayInputStream(bytes);
|
||||||
ASN1InputStream octIn = new ASN1InputStream(inStream);
|
ASN1InputStream octIn = new ASN1InputStream(inStream);
|
||||||
@ -446,12 +447,11 @@ public class EndorsementCredential extends DeviceAssociatedCertificate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (component instanceof ASN1Set) {
|
} else if (component instanceof ASN1Set set) {
|
||||||
// all ECs seen to this point use sets differently than sequences and their sets
|
// all ECs seen to this point use sets differently than sequences and their sets
|
||||||
// don't contain top level OIDs, so we can parse everything term by term, if that
|
// don't contain top level OIDs, so we can parse everything term by term, if that
|
||||||
// ceases to be the case, we need to switch to this parsing to be more like
|
// ceases to be the case, we need to switch to this parsing to be more like
|
||||||
// parseSequences in the future
|
// parseSequences in the future
|
||||||
ASN1Set set = (ASN1Set) component;
|
|
||||||
Enumeration setContents = set.getObjects();
|
Enumeration setContents = set.getObjects();
|
||||||
ASN1Encodable subComp;
|
ASN1Encodable subComp;
|
||||||
while (setContents.hasMoreElements()) {
|
while (setContents.hasMoreElements()) {
|
||||||
|
@ -4,6 +4,7 @@ import hirs.attestationca.persist.entity.userdefined.Certificate;
|
|||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.Transient;
|
import jakarta.persistence.Transient;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import org.bouncycastle.asn1.ASN1Encodable;
|
import org.bouncycastle.asn1.ASN1Encodable;
|
||||||
@ -21,13 +22,13 @@ import java.io.ByteArrayInputStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
|
@Getter
|
||||||
|
@EqualsAndHashCode
|
||||||
@Log4j2
|
@Log4j2
|
||||||
public class IDevIDCertificate extends Certificate {
|
public class IDevIDCertificate extends Certificate {
|
||||||
|
|
||||||
@ -45,28 +46,24 @@ public class IDevIDCertificate extends Certificate {
|
|||||||
private static final String POLICY_QUALIFIER_VERIFIED_TPM_FIXED = "2.23.133.11.1.2";
|
private static final String POLICY_QUALIFIER_VERIFIED_TPM_FIXED = "2.23.133.11.1.2";
|
||||||
private static final String POLICY_QUALIFIER_VERIFIED_TPM_RESTRICTED = "2.23.133.11.1.3";
|
private static final String POLICY_QUALIFIER_VERIFIED_TPM_RESTRICTED = "2.23.133.11.1.3";
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Transient
|
@Transient
|
||||||
private byte[] subjectAltName;
|
private byte[] subjectAltName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Corresponds to the hwType field found in a Hardware Module Name (if present).
|
* Corresponds to the hwType field found in a Hardware Module Name (if present).
|
||||||
*/
|
*/
|
||||||
@Getter
|
|
||||||
@Column
|
@Column
|
||||||
private String hwType;
|
private String hwType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Corresponds to the serial number found in a Hardware Module Name (if present).
|
* Corresponds to the serial number found in a Hardware Module Name (if present).
|
||||||
*/
|
*/
|
||||||
@Getter
|
|
||||||
@Column
|
@Column
|
||||||
private byte[] hwSerialNum;
|
private byte[] hwSerialNum;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TPM policy qualifiers (TCG only).
|
* TPM policy qualifiers (TCG only).
|
||||||
*/
|
*/
|
||||||
@Getter
|
|
||||||
@Column
|
@Column
|
||||||
private String tpmPolicies;
|
private String tpmPolicies;
|
||||||
|
|
||||||
@ -106,13 +103,14 @@ public class IDevIDCertificate extends Certificate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtains TPM policy qualifiers from the Certificate Policies extension, if present. These policy qualifiers are
|
* Obtains TPM policy qualifiers from the Certificate Policies extension, if present. These policy
|
||||||
* specified in the TCG document "TPM 2.0 Keys for Device Identity and Attestation".
|
* qualifiers are specified in the TCG document "TPM 2.0 Keys for Device Identity and Attestation".
|
||||||
*
|
*
|
||||||
|
* @param policyBytes byte array representation of the policy
|
||||||
* @return A {@link java.util.Map} containing the policy qualifiers obtained.
|
* @return A {@link java.util.Map} containing the policy qualifiers obtained.
|
||||||
* @throws IOException if policy qualifiers cannot be parsed from extension value
|
* @throws IOException if policy qualifiers cannot be parsed from extension value
|
||||||
*/
|
*/
|
||||||
public Map<String, Boolean> getTPMPolicyQualifiers(byte[] policyBytes) throws IOException {
|
public Map<String, Boolean> getTPMPolicyQualifiers(final byte[] policyBytes) throws IOException {
|
||||||
CertificatePolicies certPolicies =
|
CertificatePolicies certPolicies =
|
||||||
CertificatePolicies.getInstance(JcaX509ExtensionUtils.parseExtensionValue(policyBytes));
|
CertificatePolicies.getInstance(JcaX509ExtensionUtils.parseExtensionValue(policyBytes));
|
||||||
Map<String, Boolean> policyQualifiers = new HashMap<>();
|
Map<String, Boolean> policyQualifiers = new HashMap<>();
|
||||||
@ -167,13 +165,13 @@ public class IDevIDCertificate extends Certificate {
|
|||||||
ASN1OctetString obj = (ASN1OctetString) input.readObject();
|
ASN1OctetString obj = (ASN1OctetString) input.readObject();
|
||||||
boolean tcgOid = false;
|
boolean tcgOid = false;
|
||||||
|
|
||||||
// Parse the otherName structure. According to the specification "TPM 2.0 Keys for Device Identity and
|
// Parse the otherName structure. According to the specification "TPM 2.0 Keys for Device Identity
|
||||||
// Attestation", otherName can contain up to two structures: HardwareModuleName and PermanentIdentifier.
|
// and Attestation", otherName can contain up to two structures: HardwareModuleName and
|
||||||
// Currently, this parser only supports HardwareModuleName (if present).
|
// PermanentIdentifier. Currently, this parser only supports HardwareModuleName (if present).
|
||||||
|
|
||||||
if (obj != null) {
|
if (obj != null) {
|
||||||
// Parse Hardware Module Name structure, comprised of a hwType and hwSerialNum, and associated OID
|
// Parse Hardware Module Name structure, comprised of a hwType and hwSerialNum,
|
||||||
// See also RFC 4108
|
// and associated OID. See also RFC 4108
|
||||||
ASN1Sequence seq1 = ASN1Sequence.getInstance(obj.getOctets());
|
ASN1Sequence seq1 = ASN1Sequence.getInstance(obj.getOctets());
|
||||||
|
|
||||||
// Iterate over GeneralNames sequence until HardwareModuleName is found
|
// Iterate over GeneralNames sequence until HardwareModuleName is found
|
||||||
@ -205,7 +203,8 @@ public class IDevIDCertificate extends Certificate {
|
|||||||
// Some certs have been found to contain tagged objects for hwSerialNum.
|
// Some certs have been found to contain tagged objects for hwSerialNum.
|
||||||
// Handle this as a special case.
|
// Handle this as a special case.
|
||||||
log.warn(
|
log.warn(
|
||||||
"Could not parse octet string for hwSerialNum. Attempting to parse tag.");
|
"Could not parse octet string for hwSerialNum. "
|
||||||
|
+ "Attempting to parse tag.");
|
||||||
try {
|
try {
|
||||||
tagObj1 = ASN1TaggedObject.getInstance(seq1.getObjectAt(1));
|
tagObj1 = ASN1TaggedObject.getInstance(seq1.getObjectAt(1));
|
||||||
obj2 = ASN1OctetString.getInstance(tagObj1, false);
|
obj2 = ASN1OctetString.getInstance(tagObj1, false);
|
||||||
@ -215,9 +214,9 @@ public class IDevIDCertificate extends Certificate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If an OID corresponding to TPM 2.0 for hwType is supported, according to the
|
// If an OID corresponding to TPM 2.0 for hwType is supported, according
|
||||||
// specification "TPM 2.0 Keys for Device Identity and Attestation", the contents of
|
// to the specification "TPM 2.0 Keys for Device Identity and Attestation",
|
||||||
// the hwSerialNum field will be parsed accordingly.
|
// the contents of the hwSerialNum field will be parsed accordingly.
|
||||||
hwType = obj1.toString();
|
hwType = obj1.toString();
|
||||||
if (hasTCGOIDs()) {
|
if (hasTCGOIDs()) {
|
||||||
tcgOid = true;
|
tcgOid = true;
|
||||||
@ -231,9 +230,9 @@ public class IDevIDCertificate extends Certificate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for certificate policy qualifiers, which should be present for IDevIDs if in compliance with the
|
// Check for certificate policy qualifiers, which should be present for IDevIDs if in compliance
|
||||||
// TCG specification.
|
// with the TCG specification. For interoperability reasons, this will only log a warning
|
||||||
// For interoperability reasons, this will only log a warning if a TCG OID is specified above.
|
// if a TCG OID is specified above.
|
||||||
byte[] policyBytes =
|
byte[] policyBytes =
|
||||||
getX509Certificate().getExtensionValue(Extension.certificatePolicies.getId());
|
getX509Certificate().getExtensionValue(Extension.certificatePolicies.getId());
|
||||||
Map<String, Boolean> policyQualifiers = null;
|
Map<String, Boolean> policyQualifiers = null;
|
||||||
@ -255,23 +254,23 @@ public class IDevIDCertificate extends Certificate {
|
|||||||
});
|
});
|
||||||
tpmPolicies = qualifierSB.toString();
|
tpmPolicies = qualifierSB.toString();
|
||||||
|
|
||||||
failCondition = !(policyQualifiers.get("verifiedTPMResidency") &&
|
failCondition = !(policyQualifiers.get("verifiedTPMResidency")
|
||||||
(policyQualifiers.get("verifiedTPMFixed") ||
|
&& (policyQualifiers.get("verifiedTPMFixed")
|
||||||
policyQualifiers.get("verifiedTPMRestricted")));
|
|| policyQualifiers.get("verifiedTPMRestricted")));
|
||||||
} else {
|
} else {
|
||||||
failCondition = true;
|
failCondition = true;
|
||||||
}
|
}
|
||||||
if (failCondition) {
|
if (failCondition) {
|
||||||
log.warn(
|
log.warn(
|
||||||
"TPM policy qualifiers not found, or do not meet logical criteria. Certificate may not " +
|
"TPM policy qualifiers not found, or do not meet logical criteria. "
|
||||||
"be in compliance with TCG specification.");
|
+ "Certificate may not be in compliance with TCG specification.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log a warning if notAfter field has an expiry date that is not indefinite
|
// Log a warning if notAfter field has an expiry date that is not indefinite
|
||||||
if (!this.getEndValidity().toInstant().equals(Instant.ofEpochSecond(UNDEFINED_EXPIRY_DATE))) {
|
if (!this.getEndValidity().toInstant().equals(Instant.ofEpochSecond(UNDEFINED_EXPIRY_DATE))) {
|
||||||
log.warn("IDevID does not contain an indefinite expiry date. This may indicate an invalid " +
|
log.warn("IDevID does not contain an indefinite expiry date. This may indicate an invalid "
|
||||||
"certificate.");
|
+ "certificate.");
|
||||||
}
|
}
|
||||||
|
|
||||||
input.close();
|
input.close();
|
||||||
@ -279,8 +278,8 @@ public class IDevIDCertificate extends Certificate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function to check whether a given IDevID certificate has TCG OIDs, in order to check compliance with various
|
* Function to check whether a given IDevID certificate has TCG OIDs, in order to check compliance with
|
||||||
* fields.
|
* various fields.
|
||||||
*
|
*
|
||||||
* @return a boolean value
|
* @return a boolean value
|
||||||
*/
|
*/
|
||||||
@ -291,41 +290,4 @@ public class IDevIDCertificate extends Certificate {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
@Override
|
|
||||||
@SuppressWarnings("checkstyle:avoidinlineconditionals")
|
|
||||||
public boolean equals(final Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (o == null || getClass() != o.getClass()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!super.equals(o)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
IDevIDCertificate that = (IDevIDCertificate) o;
|
|
||||||
|
|
||||||
if (!Objects.equals(getTpmPolicies(), that.getTpmPolicies())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Objects.equals(getHwType(), that.getHwType())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Arrays.equals(getHwSerialNum(), that.getHwSerialNum());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings({"checkstyle:magicnumber", "checkstyle:avoidinlineconditionals"})
|
|
||||||
public int hashCode() {
|
|
||||||
int result = super.hashCode();
|
|
||||||
result = 31 * result + (getTpmPolicies() != null ? getTpmPolicies().hashCode() : 0);
|
|
||||||
result = 31 * result + (getHwType() != null ? getHwType().hashCode() : 0);
|
|
||||||
result = 31 * result + (getHwSerialNum() != null ? Arrays.hashCode(getHwSerialNum()) : 0);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -28,6 +28,9 @@ public class IssuedAttestationCertificate extends DeviceAssociatedCertificate {
|
|||||||
*/
|
*/
|
||||||
public static final String AIC_TYPE_LABEL = "TCPA Trusted Platform Identity";
|
public static final String AIC_TYPE_LABEL = "TCPA Trusted Platform Identity";
|
||||||
|
|
||||||
|
@Column
|
||||||
|
public boolean isLDevID;
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.EAGER)
|
@ManyToOne(fetch = FetchType.EAGER)
|
||||||
@JoinColumn(name = "ek_id")
|
@JoinColumn(name = "ek_id")
|
||||||
private EndorsementCredential endorsementCredential;
|
private EndorsementCredential endorsementCredential;
|
||||||
@ -36,14 +39,12 @@ public class IssuedAttestationCertificate extends DeviceAssociatedCertificate {
|
|||||||
@JoinColumn(name = "pc_id")
|
@JoinColumn(name = "pc_id")
|
||||||
private List<PlatformCredential> platformCredentials;
|
private List<PlatformCredential> platformCredentials;
|
||||||
|
|
||||||
@Column
|
|
||||||
public boolean isLDevID;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
* @param certificateBytes the issued certificate bytes
|
*
|
||||||
|
* @param certificateBytes the issued certificate bytes
|
||||||
* @param endorsementCredential the endorsement credential
|
* @param endorsementCredential the endorsement credential
|
||||||
* @param platformCredentials the platform credentials
|
* @param platformCredentials the platform credentials
|
||||||
* @throws IOException if there is a problem extracting information from the certificate
|
* @throws IOException if there is a problem extracting information from the certificate
|
||||||
*/
|
*/
|
||||||
public IssuedAttestationCertificate(final byte[] certificateBytes,
|
public IssuedAttestationCertificate(final byte[] certificateBytes,
|
||||||
@ -58,9 +59,11 @@ public class IssuedAttestationCertificate extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
* @param certificatePath path to certificate
|
*
|
||||||
|
* @param certificatePath path to certificate
|
||||||
* @param endorsementCredential the endorsement credential
|
* @param endorsementCredential the endorsement credential
|
||||||
* @param platformCredentials the platform credentials
|
* @param platformCredentials the platform credentials
|
||||||
|
* @param isLDevID is it an LDev ID
|
||||||
* @throws IOException if there is a problem extracting information from the certificate
|
* @throws IOException if there is a problem extracting information from the certificate
|
||||||
*/
|
*/
|
||||||
public IssuedAttestationCertificate(final Path certificatePath,
|
public IssuedAttestationCertificate(final Path certificatePath,
|
||||||
@ -70,8 +73,4 @@ public class IssuedAttestationCertificate extends DeviceAssociatedCertificate {
|
|||||||
throws IOException {
|
throws IOException {
|
||||||
this(readBytes(certificatePath), endorsementCredential, platformCredentials, isLDevID);
|
this(readBytes(certificatePath), endorsementCredential, platformCredentials, isLDevID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<PlatformCredential> getPlatformCredentials() {
|
|
||||||
return new ArrayList<>(platformCredentials);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,6 @@ import java.util.Collections;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class persists Platform credentials by extending the base Certificate
|
* This class persists Platform credentials by extending the base Certificate
|
||||||
@ -61,24 +60,29 @@ import java.util.UUID;
|
|||||||
@Entity
|
@Entity
|
||||||
public class PlatformCredential extends DeviceAssociatedCertificate {
|
public class PlatformCredential extends DeviceAssociatedCertificate {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TCPA Trusted Platform Endorsement.
|
||||||
|
*/
|
||||||
|
public static final String CERTIFICATE_TYPE_1_2 = "TCPA Trusted Platform Endorsement";
|
||||||
|
/**
|
||||||
|
* TCG Trusted Platform Endorsement.
|
||||||
|
*/
|
||||||
|
public static final String CERTIFICATE_TYPE_2_0 = "TCG Trusted Platform Endorsement";
|
||||||
private static final int TCG_SPECIFICATION_LENGTH = 3;
|
private static final int TCG_SPECIFICATION_LENGTH = 3;
|
||||||
// These are Object Identifiers (OIDs) for sections in the credentials
|
// These are Object Identifiers (OIDs) for sections in the credentials
|
||||||
private static final String POLICY_QUALIFIER_CPSURI = "1.3.6.1.5.5.7.2.1";
|
private static final String POLICY_QUALIFIER_CPSURI = "1.3.6.1.5.5.7.2.1";
|
||||||
private static final String POLICY_QUALIFIER_USER_NOTICE = "1.3.6.1.5.5.7.2.2";
|
private static final String POLICY_QUALIFIER_USER_NOTICE = "1.3.6.1.5.5.7.2.2";
|
||||||
|
|
||||||
// OID for TCG Attributes
|
// OID for TCG Attributes
|
||||||
private static final String PLATFORM_MANUFACTURER = "2.23.133.2.4";
|
private static final String PLATFORM_MANUFACTURER = "2.23.133.2.4";
|
||||||
private static final String PLATFORM_MODEL = "2.23.133.2.5";
|
private static final String PLATFORM_MODEL = "2.23.133.2.5";
|
||||||
private static final String PLATFORM_VERSION = "2.23.133.2.6";
|
private static final String PLATFORM_VERSION = "2.23.133.2.6";
|
||||||
private static final String PLATFORM_SERIAL = "2.23.133.2.23";
|
private static final String PLATFORM_SERIAL = "2.23.133.2.23";
|
||||||
private static final String PLATFORM_BASEBOARD_CHASSIS_COMBINED = "2.23.133.5.1.6";
|
private static final String PLATFORM_BASEBOARD_CHASSIS_COMBINED = "2.23.133.5.1.6";
|
||||||
|
|
||||||
// OID for TCG Platform Class Common Attributes
|
// OID for TCG Platform Class Common Attributes
|
||||||
private static final String PLATFORM_MANUFACTURER_2_0 = "2.23.133.5.1.1";
|
private static final String PLATFORM_MANUFACTURER_2_0 = "2.23.133.5.1.1";
|
||||||
private static final String PLATFORM_MODEL_2_0 = "2.23.133.5.1.4";
|
private static final String PLATFORM_MODEL_2_0 = "2.23.133.5.1.4";
|
||||||
private static final String PLATFORM_VERSION_2_0 = "2.23.133.5.1.5";
|
private static final String PLATFORM_VERSION_2_0 = "2.23.133.5.1.5";
|
||||||
private static final String PLATFORM_SERIAL_2_0 = "2.23.133.5.1.6";
|
private static final String PLATFORM_SERIAL_2_0 = "2.23.133.5.1.6";
|
||||||
|
|
||||||
// OID for Certificate Attributes
|
// OID for Certificate Attributes
|
||||||
private static final String TCG_PLATFORM_SPECIFICATION = "2.23.133.2.17";
|
private static final String TCG_PLATFORM_SPECIFICATION = "2.23.133.2.17";
|
||||||
private static final String TPM_SECURITY_ASSERTION = "2.23.133.2.18";
|
private static final String TPM_SECURITY_ASSERTION = "2.23.133.2.18";
|
||||||
@ -115,16 +119,11 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
// number of extra bytes potentially present in a cert header.
|
// number of extra bytes potentially present in a cert header.
|
||||||
private static final int PC_CERT_HEADER_BYTE_COUNT = 8;
|
private static final int PC_CERT_HEADER_BYTE_COUNT = 8;
|
||||||
|
private static final String MANUFACTURER_FIELD = "manufacturer";
|
||||||
/**
|
private static final String MODEL_FIELD = "model";
|
||||||
* TCPA Trusted Platform Endorsement.
|
private static final String VERSION_FIELD = "version";
|
||||||
*/
|
private static final String PLATFORM_SERIAL_FIELD = "platformSerial";
|
||||||
public static final String CERTIFICATE_TYPE_1_2 = "TCPA Trusted Platform Endorsement";
|
private static final String CHASSIS_SERIAL_NUMBER_FIELD = "chassisSerialNumber";
|
||||||
|
|
||||||
/**
|
|
||||||
* TCG Trusted Platform Endorsement.
|
|
||||||
*/
|
|
||||||
public static final String CERTIFICATE_TYPE_2_0 = "TCG Trusted Platform Endorsement";
|
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private String credentialType = null;
|
private String credentialType = null;
|
||||||
@ -132,23 +131,18 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
@Column
|
@Column
|
||||||
private boolean platformBase = false;
|
private boolean platformBase = false;
|
||||||
|
|
||||||
private static final String MANUFACTURER_FIELD = "manufacturer";
|
|
||||||
@Column
|
@Column
|
||||||
private String manufacturer = null;
|
private String manufacturer = null;
|
||||||
|
|
||||||
private static final String MODEL_FIELD = "model";
|
|
||||||
@Column
|
@Column
|
||||||
private String model = null;
|
private String model = null;
|
||||||
|
|
||||||
private static final String VERSION_FIELD = "version";
|
|
||||||
@Column
|
@Column
|
||||||
private String version = null;
|
private String version = null;
|
||||||
|
|
||||||
private static final String PLATFORM_SERIAL_FIELD = "platformSerial";
|
|
||||||
@Column
|
@Column
|
||||||
private String platformSerial = null;
|
private String platformSerial = null;
|
||||||
|
|
||||||
private static final String CHASSIS_SERIAL_NUMBER_FIELD = "chassisSerialNumber";
|
|
||||||
@Column
|
@Column
|
||||||
private String chassisSerialNumber;
|
private String chassisSerialNumber;
|
||||||
|
|
||||||
@ -175,6 +169,7 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
@Column(length = MAX_MESSAGE_LENGTH)
|
@Column(length = MAX_MESSAGE_LENGTH)
|
||||||
private String componentFailures = Strings.EMPTY;
|
private String componentFailures = Strings.EMPTY;
|
||||||
|
|
||||||
@Column(length = MAX_MESSAGE_LENGTH)
|
@Column(length = MAX_MESSAGE_LENGTH)
|
||||||
private String componentFailureMessage = Strings.EMPTY;
|
private String componentFailureMessage = Strings.EMPTY;
|
||||||
|
|
||||||
@ -182,6 +177,7 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
private EndorsementCredential endorsementCredential = null;
|
private EndorsementCredential endorsementCredential = null;
|
||||||
|
|
||||||
private String platformChainType = Strings.EMPTY;
|
private String platformChainType = Strings.EMPTY;
|
||||||
|
|
||||||
private boolean isDeltaChain = false;
|
private boolean isDeltaChain = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -190,7 +186,7 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
* or X509 attribute certificate.
|
* or X509 attribute certificate.
|
||||||
*
|
*
|
||||||
* @param certificateBytes the contents of a certificate file
|
* @param certificateBytes the contents of a certificate file
|
||||||
* @param parseFields boolean True to parse fields
|
* @param parseFields boolean True to parse fields
|
||||||
* @throws IOException if there is a problem extracting information from the certificate\
|
* @throws IOException if there is a problem extracting information from the certificate\
|
||||||
*/
|
*/
|
||||||
public PlatformCredential(final byte[] certificateBytes,
|
public PlatformCredential(final byte[] certificateBytes,
|
||||||
@ -223,40 +219,11 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
this(readBytes(certificatePath), true);
|
this(readBytes(certificatePath), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate the signature on the attribute certificate in this holder.
|
|
||||||
*
|
|
||||||
* @param verifierProvider a ContentVerifierProvider that can generate a
|
|
||||||
* verifier for the signature.
|
|
||||||
* @return true if the signature is valid, false otherwise.
|
|
||||||
* @throws IOException if the signature cannot be processed or is inappropriate.
|
|
||||||
*/
|
|
||||||
public boolean isSignatureValid(final ContentVerifierProvider verifierProvider)
|
|
||||||
throws IOException {
|
|
||||||
AttributeCertificate attCert = getAttributeCertificate();
|
|
||||||
AttributeCertificateInfo acinfo = getAttributeCertificate().getAcinfo();
|
|
||||||
|
|
||||||
// Check if the algorithm identifier is the same
|
|
||||||
if (!isAlgIdEqual(acinfo.getSignature(), attCert.getSignatureAlgorithm())) {
|
|
||||||
throw new IOException("signature invalid - algorithm identifier mismatch");
|
|
||||||
}
|
|
||||||
|
|
||||||
ContentVerifier verifier;
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Set ContentVerifier with the signature that will verify
|
|
||||||
verifier = verifierProvider.get((acinfo.getSignature()));
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new IOException("unable to process signature: " + e.getMessage(), e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return verifier.verify(attCert.getSignatureValue().getOctets());
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Parses the bytes as an PC. If parsing fails initially, the optionally present header
|
* Parses the bytes as an PC. If parsing fails initially, the optionally present header
|
||||||
* is removed and tried again. The cert header, if present, contains some certificate length
|
* is removed and tried again. The cert header, if present, contains some certificate length
|
||||||
* information which isn't needed for parsing.
|
* information which isn't needed for parsing.
|
||||||
|
*
|
||||||
* @param certificateBytes the bytes of the PC
|
* @param certificateBytes the bytes of the PC
|
||||||
* @return the PC if a valid credential, null otherwise
|
* @return the PC if a valid credential, null otherwise
|
||||||
*/
|
*/
|
||||||
@ -285,6 +252,103 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
return credential;
|
return credential;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify if the AlgorithmIdentifiers are equal.
|
||||||
|
*
|
||||||
|
* @param id1 AlgorithIdentifier one
|
||||||
|
* @param id2 AlgorithIdentifier two
|
||||||
|
* @return True if are the same, False if not
|
||||||
|
*/
|
||||||
|
public static boolean isAlgIdEqual(final AlgorithmIdentifier id1,
|
||||||
|
final AlgorithmIdentifier id2) {
|
||||||
|
if (!id1.getAlgorithm().equals(id2.getAlgorithm())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (id1.getParameters() == null) {
|
||||||
|
return id2.getParameters() == null || id2.getParameters().equals(DERNull.INSTANCE);
|
||||||
|
}
|
||||||
|
if (id2.getParameters() == null) {
|
||||||
|
return id1.getParameters() == null || id1.getParameters().equals(DERNull.INSTANCE);
|
||||||
|
}
|
||||||
|
return id1.getParameters().equals(id2.getParameters());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the PolicyQualifier from the Certificate Policies Extension.
|
||||||
|
*
|
||||||
|
* @param certificate Attribute Certificate information
|
||||||
|
* @return Policy Qualifier from the Certificate Policies Extension
|
||||||
|
*/
|
||||||
|
public static Map<String, String> getPolicyQualifier(
|
||||||
|
final AttributeCertificateInfo certificate) {
|
||||||
|
Preconditions.checkArgument(certificate.getExtensions() != null,
|
||||||
|
"Platform certificate should have extensions.");
|
||||||
|
|
||||||
|
CertificatePolicies certPolicies
|
||||||
|
= CertificatePolicies.fromExtensions(certificate.getExtensions());
|
||||||
|
Map<String, String> policyQualifiers = new HashMap<>();
|
||||||
|
String userNoticeQualifier = "";
|
||||||
|
String cpsURI = "";
|
||||||
|
|
||||||
|
if (certPolicies != null) {
|
||||||
|
// Must contain at least one Policy
|
||||||
|
for (PolicyInformation policy : certPolicies.getPolicyInformation()) {
|
||||||
|
for (ASN1Encodable pQualifierInfo : policy.getPolicyQualifiers().toArray()) {
|
||||||
|
PolicyQualifierInfo info = PolicyQualifierInfo.getInstance(pQualifierInfo);
|
||||||
|
// Subtract the data based on the OID
|
||||||
|
switch (info.getPolicyQualifierId().getId()) {
|
||||||
|
case POLICY_QUALIFIER_CPSURI:
|
||||||
|
cpsURI = DERIA5String.getInstance(info.getQualifier()).getString();
|
||||||
|
break;
|
||||||
|
case POLICY_QUALIFIER_USER_NOTICE:
|
||||||
|
UserNotice userNotice = UserNotice.getInstance(info.getQualifier());
|
||||||
|
userNoticeQualifier = userNotice.getExplicitText().getString();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add to map
|
||||||
|
policyQualifiers.put("userNotice", userNoticeQualifier);
|
||||||
|
policyQualifiers.put("cpsURI", cpsURI);
|
||||||
|
|
||||||
|
return policyQualifiers;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate the signature on the attribute certificate in this holder.
|
||||||
|
*
|
||||||
|
* @param verifierProvider a ContentVerifierProvider that can generate a
|
||||||
|
* verifier for the signature.
|
||||||
|
* @return true if the signature is valid, false otherwise.
|
||||||
|
* @throws IOException if the signature cannot be processed or is inappropriate.
|
||||||
|
*/
|
||||||
|
public boolean isSignatureValid(final ContentVerifierProvider verifierProvider)
|
||||||
|
throws IOException {
|
||||||
|
AttributeCertificate attCert = getAttributeCertificate();
|
||||||
|
AttributeCertificateInfo acinfo = getAttributeCertificate().getAcinfo();
|
||||||
|
|
||||||
|
// Check if the algorithm identifier is the same
|
||||||
|
if (!isAlgIdEqual(acinfo.getSignature(), attCert.getSignatureAlgorithm())) {
|
||||||
|
throw new IOException("signature invalid - algorithm identifier mismatch");
|
||||||
|
}
|
||||||
|
|
||||||
|
ContentVerifier verifier;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Set ContentVerifier with the signature that will verify
|
||||||
|
verifier = verifierProvider.get((acinfo.getSignature()));
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IOException("unable to process signature: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return verifier.verify(attCert.getSignatureValue().getOctets());
|
||||||
|
}
|
||||||
|
|
||||||
private void parseFields() throws IOException {
|
private void parseFields() throws IOException {
|
||||||
AttributeCertificateInfo certificate = getAttributeCertificate().getAcinfo();
|
AttributeCertificateInfo certificate = getAttributeCertificate().getAcinfo();
|
||||||
Map<String, String> policyQualifier = getPolicyQualifier(certificate);
|
Map<String, String> policyQualifier = getPolicyQualifier(certificate);
|
||||||
@ -340,6 +404,7 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse a 1.2 Platform Certificate (Attribute Certificate).
|
* Parse a 1.2 Platform Certificate (Attribute Certificate).
|
||||||
|
*
|
||||||
* @param certificate Attribute Certificate
|
* @param certificate Attribute Certificate
|
||||||
*/
|
*/
|
||||||
private void parseAttributeCert(final AttributeCertificateInfo certificate) {
|
private void parseAttributeCert(final AttributeCertificateInfo certificate) {
|
||||||
@ -347,14 +412,14 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
= certificate.getExtensions().getExtension(Extension.subjectAlternativeName);
|
= certificate.getExtensions().getExtension(Extension.subjectAlternativeName);
|
||||||
// It contains a Subject Alternative Name Extension
|
// It contains a Subject Alternative Name Extension
|
||||||
if (subjectAlternativeNameExtension != null) {
|
if (subjectAlternativeNameExtension != null) {
|
||||||
GeneralNames gnames = GeneralNames.getInstance(
|
GeneralNames gnames = GeneralNames.getInstance(
|
||||||
subjectAlternativeNameExtension.getParsedValue());
|
subjectAlternativeNameExtension.getParsedValue());
|
||||||
for (GeneralName gname : gnames.getNames()) {
|
for (GeneralName gname : gnames.getNames()) {
|
||||||
// Check if it's a directoryName [4] Name type
|
// Check if it's a directoryName [4] Name type
|
||||||
if (gname.getTagNo() == GeneralName.directoryName) {
|
if (gname.getTagNo() == GeneralName.directoryName) {
|
||||||
X500Name name = X500Name.getInstance(gname.getName());
|
X500Name name = X500Name.getInstance(gname.getName());
|
||||||
for (RDN rdn: name.getRDNs()) {
|
for (RDN rdn : name.getRDNs()) {
|
||||||
for (AttributeTypeAndValue attTV: rdn.getTypesAndValues()) {
|
for (AttributeTypeAndValue attTV : rdn.getTypesAndValues()) {
|
||||||
switch (attTV.getType().toString()) {
|
switch (attTV.getType().toString()) {
|
||||||
case PLATFORM_MANUFACTURER:
|
case PLATFORM_MANUFACTURER:
|
||||||
this.manufacturer = attTV.getValue().toString();
|
this.manufacturer = attTV.getValue().toString();
|
||||||
@ -392,6 +457,7 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse a 2.0 Platform Certificate (Attribute Certificate).
|
* Parse a 2.0 Platform Certificate (Attribute Certificate).
|
||||||
|
*
|
||||||
* @param certificate Attribute Certificate
|
* @param certificate Attribute Certificate
|
||||||
*/
|
*/
|
||||||
private void parseAttributeCert2(final AttributeCertificateInfo certificate)
|
private void parseAttributeCert2(final AttributeCertificateInfo certificate)
|
||||||
@ -407,8 +473,8 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
// Check if it's a directoryName [4] Name type
|
// Check if it's a directoryName [4] Name type
|
||||||
if (gname.getTagNo() == GeneralName.directoryName) {
|
if (gname.getTagNo() == GeneralName.directoryName) {
|
||||||
X500Name name = X500Name.getInstance(gname.getName());
|
X500Name name = X500Name.getInstance(gname.getName());
|
||||||
for (RDN rdn: name.getRDNs()) {
|
for (RDN rdn : name.getRDNs()) {
|
||||||
for (AttributeTypeAndValue attTV: rdn.getTypesAndValues()) {
|
for (AttributeTypeAndValue attTV : rdn.getTypesAndValues()) {
|
||||||
switch (attTV.getType().toString()) {
|
switch (attTV.getType().toString()) {
|
||||||
case PLATFORM_MANUFACTURER_2_0:
|
case PLATFORM_MANUFACTURER_2_0:
|
||||||
this.manufacturer = attTV.getValue().toString();
|
this.manufacturer = attTV.getValue().toString();
|
||||||
@ -440,6 +506,7 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the x509 Platform Certificate version.
|
* Get the x509 Platform Certificate version.
|
||||||
|
*
|
||||||
* @return a big integer representing the certificate version.
|
* @return a big integer representing the certificate version.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -458,6 +525,7 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the cPSuri from the Certificate Policies.
|
* Get the cPSuri from the Certificate Policies.
|
||||||
|
*
|
||||||
* @return cPSuri from the CertificatePolicies.
|
* @return cPSuri from the CertificatePolicies.
|
||||||
* @throws IOException when reading the certificate.
|
* @throws IOException when reading the certificate.
|
||||||
*/
|
*/
|
||||||
@ -473,9 +541,10 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the Platform Configuration Attribute from the Platform Certificate.
|
* Get the Platform Configuration Attribute from the Platform Certificate.
|
||||||
|
*
|
||||||
* @return a map with all the attributes
|
* @return a map with all the attributes
|
||||||
* @throws IllegalArgumentException when there is a parsing error
|
* @throws IllegalArgumentException when there is a parsing error
|
||||||
* @throws IOException when reading the certificate.
|
* @throws IOException when reading the certificate.
|
||||||
*/
|
*/
|
||||||
public Map<String, Object> getAllAttributes()
|
public Map<String, Object> getAllAttributes()
|
||||||
throws IllegalArgumentException, IOException {
|
throws IllegalArgumentException, IOException {
|
||||||
@ -523,10 +592,11 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the specified attribute from the Platform Certificate.
|
* Get the specified attribute from the Platform Certificate.
|
||||||
|
*
|
||||||
* @param attributeName to retrieve from the map.
|
* @param attributeName to retrieve from the map.
|
||||||
* @return an Object with the attribute.
|
* @return an Object with the attribute.
|
||||||
* @throws IllegalArgumentException when there is a parsing error
|
* @throws IllegalArgumentException when there is a parsing error
|
||||||
* @throws IOException when reading the certificate.
|
* @throws IOException when reading the certificate.
|
||||||
*/
|
*/
|
||||||
public Object getAttribute(final String attributeName)
|
public Object getAttribute(final String attributeName)
|
||||||
throws IllegalArgumentException, IOException {
|
throws IllegalArgumentException, IOException {
|
||||||
@ -535,9 +605,10 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the Platform Configuration Attribute from the Platform Certificate.
|
* Get the Platform Configuration Attribute from the Platform Certificate.
|
||||||
|
*
|
||||||
* @return a map with the Platform Configuration information.
|
* @return a map with the Platform Configuration information.
|
||||||
* @throws IllegalArgumentException when there is a parsing error
|
* @throws IllegalArgumentException when there is a parsing error
|
||||||
* @throws IOException when reading the certificate.
|
* @throws IOException when reading the certificate.
|
||||||
*/
|
*/
|
||||||
public PlatformConfiguration getPlatformConfiguration()
|
public PlatformConfiguration getPlatformConfiguration()
|
||||||
throws IllegalArgumentException, IOException {
|
throws IllegalArgumentException, IOException {
|
||||||
@ -552,9 +623,10 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the Platform Configuration URI Attribute from the Platform Certificate.
|
* Get the Platform Configuration URI Attribute from the Platform Certificate.
|
||||||
|
*
|
||||||
* @return an URIReference object to the Platform Configuration URI.
|
* @return an URIReference object to the Platform Configuration URI.
|
||||||
* @throws IllegalArgumentException when there is a parsing error
|
* @throws IllegalArgumentException when there is a parsing error
|
||||||
* @throws IOException when reading the certificate.
|
* @throws IOException when reading the certificate.
|
||||||
*/
|
*/
|
||||||
public URIReference getPlatformConfigurationURI()
|
public URIReference getPlatformConfigurationURI()
|
||||||
throws IllegalArgumentException, IOException {
|
throws IllegalArgumentException, IOException {
|
||||||
@ -567,9 +639,10 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the TBB Security Assertion from the Platform Certificate.
|
* Get the TBB Security Assertion from the Platform Certificate.
|
||||||
|
*
|
||||||
* @return a TBBSecurityAssertion object.
|
* @return a TBBSecurityAssertion object.
|
||||||
* @throws IllegalArgumentException when there is a parsing error
|
* @throws IllegalArgumentException when there is a parsing error
|
||||||
* @throws IOException when reading the certificate.
|
* @throws IOException when reading the certificate.
|
||||||
*/
|
*/
|
||||||
public TBBSecurityAssertion getTBBSecurityAssertion()
|
public TBBSecurityAssertion getTBBSecurityAssertion()
|
||||||
throws IllegalArgumentException, IOException {
|
throws IllegalArgumentException, IOException {
|
||||||
@ -612,6 +685,7 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the list of component identifiers if there are any.
|
* Get the list of component identifiers if there are any.
|
||||||
|
*
|
||||||
* @return the list of component identifiers if there are any
|
* @return the list of component identifiers if there are any
|
||||||
*/
|
*/
|
||||||
public List<ComponentIdentifier> getComponentIdentifiers() {
|
public List<ComponentIdentifier> getComponentIdentifiers() {
|
||||||
@ -626,76 +700,4 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
}
|
}
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Verify if the AlgorithmIdentifiers are equal.
|
|
||||||
*
|
|
||||||
* @param id1 AlgorithIdentifier one
|
|
||||||
* @param id2 AlgorithIdentifier two
|
|
||||||
* @return True if are the same, False if not
|
|
||||||
*/
|
|
||||||
public static boolean isAlgIdEqual(final AlgorithmIdentifier id1,
|
|
||||||
final AlgorithmIdentifier id2) {
|
|
||||||
if (!id1.getAlgorithm().equals(id2.getAlgorithm())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (id1.getParameters() == null) {
|
|
||||||
if (id2.getParameters() != null && !id2.getParameters().equals(DERNull.INSTANCE)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (id2.getParameters() == null) {
|
|
||||||
if (id1.getParameters() != null && !id1.getParameters().equals(DERNull.INSTANCE)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return id1.getParameters().equals(id2.getParameters());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the PolicyQualifier from the Certificate Policies Extension.
|
|
||||||
*
|
|
||||||
* @param certificate Attribute Certificate information
|
|
||||||
* @return Policy Qualifier from the Certificate Policies Extension
|
|
||||||
*/
|
|
||||||
public static Map<String, String> getPolicyQualifier(
|
|
||||||
final AttributeCertificateInfo certificate) {
|
|
||||||
Preconditions.checkArgument(certificate.getExtensions() != null,
|
|
||||||
"Platform certificate should have extensions.");
|
|
||||||
|
|
||||||
CertificatePolicies certPolicies
|
|
||||||
= CertificatePolicies.fromExtensions(certificate.getExtensions());
|
|
||||||
Map<String, String> policyQualifiers = new HashMap<>();
|
|
||||||
String userNoticeQualifier = "";
|
|
||||||
String cpsURI = "";
|
|
||||||
|
|
||||||
if (certPolicies != null) {
|
|
||||||
// Must contain at least one Policy
|
|
||||||
for (PolicyInformation policy : certPolicies.getPolicyInformation()) {
|
|
||||||
for (ASN1Encodable pQualifierInfo: policy.getPolicyQualifiers().toArray()) {
|
|
||||||
PolicyQualifierInfo info = PolicyQualifierInfo.getInstance(pQualifierInfo);
|
|
||||||
// Subtract the data based on the OID
|
|
||||||
switch (info.getPolicyQualifierId().getId()) {
|
|
||||||
case POLICY_QUALIFIER_CPSURI:
|
|
||||||
cpsURI = DERIA5String.getInstance(info.getQualifier()).getString();
|
|
||||||
break;
|
|
||||||
case POLICY_QUALIFIER_USER_NOTICE:
|
|
||||||
UserNotice userNotice = UserNotice.getInstance(info.getQualifier());
|
|
||||||
userNoticeQualifier = userNotice.getExplicitText().getString();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add to map
|
|
||||||
policyQualifiers.put("userNotice", userNoticeQualifier);
|
|
||||||
policyQualifiers.put("cpsURI", cpsURI);
|
|
||||||
|
|
||||||
return policyQualifiers;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -62,25 +62,16 @@ public class ComponentAddress {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the string value for the address type.
|
* Get the string value for the address type.
|
||||||
|
*
|
||||||
* @return the string value for the address type
|
* @return the string value for the address type
|
||||||
*/
|
*/
|
||||||
public String getAddressTypeValue() {
|
public String getAddressTypeValue() {
|
||||||
String typeValue;
|
return switch (this.addressType.getId()) {
|
||||||
switch (this.addressType.getId()) {
|
case ETHERNET_MAC -> "ethernet mac";
|
||||||
case ETHERNET_MAC:
|
case WLAN_MAC -> "wlan mac";
|
||||||
typeValue = "ethernet mac";
|
case BLUETOOTH_MAC -> "bluetooth mac";
|
||||||
break;
|
default -> "unknown mac";
|
||||||
case WLAN_MAC:
|
};
|
||||||
typeValue = "wlan mac";
|
|
||||||
break;
|
|
||||||
case BLUETOOTH_MAC:
|
|
||||||
typeValue = "bluetooth mac";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
typeValue = "unknown mac";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return typeValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -6,7 +6,6 @@ import lombok.AccessLevel;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ -14,29 +13,34 @@ import java.util.UUID;
|
|||||||
* This is tied to the ComponentResult class. If a component has a mismatched
|
* This is tied to the ComponentResult class. If a component has a mismatched
|
||||||
* value from what the device has listed, this class represents which attribute
|
* value from what the device has listed, this class represents which attribute
|
||||||
* of that component mismatched.
|
* of that component mismatched.
|
||||||
*
|
* <p>
|
||||||
* If this is a delta issue, the component ID would be set to null if the
|
* If this is a delta issue, the component ID would be set to null if the
|
||||||
* remove or modified don't exist.
|
* remove or modified don't exist.
|
||||||
*/
|
*/
|
||||||
@Entity
|
@Entity
|
||||||
@Getter
|
@Getter
|
||||||
@NoArgsConstructor(access = AccessLevel.PROTECTED)
|
@NoArgsConstructor(access = AccessLevel.PROTECTED)
|
||||||
public class ComponentAttributeResult extends ArchivableEntity {
|
public class ComponentAttributeResult extends ArchivableEntity {
|
||||||
|
|
||||||
private UUID componentId;
|
private UUID componentId;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private UUID provisionSessionId;
|
private UUID provisionSessionId;
|
||||||
|
|
||||||
// this is used to identify Revision for the ignore policy
|
// this is used to identify Revision for the ignore policy
|
||||||
@Setter
|
@Setter
|
||||||
private String attribute;
|
private String attribute;
|
||||||
|
|
||||||
private String expectedValue;
|
private String expectedValue;
|
||||||
|
|
||||||
private String actualValue;
|
private String actualValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor that populates the expected and actual values.
|
* Default constructor that populates the expected and actual values.
|
||||||
* @param componentId id associated with component result
|
*
|
||||||
|
* @param componentId id associated with component result
|
||||||
* @param expectedValue platform certificate value
|
* @param expectedValue platform certificate value
|
||||||
* @param actualValue paccor value from the device
|
* @param actualValue paccor value from the device
|
||||||
*/
|
*/
|
||||||
public ComponentAttributeResult(final UUID componentId,
|
public ComponentAttributeResult(final UUID componentId,
|
||||||
final String expectedValue,
|
final String expectedValue,
|
||||||
@ -48,10 +52,11 @@ public class ComponentAttributeResult extends ArchivableEntity {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor that populates the expected and actual values.
|
* Default constructor that populates the expected and actual values.
|
||||||
* @param componentId id associated with component result
|
*
|
||||||
|
* @param componentId id associated with component result
|
||||||
* @param provisionSessionId an id for the associated provision
|
* @param provisionSessionId an id for the associated provision
|
||||||
* @param expectedValue platform certificate value
|
* @param expectedValue platform certificate value
|
||||||
* @param actualValue paccor value from the device
|
* @param actualValue paccor value from the device
|
||||||
*/
|
*/
|
||||||
public ComponentAttributeResult(final UUID componentId,
|
public ComponentAttributeResult(final UUID componentId,
|
||||||
final UUID provisionSessionId,
|
final UUID provisionSessionId,
|
||||||
@ -65,6 +70,8 @@ public class ComponentAttributeResult extends ArchivableEntity {
|
|||||||
/**
|
/**
|
||||||
* This method is used to check the mismatched status flag for
|
* This method is used to check the mismatched status flag for
|
||||||
* displaying red if there is a failure.
|
* displaying red if there is a failure.
|
||||||
|
*
|
||||||
|
* @return true if there is status match, false otherwise
|
||||||
*/
|
*/
|
||||||
public boolean checkMatchedStatus() {
|
public boolean checkMatchedStatus() {
|
||||||
return this.actualValue.equals(this.expectedValue);
|
return this.actualValue.equals(this.expectedValue);
|
||||||
@ -72,6 +79,7 @@ public class ComponentAttributeResult extends ArchivableEntity {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* For the state of the object, this shouldn't be negative.
|
* For the state of the object, this shouldn't be negative.
|
||||||
|
*
|
||||||
* @return the string value of the attribute name
|
* @return the string value of the attribute name
|
||||||
*/
|
*/
|
||||||
public String getAttribute() {
|
public String getAttribute() {
|
||||||
|
@ -23,39 +23,52 @@ import java.nio.file.Path;
|
|||||||
* componentClassRegistry ComponentClassRegistry,
|
* componentClassRegistry ComponentClassRegistry,
|
||||||
* componentClassValue OCTET STRING SIZE(4) ) }
|
* componentClassValue OCTET STRING SIZE(4) ) }
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
* <p>
|
||||||
* A note for the future.
|
* A note for the future.
|
||||||
*/
|
*/
|
||||||
public class ComponentClass {
|
@Getter
|
||||||
|
public class
|
||||||
|
ComponentClass {
|
||||||
private static final String TCG_COMPONENT_REGISTRY = "2.23.133.18.3.1";
|
private static final String TCG_COMPONENT_REGISTRY = "2.23.133.18.3.1";
|
||||||
|
|
||||||
private static final String SMBIOS_COMPONENT_REGISTRY = "2.23.133.18.3.3";
|
private static final String SMBIOS_COMPONENT_REGISTRY = "2.23.133.18.3.3";
|
||||||
|
|
||||||
private static final Path WINDOWS_JSON_PATH = FileSystems.getDefault().getPath(
|
private static final Path WINDOWS_JSON_PATH = FileSystems.getDefault().getPath(
|
||||||
"C:/", "ProgramData", "hirs", "aca", "default-properties", "component-class.json");
|
"C:/", "ProgramData", "hirs", "aca", "default-properties", "component-class.json");
|
||||||
private static final Path JSON_PATH = WINDOWS_JSON_PATH.toFile().exists() ? WINDOWS_JSON_PATH :
|
|
||||||
FileSystems.getDefault().getPath(
|
private static final Path JSON_PATH = WINDOWS_JSON_PATH.toFile().exists() ? WINDOWS_JSON_PATH
|
||||||
"/etc", "hirs", "aca", "default-properties", "component-class.json");
|
: FileSystems.getDefault().getPath(
|
||||||
|
"/etc", "hirs", "aca", "default-properties", "component-class.json");
|
||||||
|
|
||||||
private static final String OTHER_STRING = "Other";
|
private static final String OTHER_STRING = "Other";
|
||||||
|
|
||||||
private static final String UNKNOWN_STRING = "Unknown";
|
private static final String UNKNOWN_STRING = "Unknown";
|
||||||
|
|
||||||
private static final String NONE_STRING = "None";
|
private static final String NONE_STRING = "None";
|
||||||
|
|
||||||
// Used to indicate that the component string value provided is erroneous
|
// Used to indicate that the component string value provided is erroneous
|
||||||
private static final String ERROR = "-1";
|
private static final String ERROR = "-1";
|
||||||
|
|
||||||
private static final int MID_INDEX = 4;
|
private static final int MID_INDEX = 4;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All TCG categories have Other and Unknown as the first 2 values.
|
* All TCG categories have Other and Unknown as the first 2 values.
|
||||||
*/
|
*/
|
||||||
private static final String OTHER = "0000";
|
private static final String OTHER = "0000";
|
||||||
|
|
||||||
private static final String UNKNOWN = "0001";
|
private static final String UNKNOWN = "0001";
|
||||||
|
|
||||||
@Getter
|
private final String registryType;
|
||||||
private String category, categoryStr;
|
|
||||||
@Getter
|
private final String componentIdentifier;
|
||||||
private String component, componentStr;
|
|
||||||
@Getter
|
private String category;
|
||||||
private String registryType;
|
|
||||||
@Getter
|
private String categoryStr;
|
||||||
private String componentIdentifier;
|
|
||||||
|
private String component;
|
||||||
|
|
||||||
|
private String componentStr;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default class constructor.
|
* Default class constructor.
|
||||||
@ -68,7 +81,7 @@ public class ComponentClass {
|
|||||||
* Class Constructor that takes a String representation of the component
|
* Class Constructor that takes a String representation of the component
|
||||||
* value.
|
* value.
|
||||||
*
|
*
|
||||||
* @param registryOid the decimal notation for the type of registry
|
* @param registryOid the decimal notation for the type of registry
|
||||||
* @param componentIdentifier component value
|
* @param componentIdentifier component value
|
||||||
*/
|
*/
|
||||||
public ComponentClass(final String registryOid, final String componentIdentifier) {
|
public ComponentClass(final String registryOid, final String componentIdentifier) {
|
||||||
@ -79,7 +92,7 @@ public class ComponentClass {
|
|||||||
* Class Constructor that takes a String representation of the component
|
* Class Constructor that takes a String representation of the component
|
||||||
* value.
|
* value.
|
||||||
*
|
*
|
||||||
* @param componentClassPath file path for the json
|
* @param componentClassPath file path for the json
|
||||||
* @param componentIdentifier component value
|
* @param componentIdentifier component value
|
||||||
*/
|
*/
|
||||||
public ComponentClass(final Path componentClassPath, final String componentIdentifier) {
|
public ComponentClass(final Path componentClassPath, final String componentIdentifier) {
|
||||||
@ -91,8 +104,8 @@ public class ComponentClass {
|
|||||||
* component value. Sets main class variables to default values and then
|
* component value. Sets main class variables to default values and then
|
||||||
* matches the value against defined values in the associated JSON file.
|
* matches the value against defined values in the associated JSON file.
|
||||||
*
|
*
|
||||||
* @param registryOid the decimal notation for the type of registry
|
* @param registryOid the decimal notation for the type of registry
|
||||||
* @param componentClassPath file path for the json
|
* @param componentClassPath file path for the json
|
||||||
* @param componentIdentifier component value
|
* @param componentIdentifier component value
|
||||||
*/
|
*/
|
||||||
public ComponentClass(final String registryOid,
|
public ComponentClass(final String registryOid,
|
||||||
@ -106,11 +119,11 @@ public class ComponentClass {
|
|||||||
this.componentIdentifier = verifyComponentValue(componentIdentifier);
|
this.componentIdentifier = verifyComponentValue(componentIdentifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (registryOid) {
|
this.registryType = switch (registryOid) {
|
||||||
case TCG_COMPONENT_REGISTRY -> registryType = "TCG";
|
case TCG_COMPONENT_REGISTRY -> "TCG";
|
||||||
case SMBIOS_COMPONENT_REGISTRY -> registryType = "SMBIOS";
|
case SMBIOS_COMPONENT_REGISTRY -> "SMBIOS";
|
||||||
default -> registryType = UNKNOWN_STRING;
|
default -> UNKNOWN_STRING;
|
||||||
}
|
};
|
||||||
|
|
||||||
switch (this.componentIdentifier) {
|
switch (this.componentIdentifier) {
|
||||||
case OTHER:
|
case OTHER:
|
||||||
@ -135,91 +148,6 @@ public class ComponentClass {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This is the main way this class will be referenced and how it
|
|
||||||
* will be displayed on the portal.
|
|
||||||
* @return String combination of category and component.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
String resultString;
|
|
||||||
if (componentStr.equals(UNKNOWN_STRING) || component.equals(OTHER_STRING)) {
|
|
||||||
resultString = String.format("%s%n%s", registryType, categoryStr);
|
|
||||||
} else {
|
|
||||||
resultString = String.format("%s%n%s - %s", registryType, categoryStr, componentStr);
|
|
||||||
}
|
|
||||||
return resultString;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Getter for the Category mapped to the associated value in.
|
|
||||||
*
|
|
||||||
* @param categories a JSON object associated with mapped categories in file
|
|
||||||
* {}@link componentIdentifier}.
|
|
||||||
*/
|
|
||||||
private void findStringValues(final JsonObject categories) {
|
|
||||||
String categoryID;
|
|
||||||
String componentMask;
|
|
||||||
boolean found = false;
|
|
||||||
|
|
||||||
if (categories != null) {
|
|
||||||
for (String name : categories.names()) {
|
|
||||||
categoryID = verifyComponentValue(categories.get(name)
|
|
||||||
.asObject().get("ID").asString());
|
|
||||||
componentMask = componentIdentifier.substring(MID_INDEX);
|
|
||||||
// check for the correct flag
|
|
||||||
if (categoryMatch(componentIdentifier.substring(0, MID_INDEX),
|
|
||||||
categoryID.substring(0, MID_INDEX))) {
|
|
||||||
found = true;
|
|
||||||
JsonObject componentTypes = categories.get(name)
|
|
||||||
.asObject().get("Types").asObject();
|
|
||||||
categoryStr = name;
|
|
||||||
|
|
||||||
switch (componentMask) {
|
|
||||||
case OTHER -> componentStr = OTHER_STRING;
|
|
||||||
case UNKNOWN -> componentStr = UNKNOWN_STRING;
|
|
||||||
default -> getComponent(componentTypes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
this.categoryStr = NONE_STRING;
|
|
||||||
this.componentStr = UNKNOWN_STRING;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the value of the comparison between a category and the what's in the id.
|
|
||||||
* @param category the category to compare
|
|
||||||
* @param componentId the id value to compare
|
|
||||||
* @return true if they match
|
|
||||||
*/
|
|
||||||
public boolean categoryMatch(final String category, final String componentId) {
|
|
||||||
return category.equals(componentId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Getter for the component associated with the component JSON Object mapped
|
|
||||||
* in the JSON file.
|
|
||||||
*
|
|
||||||
* @param components JSON Object for the categories components
|
|
||||||
*/
|
|
||||||
private void getComponent(final JsonObject components) {
|
|
||||||
String typeID;
|
|
||||||
|
|
||||||
if (components != null) {
|
|
||||||
for (Member member : components) {
|
|
||||||
typeID = verifyComponentValue(member.getName());
|
|
||||||
|
|
||||||
if (component.equalsIgnoreCase(typeID)) {
|
|
||||||
componentStr = member.getValue().asString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method converts the string representation of the component ID into
|
* This method converts the string representation of the component ID into
|
||||||
* an integer. Or throws and error if the format is in error.
|
* an integer. Or throws and error if the format is in error.
|
||||||
@ -248,4 +176,93 @@ public class ComponentClass {
|
|||||||
|
|
||||||
return componentValue;
|
return componentValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the main way this class will be referenced and how it
|
||||||
|
* will be displayed on the portal.
|
||||||
|
*
|
||||||
|
* @return String combination of category and component.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
String resultString;
|
||||||
|
if (componentStr.equals(UNKNOWN_STRING) || component.equals(OTHER_STRING)) {
|
||||||
|
resultString = String.format("%s%n%s", registryType, categoryStr);
|
||||||
|
} else {
|
||||||
|
resultString = String.format("%s%n%s - %s", registryType, categoryStr, componentStr);
|
||||||
|
}
|
||||||
|
return resultString;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for the Category mapped to the associated value in.
|
||||||
|
*
|
||||||
|
* @param categories a JSON object associated with mapped categories in file
|
||||||
|
* {}@link componentIdentifier}.
|
||||||
|
*/
|
||||||
|
private void findStringValues(final JsonObject categories) {
|
||||||
|
String categoryID;
|
||||||
|
String componentMask;
|
||||||
|
boolean found = false;
|
||||||
|
|
||||||
|
if (categories != null) {
|
||||||
|
for (String name : categories.names()) {
|
||||||
|
categoryID = verifyComponentValue(categories.get(name)
|
||||||
|
.asObject().get("ID").asString());
|
||||||
|
componentMask = componentIdentifier.substring(MID_INDEX);
|
||||||
|
// check for the correct flag
|
||||||
|
if (categoryMatch(componentIdentifier.substring(0, MID_INDEX),
|
||||||
|
categoryID.substring(0, MID_INDEX))) {
|
||||||
|
found = true;
|
||||||
|
JsonObject componentTypes = categories.get(name)
|
||||||
|
.asObject().get("Types").asObject();
|
||||||
|
this.categoryStr = name;
|
||||||
|
|
||||||
|
if (componentMask.equals(OTHER)) {
|
||||||
|
this.componentStr = OTHER_STRING;
|
||||||
|
} else if (componentMask.equals(UNKNOWN)) {
|
||||||
|
this.componentStr = UNKNOWN_STRING;
|
||||||
|
} else {
|
||||||
|
getComponent(componentTypes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
this.categoryStr = NONE_STRING;
|
||||||
|
this.componentStr = UNKNOWN_STRING;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value of the comparison between a category and the what's in the id.
|
||||||
|
*
|
||||||
|
* @param category the category to compare
|
||||||
|
* @param componentId the id value to compare
|
||||||
|
* @return true if they match
|
||||||
|
*/
|
||||||
|
public boolean categoryMatch(final String category, final String componentId) {
|
||||||
|
return category.equals(componentId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for the component associated with the component JSON Object mapped
|
||||||
|
* in the JSON file.
|
||||||
|
*
|
||||||
|
* @param components JSON Object for the categories components
|
||||||
|
*/
|
||||||
|
private void getComponent(final JsonObject components) {
|
||||||
|
String typeID;
|
||||||
|
|
||||||
|
if (components != null) {
|
||||||
|
for (Member member : components) {
|
||||||
|
typeID = verifyComponentValue(member.getName());
|
||||||
|
|
||||||
|
if (component.equalsIgnoreCase(typeID)) {
|
||||||
|
componentStr = member.getValue().asString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,13 +44,11 @@ public class ComponentIdentifier {
|
|||||||
* Maximum number of configurations.
|
* Maximum number of configurations.
|
||||||
*/
|
*/
|
||||||
public static final int CONFIGMAX = 32;
|
public static final int CONFIGMAX = 32;
|
||||||
|
|
||||||
private static final int MANDATORY_ELEMENTS = 2;
|
|
||||||
// optional sequence objects
|
|
||||||
/**
|
/**
|
||||||
* Static variable indicated array position for the serial number.
|
* Static variable indicated array position for the serial number.
|
||||||
*/
|
*/
|
||||||
protected static final int COMPONENT_SERIAL = 0;
|
protected static final int COMPONENT_SERIAL = 0;
|
||||||
|
// optional sequence objects
|
||||||
/**
|
/**
|
||||||
* Static variable indicated array position for the revision info.
|
* Static variable indicated array position for the revision info.
|
||||||
*/
|
*/
|
||||||
@ -68,13 +66,22 @@ public class ComponentIdentifier {
|
|||||||
*/
|
*/
|
||||||
protected static final int COMPONENT_ADDRESS = 4;
|
protected static final int COMPONENT_ADDRESS = 4;
|
||||||
|
|
||||||
|
private static final int MANDATORY_ELEMENTS = 2;
|
||||||
|
|
||||||
private DERUTF8String componentManufacturer;
|
private DERUTF8String componentManufacturer;
|
||||||
|
|
||||||
private DERUTF8String componentModel;
|
private DERUTF8String componentModel;
|
||||||
|
|
||||||
private DERUTF8String componentSerial;
|
private DERUTF8String componentSerial;
|
||||||
|
|
||||||
private DERUTF8String componentRevision;
|
private DERUTF8String componentRevision;
|
||||||
|
|
||||||
private ASN1ObjectIdentifier componentManufacturerId;
|
private ASN1ObjectIdentifier componentManufacturerId;
|
||||||
|
|
||||||
private ASN1Boolean fieldReplaceable;
|
private ASN1Boolean fieldReplaceable;
|
||||||
|
|
||||||
private List<ComponentAddress> componentAddress;
|
private List<ComponentAddress> componentAddress;
|
||||||
|
|
||||||
private boolean validationResult = true;
|
private boolean validationResult = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -93,13 +100,13 @@ public class ComponentIdentifier {
|
|||||||
/**
|
/**
|
||||||
* Constructor given the components values.
|
* Constructor given the components values.
|
||||||
*
|
*
|
||||||
* @param componentManufacturer represents the component manufacturer
|
* @param componentManufacturer represents the component manufacturer
|
||||||
* @param componentModel represents the component model
|
* @param componentModel represents the component model
|
||||||
* @param componentSerial represents the component serial number
|
* @param componentSerial represents the component serial number
|
||||||
* @param componentRevision represents the component revision
|
* @param componentRevision represents the component revision
|
||||||
* @param componentManufacturerId represents the component manufacturer ID
|
* @param componentManufacturerId represents the component manufacturer ID
|
||||||
* @param fieldReplaceable represents if the component is replaceable
|
* @param fieldReplaceable represents if the component is replaceable
|
||||||
* @param componentAddress represents a list of addresses
|
* @param componentAddress represents a list of addresses
|
||||||
*/
|
*/
|
||||||
public ComponentIdentifier(final DERUTF8String componentManufacturer,
|
public ComponentIdentifier(final DERUTF8String componentManufacturer,
|
||||||
final DERUTF8String componentModel,
|
final DERUTF8String componentModel,
|
||||||
@ -119,6 +126,7 @@ public class ComponentIdentifier {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor given the SEQUENCE that contains Component Identifier.
|
* Constructor given the SEQUENCE that contains Component Identifier.
|
||||||
|
*
|
||||||
* @param sequence containing the component identifier
|
* @param sequence containing the component identifier
|
||||||
* @throws IllegalArgumentException if there was an error on the parsing
|
* @throws IllegalArgumentException if there was an error on the parsing
|
||||||
*/
|
*/
|
||||||
@ -193,22 +201,6 @@ public class ComponentIdentifier {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Getter for the component addresses.
|
|
||||||
* @return a collection of component addresses
|
|
||||||
*/
|
|
||||||
public List<ComponentAddress> getComponentAddress() {
|
|
||||||
return componentAddress.stream().toList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setter for the list of component addresses.
|
|
||||||
* @param componentAddress collection of addresses
|
|
||||||
*/
|
|
||||||
public void setComponentAddress(List<ComponentAddress> componentAddress) {
|
|
||||||
this.componentAddress = componentAddress.stream().toList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
@ -230,7 +222,7 @@ public class ComponentIdentifier {
|
|||||||
}
|
}
|
||||||
sb.append(", fieldReplaceable=");
|
sb.append(", fieldReplaceable=");
|
||||||
if (fieldReplaceable != null) {
|
if (fieldReplaceable != null) {
|
||||||
sb.append(fieldReplaceable.toString());
|
sb.append(fieldReplaceable);
|
||||||
}
|
}
|
||||||
sb.append(", componentAddress=");
|
sb.append(", componentAddress=");
|
||||||
if (!componentAddress.isEmpty()) {
|
if (!componentAddress.isEmpty()) {
|
||||||
|
@ -67,19 +67,18 @@ public class ComponentIdentifierV2 extends ComponentIdentifier {
|
|||||||
/**
|
/**
|
||||||
* Constructor given the components values.
|
* Constructor given the components values.
|
||||||
*
|
*
|
||||||
* @param componentClass represent the component type
|
* @param componentClass represent the component type
|
||||||
* @param componentManufacturer represents the component manufacturer
|
* @param componentManufacturer represents the component manufacturer
|
||||||
* @param componentModel represents the component model
|
* @param componentModel represents the component model
|
||||||
* @param componentSerial represents the component serial number
|
* @param componentSerial represents the component serial number
|
||||||
* @param componentRevision represents the component revision
|
* @param componentRevision represents the component revision
|
||||||
* @param componentManufacturerId represents the component manufacturer ID
|
* @param componentManufacturerId represents the component manufacturer ID
|
||||||
* @param fieldReplaceable represents if the component is replaceable
|
* @param fieldReplaceable represents if the component is replaceable
|
||||||
* @param componentAddress represents a list of addresses
|
* @param componentAddress represents a list of addresses
|
||||||
* @param certificateIdentifier object representing certificate Id
|
* @param certificateIdentifier object representing certificate Id
|
||||||
* @param componentPlatformUri object containing the URI Reference
|
* @param componentPlatformUri object containing the URI Reference
|
||||||
* @param attributeStatus object containing enumerated status
|
* @param attributeStatus object containing enumerated status
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("checkstyle:parameternumber")
|
|
||||||
public ComponentIdentifierV2(final ComponentClass componentClass,
|
public ComponentIdentifierV2(final ComponentClass componentClass,
|
||||||
final DERUTF8String componentManufacturer,
|
final DERUTF8String componentManufacturer,
|
||||||
final DERUTF8String componentModel,
|
final DERUTF8String componentModel,
|
||||||
@ -103,6 +102,7 @@ public class ComponentIdentifierV2 extends ComponentIdentifier {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor given the SEQUENCE that contains Component Identifier.
|
* Constructor given the SEQUENCE that contains Component Identifier.
|
||||||
|
*
|
||||||
* @param sequence containing the component identifier
|
* @param sequence containing the component identifier
|
||||||
* @throws IllegalArgumentException if there was an error on the parsing
|
* @throws IllegalArgumentException if there was an error on the parsing
|
||||||
*/
|
*/
|
||||||
@ -120,7 +120,8 @@ public class ComponentIdentifierV2 extends ComponentIdentifier {
|
|||||||
ASN1OctetString.getInstance(componentIdSeq.getObjectAt(tag)).toString());
|
ASN1OctetString.getInstance(componentIdSeq.getObjectAt(tag)).toString());
|
||||||
|
|
||||||
// Mandatory values
|
// Mandatory values
|
||||||
this.setComponentManufacturer((DERUTF8String) ASN1UTF8String.getInstance(sequence.getObjectAt(tag++)));
|
this.setComponentManufacturer(
|
||||||
|
(DERUTF8String) ASN1UTF8String.getInstance(sequence.getObjectAt(tag++)));
|
||||||
this.setComponentModel((DERUTF8String) ASN1UTF8String.getInstance(sequence.getObjectAt(tag++)));
|
this.setComponentModel((DERUTF8String) ASN1UTF8String.getInstance(sequence.getObjectAt(tag++)));
|
||||||
|
|
||||||
// Continue reading the sequence if it does contain more than 2 values
|
// Continue reading the sequence if it does contain more than 2 values
|
||||||
@ -202,9 +203,15 @@ public class ComponentIdentifierV2 extends ComponentIdentifier {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (this == o) return true;
|
if (this == o) {
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
return true;
|
||||||
if (!super.equals(o)) return false;
|
}
|
||||||
|
if (o == null || getClass() != o.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!super.equals(o)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
ComponentIdentifierV2 that = (ComponentIdentifierV2) o;
|
ComponentIdentifierV2 that = (ComponentIdentifierV2) o;
|
||||||
return Objects.equals(componentClass, that.componentClass)
|
return Objects.equals(componentClass, that.componentClass)
|
||||||
&& Objects.equals(certificateIdentifier, that.certificateIdentifier)
|
&& Objects.equals(certificateIdentifier, that.certificateIdentifier)
|
||||||
@ -241,7 +248,7 @@ public class ComponentIdentifierV2 extends ComponentIdentifier {
|
|||||||
}
|
}
|
||||||
sb.append(", fieldReplaceable=");
|
sb.append(", fieldReplaceable=");
|
||||||
if (getFieldReplaceable() != null) {
|
if (getFieldReplaceable() != null) {
|
||||||
sb.append(getFieldReplaceable().toString());
|
sb.append(getFieldReplaceable());
|
||||||
}
|
}
|
||||||
sb.append(", componentAddress=");
|
sb.append(", componentAddress=");
|
||||||
if (getComponentAddress().size() > 0) {
|
if (getComponentAddress().size() > 0) {
|
||||||
@ -252,11 +259,11 @@ public class ComponentIdentifierV2 extends ComponentIdentifier {
|
|||||||
}
|
}
|
||||||
sb.append(", certificateIdentifier=");
|
sb.append(", certificateIdentifier=");
|
||||||
if (certificateIdentifier != null) {
|
if (certificateIdentifier != null) {
|
||||||
sb.append(certificateIdentifier.toString());
|
sb.append(certificateIdentifier);
|
||||||
}
|
}
|
||||||
sb.append(", componentPlatformUri=");
|
sb.append(", componentPlatformUri=");
|
||||||
if (componentPlatformUri != null) {
|
if (componentPlatformUri != null) {
|
||||||
sb.append(componentPlatformUri.toString());
|
sb.append(componentPlatformUri);
|
||||||
}
|
}
|
||||||
sb.append(", status=");
|
sb.append(", status=");
|
||||||
if (attributeStatus != null) {
|
if (attributeStatus != null) {
|
||||||
|
@ -12,13 +12,6 @@ import hirs.attestationca.persist.enums.HealthStatus;
|
|||||||
import hirs.attestationca.portal.page.Page;
|
import hirs.attestationca.portal.page.Page;
|
||||||
import hirs.attestationca.portal.page.PageController;
|
import hirs.attestationca.portal.page.PageController;
|
||||||
import hirs.attestationca.portal.page.PageControllerTest;
|
import hirs.attestationca.portal.page.PageControllerTest;
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import java.security.Security;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@ -27,8 +20,15 @@ import org.springframework.test.annotation.DirtiesContext;
|
|||||||
import org.springframework.test.annotation.Rollback;
|
import org.springframework.test.annotation.Rollback;
|
||||||
import org.springframework.test.web.servlet.MvcResult;
|
import org.springframework.test.web.servlet.MvcResult;
|
||||||
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
||||||
import static org.hamcrest.Matchers.hasProperty;
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.security.Security;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.hasItem;
|
import static org.hamcrest.Matchers.hasItem;
|
||||||
|
import static org.hamcrest.Matchers.hasProperty;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
|
||||||
@ -40,25 +40,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
|
|||||||
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
|
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
|
||||||
public class CertificateDetailsPageControllerTest extends PageControllerTest {
|
public class CertificateDetailsPageControllerTest extends PageControllerTest {
|
||||||
|
|
||||||
// Base path for the page
|
|
||||||
private String pagePath;
|
|
||||||
|
|
||||||
// Repository manager to handle data access between device entity and data storage in db
|
|
||||||
@Autowired
|
|
||||||
private DeviceRepository deviceRepository;
|
|
||||||
|
|
||||||
// Repository manager to handle data access between certificate entity and data storage in db
|
|
||||||
@Autowired
|
|
||||||
private CertificateRepository certificateRepository;
|
|
||||||
|
|
||||||
private CertificateAuthorityCredential caCertificate;
|
|
||||||
private CertificateAuthorityCredential caRootCertificate;
|
|
||||||
private PlatformCredential platformCredential;
|
|
||||||
private PlatformCredential platformCredential2;
|
|
||||||
private PlatformCredential platformCertificatePCI;
|
|
||||||
private EndorsementCredential endorsementCredential;
|
|
||||||
private IssuedAttestationCertificate issuedCredential;
|
|
||||||
|
|
||||||
// Random UUID for certificate search.
|
// Random UUID for certificate search.
|
||||||
private static final String ID = "046b6c7f-0b8a-43b9-b35d-6489e6daee91";
|
private static final String ID = "046b6c7f-0b8a-43b9-b35d-6489e6daee91";
|
||||||
private static final String TEST_CA_CERTIFICATE
|
private static final String TEST_CA_CERTIFICATE
|
||||||
@ -75,6 +56,21 @@ public class CertificateDetailsPageControllerTest extends PageControllerTest {
|
|||||||
= "/platform_credentials/basic_plat_cert_2-0.pem";
|
= "/platform_credentials/basic_plat_cert_2-0.pem";
|
||||||
private static final String TEST_PLATFORM_CREDENTIAL_2_PCI
|
private static final String TEST_PLATFORM_CREDENTIAL_2_PCI
|
||||||
= "/platform_credentials/pciids_plat_cert_2-0.pem";
|
= "/platform_credentials/pciids_plat_cert_2-0.pem";
|
||||||
|
// Base path for the page
|
||||||
|
private final String pagePath;
|
||||||
|
// Repository manager to handle data access between device entity and data storage in db
|
||||||
|
@Autowired
|
||||||
|
private DeviceRepository deviceRepository;
|
||||||
|
// Repository manager to handle data access between certificate entity and data storage in db
|
||||||
|
@Autowired
|
||||||
|
private CertificateRepository certificateRepository;
|
||||||
|
private CertificateAuthorityCredential caCertificate;
|
||||||
|
private CertificateAuthorityCredential caRootCertificate;
|
||||||
|
private PlatformCredential platformCredential;
|
||||||
|
private PlatformCredential platformCredential2;
|
||||||
|
private PlatformCredential platformCertificatePCI;
|
||||||
|
private EndorsementCredential endorsementCredential;
|
||||||
|
private IssuedAttestationCertificate issuedCredential;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor providing the Page's display and routing specification.
|
* Constructor providing the Page's display and routing specification.
|
||||||
@ -239,7 +235,7 @@ public class CertificateDetailsPageControllerTest extends PageControllerTest {
|
|||||||
.getModelAndView()
|
.getModelAndView()
|
||||||
.getModel()
|
.getModel()
|
||||||
.get(PolicyPageController.INITIAL_DATA);
|
.get(PolicyPageController.INITIAL_DATA);
|
||||||
assertEquals(caCertificate.getIssuer(), initialData.get("issuer"));
|
assertEquals(caCertificate.getIssuer(), initialData.get("issuer"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -268,7 +264,7 @@ public class CertificateDetailsPageControllerTest extends PageControllerTest {
|
|||||||
.getModel()
|
.getModel()
|
||||||
.get(PolicyPageController.INITIAL_DATA);
|
.get(PolicyPageController.INITIAL_DATA);
|
||||||
assertEquals(platformCredential.getIssuer(), initialData.get("issuer"));
|
assertEquals(platformCredential.getIssuer(), initialData.get("issuer"));
|
||||||
assertEquals(((PlatformCredential) platformCredential).getCredentialType(),
|
assertEquals(platformCredential.getCredentialType(),
|
||||||
initialData.get("credentialType"));
|
initialData.get("credentialType"));
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -298,7 +294,7 @@ public class CertificateDetailsPageControllerTest extends PageControllerTest {
|
|||||||
.getModel()
|
.getModel()
|
||||||
.get(PolicyPageController.INITIAL_DATA);
|
.get(PolicyPageController.INITIAL_DATA);
|
||||||
assertEquals(platformCredential2.getIssuer(), initialData.get("issuer"));
|
assertEquals(platformCredential2.getIssuer(), initialData.get("issuer"));
|
||||||
assertEquals(((PlatformCredential) platformCredential2).getCredentialType(),
|
assertEquals(platformCredential2.getCredentialType(),
|
||||||
initialData.get("credentialType"));
|
initialData.get("credentialType"));
|
||||||
// Check component identifier
|
// Check component identifier
|
||||||
assertNotNull(initialData.get("componentsIdentifier"));
|
assertNotNull(initialData.get("componentsIdentifier"));
|
||||||
@ -337,7 +333,7 @@ public class CertificateDetailsPageControllerTest extends PageControllerTest {
|
|||||||
.getModel()
|
.getModel()
|
||||||
.get(PolicyPageController.INITIAL_DATA);
|
.get(PolicyPageController.INITIAL_DATA);
|
||||||
assertEquals(platformCertificatePCI.getIssuer(), initialData.get("issuer"));
|
assertEquals(platformCertificatePCI.getIssuer(), initialData.get("issuer"));
|
||||||
assertEquals(((PlatformCredential) platformCertificatePCI).getCredentialType(),
|
assertEquals(platformCertificatePCI.getCredentialType(),
|
||||||
initialData.get("credentialType"));
|
initialData.get("credentialType"));
|
||||||
// Check component identifier
|
// Check component identifier
|
||||||
assertNotNull(initialData.get("componentsIdentifier"));
|
assertNotNull(initialData.get("componentsIdentifier"));
|
||||||
@ -376,7 +372,7 @@ public class CertificateDetailsPageControllerTest extends PageControllerTest {
|
|||||||
.getModel()
|
.getModel()
|
||||||
.get(PolicyPageController.INITIAL_DATA);
|
.get(PolicyPageController.INITIAL_DATA);
|
||||||
assertEquals(endorsementCredential.getIssuer(), initialData.get("issuer"));
|
assertEquals(endorsementCredential.getIssuer(), initialData.get("issuer"));
|
||||||
assertEquals(((EndorsementCredential) endorsementCredential).getManufacturer(),
|
assertEquals(endorsementCredential.getManufacturer(),
|
||||||
initialData.get("manufacturer"));
|
initialData.get("manufacturer"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user