Modified: turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/CryptoUtilTest.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/CryptoUtilTest.java?rev=1880199&r1=1880198&r2=1880199&view=diff ============================================================================== --- turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/CryptoUtilTest.java (original) +++ turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/CryptoUtilTest.java Thu Jul 23 11:58:44 2020 @@ -1,5 +1,10 @@ package org.apache.fulcrum.jce.crypto; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -21,12 +26,14 @@ package org.apache.fulcrum.jce.crypto; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.IOException; +import java.security.GeneralSecurityException; -import org.apache.fulcrum.jce.crypto.extended.CryptoUtilJ8ParameterizedTest; +import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; - -import junit.framework.TestCase; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; /** * Test suite for crypto functionality @@ -34,7 +41,7 @@ import junit.framework.TestCase; * @author <a href="mailto:[email protected]">Siegfried Goeschl</a> */ -public class CryptoUtilTest extends TestCase { +public class CryptoUtilTest { /** the password to be used */ private String password; @@ -48,12 +55,8 @@ public class CryptoUtilTest extends Test /** * Constructor - * - * @param name the name of the test case */ - public CryptoUtilTest(String name) { - super(name); - + public CryptoUtilTest() { this.password = "mysecret"; this.testDataDirectory = new File("./src/test/data"); this.tempDataDirectory = new File("./target/temp"); @@ -61,15 +64,16 @@ public class CryptoUtilTest extends Test } /** - * @see junit.framework.TestCase#setUp() byte[] salt, int count, String - * algorithm, String providerName ) * * @throws Exception Generic exception */ - protected void setUp() throws Exception { + @BeforeAll + protected static void setUp() throws Exception { CryptoStreamFactoryImpl factory = new CryptoStreamFactoryImpl(CryptoParameters.Salt(), CryptoParameters.COUNT); CryptoStreamFactoryImpl.setInstance(factory); + + } /** @@ -94,159 +98,205 @@ public class CryptoUtilTest extends Test } /** Encrypt a text file - * @throws Exception Generic exception */ - public void testTextEncryption() throws Exception { + @Test + public void testTextEncryption() { File sourceFile = new File(this.getTestDataDirectory(), "plain.txt"); File targetFile = new File(this.getTempDataDirectory(), "plain.enc.txt"); - CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException e) { + fail(e); + } catch (IOException e) { + fail(e); + } } /** Decrypt a text file - * @throws Exception Generic exception */ - public void testTextDecryption() throws Exception { + @Test + public void testTextDecryption() { testTextEncryption(); File sourceFile = new File(this.getTempDataDirectory(), "plain.enc.txt"); File targetFile = new File(this.getTempDataDirectory(), "plain.dec.txt"); - CryptoUtil.getInstance().decrypt(sourceFile, targetFile.getAbsolutePath(), this.getPassword()); + try { + CryptoUtil.getInstance().decrypt(sourceFile, targetFile.getAbsolutePath(), this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** Encrypt an empty text file - * - * @throws Exception Generic exception */ - public void testEmptyTextEncryption() throws Exception { + @Test + public void testEmptyTextEncryption() { File sourceFile = new File(this.getTestDataDirectory(), "empty.txt"); File targetFile = new File(this.getTempDataDirectory(), "empty.enc.txt"); - CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** Decrypt a text file - * @throws Exception Generic exception */ - public void testEmptyTextDecryption() throws Exception { + @Test + public void testEmptyTextDecryption() { testEmptyTextEncryption(); File sourceFile = new File(this.getTempDataDirectory(), "empty.enc.txt"); File targetFile = new File(this.getTempDataDirectory(), "empty.dec.txt"); - CryptoUtil.getInstance().decrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().decrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** Encrypt a PDF file - * - * @throws Exception Generic exception */ - public void testPdfEncryption() throws Exception { + @Test + public void testPdfEncryption() { File sourceFile = new File(this.getTestDataDirectory(), "plain.pdf"); File targetFile = new File(this.getTempDataDirectory(), "plain.enc.pdf"); - CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** Decrypt a PDF file - * - * @throws Exception Generic exception */ - public void testPdfDecryption() throws Exception { + @Test + public void testPdfDecryption() { testPdfEncryption(); File sourceFile = new File(this.getTempDataDirectory(), "plain.enc.pdf"); File targetFile = new File(this.getTempDataDirectory(), "plain.dec.pdf"); - CryptoUtil.getInstance().decrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().decrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** Encrypt a ZIP file - * - * @throws Exception Generic exception */ - public void testZipEncryption() throws Exception { + @Test + public void testZipEncryption() { File sourceFile = new File(this.getTestDataDirectory(), "plain.zip"); File targetFile = new File(this.getTempDataDirectory(), "plain.enc.zip"); - CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** Decrypt a ZIP file - * - * @throws Exception Generic exception */ - public void testZipDecryption() throws Exception { + @Test + public void testZipDecryption() { testZipEncryption(); File sourceFile = new File(this.getTempDataDirectory(), "plain.enc.zip"); File targetFile = new File(this.getTempDataDirectory(), "plain.dec.zip"); - CryptoUtil.getInstance().decrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().decrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** Encrypt a UTF-16 XML file - * - * @throws Exception Generic exception */ - public void testXmlUTF16Encryption() throws Exception { + @Test + public void testXmlUTF16Encryption() { File sourceFile = new File(this.getTestDataDirectory(), "plain-utf16.xml"); File targetFile = new File(this.getTempDataDirectory(), "plain-utf16.enc.xml"); - CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** * Decrypt a UTF-16 XML file - * - * @throws Exception Generic exception */ - public void testXMLUTF16Decryption() throws Exception { + @Test + public void testXMLUTF16Decryption() { testXmlUTF16Encryption(); File sourceFile = new File(this.getTempDataDirectory(), "plain-utf16.enc.xml"); File targetFile = new File(this.getTempDataDirectory(), "plain-utf16.dec.xml"); - CryptoUtil.getInstance().decrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().decrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** * Encrypt a UTF-8 XML file - * - * @throws Exception Generic exception */ - public void testXmlUTF8Encryption() throws Exception { + @Test + public void testXmlUTF8Encryption() { File sourceFile = new File(this.getTestDataDirectory(), "plain-utf8.xml"); File targetFile = new File(this.getTempDataDirectory(), "plain-utf8.enc.xml"); - CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** * Decrypt a UTF-8 XML file - * - * @throws Exception Generic exception */ - public void testXMLUTF8Decryption() throws Exception { + @Test + public void testXMLUTF8Decryption() { testXmlUTF8Encryption(); File sourceFile = new File(this.getTempDataDirectory(), "plain-utf8.enc.xml"); File targetFile = new File(this.getTempDataDirectory(), "plain-utf8.dec.xml"); - CryptoUtil.getInstance().decrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().decrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** * Encrypt a ISO-8859-1 XML file - * - * @throws Exception Generic exception */ - public void testXmlISO88591Encryption() throws Exception { + @Test + public void testXmlISO88591Encryption() { File sourceFile = new File(this.getTestDataDirectory(), "plain-iso-8859-1.xml"); File targetFile = new File(this.getTempDataDirectory(), "plain-iso-8859-1.enc.xml"); - CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().encrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** * Decrypt a ISO-8859-1 XML file - * - * @throws Exception Generic exception */ - public void testXmlISO88591Decryption() throws Exception { + @Test + public void testXmlISO88591Decryption() { testXmlISO88591Encryption(); File sourceFile = new File(this.getTempDataDirectory(), "plain-iso-8859-1.enc.xml"); File targetFile = new File(this.getTempDataDirectory(), "plain-iso-8859-1.dec.xml"); - CryptoUtil.getInstance().decrypt(sourceFile, targetFile, this.getPassword()); + try { + CryptoUtil.getInstance().decrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } } /** Test encryption and decryption of Strings - * - * @throws Exception Generic exception */ - public void testStringEncryption() throws Exception { + @Test + public void testStringEncryption() { char[] testVector = new char[513]; for (int i = 0; i < testVector.length; i++) { @@ -254,24 +304,70 @@ public class CryptoUtilTest extends Test } String source = new String(testVector); - String cipherText = CryptoUtil.getInstance().encryptString(source, this.getPassword()); - String plainText = CryptoUtil.getInstance().decryptString(cipherText, this.getPassword()); - assertEquals(source, plainText); + try { + String cipherText = CryptoUtil.getInstance().encryptString(source, this.getPassword()); + String plainText = CryptoUtil.getInstance().decryptString(cipherText, this.getPassword()); + assertEquals(source, plainText); + } catch (GeneralSecurityException | IOException e) { + fail(e); + } + + } + + @Test + public void testStringEncryptionWithType() { + CryptoUtil cu = CryptoUtil.getInstance(); + char[] testVector = new char[513]; + + for (int i = 0; i < testVector.length; i++) { + testVector[i] = (char) i; + } + + String source = new String(testVector); + String cipherText = null; + String plainText = null; + try { + log.info("Test without clearTextHeader"); + cipherText = cu.encryptString(source, this.getPassword()); + log.trace(cipherText); + plainText = cu.decryptString(cipherText, this.getPassword()); + assertEquals(source, plainText, source + " is not equal with " + plainText); + + log.info(String.format("Test with clearTextHeader %s in encrypted string.", + CryptoParametersJ8.CLEAR_CODE_DEFAULT)); + String cipherText2 = cu.encryptStringWithClearCode(source, this.getPassword()); + log.trace(cipherText2); + // old style + assertTrue(cipherText2.startsWith(CryptoParametersJ8.CLEAR_CODE_DEFAULT), + String.format("%s does not start with '%s'", cipherText2, CryptoParametersJ8.CLEAR_CODE_DEFAULT)); + String plainText2 = cu.decryptStringWithClearCode(cipherText2, this.getPassword()); + assertEquals(source, plainText2, String.format("%s is not equal with %s", source, plainText)); + + } catch (GeneralSecurityException | IOException e) { + e.printStackTrace(); + fail(); + } } /** Test encryption and decryption of Strings - * @throws Exception Generic exception */ - public void testStringHandling() throws Exception { + @Test + public void testStringHandling() { String source = "Nobody knows the toubles I have seen ..."; - String cipherText = CryptoUtil.getInstance().encryptString(source, this.getPassword()); - String plainText = CryptoUtil.getInstance().decryptString(cipherText, this.getPassword()); + try { + String cipherText = CryptoUtil.getInstance().encryptString(source, this.getPassword()); + String plainText = CryptoUtil.getInstance().decryptString(cipherText, this.getPassword()); assertEquals(source, plainText); + } catch (GeneralSecurityException | IOException e) { + e.printStackTrace(); + fail(); + } } /** Test encryption and decryption of binary data * @throws Exception Generic exception */ + @Test public void testBinaryHandling() throws Exception { byte[] source = new byte[256]; byte[] result = null; @@ -298,6 +394,7 @@ public class CryptoUtilTest extends Test /** Test creating a password * @throws Exception Generic exception */ + @Test public void testPasswordFactory() throws Exception { char[] result = null; result = PasswordFactory.getInstance().create(); @@ -305,12 +402,12 @@ public class CryptoUtilTest extends Test result = PasswordFactory.getInstance().create(this.getPassword()); log.info(new String(result)); assertNotNull(result); - return; } /** Test the hex converter * @throws Exception Generic exception */ + @Test public void testHexConverter() throws Exception { String source = "DceuATAABWSaVTSIK"; String hexString = HexConverter.toString(source.getBytes()); @@ -321,6 +418,7 @@ public class CryptoUtilTest extends Test /** Test encryption and decryption of Strings * @throws Exception Generic exception */ + @Test public void testPasswordEncryption() throws Exception { char[] password = "57cb-4a23-d838-45222".toCharArray(); String source = "e02c-3b76-ff1e-5d9a1";
Added: turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8ExplicitParamsTest.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8ExplicitParamsTest.java?rev=1880199&view=auto ============================================================================== --- turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8ExplicitParamsTest.java (added) +++ turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8ExplicitParamsTest.java Thu Jul 23 11:58:44 2020 @@ -0,0 +1,371 @@ +package org.apache.fulcrum.jce.crypto.extended; + + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.security.GeneralSecurityException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.List; + +import org.apache.fulcrum.jce.crypto.PasswordFactory; +import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8.TYPES; +import org.apache.fulcrum.jce.junit5.extension.SupportedTypeArguments; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + + +/** + * Test suite for crypto functionality + * + * @author <a href="mailto:[email protected]">Siegfried Goeschl</a> + */ +public class CryptoUtilJ8ExplicitParamsTest { + /** the password to be used */ + private String password; + + /** the test data directory */ + private File testDataDirectory; + + /** the temp data director */ + private File tempDataDirectory; + + + private static byte[] SALT = generateSalt(); + + private static int COUNT = 12345; + + private static List<CryptoUtilJ8> cryptoUtilJ8s = new ArrayList<>(); + + private static Logger log = LogManager.getLogger(CryptoUtilJ8ExplicitParamsTest.class); + + + protected static byte[] generateSalt() { + SecureRandom random; + try { + random = SecureRandom.getInstanceStrong(); + byte[] salt = new byte[ 16 ]; + random.nextBytes(salt); + return salt; + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return null; + } + + /** + * Constructor + */ + public CryptoUtilJ8ExplicitParamsTest() { + + this.password = "mysecret"; + this.testDataDirectory = new File("./src/test/data"); + this.tempDataDirectory = new File("./target/temp"); + this.tempDataDirectory.mkdirs(); + } + + + @BeforeAll + public static void setUp() throws Exception { + cryptoUtilJ8s.clear(); + SupportedTypeArguments.init(); + for (TYPES type : CryptoParametersJ8.TYPES.values()) { + if (SupportedTypeArguments.SUPPORTED_TYPES.contains(type.toString())) { + cryptoUtilJ8s.add(CryptoUtilJ8.getInstance(type, SALT, COUNT)); + } + } + for (CryptoUtilJ8 cryptoUtilJ8 : cryptoUtilJ8s) { + log.debug("registered {}", cryptoUtilJ8.getClass().getSimpleName() ); + CryptoStreamFactoryJ8Template crt = ((CryptoStreamFactoryJ8Template)cryptoUtilJ8.getCryptoStreamFactory()); + log.debug(String.format("created default crypto factory instance %s for algo %s with salt length: %s", + crt.getClass().getSimpleName(), + crt.getAlgorithm(), crt.getSalt().length)); + } + } + + @AfterAll + public static void destroy() { + cryptoUtilJ8s.clear(); + } + + + /** + * @return Returns the password. + */ + protected char[] getPassword() { + return password.toCharArray(); + } + + /** + * @return Returns the tempDataDirectory. + */ + protected File getTempDataDirectory() { + return tempDataDirectory; + } + + /** + * @return Returns the testDataDirectory. + */ + protected File getTestDataDirectory() { + return testDataDirectory; + } + + /** Encrypt a text file + * + */ + @Test + public void testTextEncryption() { + + File sourceFile = new File(this.getTestDataDirectory(), "plain.txt"); + File targetFile = new File(this.getTempDataDirectory(), "plain.j8.enc.txt"); + + cryptoUtilJ8s.forEach(cuj8 -> { + try { + cuj8.encrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException e) { + e.printStackTrace(); + fail(); + } catch (IOException e) { + e.printStackTrace(); + fail(); + } + } ); + } + + /** Decrypt a text file + */ + @Test + public void testTextDecryption() { + cryptoUtilJ8s.forEach(cuj8 -> { + log.info("start en-/decrypting with {}",cuj8); + try { + File sourceFile = new File(this.getTestDataDirectory(), "plain.txt"); + File targetFile = new File(this.getTempDataDirectory(), "plain.j8.enc.txt"); + cuj8.encrypt(sourceFile, targetFile, this.getPassword()); + + File sourceFile2 = new File(this.getTempDataDirectory(), "plain.j8.enc.txt");; + File targetFile2 = new File(this.getTempDataDirectory(), "plain.j8.dec.txt"); + cuj8.decrypt(sourceFile2, targetFile2.getAbsolutePath(), this.getPassword()); + assertEquals( + new String(Files.readAllBytes( Paths.get(sourceFile.toURI())) ), + new String(Files.readAllBytes( Paths.get(targetFile2.toURI())) ) + ); + } catch (GeneralSecurityException | IOException e) { + e.printStackTrace(); + fail(); + } + }); + } + + /** Encrypt a PDF file + * + */ + @Test + public void testPdfEncryption() { + File sourceFile = new File(this.getTestDataDirectory(), "plain.pdf"); + File targetFile = new File(this.getTempDataDirectory(), "plain.j8.enc.pdf"); + cryptoUtilJ8s.forEach(cuj8 -> { + try { + cuj8.encrypt(sourceFile, targetFile, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + e.printStackTrace(); + fail(); + } + }); + } + + /** Decrypt a PDF file + * + */ + @Test + public void testPdfDecryption() { + //testPdfEncryption(); + cryptoUtilJ8s.forEach(cuj8 -> { + try { + File sourceFile = new File(this.getTestDataDirectory(), "plain.pdf"); + File targetFile = new File(this.getTempDataDirectory(), "plain.j8.enc.pdf"); + cuj8.encrypt(sourceFile, targetFile, this.getPassword()); + + File sourceFile2 = new File(this.getTempDataDirectory(), "plain.j8.enc.pdf"); + File targetFile2 = new File(this.getTempDataDirectory(), "plain.j8.dec.pdf"); + cuj8.decrypt(sourceFile2, targetFile2, this.getPassword()); + + assertEquals( + new String(Files.readAllBytes( Paths.get(sourceFile.toURI())) ), + new String(Files.readAllBytes( Paths.get(targetFile2.toURI())) ) + ); + } catch (GeneralSecurityException | IOException e) { + e.printStackTrace(); + fail(); + } + }); + + } + + /** Test encryption and decryption of Strings + * + */ + @Test + public void testStringEncryption() { + char[] testVector = new char[513]; + + for (int i = 0; i < testVector.length; i++) { + testVector[i] = (char) i; + } + + String source = new String(testVector); + cryptoUtilJ8s.forEach(cuj8 -> { + String cipherText; + String plainText; + try { + cipherText = cuj8.encryptString(source, this.getPassword()); + plainText = cuj8.decryptString(cipherText, this.getPassword()); + assertEquals(source, plainText, source +" is not equal with " + plainText); + } catch (GeneralSecurityException | IOException e) { + e.printStackTrace(); + fail(); + } + + }); + + + } + + /** Test encryption and decryption of Strings + */ + @Test + public void testStringHandling() { + String source = "Nobody knows the toubles I have seen ..."; + cryptoUtilJ8s.forEach(cuj8 -> { + String cipherText; + try { + cipherText = cuj8.encryptString(source, this.getPassword()); + String plainText = cuj8.decryptString(cipherText, this.getPassword()); + assertEquals(source, plainText); + } catch (GeneralSecurityException | IOException e) { + e.printStackTrace(); + fail(); + } + + }); + + } + + /** + * Test creating a password + * @throws Exception Generic exception + */ + @Test + public void testPasswordFactory() throws Exception { + char[] result = null; + result = PasswordFactory.getInstance("SHA-256").create(); + log.debug("random pw: {}", new String(result)); + result = PasswordFactory.getInstance("SHA-256",10_000).create(this.getPassword()); + log.debug("password pw with seed: {}", new String(result)); + assertNotNull(result); + return; + } + + /** Test encryption and decryption of binary data + * @throws Exception Generic exception + */ + @Test + public void testBinaryHandling() throws Exception { + + cryptoUtilJ8s.forEach(cuj8 -> { + byte[] source = new byte[256]; + byte[] result = null; + + for (int i = 0; i < source.length; i++) { + source[i] = (byte) i; + } + + ByteArrayOutputStream cipherText = new ByteArrayOutputStream(); + ByteArrayOutputStream plainText = new ByteArrayOutputStream(); + try { + cuj8.encrypt(source, cipherText, this.getPassword()); + cuj8.decrypt(cipherText, plainText, this.getPassword()); + } catch (GeneralSecurityException | IOException e) { + e.printStackTrace(); + fail(); + } + result = plainText.toByteArray(); + + for (int i = 0; i < source.length; i++) { + if (source[i] != result[i]) { + fail("Binary data are different at position " + i); + } + } + }); + + + + } + + /** + * Test encryption and decryption of Strings + */ + @Test + public void testStringWithPasswordEncryption() { + char[] password = "57cb-4a23-d838-45222".toCharArray(); + String source = "e02c-3b76-ff1e-5d9a1"; + + cryptoUtilJ8s.forEach(cuj8 -> { + String cipherText = null; + try { + cipherText = cuj8.encryptString(source, password); + log.debug(cipherText);// about 128 + + log.debug("registered {}: {}", cuj8.getClass().getSimpleName()); + CryptoStreamFactoryJ8Template crt = ((CryptoStreamFactoryJ8Template)cuj8.getCryptoStreamFactory()); + log.debug(String.format("created default crypto factory instance %s for algo %s with salt (optional): %s", + crt.getClass().getSimpleName(), + crt.getAlgorithm(), crt.getSalt())); + + log.debug("length for {} is: {}", crt.getType(), cipherText.length());// about 128 + if (crt.getType() == TYPES.PBE) { + assertEquals(128, cipherText.length()); // 128bytes + 10 bytes for cleartext + } + CryptoStreamFactoryJ8Template.resetInstances(); + String plainText = cuj8.decryptString(cipherText, password); + assertEquals(source, plainText); + } catch (GeneralSecurityException | IOException e) { + e.printStackTrace(); + fail(); + } + + }); + + } + +} Modified: turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8ParameterizedTest.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8ParameterizedTest.java?rev=1880199&r1=1880198&r2=1880199&view=diff ============================================================================== --- turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8ParameterizedTest.java (original) +++ turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8ParameterizedTest.java Thu Jul 23 11:58:44 2020 @@ -16,18 +16,25 @@ import java.util.List; import org.apache.fulcrum.jce.crypto.PasswordFactory; import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8.TYPES; +import org.apache.fulcrum.jce.junit5.extension.SupportedTypeArguments; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.ArgumentsSource; /** * Test suite for crypto functionality + * + * Could still not access arguments of parameterized tests in lifecycle callback methods + * + * - https://github.com/junit-team/junit5/issues/944 + * - https://github.com/junit-team/junit5/issues/1139#issuecomment-341683075 * - * @author <a href="mailto:[email protected]">Siegfried Goeschl</a> - */ + * e.g. with ExtendWith(SupportedTypeArguments.class) + * */ public class CryptoUtilJ8ParameterizedTest { /** the password to be used */ private String password; @@ -46,19 +53,12 @@ public class CryptoUtilJ8ParameterizedTe * Constructor */ public CryptoUtilJ8ParameterizedTest() { - this.password = "mysecret"; this.testDataDirectory = new File("./src/test/data"); this.tempDataDirectory = new File("./target/temp"); this.tempDataDirectory.mkdirs(); } -// @ParameterizedTest -// @EnumSource( TYPES.class ) -// public void setUp(TYPES type) throws Exception { -// cryptoUtilJ8 = CryptoUtilJ8.getInstance(type); // (TYPES.PBE); -// } - /** * @return Returns the password. */ @@ -80,9 +80,16 @@ public class CryptoUtilJ8ParameterizedTe return testDataDirectory; } - @AfterEach + @BeforeEach public void setup() { cryptoUtilJ8s.clear(); + SupportedTypeArguments.init(); + } + + + @AfterEach + public void clean() { + cryptoUtilJ8s.clear(); } /** @@ -94,7 +101,7 @@ public class CryptoUtilJ8ParameterizedTe * */ @ParameterizedTest - @EnumSource(TYPES.class) + @ArgumentsSource(SupportedTypeArguments.class) public void testTextEncryption(TYPES type) { cryptoUtilJ8s.add(CryptoUtilJ8.getInstance(type)); @@ -103,7 +110,11 @@ public class CryptoUtilJ8ParameterizedTe cryptoUtilJ8s.forEach(cuj8 -> { try { - log.info("checking " + cuj8.getType()); + log.debug("registered {}: {}", cuj8.getClass().getSimpleName()); + CryptoStreamFactoryJ8Template crt = ((CryptoStreamFactoryJ8Template)cuj8.getCryptoStreamFactory()); + log.debug(String.format("created default crypto factory instance %s for algo %s with salt (optional): %s", + crt.getClass().getSimpleName(), + crt.getAlgorithm(), crt.getSalt())); cuj8.encrypt(sourceFile, targetFile, this.getPassword()); } catch (GeneralSecurityException e) { e.printStackTrace(); @@ -122,11 +133,15 @@ public class CryptoUtilJ8ParameterizedTe * */ @ParameterizedTest - @EnumSource(TYPES.class) + @ArgumentsSource(SupportedTypeArguments.class) public void testTextDecryption(TYPES type) { cryptoUtilJ8s.add(CryptoUtilJ8.getInstance(type)); cryptoUtilJ8s.forEach(cuj8 -> { - log.info("checking " + cuj8.getType()); + log.debug("registered {}: {}", cuj8.getClass().getSimpleName()); + CryptoStreamFactoryJ8Template crt = ((CryptoStreamFactoryJ8Template)cuj8.getCryptoStreamFactory()); + log.debug(String.format("created default crypto factory instance %s for algo %s with salt length: %s", + crt.getClass().getSimpleName(), + crt.getAlgorithm(), crt.getSalt().length)); try { File sourceFile = new File(this.getTestDataDirectory(), "plain.txt"); File targetFile = new File(this.getTempDataDirectory(), "plain.j8.enc.txt"); @@ -153,7 +168,7 @@ public class CryptoUtilJ8ParameterizedTe * */ @ParameterizedTest - @EnumSource(TYPES.class) + @ArgumentsSource(SupportedTypeArguments.class) public void testPdfEncryption(TYPES type) { cryptoUtilJ8s.add(CryptoUtilJ8.getInstance(type)); File sourceFile = new File(this.getTestDataDirectory(), "plain.pdf"); @@ -175,7 +190,7 @@ public class CryptoUtilJ8ParameterizedTe * */ @ParameterizedTest - @EnumSource(TYPES.class) + @ArgumentsSource(SupportedTypeArguments.class) public void testPdfDecryption(TYPES type) { cryptoUtilJ8s.add(CryptoUtilJ8.getInstance(type)); // testPdfEncryption(); @@ -206,9 +221,15 @@ public class CryptoUtilJ8ParameterizedTe * */ @ParameterizedTest - @EnumSource(TYPES.class) + @ArgumentsSource(SupportedTypeArguments.class) public void testStringEncryption(TYPES type) { CryptoUtilJ8 cuj8 = CryptoUtilJ8.getInstance(type); + + log.debug("registered {} and called for {}", cuj8.getClass().getSimpleName(), type); + CryptoStreamFactoryJ8Template crt = ((CryptoStreamFactoryJ8Template)cuj8.getCryptoStreamFactory()); + log.debug(String.format("created default crypto factory instance %s for algo %s with salt length: %s", + crt.getClass().getSimpleName(), + crt.getAlgorithm(), crt.getSalt().length)); char[] testVector = new char[513]; for (int i = 0; i < testVector.length; i++) { @@ -219,18 +240,20 @@ public class CryptoUtilJ8ParameterizedTe String cipherText = null; String plainText = null; try { - log.info("Test without clearTextHeader"); + log.info("Test without clearTextHeader in type {}", type); cipherText = cuj8.encryptString(source, this.getPassword()); - // log.debug(cipherText); + log.trace(cipherText); plainText = cuj8.decryptString(cipherText, this.getPassword()); assertEquals(source, plainText, source + " is not equal with " + plainText); + + String clearCode = type.equals(TYPES.PBE)? CryptoParametersJ8.TYPES.PBE.getClearCode(): + CryptoParametersJ8.TYPES.GCM.getClearCode() ; - log.info(String.format("Test with clearTextHeader %s in encrypted string.", - CryptoParametersJ8.CLEAR_CODE_J8)); + log.info(String.format("Test with clearTextHeader %s in encrypted string.",clearCode) ); String cipherText2 = cuj8.encryptStringWithClearCode(source, this.getPassword()); - // log.debug(cipherText2); - assertTrue(cipherText2.startsWith(CryptoParametersJ8.CLEAR_CODE_J8), - String.format("%s does not start with '%s'", cipherText2, CryptoParametersJ8.CLEAR_CODE_J8)); + log.trace(cipherText2); + assertTrue(cipherText2.startsWith(clearCode), + String.format("%s does not start with '%s'", cipherText2, clearCode)); String plainText2 = cuj8.decryptStringWithClearCode(cipherText2, this.getPassword()); assertEquals(source, plainText2, String.format("%s is not equal with %s", source, plainText)); @@ -247,7 +270,7 @@ public class CryptoUtilJ8ParameterizedTe * */ @ParameterizedTest - @EnumSource(TYPES.class) + @ArgumentsSource(SupportedTypeArguments.class) public void testStringHandling(TYPES type) { cryptoUtilJ8s.add(CryptoUtilJ8.getInstance(type)); String source = "Nobody knows the toubles I have seen ..."; @@ -292,7 +315,7 @@ public class CryptoUtilJ8ParameterizedTe * @param type the type to be tested based on {@link TYPES} */ @ParameterizedTest - @EnumSource(TYPES.class) + @ArgumentsSource(SupportedTypeArguments.class) public void testBinaryHandling(TYPES type) throws Exception { cryptoUtilJ8s.add(CryptoUtilJ8.getInstance(type)); cryptoUtilJ8s.forEach(cuj8 -> { @@ -332,23 +355,28 @@ public class CryptoUtilJ8ParameterizedTe * */ @ParameterizedTest - @EnumSource(TYPES.class) + @ArgumentsSource(SupportedTypeArguments.class) public void testStringWithPasswordEncryption(TYPES type) { char[] password = "57cb-4a23-d838-45222".toCharArray(); String source = "e02c-3b76-ff1e-5d9a1"; CryptoUtilJ8 cuj8 = CryptoUtilJ8.getInstance(type); - log.debug("checking type " + cuj8.getType()); + log.debug("registered {}: {}", cuj8.getClass().getSimpleName()); + CryptoStreamFactoryJ8Template crt = ((CryptoStreamFactoryJ8Template)cuj8.getCryptoStreamFactory()); + log.debug(String.format("created default crypto factory instance %s for algo %s with salt (optional): %s", + crt.getClass().getSimpleName(), + crt.getAlgorithm(), crt.getSalt())); String cipherText = null; try { cipherText = cuj8.encryptString(source, password); log.info(cipherText);// about 128 - log.info(String.format("length for %s is %d", cuj8.getType(), cipherText.length()));// about 128 - if (cuj8.type == TYPES.PBE) { - assertEquals(128, cipherText.length()); // 128bytes + 10 bytes for cleartext - } - if (cuj8.type == TYPES.GCM) { - assertEquals(128, cipherText.length()); - } + log.info(String.format("length for %s is %d", cuj8, cipherText.length()));// about 128 + assertEquals(128, cipherText.length()); +// if (cuj8.type == TYPES.PBE) { +// assertEquals(128, cipherText.length()); // 128bytes + 10 bytes for cleartext +// } +// if (cuj8.type == TYPES.GCM) { +// assertEquals(128, cipherText.length()); +// } String plainText = cuj8.decryptString(cipherText, password); assertEquals(source, plainText); } catch (GeneralSecurityException | IOException e) { Modified: turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8Test.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8Test.java?rev=1880199&r1=1880198&r2=1880199&view=diff ============================================================================== --- turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8Test.java (original) +++ turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8Test.java Thu Jul 23 11:58:44 2020 @@ -11,6 +11,8 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.security.GeneralSecurityException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; import java.util.ArrayList; import java.util.List; @@ -18,6 +20,7 @@ import org.apache.fulcrum.jce.crypto.Pas import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8; import org.apache.fulcrum.jce.crypto.extended.CryptoStreamFactoryJ8Template; import org.apache.fulcrum.jce.crypto.extended.CryptoUtilJ8; +import org.apache.fulcrum.jce.junit5.extension.SupportedTypeArguments; import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8.TYPES; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -25,6 +28,24 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ /** * Test suite for crypto functionality @@ -60,17 +81,21 @@ public class CryptoUtilJ8Test { @BeforeAll public static void setUp() throws Exception { cryptoUtilJ8s.clear(); + SupportedTypeArguments.init(); for (TYPES type : CryptoParametersJ8.TYPES.values()) { - cryptoUtilJ8s.add(CryptoUtilJ8.getInstance(type)); + if (SupportedTypeArguments.SUPPORTED_TYPES.contains(type.toString())) { + cryptoUtilJ8s.add(CryptoUtilJ8.getInstance(type)); + } } for (CryptoUtilJ8 cryptoUtilJ8 : cryptoUtilJ8s) { - log.debug("registered {}: {}", cryptoUtilJ8.getClass().getSimpleName(), cryptoUtilJ8.getType() ); + log.debug("registered {}: {}", cryptoUtilJ8.getClass().getSimpleName()); CryptoStreamFactoryJ8Template crt = ((CryptoStreamFactoryJ8Template)cryptoUtilJ8.getCryptoStreamFactory()); - log.debug(String.format("created default crypto factory instance %s for algo %s", crt.getClass().getSimpleName(), - crt.getAlgorithm())); + log.debug(String.format("created default crypto factory instance %s for algo %s with salt length: %s", + crt.getClass().getSimpleName(), + crt.getAlgorithm(), crt.getSalt().length)); } - } + @AfterAll public static void destroy() { cryptoUtilJ8s.clear(); @@ -124,8 +149,13 @@ public class CryptoUtilJ8Test { */ @Test public void testTextDecryption() { - cryptoUtilJ8s.forEach(cuj8 -> { - try { + cryptoUtilJ8s.forEach(cuj8 -> { + log.debug("registered {}: {}", cuj8.getClass().getSimpleName()); + CryptoStreamFactoryJ8Template crt = ((CryptoStreamFactoryJ8Template)cuj8.getCryptoStreamFactory()); + log.debug(String.format("created default crypto factory instance %s for algo %s with salt length: %s", + crt.getClass().getSimpleName(), + crt.getAlgorithm(), crt.getSalt().length)); + try { File sourceFile = new File(this.getTestDataDirectory(), "plain.txt"); File targetFile = new File(this.getTempDataDirectory(), "plain.j8.enc.txt"); cuj8.encrypt(sourceFile, targetFile, this.getPassword()); @@ -302,9 +332,14 @@ public class CryptoUtilJ8Test { try { cipherText = cuj8.encryptString(source, password); log.debug(cipherText);// about 128 + + CryptoStreamFactoryJ8Template crt = ((CryptoStreamFactoryJ8Template)cuj8.getCryptoStreamFactory()); + log.debug(String.format("created default crypto factory instance %s for algo %s and type %s with salt (optional): %s", + crt.getClass().getSimpleName(), crt.getType(), + crt.getAlgorithm(), crt.getSalt())); - log.debug("length for {} is: {}", cuj8.getType(), cipherText.length());// about 128 - if (cuj8.type == TYPES.PBE) { + log.debug("length for {} is: {}", crt.getType(), cipherText.length());// about 128 + if (crt.getType() == TYPES.PBE) { assertEquals(128, cipherText.length()); // 128bytes + 10 bytes for cleartext } CryptoStreamFactoryJ8Template.resetInstances(); Modified: turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/Main8Test.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/Main8Test.java?rev=1880199&r1=1880198&r2=1880199&view=diff ============================================================================== --- turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/Main8Test.java (original) +++ turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/crypto/extended/Main8Test.java Thu Jul 23 11:58:44 2020 @@ -1,23 +1,25 @@ package org.apache.fulcrum.jce.crypto.extended; import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.security.GeneralSecurityException; import java.util.HashMap; import java.util.Map; -import org.apache.commons.io.Charsets; import org.apache.commons.io.FileUtils; import org.apache.fulcrum.jce.crypto.cli.CLI2; import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8.TYPES; +import org.apache.fulcrum.jce.junit5.extension.SupportedTypeArguments; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder; import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory; import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration; - +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; /* @@ -39,177 +41,198 @@ import org.junit.jupiter.api.Test; * under the License. */ - /** * Test suite for crypto functionality * * @author <a href="mailto:[email protected]">Siegfried Goeschl</a> */ -public class Main8Test -{ - /** the password to be used */ - private String password; - - /** - * Constructor - */ - public Main8Test() { - - this.password = "foobar"; - ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder(); - builder.setStatusLevel(Level.DEBUG); - } - - - /** - * @return Returns the password. - */ - protected char[] getPassword() - { - return password.toCharArray(); - } - - - /** Encrypt a string on the command line */ - @Test - public void testStringEncryption() - { - String[] encryptionArgs = { "string", "enc", this.password, "mysecretpassword"}; - CLI2.main(encryptionArgs); - String[] decryptionArgs = { "string", "dec", this.password, "ce3bf02da8a57c94b4f42c084230d1bedcd856c49a3fd23ec59835ca46a3d37ee02d470394691353478c905e7b342316d1fcc3e1b98837bf0595ef50853922df"}; - CLI2.main(decryptionArgs); - } - @Test - public void testAnotherStringEncryption() - { - String[] encryptionArgs = { "string", "enc", this.password, "secret"}; - CLI2.main(encryptionArgs); - String[] decryptionArgs = { "string", "dec", this.password, "8626904c9e64fddfa64add56472c4796429b0adb7c8039424adef7434be6bc255ce092011e8c560965814e806dd68117"}; - CLI2.main(decryptionArgs); - } - @Test - /** Encrypt a text file on the command line */ - public void testFileEncryption1() - { - String[] encryptionArgs = { "file", "enc", this.password, "./src/test/data/plain.txt", "./target/main8/plain.enc.txt" }; - String[] decryptionArgs = { "file", "dec", this.password, "./target/main8/plain.enc.txt", "./target/main8/plain.dec.txt" }; - CLI2.main(encryptionArgs); - CLI2.main(decryptionArgs); - try { - assertTrue( - FileUtils.contentEquals(new File("./src/test/data/plain.txt"), new File("./target/main8/plain.dec.txt")) - ); - } catch (IOException e) { - fail(); - } - } - @Test - /** Encrypt a text file in-place on the command line */ - public void testFileEncryption2() - { - String[] encryptionArgs = { "file", "enc", this.password, "./src/test/data/plain.txt", "./target/main8/plain.txt" }; - // caution decrypting into source file! - String[] decryptionArgs = { "file", "dec", this.password, "./target/main8/plain.txt" }; - CLI2.main(encryptionArgs); - CLI2.main(decryptionArgs); - } - - @Test - public void testYetAnotherStringEncryption() - { - try { - // assumptions - String topSecret= "mysecretpassword"; - assertTrue(FileUtils.readFileToString( - new File("./src/test/data/plain-simple.txt"), StandardCharsets.UTF_8). - equals(topSecret)); - // test - // encode from string = hexdecimal file - String[] encryptionArgs = { "string", "enc"+TYPES.GCM, this.password, topSecret, - "./target/main8/another-plain16chars.enc.txt"}; - CLI2.main(encryptionArgs); - // shows hex dec in stderr + file - - String[] decryptionArgs = { "string", "dec"+TYPES.GCM, this.password, - "c9fa3e7d3c49d379ee8ff2dff6e6effbafee264794a03d0ffd895caac2b3c9b4558087f5b12e72a92475f1ed638b7911389234b443d4ebcf351c86cb", - "./target/main8/another-plain16chars.dec.txt"}; - CLI2.main(decryptionArgs); - // shows clear password in stdout + file - - assertTrue( - FileUtils.readFileToString( - new File("./target/main8/another-plain16chars.dec.txt"), StandardCharsets.UTF_8). - equals(topSecret)); - - String[] decryptionArgs2 = { "string", "dec"+TYPES.GCM, this.password, - "605efd3009a7242a9c9cab23aa712d6d116e8686732194d3306416cda2a416df1e63aeffcdc1910af1e1100b382b24fc628d9c413ebf7e1b2885c0ec"}; - CLI2.main(decryptionArgs2); - // shows clear password in stdout (offline decoded) - - // file mode commands do show nothing on stdout, except Decrypting / Encrypting - - // should not fail, if converted from hex - String[] decryptionArgs3 = { "file", "dec"+TYPES.GCM, this.password, "./target/main8/another-plain16chars.enc.txt", "./target/main8/another-plain16chars2.dec.txt"}; - CLI2.main(decryptionArgs3); - assertTrue( - FileUtils.readFileToString( - new File("./target/main8/another-plain16chars2.dec.txt"), StandardCharsets.UTF_8). - equals(topSecret)); - - String[] encryptionArgs4 = { "file", "enc"+TYPES.GCM, this.password, - "./src/test/data/plain-simple.txt", "./target/main8/plain-simple.enc.txt" }; - CLI2.main(encryptionArgs4); - - String[] decryptionArgs4 = { "file", "dec"+TYPES.GCM, this.password, - "./target/main8/plain-simple.enc.txt", "./target/main8/plain-simple.dec.txt"}; - CLI2.main(decryptionArgs4); - - try { - assertTrue( - FileUtils.contentEquals( - new File("./src/test/data/plain-simple.txt"), - new File("./target/main8/plain-simple.dec.txt")) - ); - } catch (IOException e) { - fail(); - } - - } catch (Exception e) { - e.printStackTrace(); - fail(); +public class Main8Test { + /** the password to be used */ + private String password; + + /** + * Constructor + */ + public Main8Test() { + + this.password = "foobar"; + ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder(); + builder.setStatusLevel(Level.DEBUG); + } + + @BeforeAll + public static void setup() { + SupportedTypeArguments.init(); + } + + /** + * @return Returns the password. + */ + protected char[] getPassword() { + return password.toCharArray(); + } + + /** Encrypt a string on the command line */ + @Test + public void testStringEncryption() { + String[] encryptionArgs = { "string", "enc", this.password, "mysecretpassword" }; + CLI2.main(encryptionArgs); + String[] decryptionArgs = { "string", "dec", this.password, + "ce3bf02da8a57c94b4f42c084230d1bedcd856c49a3fd23ec59835ca46a3d37ee02d470394691353478c905e7b342316d1fcc3e1b98837bf0595ef50853922df" }; + CLI2.main(decryptionArgs); + } + + @Test + public void testAnotherStringEncryption() { + String[] encryptionArgs = { "string", "enc", this.password, "secret" }; + CLI2.main(encryptionArgs); + String[] decryptionArgs = { "string", "dec", this.password, + "8626904c9e64fddfa64add56472c4796429b0adb7c8039424adef7434be6bc255ce092011e8c560965814e806dd68117" }; + CLI2.main(decryptionArgs); + } + + @Test + /** Encrypt a text file on the command line */ + public void testFileEncryption1() { + String[] encryptionArgs = { "file", "enc", this.password, "./src/test/data/plain.txt", + "./target/main8/plain.enc.txt" }; + String[] decryptionArgs = { "file", "dec", this.password, "./target/main8/plain.enc.txt", + "./target/main8/plain.dec.txt" }; + CLI2.main(encryptionArgs); + CLI2.main(decryptionArgs); + try { + assertTrue(FileUtils.contentEquals(new File("./src/test/data/plain.txt"), + new File("./target/main8/plain.dec.txt"))); + } catch (IOException e) { + fail(); + } + } + + @Test + /** Encrypt a text file in-place on the command line */ + public void testFileEncryption2() { + String[] encryptionArgs = { "file", "enc", this.password, "./src/test/data/plain.txt", + "./target/main8/plain.txt" }; + // caution decrypting into source file! + String[] decryptionArgs = { "file", "dec", this.password, "./target/main8/plain.txt" }; + CLI2.main(encryptionArgs); + CLI2.main(decryptionArgs); + } + + @Test + public void testYetAnotherStringEncryption() { + try { + // assumptions + String topSecret = "mysecretpassword"; + assertTrue(FileUtils.readFileToString(new File("./src/test/data/plain-simple.txt"), StandardCharsets.UTF_8) + .equals(topSecret)); + + if (SupportedTypeArguments.SUPPORTED_TYPES.contains(TYPES.GCM.toString())) { + + // test + // encode from string = hexdecimal file + String[] encryptionArgs = { "string", "enc" + TYPES.GCM, this.password, topSecret, + "./target/main8/another-plain16chars.enc.txt" }; + CLI2.main(encryptionArgs); + // shows hex dec in stderr + file + + String[] decryptionArgs = { "string", "dec" + TYPES.GCM, this.password, + "c9fa3e7d3c49d379ee8ff2dff6e6effbafee264794a03d0ffd895caac2b3c9b4558087f5b12e72a92475f1ed638b7911389234b443d4ebcf351c86cb", + "./target/main8/another-plain16chars.dec.txt" }; + CLI2.main(decryptionArgs); + // shows clear password in stdout + file + + assertTrue(FileUtils.readFileToString(new File("./target/main8/another-plain16chars.dec.txt"), + StandardCharsets.UTF_8).equals(topSecret)); + + String[] decryptionArgs2 = { "string", "dec" + TYPES.GCM, this.password, + "605efd3009a7242a9c9cab23aa712d6d116e8686732194d3306416cda2a416df1e63aeffcdc1910af1e1100b382b24fc628d9c413ebf7e1b2885c0ec" }; + CLI2.main(decryptionArgs2); + // shows clear password in stdout (offline decoded) + + // file mode commands do show nothing on stdout, except Decrypting / Encrypting + + // should not fail, if converted from hex + String[] decryptionArgs3 = { "file", "dec" + TYPES.GCM, this.password, + "./target/main8/another-plain16chars.enc.txt", "./target/main8/another-plain16chars2.dec.txt" }; + CLI2.main(decryptionArgs3); + assertTrue(FileUtils.readFileToString(new File("./target/main8/another-plain16chars2.dec.txt"), + StandardCharsets.UTF_8).equals(topSecret)); + + String[] encryptionArgs4 = { "file", "enc" + TYPES.GCM, this.password, + "./src/test/data/plain-simple.txt", "./target/main8/plain-simple.enc.txt" }; + CLI2.main(encryptionArgs4); + + String[] decryptionArgs4 = { "file", "dec" + TYPES.GCM, this.password, + "./target/main8/plain-simple.enc.txt", "./target/main8/plain-simple.dec.txt" }; + CLI2.main(decryptionArgs4); + + try { + assertTrue(FileUtils.contentEquals(new File("./src/test/data/plain-simple.txt"), + new File("./target/main8/plain-simple.dec.txt"))); + } catch (IOException e) { + fail(); + } + + } + + } catch (Exception e) { + e.printStackTrace(); + fail(); + } + } + + @Test + public void testIntegratedStringEncryption() { + try { + // assumptions + String topSecret = "myX!_secretp@ssword?~,2"; + + Map<String, Object> conf = new HashMap<>(); + conf.put("enc", TYPES.GCM); + + // encode as string to stderr and file in hexdecimal format + String[] encryptionArgs = { "string", "enc" + conf.get("enc"), this.password, topSecret, + "./target/main8/integrated-plain16chars.enc.txt" }; + CLI2.main(encryptionArgs); + // shows encoded hexdec in stdout + file + + String encodedEncrypted = FileUtils.readFileToString( + new File("./target/main8/integrated-plain16chars.enc.txt"), StandardCharsets.UTF_8); + + conf.put("pw", encodedEncrypted); + + // this should be done without output to console + String result = CLI2.processString("dec" + conf.get("enc"), this.password.toCharArray(), + (String) conf.get("pw")); + + assertTrue(result.equals(topSecret)); + + } catch (Exception e) { + e.printStackTrace(); + fail(); + } + } + + @Test + public void testDefaultStringEncryption() { + char[] testVector = new char[513]; + + for (int i = 0; i < testVector.length; i++) { + testVector[i] = (char) i; } - } - - @Test - public void testIntegratedStringEncryption() - { + String source = new String(testVector); + + CryptoUtilJ8.getInstances().clear(); + CryptoUtilJ8 cuj8 = CryptoUtilJ8.getInstance(); + String cipherText; + String plainText; try { - // assumptions - String topSecret= "myX!_secretp@ssword?~,2"; - - Map<String,Object> conf = new HashMap<>(); - conf.put("enc",TYPES.GCM); - - // encode as string to stderr and file in hexdecimal format - String[] encryptionArgs = { - "string", "enc"+ conf.get("enc"), this.password, - topSecret, - "./target/main8/integrated-plain16chars.enc.txt"}; - CLI2.main(encryptionArgs); - // shows encoded hexdec in stdout + file - - String encodedEncrypted = FileUtils.readFileToString(new File("./target/main8/integrated-plain16chars.enc.txt"), StandardCharsets.UTF_8); - - conf.put("pw", encodedEncrypted); - - // this should be done without output to console - String result = CLI2.processString( "dec"+ conf.get("enc"), this.password.toCharArray(), (String) conf.get("pw")); - - assertTrue( - result.equals(topSecret)); - - } catch (Exception e) { + cipherText = cuj8.encryptString(source, this.getPassword()); + plainText = cuj8.decryptString(cipherText, this.getPassword()); + assertEquals(source, plainText, source +" is not equal with " + plainText); + } catch (GeneralSecurityException | IOException e) { e.printStackTrace(); fail(); } Added: turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/junit5/extension/SupportedTypeArguments.java URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/junit5/extension/SupportedTypeArguments.java?rev=1880199&view=auto ============================================================================== --- turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/junit5/extension/SupportedTypeArguments.java (added) +++ turbine/fulcrum/trunk/yaafi-crypto/src/test/org/apache/fulcrum/jce/junit5/extension/SupportedTypeArguments.java Thu Jul 23 11:58:44 2020 @@ -0,0 +1,71 @@ +package org.apache.fulcrum.jce.junit5.extension; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8; +import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8.TYPES; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.ArgumentsProvider; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +/** + * Using {@link CryptoParametersJ8#init()} and ArgumentsProvider to filter parameters. + * + * Could still not access arguments of parameterized tests in lifecycle callback methods + * + * - https://github.com/junit-team/junit5/issues/944 + * - https://github.com/junit-team/junit5/issues/1139#issuecomment-341683075 + * + * @author gkallidis + * + */ +public class SupportedTypeArguments implements ArgumentsProvider { + + public static Logger log = LogManager.getLogger(); + + public static List<String> SUPPORTED_TYPES = null; + + public static void init() { + if (SUPPORTED_TYPES == null) { + SUPPORTED_TYPES = CryptoParametersJ8.init(); + } + log.warn("SUPPORTED_TYPES: {}",SupportedTypeArguments.SUPPORTED_TYPES); + } + + @Override + public Stream<? extends Arguments> provideArguments(ExtensionContext arg0) throws Exception { + if (SUPPORTED_TYPES == null) { + init(); + } + return SUPPORTED_TYPES.stream().map(Arguments::of); + } + + public static List<String> getSUPPORTED_TYPES() { + return SUPPORTED_TYPES; + } + +} Modified: turbine/fulcrum/trunk/yaafi-crypto/xdocs/index.xml URL: http://svn.apache.org/viewvc/turbine/fulcrum/trunk/yaafi-crypto/xdocs/index.xml?rev=1880199&r1=1880198&r2=1880199&view=diff ============================================================================== --- turbine/fulcrum/trunk/yaafi-crypto/xdocs/index.xml (original) +++ turbine/fulcrum/trunk/yaafi-crypto/xdocs/index.xml Thu Jul 23 11:58:44 2020 @@ -120,7 +120,7 @@ </tr> </table> </subsection> - <subsection name="Availabe Algorithms"> + <subsection name="Availabe Cipher Algorithms (Algorithm Modes)"> <table> <tr> <th>Provider Version</th> @@ -134,10 +134,14 @@ <td>SunJCE 1.42</td> <td>PBEWithMD5AndDES</td> </tr> - <tr> + <tr> <td>SunJCE (Java 8)</td> <td>PBEWithHmacSHA256AndAES_256</td> </tr> + <tr> + <td>SunJCE (Java 8)</td> + <td>AES_128/GCM/NoPadding</td> + </tr> </table> </subsection> </section>
