/** * Copyright 2020 Nokia *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *

* http://www.apache.org/licenses/LICENSE-2.0 *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onap.functional; import org.junit.Test; import org.onap.functional.cli.OnapCliValidationResponseWrapper; import org.onap.functional.cli.OnapCliWrapper; import java.net.URISyntaxException; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.onap.cvc.csar.cc.sol004.IntegrationTestUtils.absoluteFilePath; import static org.onap.functional.CsarValidationUtility.CERTIFICATION_RULE; import static org.onap.functional.CsarValidationUtility.MANIFEST_FILE_RULE; import static org.onap.functional.CsarValidationUtility.OPERATION_STATUS_FAILED; import static org.onap.functional.CsarValidationUtility.OPERATION_STATUS_PASS; import static org.onap.functional.CsarValidationUtility.PM_DICTIONARY_YAML_RULE; import static org.onap.functional.CsarValidationUtility.createExpectedError; import static org.onap.functional.CsarValidationUtility.getCliCommandValidationResult; import static org.onap.functional.CsarValidationUtility.verifyThatOperationFinishedWithoutAnyError; public class PnfValidationFunctionalTest { @Test public void shouldReportOnlyWarningWhenCsarDoNotHaveCertificateAndHashesInManifest() throws URISyntaxException { // given OnapCliValidationResponseWrapper.ValidationResultWrapper.ValidationErrorWrapper expectedWarning = createExpectedError(CERTIFICATION_RULE, "0x1006", "Warning. Consider adding package integrity and authenticity assurance according to ETSI NFV-SOL 004 Security Option 1"); OnapCliWrapper cli = new OnapCliWrapper(createPnfValidationRequestInfo( "pnf/validFile.csar")); // when cli.handle(); // then final OnapCliValidationResponseWrapper result = getCliCommandValidationResult(cli); assertThat(result.criteria).isEqualTo(OPERATION_STATUS_PASS); result.results.forEach((ruleValidationResult)->{ assertThat(ruleValidationResult.errors).isEmpty(); if (ruleValidationResult.vnfreqName.equals(CERTIFICATION_RULE)) { assertThat(ruleValidationResult.warnings) .containsExactlyInAnyOrder(expectedWarning); } else { assertThat(ruleValidationResult.warnings).isEmpty(); } }); verifyThatOperationFinishedWithoutAnyError(cli); } @Test public void shouldNotReportThatPnfValidationFailedWhenZipDoNotHaveCertificatesAndHashesInManifest() throws URISyntaxException { // given OnapCliWrapper cli = new OnapCliWrapper(createPnfValidationRequestInfo( "pnf/signed-package-valid-signature.zip")); // when cli.handle(); // then final OnapCliValidationResponseWrapper result = getCliCommandValidationResult(cli); assertThat(result.criteria).isEqualTo(OPERATION_STATUS_PASS); verifyThatOperationFinishedWithoutAnyError(cli); } @Test public void shouldReportThatPnfValidationFailedWhenCsarContainsCertificateInCmsAndInToscaAndInRootAndHashIsIncorrect_allOtherRulesShouldPass() throws URISyntaxException { // given List expectedErrors = List.of( createExpectedError(CERTIFICATION_RULE, "0x4007", "File has invalid signature!"), createExpectedError(CERTIFICATION_RULE, "0x4004", "Source 'Files/pnf-sw-information/pnf-sw-information.yaml' has wrong hash!"), createExpectedError(CERTIFICATION_RULE, "0x4011", "ETSI-Entry-Certificate entry in Tosca.meta is defined despite the certificate is included in the signature container"), createExpectedError(CERTIFICATION_RULE, "0x4012", "ETSI-Entry-Certificate certificate present despite the certificate is included in the signature container"), createExpectedError(CERTIFICATION_RULE, "0x4013", "Certificate present in root catalog despite the certificate is included in the signature container") ); OnapCliWrapper cli = new OnapCliWrapper(createPnfValidationRequestInfo( "pnf/r130206/cert-in-cms-and-root-and-tosca-incorrect-hash.csar")); // when cli.handle(); // then final OnapCliValidationResponseWrapper result = getCliCommandValidationResult(cli); assertThat(result.criteria).isEqualTo(OPERATION_STATUS_FAILED); result.results.forEach((ruleValidationResult)->{ assertThat(ruleValidationResult.warnings).isEmpty(); if (ruleValidationResult.vnfreqName.equals(CERTIFICATION_RULE)) { assertThat(ruleValidationResult.errors) .containsExactlyInAnyOrderElementsOf(expectedErrors); } else { assertThat(ruleValidationResult.errors).isEmpty(); } }); verifyThatOperationFinishedWithoutAnyError(cli); } @Test public void shouldReportThatPnfCertificationRuleValidationFailedWhenCsarContainsCertificateInCmsAndInToscaAndInRootAndHashIsIncorrect() throws URISyntaxException { // given List expectedErrors = List.of( createExpectedError(CERTIFICATION_RULE, "0x4007", "File has invalid signature!"), createExpectedError(CERTIFICATION_RULE, "0x4004", "Source 'Files/pnf-sw-information/pnf-sw-information.yaml' has wrong hash!"), createExpectedError(CERTIFICATION_RULE, "0x4011", "ETSI-Entry-Certificate entry in Tosca.meta is defined despite the certificate is included in the signature container"), createExpectedError(CERTIFICATION_RULE, "0x4012", "ETSI-Entry-Certificate certificate present despite the certificate is included in the signature container"), createExpectedError(CERTIFICATION_RULE, "0x4013", "Certificate present in root catalog despite the certificate is included in the signature container") ); OnapCliWrapper cli = new OnapCliWrapper( createPnfValidationSelectedRulesRequestInfo( "pnf/r130206/cert-in-cms-and-root-and-tosca-incorrect-hash.csar", CERTIFICATION_RULE )); // when cli.handle(); // then final OnapCliValidationResponseWrapper result = getCliCommandValidationResult(cli); assertThat(result.criteria).isEqualTo(OPERATION_STATUS_FAILED); assertThat(result.results).hasSize(2); result.results.forEach((ruleValidationResult)->{ assertThat(ruleValidationResult.warnings).isEmpty(); if (ruleValidationResult.vnfreqName.equals(CERTIFICATION_RULE)) { assertThat(ruleValidationResult.errors) .containsExactlyInAnyOrderElementsOf(expectedErrors); } else { assertThat(ruleValidationResult.errors).isEmpty(); } }); verifyThatOperationFinishedWithoutAnyError(cli); } @Test public void shouldReportThatPnfPmDictionaryYamlRuleValidationSuccessWhenCsarContainsCertificateInCmsAndInToscaAndInRootAndHashIsIncorrect() throws URISyntaxException { // given OnapCliWrapper cli = new OnapCliWrapper( createPnfValidationSelectedRulesRequestInfo( "pnf/r130206/cert-in-cms-and-root-and-tosca-incorrect-hash.csar", PM_DICTIONARY_YAML_RULE )); // when cli.handle(); // then final OnapCliValidationResponseWrapper result = getCliCommandValidationResult(cli); assertThat(result.criteria).isEqualTo(OPERATION_STATUS_PASS); assertThat(result.results).hasSize(2); result.results.forEach((ruleValidationResult)->{ assertThat(ruleValidationResult.warnings).isEmpty(); assertThat(ruleValidationResult.errors).isEmpty(); }); verifyThatOperationFinishedWithoutAnyError(cli); } @Test public void shouldReportThatPnfCertificationRuleAndPnfPmDictionaryYamlRuleValidationFailedWhenCsarContainsCertificateInCmsAndInToscaAndInRootAndHashIsIncorrect() throws URISyntaxException { // given List expectedErrors = List.of( createExpectedError(CERTIFICATION_RULE, "0x4007", "File has invalid signature!"), createExpectedError(CERTIFICATION_RULE, "0x4004", "Source 'Files/pnf-sw-information/pnf-sw-information.yaml' has wrong hash!"), createExpectedError(CERTIFICATION_RULE, "0x4011", "ETSI-Entry-Certificate entry in Tosca.meta is defined despite the certificate is included in the signature container"), createExpectedError(CERTIFICATION_RULE, "0x4012", "ETSI-Entry-Certificate certificate present despite the certificate is included in the signature container"), createExpectedError(CERTIFICATION_RULE, "0x4013", "Certificate present in root catalog despite the certificate is included in the signature container") ); OnapCliWrapper cli = new OnapCliWrapper( createPnfValidationSelectedRulesRequestInfo( "pnf/r130206/cert-in-cms-and-root-and-tosca-incorrect-hash.csar", CERTIFICATION_RULE+","+PM_DICTIONARY_YAML_RULE )); // when cli.handle(); // then final OnapCliValidationResponseWrapper result = getCliCommandValidationResult(cli); assertThat(result.criteria).isEqualTo(OPERATION_STATUS_FAILED); assertThat(result.results).hasSize(3); result.results.forEach((ruleValidationResult)->{ assertThat(ruleValidationResult.warnings).isEmpty(); if (ruleValidationResult.vnfreqName.equals(CERTIFICATION_RULE)) { assertThat(ruleValidationResult.errors) .containsExactlyInAnyOrderElementsOf(expectedErrors); } else { assertThat(ruleValidationResult.errors).isEmpty(); } }); verifyThatOperationFinishedWithoutAnyError(cli); } @Test public void shouldReportThatIndividualArtifactHaveIncorrectCertificateAndCertificateAndSignatureAreNotPresentAsSources() throws URISyntaxException { // given List expectedCertificationErrors = List.of( createExpectedError(CERTIFICATION_RULE, "0x4020", "Source 'Files/ChangeLog.txt' has incorrect signature!"), createExpectedError(CERTIFICATION_RULE, "0x4007", "File has invalid signature!") ); List expectedManifestErrors = List.of( createExpectedError(MANIFEST_FILE_RULE, "0x1001", "file(s): [Files/pnf-sw-information/pnf-sw-information.cert, Files/pnf-sw-information/pnf-sw-information.sig.cms] available in CSAR, but cannot be found in Manifest as Source", "TOSCA-Metadata" ) ); OnapCliWrapper cli = new OnapCliWrapper(createPnfValidationRequestInfo( "pnf/r130206/csar-cert-in-cms-valid-with-incorrect-signature-of-individual-artifact.csar" )); // when cli.handle(); // then final OnapCliValidationResponseWrapper result = getCliCommandValidationResult(cli); assertThat(result.criteria).isEqualTo(OPERATION_STATUS_FAILED); result.results.forEach((ruleValidationResult)->{ assertThat(ruleValidationResult.warnings).isEmpty(); if (ruleValidationResult.vnfreqName.equals(CERTIFICATION_RULE)) { assertThat(ruleValidationResult.errors) .containsAll(expectedCertificationErrors); } else if (ruleValidationResult.vnfreqName.equals(MANIFEST_FILE_RULE)) { assertThat(ruleValidationResult.errors) .containsAll(expectedManifestErrors); } else { assertThat(ruleValidationResult.errors).isEmpty(); } }); verifyThatOperationFinishedWithoutAnyError(cli); } private String[] createPnfValidationRequestInfo(String csarPath) throws URISyntaxException { return new String[]{ "--product", "onap-dublin", "csar-validate", "--format", "json", "--pnf", "--csar", absoluteFilePath(csarPath) }; } private String[] createPnfValidationSelectedRulesRequestInfo(String csarPath, String rulesToValidate) throws URISyntaxException { return new String[]{ "--product", "onap-dublin", "csar-validate", "--format", "json", "--rules", rulesToValidate, "--pnf", "--csar", absoluteFilePath(csarPath) }; } }