- renamed and moved Main, MainJ8 classes from test folder to classes folder subpackage cli, name CLI and CLI2.
- separated parameter interface, new one CryptoParametersJ8
- moved to package extended using two cipher modes 
- added log4j2 logging to test 

git-svn-id: https://svn.apache.org/repos/asf/turbine/fulcrum/trunk/yaafi-crypto@1866324 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pom.xml b/pom.xml
index 25d9f5d..a090b32 100644
--- a/pom.xml
+++ b/pom.xml
@@ -68,6 +68,12 @@
       <version>1.0.8</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+      <version>${turbine.log4j2.version}</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/src/java/org/apache/fulcrum/jce/crypto/CryptoParameters.java b/src/java/org/apache/fulcrum/jce/crypto/CryptoParameters.java
index efdac7a..c8d1bec 100644
--- a/src/java/org/apache/fulcrum/jce/crypto/CryptoParameters.java
+++ b/src/java/org/apache/fulcrum/jce/crypto/CryptoParameters.java
@@ -30,8 +30,6 @@
 {
     /** Parameter for PBEParameterSpec */
     int COUNT = 20;
-    
-    int COUNT_J8 = 10_000; //200_000;
 
     /** The password salt */
     byte[] SALT = {
@@ -42,27 +40,4 @@
     /** The crypto algorithm being used */
     String ALGORITHM = "PBEWithMD5AndDES";
     
-    /**
-     *  @see https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SunJCEProvider
-     *  
-     *  Algo/mode/padding for cipher transformation: 
-     *  @see https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html
-     *  
-     *  PBEWithHmacSHA256AndAES_256/CBC/PKCS5Padding, PBEWithHmacSHA256AndAES_128/CBC/PKCS5Padding
-     *  or
-     *  GCM
-     */
-    String ALGORITHM_J8_PBE = "PBEWithHmacSHA256AndAES_256"; //"PBEWithHmacSHA256AndAES_128 ";
-    String ALGORITHM_J8_GCM = "AES/GCM/NoPadding";
-    
-    public enum TYPES {
-        PBE, GCM
-    }
-    
-    /**
-     * Prefix to decrypted hex hash to get a clue, what to use and what it is.
-     * 
-     * This should be always 10 bytes
-     */
-    String CLEAR_CODE_J8 = "J8_AES256;"; //
 }
diff --git a/src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryImpl.java b/src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryImpl.java
index 3c92617..35078ee 100644
--- a/src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryImpl.java
+++ b/src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryImpl.java
@@ -143,7 +143,7 @@
     /**
      * @return Returns the algorithm.
      */
-    protected String getAlgorithm()
+    public String getAlgorithm()
     {
         return algorithm;
     }
diff --git a/src/java/org/apache/fulcrum/jce/crypto/CryptoUtil.java b/src/java/org/apache/fulcrum/jce/crypto/CryptoUtil.java
index 95398e5..17b5130 100644
--- a/src/java/org/apache/fulcrum/jce/crypto/CryptoUtil.java
+++ b/src/java/org/apache/fulcrum/jce/crypto/CryptoUtil.java
@@ -25,6 +25,8 @@
 import java.io.OutputStream;
 import java.security.GeneralSecurityException;
 
+import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8;
+
 /**
  * Helper class to provde generic functions to work with CryptoStreams.
  *
@@ -147,7 +149,7 @@
             throws GeneralSecurityException, IOException {
         ByteArrayOutputStream bais = new ByteArrayOutputStream();
         encrypt(factory, plainText, bais, password);
-        return (useClearTextHeader)? CryptoParameters.CLEAR_CODE_J8 + HexConverter.toString(bais.toByteArray()):
+        return (useClearTextHeader)? CryptoParametersJ8.CLEAR_CODE_J8 + HexConverter.toString(bais.toByteArray()):
             HexConverter.toString(bais.toByteArray());
     }
 
@@ -163,7 +165,7 @@
      */
     public String decryptString(String cipherText, char[] password) throws GeneralSecurityException, IOException {
         return decryptString(getCryptoStreamFactory(), (useClearTextHeader)?
-                cipherText.substring(CryptoParameters.CLEAR_CODE_J8.length()):
+                cipherText.substring(CryptoParametersJ8.CLEAR_CODE_J8.length()):
                 cipherText, password);
     }
 
diff --git a/src/java/org/apache/fulcrum/jce/crypto/algo/CryptoStreamGCMImpl.java b/src/java/org/apache/fulcrum/jce/crypto/algo/CryptoStreamGCMImpl.java
index ed0a005..85133ee 100644
--- a/src/java/org/apache/fulcrum/jce/crypto/algo/CryptoStreamGCMImpl.java
+++ b/src/java/org/apache/fulcrum/jce/crypto/algo/CryptoStreamGCMImpl.java
@@ -34,16 +34,16 @@
 import javax.crypto.spec.GCMParameterSpec;
 import javax.crypto.spec.SecretKeySpec;
 
-import org.apache.fulcrum.jce.crypto.CryptoParameters;
-import org.apache.fulcrum.jce.crypto.CryptoStreamFactoryJ8Template;
 import org.apache.fulcrum.jce.crypto.StreamUtil;
+import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8;
+import org.apache.fulcrum.jce.crypto.extended.CryptoStreamFactoryJ8Template;
 
 /**
  * Concrete implementation for creating encrypting/decrypting streams. The
  * implementation uses the JCA (Java Crypto Extension) supplied
  * by SUN (using SunJCE 1.42).
  *
- * The implementation uses @see {@link CryptoParameters#ALGORITHM_J8_GCM} for encryption which
+ * The implementation uses @see {@link CryptoParametersJ8#ALGORITHM_J8_GCM} for encryption which
  * should be sufficent for most applications.
  *
  * The implementation also supplies a default password in the case that
@@ -65,9 +65,9 @@
     public CryptoStreamGCMImpl() throws GeneralSecurityException
     {
         this.salt =  generateSalt();
-        this.count = CryptoParameters.COUNT_J8;// not used
+        this.count = CryptoParametersJ8.COUNT_J8;// not used
         this.providerName = PROVIDERNAME;
-        this.algorithm = CryptoParameters.ALGORITHM_J8_GCM;
+        this.algorithm = CryptoParametersJ8.ALGORITHM_J8_GCM;
     }
 
 
@@ -82,7 +82,7 @@
         this.salt = salt;
         this.count = count;
         this.providerName = PROVIDERNAME;
-        this.algorithm = CryptoParameters.ALGORITHM_J8_GCM;
+        this.algorithm = CryptoParametersJ8.ALGORITHM_J8_GCM;
     }
 
     /**
diff --git a/src/java/org/apache/fulcrum/jce/crypto/algo/CryptoStreamPBEImpl.java b/src/java/org/apache/fulcrum/jce/crypto/algo/CryptoStreamPBEImpl.java
index de1cb4c..e45cebf 100644
--- a/src/java/org/apache/fulcrum/jce/crypto/algo/CryptoStreamPBEImpl.java
+++ b/src/java/org/apache/fulcrum/jce/crypto/algo/CryptoStreamPBEImpl.java
@@ -35,16 +35,16 @@
 import javax.crypto.spec.PBEKeySpec;
 import javax.crypto.spec.PBEParameterSpec;
 
-import org.apache.fulcrum.jce.crypto.CryptoParameters;
-import org.apache.fulcrum.jce.crypto.CryptoStreamFactoryJ8Template;
 import org.apache.fulcrum.jce.crypto.StreamUtil;
+import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8;
+import org.apache.fulcrum.jce.crypto.extended.CryptoStreamFactoryJ8Template;
 
 /**
  * Concrete implementation for creating encrypting/decrypting streams. The
  * implementation uses the JCA (Java Crypto Extension) supplied
  * by SUN (using SunJCE 1.42).
  *
- * The implementation uses as @see {@link CryptoParameters#ALGORITHM_J8_PBE} for encryption which
+ * The implementation uses as @see {@link CryptoParametersJ8#ALGORITHM_J8_PBE} for encryption which
  * should be sufficent for most applications.
  *
  * The implementation also supplies a default password in the case that
@@ -70,9 +70,9 @@
     public CryptoStreamPBEImpl() throws GeneralSecurityException
     {
         this.salt =  generateSalt();
-        this.count = CryptoParameters.COUNT_J8;
+        this.count = CryptoParametersJ8.COUNT_J8;
         this.providerName = PROVIDERNAME;
-        this.algorithm = CryptoParameters.ALGORITHM_J8_PBE;
+        this.algorithm = CryptoParametersJ8.ALGORITHM_J8_PBE;
     }
     
     /**
@@ -86,7 +86,7 @@
         this.salt = salt;
         this.count = count;
         this.providerName = PROVIDERNAME;
-        this.algorithm = CryptoParameters.ALGORITHM_J8_PBE;
+        this.algorithm = CryptoParametersJ8.ALGORITHM_J8_PBE;
     }
 
     /**
diff --git a/src/test/org/apache/fulcrum/jce/crypto/Main.java b/src/java/org/apache/fulcrum/jce/crypto/cli/CLI.java
similarity index 72%
rename from src/test/org/apache/fulcrum/jce/crypto/Main.java
rename to src/java/org/apache/fulcrum/jce/crypto/cli/CLI.java
index 95b79df..6f493cc 100644
--- a/src/test/org/apache/fulcrum/jce/crypto/Main.java
+++ b/src/java/org/apache/fulcrum/jce/crypto/cli/CLI.java
@@ -1,4 +1,4 @@
-package org.apache.fulcrum.jce.crypto;
+package org.apache.fulcrum.jce.crypto.cli;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -25,6 +25,9 @@
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 
+import org.apache.fulcrum.jce.crypto.CryptoUtil;
+import org.apache.fulcrum.jce.crypto.StreamUtil;
+
 /**
  * Command line tool for encrypting/decrypting files
  *
@@ -34,7 +37,7 @@
  * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
  */
 
-public class Main
+public class CLI
 {
     /**
      * Allows testing on the command line.
@@ -119,37 +122,38 @@
     public static void processFile(String cipherMode, char[] password, File sourceFile, File targetFile)
         throws Exception
     {
-        FileInputStream fis = new FileInputStream(sourceFile);
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
-        if( cipherMode.equals("dec") )
-        {
-            System.out.println("Decrypting " + sourceFile.getAbsolutePath() );
-            CryptoUtil.getInstance().decrypt( fis, baos, password );
-            fis.close();
-
-            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-            FileOutputStream fos = new FileOutputStream(targetFile);
-            CryptoUtil.copy(bais,fos);
-            bais.close();
-            fos.close();
-        }
-        else if( cipherMode.equals("enc") )
-        {
-            System.out.println("Encrypting " + sourceFile.getAbsolutePath() );
-            CryptoUtil.getInstance().encrypt( fis, baos, password );
-            fis.close();
-
-            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-            FileOutputStream fos = new FileOutputStream(targetFile);
-            CryptoUtil.copy(bais,fos);
-            bais.close();
-            fos.close();
-        }
-        else
-        {
-            String msg = "Don't know what to do with : " + cipherMode;
-            throw new IllegalArgumentException(msg);
+        try (FileInputStream fis = new FileInputStream(sourceFile)) {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    
+            if( cipherMode.equals("dec") )
+            {
+                System.out.println("Decrypting " + sourceFile.getAbsolutePath() );
+                CryptoUtil.getInstance().decrypt( fis, baos, password );
+                fis.close();
+    
+                ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+                FileOutputStream fos = new FileOutputStream(targetFile);
+                StreamUtil.copy(bais,fos);
+                bais.close();
+                fos.close();
+            }
+            else if( cipherMode.equals("enc") )
+            {
+                System.out.println("Encrypting " + sourceFile.getAbsolutePath() );
+                CryptoUtil.getInstance().encrypt( fis, baos, password );
+                fis.close();
+    
+                ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+                FileOutputStream fos = new FileOutputStream(targetFile);
+                StreamUtil.copy(bais,fos);
+                bais.close();
+                fos.close();
+            }
+            else
+            {
+                String msg = "Don't know what to do with : " + cipherMode;
+                throw new IllegalArgumentException(msg);
+            }
         }
     }
 
diff --git a/src/java/org/apache/fulcrum/jce/crypto/cli/MainJ8.java b/src/java/org/apache/fulcrum/jce/crypto/cli/CLI2.java
similarity index 89%
rename from src/java/org/apache/fulcrum/jce/crypto/cli/MainJ8.java
rename to src/java/org/apache/fulcrum/jce/crypto/cli/CLI2.java
index 5f7bcab..9ec83bb 100644
--- a/src/java/org/apache/fulcrum/jce/crypto/cli/MainJ8.java
+++ b/src/java/org/apache/fulcrum/jce/crypto/cli/CLI2.java
@@ -25,8 +25,8 @@
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 
-import org.apache.fulcrum.jce.crypto.CryptoParameters;
-import org.apache.fulcrum.jce.crypto.CryptoUtilJ8;
+import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8;
+import org.apache.fulcrum.jce.crypto.extended.CryptoUtilJ8;
 
 /**
  * Command line tool for encrypting/decrypting a file or string
@@ -39,12 +39,12 @@
  * java -classpath target/classes org.apache.fulcrum.jce.crypto.cli.Main string enc changeit mysecretgeheim
  * ...
  * 
- * java -classpath target/classes org.apache.fulcrum.jce.crypto.cli.Main string dec changeit J8_AES256;<hashcode>
+ * java -cp target/classes org.apache.fulcrum.jce.crypto.cli.Main string dec changeit J8_AES256;<hashcode>
  *
  * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
  */
 
-public class MainJ8
+public class CLI2
 {
     /**
      * Allows usage on the command line.
@@ -84,11 +84,11 @@
      */
     public static void printHelp()
     {
-        System.out.println("\r\n*** Command line tool for encrypting/decrypting strings/files ***\r\n*** algorithm based on "+ CryptoParameters.ALGORITHM_J8_PBE+ "***\r\n");
+        System.out.println("\r\n*** Command line tool for encrypting/decrypting strings/files ***\r\n*** algorithm based on "+ CryptoParametersJ8.ALGORITHM_J8_PBE+ "***\r\n");
         System.out.println( "*** Usage: ***\r\n");
-        System.out.println("java -cp target\\classes; "+ MainJ8.class.getName()+ " <operation mode:file:string> <coding mode:enc|dec> <password> <path|string> [target]\r\ne.g.\r\n");
-        System.out.println( MainJ8.class.getSimpleName()+ " file [enc|dec] passwd source [target]");
-        System.out.println(MainJ8.class.getSimpleName() + " string [enc|dec] passwd source");
+        System.out.println("java -cp target\\classes; "+ CLI2.class.getName()+ " <operation mode:file|string> <coding mode:enc|dec> <password> <path|string> [target]\r\ne.g.\r\n");
+        System.out.println( CLI2.class.getSimpleName()+ " file [enc|dec] passwd source [target]");
+        System.out.println(CLI2.class.getSimpleName() + " string [enc|dec] passwd source");
     }
 
     /**
diff --git a/src/java/org/apache/fulcrum/jce/crypto/extended/CryptoParametersJ8.java b/src/java/org/apache/fulcrum/jce/crypto/extended/CryptoParametersJ8.java
new file mode 100644
index 0000000..8195819
--- /dev/null
+++ b/src/java/org/apache/fulcrum/jce/crypto/extended/CryptoParametersJ8.java
@@ -0,0 +1,62 @@
+package org.apache.fulcrum.jce.crypto.extended;
+
+/*
+ * 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.
+ */
+
+
+/**
+ * CryptoParameters used for encryption/decryption.
+ *
+ * @author <a href="mailto:gk@apache.org">Georg Kallidis</a>
+ */
+
+public interface CryptoParametersJ8
+{
+
+    int COUNT_J8 = 10_000; //200_000;
+    
+    /**
+     *  @see https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SunJCEProvider
+     *  
+     *  Algo/mode/padding for cipher transformation: 
+     *  @see https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html
+     *  
+     *  using PBEWith<digest>And<encryption>: 
+     *  
+     *  <li>PBEWithHmacSHA256AndAES_256/CBC/PKCS5Padding
+     *  
+     *  or
+     *  Cipher Algorithm Names/Cipher Algorithm Modes/Cipher Algorithm Padding
+     *  
+     *  <li>AES/GCM/NoPadding 
+     */
+    String ALGORITHM_J8_PBE = "PBEWithHmacSHA256AndAES_256"; //"PBEWithHmacSHA256AndAES_128 ";
+    String ALGORITHM_J8_GCM = "AES/GCM/NoPadding";
+    
+    public enum TYPES {
+        PBE, GCM
+    }
+    
+    /**
+     * Prefix to decrypted hex hash to get a clue, what to use and what it is.
+     * 
+     * This should be always 10 bytes
+     */
+    String CLEAR_CODE_J8 = "J8_AES256;"; //
+}
diff --git a/src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryJ8.java b/src/java/org/apache/fulcrum/jce/crypto/extended/CryptoStreamFactoryJ8.java
similarity index 95%
rename from src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryJ8.java
rename to src/java/org/apache/fulcrum/jce/crypto/extended/CryptoStreamFactoryJ8.java
index 8dc7be6..c0cde9f 100644
--- a/src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryJ8.java
+++ b/src/java/org/apache/fulcrum/jce/crypto/extended/CryptoStreamFactoryJ8.java
@@ -1,4 +1,4 @@
-package org.apache.fulcrum.jce.crypto;
+package org.apache.fulcrum.jce.crypto.extended;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -24,6 +24,8 @@
 import java.io.OutputStream;
 import java.security.GeneralSecurityException;
 
+import org.apache.fulcrum.jce.crypto.CryptoStreamFactory;
+
 /**
  * Interface for creating encrypting/decrypting streams. 
  *
diff --git a/src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryJ8Impl.java b/src/java/org/apache/fulcrum/jce/crypto/extended/CryptoStreamFactoryJ8Impl.java
similarity index 94%
rename from src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryJ8Impl.java
rename to src/java/org/apache/fulcrum/jce/crypto/extended/CryptoStreamFactoryJ8Impl.java
index 93462eb..c692d29 100644
--- a/src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryJ8Impl.java
+++ b/src/java/org/apache/fulcrum/jce/crypto/extended/CryptoStreamFactoryJ8Impl.java
@@ -1,4 +1,4 @@
-package org.apache.fulcrum.jce.crypto;
+package org.apache.fulcrum.jce.crypto.extended;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -38,12 +38,17 @@
 import javax.crypto.spec.PBEKeySpec;
 import javax.crypto.spec.PBEParameterSpec;
 
+import org.apache.fulcrum.jce.crypto.CryptoStreamFactory;
+import org.apache.fulcrum.jce.crypto.CryptoStreamFactoryImpl;
+import org.apache.fulcrum.jce.crypto.PasswordFactory;
+import org.apache.fulcrum.jce.crypto.StreamUtil;
+
 /**
  * Concrete factory for creating encrypting/decrypting streams. The
  * implementation uses the JCA (Java Crypto Extension) supplied
  * by SUN (using SunJCE 1.42).
  *
- * The implementation uses as PBEWithHmacSHA256AndAES_256, see {@link CryptoParameters#ALGORITHM_J8} for encryption which
+ * The implementation uses as PBEWithHmacSHA256AndAES_256, see {@link CryptoParametersJ8#ALGORITHM_J8} for encryption which
  * should be sufficent for most applications.
  *
  * The implementation also supplies a default password in the case that
@@ -104,9 +109,9 @@
     public CryptoStreamFactoryJ8Impl() throws GeneralSecurityException
     {
         this.salt =  generateSalt();
-        this.count = CryptoParameters.COUNT_J8;
+        this.count = CryptoParametersJ8.COUNT_J8;
         this.providerName = PROVIDERNAME;
-        this.algorithm = CryptoParameters.ALGORITHM_J8_PBE;
+        this.algorithm = CryptoParametersJ8.ALGORITHM_J8_PBE;
     }
     
     /**
@@ -115,7 +120,7 @@
     public CryptoStreamFactoryJ8Impl(String algo) throws GeneralSecurityException
     {
         this.salt =  generateSalt();
-        this.count = CryptoParameters.COUNT_J8;
+        this.count = CryptoParametersJ8.COUNT_J8;
         this.providerName = PROVIDERNAME;
         this.algorithm = algo;
     }
@@ -131,7 +136,7 @@
         this.salt = salt;
         this.count = count;
         this.providerName = PROVIDERNAME;
-        this.algorithm = CryptoParameters.ALGORITHM_J8_PBE;
+        this.algorithm = CryptoParametersJ8.ALGORITHM_J8_PBE;
     }
 
 
diff --git a/src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryJ8Template.java b/src/java/org/apache/fulcrum/jce/crypto/extended/CryptoStreamFactoryJ8Template.java
similarity index 93%
rename from src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryJ8Template.java
rename to src/java/org/apache/fulcrum/jce/crypto/extended/CryptoStreamFactoryJ8Template.java
index 31485b4..aef5e35 100644
--- a/src/java/org/apache/fulcrum/jce/crypto/CryptoStreamFactoryJ8Template.java
+++ b/src/java/org/apache/fulcrum/jce/crypto/extended/CryptoStreamFactoryJ8Template.java
@@ -1,4 +1,4 @@
-package org.apache.fulcrum.jce.crypto;
+package org.apache.fulcrum.jce.crypto.extended;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -33,9 +33,12 @@
 
 import javax.crypto.Cipher;
 
-import org.apache.fulcrum.jce.crypto.CryptoParameters.TYPES;
+import org.apache.fulcrum.jce.crypto.CryptoStreamFactoryImpl;
+import org.apache.fulcrum.jce.crypto.PasswordFactory;
+import org.apache.fulcrum.jce.crypto.StreamUtil;
 import org.apache.fulcrum.jce.crypto.algo.CryptoStreamGCMImpl;
 import org.apache.fulcrum.jce.crypto.algo.CryptoStreamPBEImpl;
+import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8.TYPES;
 
 /**
  * Concrete factory for creating encrypting/decrypting streams. 
@@ -94,8 +97,8 @@
         this.salt = salt;
         this.count = count;
         this.providerName = PROVIDERNAME;
-        this.algorithm = type.equals(TYPES.PBE)? CryptoParameters.ALGORITHM_J8_PBE:
-            CryptoParameters.ALGORITHM_J8_GCM;
+        this.algorithm = type.equals(TYPES.PBE)? CryptoParametersJ8.ALGORITHM_J8_PBE:
+            CryptoParametersJ8.ALGORITHM_J8_GCM;
     }
 
 
diff --git a/src/java/org/apache/fulcrum/jce/crypto/CryptoUtilJ8.java b/src/java/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8.java
similarity index 93%
rename from src/java/org/apache/fulcrum/jce/crypto/CryptoUtilJ8.java
rename to src/java/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8.java
index 3287aa5..848834a 100644
--- a/src/java/org/apache/fulcrum/jce/crypto/CryptoUtilJ8.java
+++ b/src/java/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8.java
@@ -1,4 +1,4 @@
-package org.apache.fulcrum.jce.crypto;
+package org.apache.fulcrum.jce.crypto.extended;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -26,7 +26,10 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.fulcrum.jce.crypto.CryptoParameters.TYPES;
+import org.apache.fulcrum.jce.crypto.CryptoStreamFactory;
+import org.apache.fulcrum.jce.crypto.CryptoUtil;
+import org.apache.fulcrum.jce.crypto.StreamUtil;
+import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8.TYPES;
 
 /**
  * Helper class to provde generic functions to work with CryptoStreams.
@@ -41,7 +44,7 @@
 public final class CryptoUtilJ8 extends CryptoUtil {
 
     
-    protected TYPES type;// default see instance
+    public TYPES type;// default see instance
    
     
     public TYPES getType() {
diff --git a/src/test/log4j2.xml b/src/test/log4j2.xml
new file mode 100644
index 0000000..ee9dd06
--- /dev/null
+++ b/src/test/log4j2.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+<Configuration status="info" verbose="false">
+    <Appenders>
+      <Console name="console" target="SYSTEM_OUT">
+          <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+	    </Console>
+	    <File name="logfile" fileName="target/fulcrum-test.log">
+          <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+	    </File>
+	    <File name="avalon" fileName="target/avalon-test.log">
+          <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+	    </File>
+    </Appenders>
+    <Loggers>
+        <Logger name="org.apache.fulcrum.jce.crypto" level="debug" additivity="false">
+            <AppenderRef ref="console"/>
+            <AppenderRef ref="logfile"/>
+        </Logger>
+      <Logger name="org.apache.fulcrum" level="info" additivity="false">
+          <AppenderRef ref="console"/>
+          <AppenderRef ref="logfile"/>
+      </Logger>
+       <Logger name="org.apache.fulcrum.yaafi" level="info" additivity="false">
+          <AppenderRef ref="avalon"/>
+      </Logger>
+      <Logger name="avalon" level="warn" additivity="false">
+          <AppenderRef ref="avalon"/>
+      </Logger>
+      <Logger name="org.apache.logging.log4j" level="warn" additivity="false">
+          <AppenderRef ref="logfile"/>
+      </Logger>
+      <Root level="error">
+          <AppenderRef ref="console"/>
+      </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/src/test/org/apache/fulcrum/jce/crypto/CryptoUtilTest.java b/src/test/org/apache/fulcrum/jce/crypto/CryptoUtilTest.java
index d3d68ce..7e0aa5f 100644
--- a/src/test/org/apache/fulcrum/jce/crypto/CryptoUtilTest.java
+++ b/src/test/org/apache/fulcrum/jce/crypto/CryptoUtilTest.java
@@ -1,7 +1,5 @@
 package org.apache.fulcrum.jce.crypto;
 
-import static org.junit.Assert.assertEquals;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
diff --git a/src/test/org/apache/fulcrum/jce/crypto/MainTest.java b/src/test/org/apache/fulcrum/jce/crypto/MainTest.java
index 352990f..83674b4 100644
--- a/src/test/org/apache/fulcrum/jce/crypto/MainTest.java
+++ b/src/test/org/apache/fulcrum/jce/crypto/MainTest.java
@@ -1,5 +1,7 @@
 package org.apache.fulcrum.jce.crypto;
 
+import org.apache.fulcrum.jce.crypto.cli.CLI;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -55,9 +57,17 @@
     public void testStringEncryption()
     {
         String[] encryptionArgs = { "string", "enc", this.password, "mysecretpassword"};
-        Main.main(encryptionArgs);
+        CLI.main(encryptionArgs);
         String[] decryptionArgs = { "string", "dec", this.password, "9330419fc003b4e1461986782625db13f4c8c81c340a9caa"};
-        Main.main(decryptionArgs);
+        CLI.main(decryptionArgs);
+    }
+    
+    public void testAnotherStringEncryption()
+    {
+        String[] encryptionArgs = { "string", "enc", this.password, "secret"};
+        CLI.main(encryptionArgs);
+        String[] decryptionArgs = { "string", "dec", this.password, "39619852d48491af"};
+        CLI.main(decryptionArgs);
     }
 
     /** Encrypt a text file on the command line */
@@ -65,8 +75,8 @@
     {
         String[] encryptionArgs = { "file", "enc", this.password, "./src/test/data/plain.txt", "./target/main/plain.enc.txt" };
         String[] decryptionArgs = { "file", "dec", this.password, "./target/main/plain.enc.txt", "./target/main/plain.dec.txt" };
-        Main.main(encryptionArgs);
-        Main.main(decryptionArgs);
+        CLI.main(encryptionArgs);
+        CLI.main(decryptionArgs);
     }
 
     /** Encrypt a text file in-place on the command line */
@@ -74,8 +84,8 @@
     {
         String[] encryptionArgs = { "file", "enc", this.password, "./src/test/data/plain.txt", "./target/main/plain.txt" };
         String[] decryptionArgs = { "file", "dec", this.password, "./target/main/plain.txt" };
-        Main.main(encryptionArgs);
-        Main.main(decryptionArgs);
+        CLI.main(encryptionArgs);
+        CLI.main(decryptionArgs);
     }
 
 }
\ No newline at end of file
diff --git a/src/test/org/apache/fulcrum/jce/crypto/CryptoUtilJ8ParameterizedTest.java b/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8ParameterizedTest.java
similarity index 97%
rename from src/test/org/apache/fulcrum/jce/crypto/CryptoUtilJ8ParameterizedTest.java
rename to src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8ParameterizedTest.java
index 2ecbd60..6b57a51 100644
--- a/src/test/org/apache/fulcrum/jce/crypto/CryptoUtilJ8ParameterizedTest.java
+++ b/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8ParameterizedTest.java
@@ -1,4 +1,4 @@
-package org.apache.fulcrum.jce.crypto;
+package org.apache.fulcrum.jce.crypto.extended;
 
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -14,7 +14,10 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.fulcrum.jce.crypto.CryptoParameters.TYPES;
+import org.apache.fulcrum.jce.crypto.PasswordFactory;
+import org.apache.fulcrum.jce.crypto.extended.CryptoStreamFactoryJ8Template;
+import org.apache.fulcrum.jce.crypto.extended.CryptoUtilJ8;
+import org.apache.fulcrum.jce.crypto.extended.CryptoParametersJ8.TYPES;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
diff --git a/src/test/org/apache/fulcrum/jce/crypto/CryptoUtilJ8Test.java b/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8Test.java
similarity index 90%
rename from src/test/org/apache/fulcrum/jce/crypto/CryptoUtilJ8Test.java
rename to src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8Test.java
index 455b165..9a4d013 100644
--- a/src/test/org/apache/fulcrum/jce/crypto/CryptoUtilJ8Test.java
+++ b/src/test/org/apache/fulcrum/jce/crypto/extended/CryptoUtilJ8Test.java
@@ -1,4 +1,4 @@
-package org.apache.fulcrum.jce.crypto;
+package org.apache.fulcrum.jce.crypto.extended;
 
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -14,7 +14,13 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.fulcrum.jce.crypto.CryptoParameters.TYPES;
+import org.apache.fulcrum.jce.crypto.PasswordFactory;
+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.crypto.extended.CryptoParametersJ8.TYPES;
+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;
@@ -36,7 +42,8 @@
     private File tempDataDirectory;
     
     private static List<CryptoUtilJ8> cryptoUtilJ8s = new ArrayList<>();
-    
+
+    private static Logger log = LogManager.getLogger(CryptoUtilJ8Test.class);
 
     /**
      * Constructor
@@ -49,21 +56,16 @@
         this.tempDataDirectory.mkdirs();
     }
 
-    /**
-     * @see junit.framework.TestCase#setUp() byte[] salt, int count, String
-     *      algorithm, String providerName )
-     * 
-     * @throws Exception Generic exception
-     */
+
     @BeforeAll
     public static void setUp() throws Exception {
         cryptoUtilJ8s.clear();
-        for (TYPES type : CryptoParameters.TYPES.values()) {
+        for (TYPES type : CryptoParametersJ8.TYPES.values()) {
             cryptoUtilJ8s.add(CryptoUtilJ8.getInstance(type));
         }
         for (CryptoUtilJ8 cryptoUtilJ8 : cryptoUtilJ8s) {
-            System.out.println("registered cryptoUtilsJ8: "+ cryptoUtilJ8.getType() );
-            System.out.println( ((CryptoStreamFactoryJ8Template)cryptoUtilJ8.getCryptoStreamFactory()).getAlgorithm());
+            log.debug("registered cryptoUtilsJ8: {}", cryptoUtilJ8.getType() );
+            log.debug( ((CryptoStreamFactoryJ8Template)cryptoUtilJ8.getCryptoStreamFactory()).getAlgorithm());
         }
 
     }
@@ -251,9 +253,9 @@
     public void testPasswordFactory() throws Exception {
         char[] result = null;
         result = PasswordFactory.getInstance("SHA-256").create();
-        System.out.println("random pw:" + new String(result));
+        log.debug("random pw: {}", new String(result));
         result = PasswordFactory.getInstance("SHA-256",10_000).create(this.getPassword());
-        System.out.println("password pw with seed:" + new String(result));
+        log.debug("password pw with seed: {}", new String(result));
         assertNotNull(result);
         return;
     }
@@ -306,9 +308,9 @@
             String cipherText = null;
             try {
                 cipherText = cuj8.encryptString(source, password);
-                System.out.println(cipherText);// about 128
-                
-                System.out.println("length for " + cuj8.getType() + " is:" +cipherText.length());// about 128
+                log.debug(cipherText);// about 128
+
+                log.debug("length for {} is: {}", cuj8.getType(), cipherText.length());// about 128
                 if (cuj8.type == TYPES.PBE) {
                     assertEquals(128, cipherText.length()); // 128bytes + 10 bytes for cleartext
                 } 
diff --git a/src/test/org/apache/fulcrum/jce/crypto/extended/Main8Test.java b/src/test/org/apache/fulcrum/jce/crypto/extended/Main8Test.java
new file mode 100644
index 0000000..1d85649
--- /dev/null
+++ b/src/test/org/apache/fulcrum/jce/crypto/extended/Main8Test.java
@@ -0,0 +1,91 @@
+package org.apache.fulcrum.jce.crypto.extended;
+
+import org.apache.fulcrum.jce.crypto.cli.CLI2;
+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:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
+ */
+
+public class Main8Test
+{
+    /** the password to be used */
+    static private String password;
+    
+    /**
+     * Constructor
+     */
+    public Main8Test() {
+
+        this.password = "foobar";
+    }
+   
+
+    /**
+     * @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);
+    }
+    @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" };
+        String[] decryptionArgs = { "file", "dec", this.password, "./target/main8/plain.txt" };
+        CLI2.main(encryptionArgs);
+        CLI2.main(decryptionArgs);
+    }
+
+}
\ No newline at end of file