From 0b278343630c1e3c7c92b3e5094570748692666e Mon Sep 17 00:00:00 2001 From: Piotr Marcinkiewicz Date: Wed, 17 Jun 2020 14:54:51 +0200 Subject: Add creation JKS artifact Issue-ID: AAF-1152 Signed-off-by: Piotr Marcinkiewicz Change-Id: I8b38dc07ddbf6758e0c4c036100572b350dceab9 --- .../conversion/ArtifactsCreatorProviderTest.java | 26 ++- .../conversion/ConvertedArtifactsCreatorTest.java | 125 +++++++++++++ .../conversion/PKCS12ArtifactsCreatorTest.java | 106 ----------- .../certification/conversion/PemConverterTest.java | 205 +++++++++++++++++++++ .../conversion/PemToPKCS12ConverterTest.java | 197 -------------------- 5 files changed, 352 insertions(+), 307 deletions(-) create mode 100644 certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/ConvertedArtifactsCreatorTest.java delete mode 100644 certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/PKCS12ArtifactsCreatorTest.java create mode 100644 certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/PemConverterTest.java delete mode 100644 certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/PemToPKCS12ConverterTest.java (limited to 'certServiceClient/src/test') diff --git a/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/ArtifactsCreatorProviderTest.java b/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/ArtifactsCreatorProviderTest.java index 133d90d2..8a619991 100644 --- a/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/ArtifactsCreatorProviderTest.java +++ b/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/ArtifactsCreatorProviderTest.java @@ -20,6 +20,9 @@ package org.onap.aaf.certservice.client.certification.conversion; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThat; @@ -27,17 +30,19 @@ import static org.assertj.core.api.Assertions.assertThat; class ArtifactsCreatorProviderTest { private static final String P12 = "P12"; + private static final String JKS = "JKS"; private static final String PEM = "PEM"; private static final String TEST_PATH = "testPath"; - @Test - void artifactsProviderShouldReturnP12Creator(){ + @ParameterizedTest + @ValueSource(strings = {JKS, P12}) + void artifactsProviderShouldReturnConvertedCreator(String outputType){ // when ArtifactsCreator artifactsCreator = - ArtifactsCreatorProvider.getCreator(P12, TEST_PATH); + ArtifactsCreatorProvider.getCreator(outputType, TEST_PATH); // then - assertThat(artifactsCreator).isInstanceOf(PKCS12ArtifactsCreator.class); + assertThat(artifactsCreator).isInstanceOf(ConvertedArtifactsCreator.class); } @Test @@ -49,4 +54,17 @@ class ArtifactsCreatorProviderTest { // then assertThat(artifactsCreator).isInstanceOf(PemArtifactsCreator.class); } + + @ParameterizedTest + @CsvSource({ + "JKS, jks", + "P12, p12"}) + void getExtensionShouldProvideExtensionBasedOnArtifactType(String artifactType, String expectedExtension){ + + //when + String actualExtension = ArtifactsCreatorProvider.valueOf(artifactType).getExtension(); + //then + assertThat(actualExtension).isEqualTo(expectedExtension); + } + } diff --git a/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/ConvertedArtifactsCreatorTest.java b/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/ConvertedArtifactsCreatorTest.java new file mode 100644 index 00000000..2da4ab98 --- /dev/null +++ b/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/ConvertedArtifactsCreatorTest.java @@ -0,0 +1,125 @@ +/*============LICENSE_START======================================================= + * aaf-certservice-client + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.aaf.certservice.client.certification.conversion; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.security.PrivateKey; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.onap.aaf.certservice.client.certification.exception.CertFileWriterException; +import org.onap.aaf.certservice.client.certification.exception.PemConversionException; +import org.onap.aaf.certservice.client.certification.writer.CertFileWriter; + +class ConvertedArtifactsCreatorTest { + + private static final int PASSWORD_LENGTH = 24; + private static final String CERTIFICATE_ALIAS = "certificate"; + private static final String TRUSTED_CERTIFICATE_ALIAS = "trusted-certificate-"; + + private static final Password SAMPLE_PASSWORD = new Password("d9D_u8LooYaXH4G48DtN#vw0"); + private static final List SAMPLE_KEYSTORE_CERTIFICATE_CHAIN = List.of("a", "b"); + private static final List SAMPLE_TRUSTED_CERTIFICATE_CHAIN = List.of("c", "d"); + private static final byte[] SAMPLE_KEYSTORE_BYTES = "this is a keystore test".getBytes(); + private static final byte[] SAMPLE_TRUSTSTORE_BYTES = "this is a truststore test".getBytes(); + private static final String P12_EXTENSION= "p12"; + + private CertFileWriter certFileWriter; + private RandomPasswordGenerator passwordGenerator; + private PemConverter converter; + private PrivateKey privateKey; + private ConvertedArtifactsCreator artifactsCreator; + + + @BeforeEach + void setUp() { + certFileWriter = mock(CertFileWriter.class); + passwordGenerator = mock(RandomPasswordGenerator.class); + converter = mock(PemConverter.class); + privateKey = mock(PrivateKey.class); + artifactsCreator = new ConvertedArtifactsCreator(certFileWriter, passwordGenerator, converter, P12_EXTENSION); + } + + @Test + void convertedArtifactCreatorShouldTryCreateFileWithGivenExtension() + throws CertFileWriterException, PemConversionException { + //given + mockPasswordGeneratorAndPemConverter(); + final String keystore = "keystore"; + final String testExtension = "testExt"; + final String keystoreFileName = String.format("%s.%s", keystore, testExtension); + artifactsCreator = new ConvertedArtifactsCreator(certFileWriter, passwordGenerator, converter, testExtension); + + //when + artifactsCreator.create(SAMPLE_KEYSTORE_CERTIFICATE_CHAIN, SAMPLE_TRUSTED_CERTIFICATE_CHAIN, privateKey); + + //then + verify(certFileWriter, times(1)) + .saveData(SAMPLE_KEYSTORE_BYTES, keystoreFileName); + } + + @Test + void convertedArtifactsCreatorShouldCallConverterAndFilesCreatorMethods() + throws PemConversionException, CertFileWriterException { + // given + mockPasswordGeneratorAndPemConverter(); + final String keystoreP12 = "keystore.p12"; + final String keystorePass = "keystore.pass"; + + //when + artifactsCreator.create(SAMPLE_KEYSTORE_CERTIFICATE_CHAIN, SAMPLE_TRUSTED_CERTIFICATE_CHAIN, privateKey); + + // then + verify(converter, times(1)) + .convertKeystore(SAMPLE_KEYSTORE_CERTIFICATE_CHAIN, SAMPLE_PASSWORD, CERTIFICATE_ALIAS, privateKey); + verify(certFileWriter, times(1)) + .saveData(SAMPLE_KEYSTORE_BYTES, keystoreP12); + verify(certFileWriter, times(1)) + .saveData(SAMPLE_PASSWORD.getCurrentPassword().getBytes(), keystorePass); + verify(converter, times(1)) + .convertTruststore(SAMPLE_TRUSTED_CERTIFICATE_CHAIN, SAMPLE_PASSWORD, TRUSTED_CERTIFICATE_ALIAS); + } + + @Test + void convertedArtifactsCreatorShouldCallPasswordGeneratorTwice() + throws PemConversionException, CertFileWriterException { + // given + mockPasswordGeneratorAndPemConverter(); + + //when + artifactsCreator.create(SAMPLE_KEYSTORE_CERTIFICATE_CHAIN, SAMPLE_TRUSTED_CERTIFICATE_CHAIN, privateKey); + + // then + verify(passwordGenerator, times(2)).generate(PASSWORD_LENGTH); + } + + private void mockPasswordGeneratorAndPemConverter() throws PemConversionException { + when(passwordGenerator.generate(PASSWORD_LENGTH)).thenReturn(SAMPLE_PASSWORD); + when(converter.convertKeystore(SAMPLE_KEYSTORE_CERTIFICATE_CHAIN, SAMPLE_PASSWORD, CERTIFICATE_ALIAS, privateKey)) + .thenReturn(SAMPLE_KEYSTORE_BYTES); + when(converter.convertTruststore(SAMPLE_TRUSTED_CERTIFICATE_CHAIN, SAMPLE_PASSWORD, TRUSTED_CERTIFICATE_ALIAS)) + .thenReturn(SAMPLE_TRUSTSTORE_BYTES); + } +} diff --git a/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/PKCS12ArtifactsCreatorTest.java b/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/PKCS12ArtifactsCreatorTest.java deleted file mode 100644 index 4a690e5f..00000000 --- a/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/PKCS12ArtifactsCreatorTest.java +++ /dev/null @@ -1,106 +0,0 @@ -/*============LICENSE_START======================================================= - * aaf-certservice-client - * ================================================================================ - * Copyright (C) 2020 Nokia. All rights reserved. - * ================================================================================ - * 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.aaf.certservice.client.certification.conversion; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.security.PrivateKey; -import java.util.List; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.onap.aaf.certservice.client.certification.exception.CertFileWriterException; -import org.onap.aaf.certservice.client.certification.exception.PemToPKCS12ConverterException; -import org.onap.aaf.certservice.client.certification.writer.CertFileWriter; - -class PKCS12ArtifactsCreatorTest { - - private static final int PASSWORD_LENGTH = 24; - private static final String CERTIFICATE_ALIAS = "certificate"; - private static final String TRUSTED_CERTIFICATE_ALIAS = "trusted-certificate-"; - - private static final Password SAMPLE_PASSWORD = new Password("d9D_u8LooYaXH4G48DtN#vw0"); - private static final List SAMPLE_KEYSTORE_CERTIFICATE_CHAIN = List.of("a", "b"); - private static final List SAMPLE_TRUSTED_CERTIFICATE_CHAIN = List.of("c", "d"); - private static final byte[] SAMPLE_KEYSTORE_BYTES = "this is a keystore test".getBytes(); - private static final byte[] SAMPLE_TRUSTSTORE_BYTES = "this is a truststore test".getBytes(); - - private CertFileWriter certFileWriter; - private RandomPasswordGenerator passwordGenerator; - private PemToPKCS12Converter converter; - private PrivateKey privateKey; - private PKCS12ArtifactsCreator artifactCreator; - - - @BeforeEach - void setUp() { - certFileWriter = mock(CertFileWriter.class); - passwordGenerator = mock(RandomPasswordGenerator.class); - converter = mock(PemToPKCS12Converter.class); - privateKey = mock(PrivateKey.class); - artifactCreator = new PKCS12ArtifactsCreator(certFileWriter, passwordGenerator, converter); - } - - @Test - void artifactsCreatorShouldCauseCallOfConvertAndDataSaveMethods() - throws PemToPKCS12ConverterException, CertFileWriterException { - // given - mockPasswordGeneratorAndPKSC12Converter(); - final String keystoreP12 = "keystore.p12"; - final String keystorePass = "keystore.pass"; - - //when - artifactCreator.create(SAMPLE_KEYSTORE_CERTIFICATE_CHAIN, SAMPLE_TRUSTED_CERTIFICATE_CHAIN, privateKey); - - // then - verify(converter, times(1)) - .convertKeystore(SAMPLE_KEYSTORE_CERTIFICATE_CHAIN, SAMPLE_PASSWORD, CERTIFICATE_ALIAS, privateKey); - verify(certFileWriter, times(1)) - .saveData(SAMPLE_KEYSTORE_BYTES, keystoreP12); - verify(certFileWriter, times(1)) - .saveData(SAMPLE_PASSWORD.getCurrentPassword().getBytes(), keystorePass); - verify(converter, times(1)) - .convertTruststore(SAMPLE_TRUSTED_CERTIFICATE_CHAIN, SAMPLE_PASSWORD, TRUSTED_CERTIFICATE_ALIAS); - } - - @Test - void artifactsCreatorShouldCallPasswordGeneratorTwice() - throws PemToPKCS12ConverterException, CertFileWriterException { - // given - mockPasswordGeneratorAndPKSC12Converter(); - - //when - artifactCreator.create(SAMPLE_KEYSTORE_CERTIFICATE_CHAIN, SAMPLE_TRUSTED_CERTIFICATE_CHAIN, privateKey); - - // then - verify(passwordGenerator, times(2)).generate(PASSWORD_LENGTH); - } - - private void mockPasswordGeneratorAndPKSC12Converter() throws PemToPKCS12ConverterException { - when(passwordGenerator.generate(PASSWORD_LENGTH)).thenReturn(SAMPLE_PASSWORD); - when(converter.convertKeystore(SAMPLE_KEYSTORE_CERTIFICATE_CHAIN, SAMPLE_PASSWORD, CERTIFICATE_ALIAS, privateKey)) - .thenReturn(SAMPLE_KEYSTORE_BYTES); - when(converter.convertTruststore(SAMPLE_TRUSTED_CERTIFICATE_CHAIN, SAMPLE_PASSWORD, TRUSTED_CERTIFICATE_ALIAS)) - .thenReturn(SAMPLE_TRUSTSTORE_BYTES); - } -} diff --git a/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/PemConverterTest.java b/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/PemConverterTest.java new file mode 100644 index 00000000..0d67fba7 --- /dev/null +++ b/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/PemConverterTest.java @@ -0,0 +1,205 @@ +/*============LICENSE_START======================================================= + * aaf-certservice-client + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.aaf.certservice.client.certification.conversion; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.UnrecoverableKeyException; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.util.List; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.onap.aaf.certservice.client.certification.EncryptionAlgorithmConstants; +import org.onap.aaf.certservice.client.certification.exception.PemConversionException; + +class PemConverterTest { + + private static final String RESOURCES_PATH = "src/test/resources"; + private static final String CERT1_PATH = RESOURCES_PATH + "/cert1.pem"; + private static final String CERT2_PATH = RESOURCES_PATH + "/cert2.pem"; + private static final String KEY_PATH = RESOURCES_PATH + "/privateKey"; + private static final String EXPECTED_KEYSTORE_PATH = RESOURCES_PATH + "/expectedKeystore.jks"; + private static final String EXPECTED_TRUSTSTORE_PATH = RESOURCES_PATH + "/expectedTruststore.jks"; + private static final String PKCS12 = "PKCS12"; + private static final String PKCS8 = "PKCS#8"; + private static final String JKS = "JKS"; + private static final String KEY_ERROR_MSG = "java.security.KeyStoreException: Key protection algorithm not found: java.lang.NullPointerException"; + private static final String CERTIFICATES_ERROR_MSG = "The certificate couldn't be parsed correctly. certificate1"; + private static final String PASSWORD_ERROR_MSG = "Password should be min. 16 chars long and should contain only alphanumeric characters and special characters like Underscore (_), Dollar ($) and Pound (#)"; + private static byte[] key; + private PrivateKey privateKey = mock(PrivateKey.class); + + @BeforeAll + static void setUpForAll() throws IOException { + key = Files.readAllBytes(Path.of(KEY_PATH)); + } + + @ParameterizedTest + @ValueSource(strings = {PKCS12, JKS}) + void convertKeystoreShouldReturnKeystoreWithGivenPrivateKeyAndCertificateChain(String conversionTarget) + throws IOException, CertificateException, NoSuchAlgorithmException, KeyStoreException, UnrecoverableKeyException, PemConversionException { + // given + final String alias = "keystore-entry"; + final Password password = new Password("d9D_u8LooYaXH4G48DtN#vw0"); + final List certificateChain = getCertificates(); + final PemConverter converter = new PemConverter(conversionTarget); + final KeyStore expectedKeyStore = KeyStore.getInstance(conversionTarget); + expectedKeyStore.load(new ByteArrayInputStream(Files.readAllBytes(Path.of(EXPECTED_KEYSTORE_PATH))), + password.toCharArray()); + final Certificate[] expectedChain = expectedKeyStore.getCertificateChain(alias); + privateKeyMockSetup(); + + // when + final byte[] result = converter.convertKeystore(certificateChain, password, alias, privateKey); + + // then + final KeyStore actualKeyStore = KeyStore.getInstance(conversionTarget); + actualKeyStore.load(new ByteArrayInputStream(result), password.toCharArray()); + final Certificate[] actualChain = actualKeyStore.getCertificateChain(alias); + + assertArrayEquals(key, actualKeyStore.getKey(alias, password.toCharArray()).getEncoded()); + assertEquals(2, expectedChain.length); + assertArrayEquals(expectedChain, actualChain); + } + + @ParameterizedTest + @ValueSource(strings = {PKCS12, JKS}) + void convertKeystoreShouldThrowPemConverterExceptionBecauseOfWrongPassword(String conversionTarget) throws IOException { + // given + final String alias = "keystore-entry"; + final Password password = new Password("apple"); + final List certificateChain = getCertificates(); + final PemConverter converter = new PemConverter(conversionTarget); + privateKeyMockSetup(); + + // when + Exception exception = assertThrows(PemConversionException.class, () -> + converter.convertKeystore(certificateChain, password, alias, privateKey) + ); + + // then + assertEquals(PASSWORD_ERROR_MSG, exception.getMessage()); + } + + @ParameterizedTest + @ValueSource(strings = {PKCS12, JKS}) + void convertTruststoreShouldReturnTruststoreWithGivenCertificatesArray(String conversionTarget) + throws IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException, PemConversionException { + + // given + final PemConverter converter = new PemConverter(conversionTarget); + final String alias = "trusted-certificate-"; + final String alias1 = alias + 1; + final String alias2 = alias + 2; + final Password password = new Password("9z6oFx1epRSCuBWU4Er8i_0y"); + final List trustedCertificates = getCertificates(); + final KeyStore expectedTrustStore = KeyStore.getInstance(conversionTarget); + expectedTrustStore.load(new ByteArrayInputStream(Files.readAllBytes(Path.of(EXPECTED_TRUSTSTORE_PATH))), + password.toCharArray()); + + // when + final byte[] result = converter.convertTruststore(trustedCertificates, password, alias); + + // then + final KeyStore actualKeyStore = KeyStore.getInstance(conversionTarget); + actualKeyStore.load(new ByteArrayInputStream(result), password.toCharArray()); + + assertTrue(actualKeyStore.containsAlias(alias1)); + assertTrue(actualKeyStore.containsAlias(alias2)); + assertEquals(expectedTrustStore.getCertificate(alias1), actualKeyStore.getCertificate(alias1)); + assertEquals(expectedTrustStore.getCertificate(alias2), actualKeyStore.getCertificate(alias2)); + } + + @ParameterizedTest + @ValueSource(strings = {PKCS12, JKS}) + void convertTruststoreShouldThrowPemConverterExceptionBecauseOfWrongPassword(String conversionTarget) throws IOException { + // given + final String alias = "trusted-certificate-"; + final Password password = new Password("nokia"); + final List trustedCertificates = getCertificates(); + final PemConverter converter = new PemConverter(conversionTarget); + + // when then + assertThatThrownBy(() -> + converter.convertTruststore(trustedCertificates, password, alias)) + .isInstanceOf(PemConversionException.class).hasMessage(PASSWORD_ERROR_MSG); + } + + @Test + void convertKeystoreShouldThrowPemConverterExceptionBecauseOfWrongPrivateKey() throws IOException { + // given + final String alias = "keystore-entry"; + final Password password = new Password("d9D_u8LooYaXH4G48DtN#vw0"); + final List certificateChain = getCertificates(); + final PemConverter converter = new PemConverter(PKCS12); + + // when then + assertThatThrownBy(() -> converter.convertKeystore(certificateChain, password, alias, privateKey)) + .isInstanceOf(PemConversionException.class).hasMessage(KEY_ERROR_MSG); + } + + @ParameterizedTest + @ValueSource(strings = {PKCS12, JKS}) + void convertKeystoreShouldThrowPemConverterExceptionBecauseOfWrongCertificates(String conversionTarget) { + // given + final String alias = "keystore-entry"; + final Password password = new Password("d9D_u8LooYaXH4G48DtN#vw0"); + final List certificateChain = List.of("certificate1", "certificate2"); + final PemConverter converter = new PemConverter(conversionTarget); + privateKeyMockSetup(); + + // when then + assertThatThrownBy(() -> converter.convertKeystore(certificateChain, password, alias, privateKey)) + .isInstanceOf(PemConversionException.class).hasMessage(CERTIFICATES_ERROR_MSG); + } + + private void privateKeyMockSetup() { + when(privateKey.getEncoded()).thenReturn(key); + when(privateKey.getAlgorithm()).thenReturn(EncryptionAlgorithmConstants.RSA_ENCRYPTION_ALGORITHM); + when(privateKey.getFormat()).thenReturn(PKCS8); + } + + private List getCertificates() throws IOException { + return List.of( + Files.readString( + Path.of(CERT1_PATH), StandardCharsets.UTF_8), + Files.readString( + Path.of(CERT2_PATH), StandardCharsets.UTF_8) + ); + } +} diff --git a/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/PemToPKCS12ConverterTest.java b/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/PemToPKCS12ConverterTest.java deleted file mode 100644 index 35043409..00000000 --- a/certServiceClient/src/test/java/org/onap/aaf/certservice/client/certification/conversion/PemToPKCS12ConverterTest.java +++ /dev/null @@ -1,197 +0,0 @@ -/*============LICENSE_START======================================================= - * aaf-certservice-client - * ================================================================================ - * Copyright (C) 2020 Nokia. All rights reserved. - * ================================================================================ - * 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.aaf.certservice.client.certification.conversion; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.UnrecoverableKeyException; -import java.security.cert.Certificate; -import java.security.cert.CertificateException; -import java.util.List; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.onap.aaf.certservice.client.certification.EncryptionAlgorithmConstants; -import org.onap.aaf.certservice.client.certification.exception.PemToPKCS12ConverterException; - -class PemToPKCS12ConverterTest { - - private static final String RESOURCES_PATH = "src/test/resources"; - private static final String CERT1_PATH = RESOURCES_PATH + "/cert1.pem"; - private static final String CERT2_PATH = RESOURCES_PATH + "/cert2.pem"; - private static final String KEY_PATH = RESOURCES_PATH + "/privateKey"; - private static final String EXPECTED_KEYSTORE_PATH = RESOURCES_PATH + "/expectedKeystore.jks"; - private static final String EXPECTED_TRUSTSTORE_PATH = RESOURCES_PATH + "/expectedTruststore.jks"; - private static final String PKCS12 = "PKCS12"; - private static final String PKCS8 = "PKCS#8"; - private static final String KEY_ERROR_MSG = "java.security.KeyStoreException: Key protection algorithm not found: java.lang.NullPointerException"; - private static final String CERTIFICATES_ERROR_MSG = "The certificate couldn't be parsed correctly. certificate1"; - private static final String PASSWORD_ERROR_MSG = "Password should be min. 16 chars long and should contain only alphanumeric characters and special characters like Underscore (_), Dollar ($) and Pound (#)"; - private static byte[] key; - private PrivateKey privateKey = mock(PrivateKey.class); - - @BeforeAll - static void setUpForAll() throws IOException { - key = Files.readAllBytes(Path.of(KEY_PATH)); - } - - @Test - void convertKeystoreShouldReturnKeystoreWithGivenPrivateKeyAndCertificateChain() - throws IOException, CertificateException, NoSuchAlgorithmException, KeyStoreException, UnrecoverableKeyException, PemToPKCS12ConverterException { - // given - final String alias = "keystore-entry"; - final Password password = new Password("d9D_u8LooYaXH4G48DtN#vw0"); - final List certificateChain = getCertificates(); - final PemToPKCS12Converter converter = new PemToPKCS12Converter(); - final KeyStore expectedKeyStore = KeyStore.getInstance(PKCS12); - expectedKeyStore.load(new ByteArrayInputStream(Files.readAllBytes(Path.of(EXPECTED_KEYSTORE_PATH))), - password.toCharArray()); - final Certificate[] expectedChain = expectedKeyStore.getCertificateChain(alias); - privateKeyMockSetup(); - - // when - final byte[] result = converter.convertKeystore(certificateChain, password, alias, privateKey); - - // then - final KeyStore actualKeyStore = KeyStore.getInstance(PKCS12); - actualKeyStore.load(new ByteArrayInputStream(result), password.toCharArray()); - final Certificate[] actualChain = actualKeyStore.getCertificateChain(alias); - - assertArrayEquals(key, actualKeyStore.getKey(alias, password.toCharArray()).getEncoded()); - assertEquals(2, expectedChain.length); - assertArrayEquals(expectedChain, actualChain); - } - - @Test - void convertKeystoreShouldThrowPemToPKCS12ConverterExceptionBecauseOfWrongPassword() throws IOException { - // given - final String alias = "keystore-entry"; - final Password password = new Password("apple"); - final List certificateChain = getCertificates(); - final PemToPKCS12Converter converter = new PemToPKCS12Converter(); - privateKeyMockSetup(); - - // when - Exception exception = assertThrows(PemToPKCS12ConverterException.class, () -> - converter.convertKeystore(certificateChain, password, alias, privateKey) - ); - - // then - assertEquals(PASSWORD_ERROR_MSG, exception.getMessage()); - } - - @Test - void convertTruststoreShouldReturnTruststoreWithGivenCertificatesArray() - throws IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException, PemToPKCS12ConverterException { - - // given - final PemToPKCS12Converter converter = new PemToPKCS12Converter(); - final String alias = "trusted-certificate-"; - final String alias1 = alias + 1; - final String alias2 = alias + 2; - final Password password = new Password("9z6oFx1epRSCuBWU4Er8i_0y"); - final List trustedCertificates = getCertificates(); - final KeyStore expectedTrustStore = KeyStore.getInstance(PKCS12); - expectedTrustStore.load(new ByteArrayInputStream(Files.readAllBytes(Path.of(EXPECTED_TRUSTSTORE_PATH))), - password.toCharArray()); - - // when - final byte[] result = converter.convertTruststore(trustedCertificates, password, alias); - - // then - final KeyStore actualKeyStore = KeyStore.getInstance(PKCS12); - actualKeyStore.load(new ByteArrayInputStream(result), password.toCharArray()); - - assertTrue(actualKeyStore.containsAlias(alias1)); - assertTrue(actualKeyStore.containsAlias(alias2)); - assertEquals(expectedTrustStore.getCertificate(alias1), actualKeyStore.getCertificate(alias1)); - assertEquals(expectedTrustStore.getCertificate(alias2), actualKeyStore.getCertificate(alias2)); - } - - @Test - void convertTruststoreShouldThrowPemToPKCS12ConverterExceptionBecauseOfWrongPassword() throws IOException { - // given - final String alias = "trusted-certificate-"; - final Password password = new Password("nokia"); - final List trustedCertificates = getCertificates(); - final PemToPKCS12Converter converter = new PemToPKCS12Converter(); - - // when then - assertThatThrownBy(() -> - converter.convertTruststore(trustedCertificates, password, alias)) - .isInstanceOf(PemToPKCS12ConverterException.class).hasMessage(PASSWORD_ERROR_MSG); - } - - @Test - void convertKeystoreShouldThrowPemToPKCS12ConverterExceptionBecauseOfWrongPrivateKey() throws IOException { - // given - final String alias = "keystore-entry"; - final Password password = new Password("d9D_u8LooYaXH4G48DtN#vw0"); - final List certificateChain = getCertificates(); - final PemToPKCS12Converter converter = new PemToPKCS12Converter(); - - // when then - assertThatThrownBy(() -> converter.convertKeystore(certificateChain, password, alias, privateKey)) - .isInstanceOf(PemToPKCS12ConverterException.class).hasMessage(KEY_ERROR_MSG); - } - - @Test - void convertKeystoreShouldThrowPemToPKCS12ConverterExceptionBecauseOfWrongCertificates() { - // given - final String alias = "keystore-entry"; - final Password password = new Password("d9D_u8LooYaXH4G48DtN#vw0"); - final List certificateChain = List.of("certificate1", "certificate2"); - final PemToPKCS12Converter converter = new PemToPKCS12Converter(); - privateKeyMockSetup(); - - // when then - assertThatThrownBy(() -> converter.convertKeystore(certificateChain, password, alias, privateKey)) - .isInstanceOf(PemToPKCS12ConverterException.class).hasMessage(CERTIFICATES_ERROR_MSG); - } - - private void privateKeyMockSetup() { - when(privateKey.getEncoded()).thenReturn(key); - when(privateKey.getAlgorithm()).thenReturn(EncryptionAlgorithmConstants.RSA_ENCRYPTION_ALGORITHM); - when(privateKey.getFormat()).thenReturn(PKCS8); - } - - private List getCertificates() throws IOException { - return List.of( - Files.readString( - Path.of(CERT1_PATH), StandardCharsets.UTF_8), - Files.readString( - Path.of(CERT2_PATH), StandardCharsets.UTF_8) - ); - } -} \ No newline at end of file -- cgit 1.2.3-korg