diff --git a/HIRS_AttestationCA/src/main/java/hirs/attestationca/persist/validation/FirmwareScvValidator.java b/HIRS_AttestationCA/src/main/java/hirs/attestationca/persist/validation/FirmwareScvValidator.java index 65c3654c..068f4dd1 100644 --- a/HIRS_AttestationCA/src/main/java/hirs/attestationca/persist/validation/FirmwareScvValidator.java +++ b/HIRS_AttestationCA/src/main/java/hirs/attestationca/persist/validation/FirmwareScvValidator.java @@ -90,7 +90,7 @@ public class FirmwareScvValidator extends SupplyChainCredentialValidator { // verify signatures ReferenceManifestValidator referenceManifestValidator = new ReferenceManifestValidator(); - referenceManifestValidator.setRim(baseReferenceManifest); + referenceManifestValidator.setRim(baseReferenceManifest.getRimBytes()); //Validate signing cert List<CertificateAuthorityCredential> allCerts = caCredentialRepository.findAll(); @@ -99,23 +99,28 @@ public class FirmwareScvValidator extends SupplyChainCredentialValidator { signingCert = cert; KeyStore keyStore = ValidationService.getCaChain(signingCert, caCredentialRepository); - if (referenceManifestValidator.validateXmlSignature(signingCert)) { - try { - if (!SupplyChainCredentialValidator.verifyCertificate( + try { + if (referenceManifestValidator.validateXmlSignature(signingCert.getX509Certificate().getPublicKey(), + signingCert.getSubjectKeyIdString(), signingCert.getEncodedPublicKey())) { + try { + if (!SupplyChainCredentialValidator.verifyCertificate( signingCert.getX509Certificate(), keyStore)) { - passed = false; + passed = false; + fwStatus = new AppraisalStatus(FAIL, + "Firmware validation failed: invalid certificate path."); + validationObject = baseReferenceManifest; + } + } catch (IOException ioEx) { + log.error("Error getting X509 cert from manager: " + ioEx.getMessage()); + } catch (SupplyChainValidatorException scvEx) { + log.error("Error validating cert against keystore: " + scvEx.getMessage()); fwStatus = new AppraisalStatus(FAIL, "Firmware validation failed: invalid certificate path."); - validationObject = baseReferenceManifest; } - } catch (IOException ioEx) { - log.error("Error getting X509 cert from manager: " + ioEx.getMessage()); - } catch (SupplyChainValidatorException scvEx) { - log.error("Error validating cert against keystore: " + scvEx.getMessage()); - fwStatus = new AppraisalStatus(FAIL, - "Firmware validation failed: invalid certificate path."); + break; } - break; + } catch (IOException ioEx) { + log.error("Error getting X509 cert from manager: " + ioEx.getMessage()); } } diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ReferenceManifestDetailsPageController.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ReferenceManifestDetailsPageController.java index e57701af..d20a4a29 100644 --- a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ReferenceManifestDetailsPageController.java +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ReferenceManifestDetailsPageController.java @@ -272,7 +272,7 @@ public class ReferenceManifestDetailsPageController extends PageController<Refer } // going to have to pull the filename and grab that from the DB // to get the id to make the link - RIM_VALIDATOR.setRim(baseRim); + RIM_VALIDATOR.setRim(baseRim.getRimBytes()); for (SwidResource swidRes : resources) { if (support != null && swidRes.getHashValue() .equalsIgnoreCase(support.getHexDecHash())) { @@ -300,7 +300,8 @@ public class ReferenceManifestDetailsPageController extends PageController<Refer data.put("signatureValid", false); for (CertificateAuthorityCredential cert : certificates) { KeyStore keystore = ValidationService.getCaChain(cert, caCertificateRepository); - if (RIM_VALIDATOR.validateXmlSignature(cert)) { + if (RIM_VALIDATOR.validateXmlSignature(cert.getX509Certificate().getPublicKey(), + cert.getSubjectKeyIdString(), cert.getEncodedPublicKey())) { try { if (SupplyChainCredentialValidator.verifyCertificate( cert.getX509Certificate(), keystore)) { diff --git a/HIRS_Utils/src/main/java/hirs/utils/rim/ReferenceManifestValidator.java b/HIRS_Utils/src/main/java/hirs/utils/rim/ReferenceManifestValidator.java index 2a11868a..2f3bcc14 100644 --- a/HIRS_Utils/src/main/java/hirs/utils/rim/ReferenceManifestValidator.java +++ b/HIRS_Utils/src/main/java/hirs/utils/rim/ReferenceManifestValidator.java @@ -1,6 +1,5 @@ package hirs.utils.rim; -import hirs.utils.CertificateAuthorityCredential; import jakarta.xml.bind.JAXBContext; import jakarta.xml.bind.JAXBException; import jakarta.xml.bind.UnmarshalException; @@ -78,12 +77,12 @@ public class ReferenceManifestValidator { * Setter for the RIM to be validated. The ReferenceManifest object is converted into a * Document for processing. * - * @param rim ReferenceManifest object + * @param rimBytes ReferenceManifest object bytes */ - public void setRim(final ReferenceManifest rim) { + public void setRim(final byte[] rimBytes) { try { Document doc = validateSwidtagSchema(removeXMLWhitespace(new StreamSource( - new ByteArrayInputStream(rim.getRimBytes())))); + new ByteArrayInputStream(rimBytes)))); this.rim = doc; } catch (IOException e) { log.error("Error while unmarshalling rim bytes: " + e.getMessage()); @@ -152,11 +151,15 @@ public class ReferenceManifestValidator { * or the RIM's subject key identifier. If the cert is matched then validation proceeds, * otherwise validation ends. * - * @param cert the cert to be checked against the RIM + * @param publicKey public key from the CA credential + * @param subjectKeyIdString string version of the subjet key id of the CA credential + * @param encodedPublicKey the encoded public key * @return true if the signature element is validated, false otherwise */ @SuppressWarnings("magicnumber") - public boolean validateXmlSignature(final CertificateAuthorityCredential cert) { + public boolean validateXmlSignature(final PublicKey publicKey, + final String subjectKeyIdString, + final byte[] encodedPublicKey) { DOMValidateContext context = null; try { NodeList nodes = rim.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature"); @@ -171,19 +174,19 @@ public class ReferenceManifestValidator { if (embeddedCert != null) { subjectKeyIdentifier = getCertificateSubjectKeyIdentifier(embeddedCert); if (Arrays.equals(embeddedCert.getPublicKey().getEncoded(), - cert.getEncodedPublicKey())) { + encodedPublicKey)) { context = new DOMValidateContext(new X509KeySelector(), nodes.item(0)); } } } else { subjectKeyIdentifier = getKeyName(rim); - if (subjectKeyIdentifier.equals(cert.getSubjectKeyIdString())) { - context = new DOMValidateContext(cert.getX509Certificate().getPublicKey(), + if (subjectKeyIdentifier.equals(subjectKeyIdString)) { + context = new DOMValidateContext(publicKey, nodes.item(0)); } } if (context != null) { - publicKey = cert.getX509Certificate().getPublicKey(); + this.publicKey = publicKey; signatureValid = validateSignedXMLDocument(context); return signatureValid; }