// Path: encoder/src/main/java/ru/bullyboo/encoder/Encoder.java
// public class Encoder {
// 
//     private Encoder() {
// 
//     }
// 
//     public static BuilderAES BuilderAES() {
//         return new BuilderAES();
//     }
// 
//     public static BuilderARCFOUR BuilderARCFOUR() {
//         return new BuilderARCFOUR();
//     }
// 
//     public static BuilderDES BuilderDES() {
//         return new BuilderDES();
//     }
// 
//     public static BuilderDESede BuilderDESede() {
//         return new BuilderDESede();
//     }
// 
//     public static BuilderRSA BuilderRSA() {
//         return new BuilderRSA();
//     }
// 
//     public static BuilderHMAC BuilderHMAC() {
//         return new BuilderHMAC();
//     }
// 
//     public static BuilderPBE BuilderPBE() {
//         return new BuilderPBE();
//     }
// 
//     public static BuilderBlowfish BuilderBlowfish() {
//         return new BuilderBlowfish();
//     }
// 
//     public static ru.bullyboo.encoder.hashes.Hash Hashes() {
//         return new ru.bullyboo.encoder.hashes.Hash();
//     }
// 
// }
// 
// Path: encoder/src/main/java/ru/bullyboo/encoder/callbacks/EncodeCallback.java
// public interface EncodeCallback {
// 
//     void onSuccess(String result);
// 
//     void onFailure(Throwable e);
// }
// 
// Path: encoder/src/main/java/ru/bullyboo/encoder/methods/DESede.java
// public class DESede extends BaseMethod{
// 
//     private static final int VECTOR_LEGHT = 8;
// 
//     /**
//      * All supported methods
//      */
//     public enum Method{
//         DESEDE ("DESEDE"),
//         DESEDE_CBC_NoPadding ("DESEDE/CBC/NoPadding"),
//         DESEDE_CBC_PKCS5Padding ("DESEDE/CBC/PKCS5Padding"),
//         DESEDE_CBC_PKCS7Padding ("DESEDE/CBC/PKCS7Padding"),
//         DESEDE_CBC_ISO10126Padding ("DESEDE/CBC/ISO10126Padding");
// 
//         private final String method;
// 
//         Method(String method) {
//             this.method = method;
//         }
// 
//         public String getMethod() {
//             return method;
//         }
//     }
// 
//     /**
//      * Keysize must be equal to 128 or 192 bits.
//      * Default Keysize equals 128 bits.
//      */
//     public enum Key{
//         SIZE_128 (16),
//         SIZE_192 (24);
// 
//         private final int size;
// 
//         Key(int size) {
//             this.size = size;
//         }
//     }
// 
//     /**
//      * Implementation of DESede encryption
//      */
//     public static String encrypt(Method method, byte[] key, Key keySize, byte[] vector, byte[] message) throws Exception{
// 
// //        generate Key
//         byte[] keyBytes = generateKey(key, keySize.size);
//         SecretKeySpec keySpec = new SecretKeySpec(keyBytes, method.getMethod());
// 
// //        generate Initialization Vector
//         byte[] keyBytesIv = generateVector(vector, VECTOR_LEGHT);
//         IvParameterSpec ivSpec = new IvParameterSpec(keyBytesIv);
// 
//         Cipher cipher = Cipher.getInstance(method.getMethod());
//         cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
//         byte[] cipherText = cipher.doFinal(message);
// 
//         return Base64.encodeToString(cipherText, Base64.DEFAULT);
//     }
// 
//     /**
//      * Implementation of DESede decryption
//      */
//     public static String decrypt(Method method, byte[] key, Key keySize, byte[] vector, byte[] message) throws Exception{
// 
// //        generate Key
//         byte[] keyBytes = generateKey(key, keySize.size);
//         SecretKeySpec keySpec = new SecretKeySpec(keyBytes, method.getMethod());
// 
// //        generate Initialization Vector
//         byte[] keyBytesIv = generateVector(vector, VECTOR_LEGHT);
//         IvParameterSpec ivSpec = new IvParameterSpec(keyBytesIv);
// 
//         Cipher cipher = Cipher.getInstance(method.getMethod());
//         cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
//         byte[] cipherText = cipher.doFinal(Base64.decode(message, Base64.DEFAULT));
// 
//         return new String(cipherText);
//     }
// }


import ru.bullyboo.encoder.Encoder;
import ru.bullyboo.encoder.callbacks.EncodeCallback;
import ru.bullyboo.encoder.methods.DESede;
                        .message("test message")
                        .key("test key") // not necessary
                        .keySize(DESede.Key.SIZE_128) // not necessary
                        .iVector("test vector") // not necessary
                        .encrypt();

                System.out.println("encrypt with " + method.getMethod() + " = " + encrypt);

                String decrypt = Encoder.BuilderDESede()
                        .message(encrypt)
                        .method(method)
                        .key(key, keySize)
                        .iVector(vector)
                        .decrypt();

                System.out.println("decrypt with " + method.getMethod() + " = " + decrypt);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void testDESede_Async(){

        Encoder.BuilderDESede()
                .method(DESede.Method.DESEDE_CBC_ISO10126Padding)
                .message("test message")
                .key("test key") // not necessary
                .keySize(DESede.Key.SIZE_128) // not necessary
                .iVector("test vector") // not necessary
// Path: encoder/src/main/java/ru/bullyboo/encoder/Encoder.java
// public class Encoder {
// 
//     private Encoder() {
// 
//     }
// 
//     public static BuilderAES BuilderAES() {
//         return new BuilderAES();
//     }
// 
//     public static BuilderARCFOUR BuilderARCFOUR() {
//         return new BuilderARCFOUR();
//     }
// 
//     public static BuilderDES BuilderDES() {
//         return new BuilderDES();
//     }
// 
//     public static BuilderDESede BuilderDESede() {
//         return new BuilderDESede();
//     }
// 
//     public static BuilderRSA BuilderRSA() {
//         return new BuilderRSA();
//     }
// 
//     public static BuilderHMAC BuilderHMAC() {
//         return new BuilderHMAC();
//     }
// 
//     public static BuilderPBE BuilderPBE() {
//         return new BuilderPBE();
//     }
// 
//     public static BuilderBlowfish BuilderBlowfish() {
//         return new BuilderBlowfish();
//     }
// 
//     public static ru.bullyboo.encoder.hashes.Hash Hashes() {
//         return new ru.bullyboo.encoder.hashes.Hash();
//     }
// 
// }
// 
// Path: encoder/src/main/java/ru/bullyboo/encoder/callbacks/EncodeCallback.java
// public interface EncodeCallback {
// 
//     void onSuccess(String result);
// 
//     void onFailure(Throwable e);
// }
// 
// Path: encoder/src/main/java/ru/bullyboo/encoder/methods/DESede.java
// public class DESede extends BaseMethod{
// 
//     private static final int VECTOR_LEGHT = 8;
// 
//     /**
//      * All supported methods
//      */
//     public enum Method{
//         DESEDE ("DESEDE"),
//         DESEDE_CBC_NoPadding ("DESEDE/CBC/NoPadding"),
//         DESEDE_CBC_PKCS5Padding ("DESEDE/CBC/PKCS5Padding"),
//         DESEDE_CBC_PKCS7Padding ("DESEDE/CBC/PKCS7Padding"),
//         DESEDE_CBC_ISO10126Padding ("DESEDE/CBC/ISO10126Padding");
// 
//         private final String method;
// 
//         Method(String method) {
//             this.method = method;
//         }
// 
//         public String getMethod() {
//             return method;
//         }
//     }
// 
//     /**
//      * Keysize must be equal to 128 or 192 bits.
//      * Default Keysize equals 128 bits.
//      */
//     public enum Key{
//         SIZE_128 (16),
//         SIZE_192 (24);
// 
//         private final int size;
// 
//         Key(int size) {
//             this.size = size;
//         }
//     }
// 
//     /**
//      * Implementation of DESede encryption
//      */
//     public static String encrypt(Method method, byte[] key, Key keySize, byte[] vector, byte[] message) throws Exception{
// 
// //        generate Key
//         byte[] keyBytes = generateKey(key, keySize.size);
//         SecretKeySpec keySpec = new SecretKeySpec(keyBytes, method.getMethod());
// 
// //        generate Initialization Vector
//         byte[] keyBytesIv = generateVector(vector, VECTOR_LEGHT);
//         IvParameterSpec ivSpec = new IvParameterSpec(keyBytesIv);
// 
//         Cipher cipher = Cipher.getInstance(method.getMethod());
//         cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
//         byte[] cipherText = cipher.doFinal(message);
// 
//         return Base64.encodeToString(cipherText, Base64.DEFAULT);
//     }
// 
//     /**
//      * Implementation of DESede decryption
//      */
//     public static String decrypt(Method method, byte[] key, Key keySize, byte[] vector, byte[] message) throws Exception{
// 
// //        generate Key
//         byte[] keyBytes = generateKey(key, keySize.size);
//         SecretKeySpec keySpec = new SecretKeySpec(keyBytes, method.getMethod());
// 
// //        generate Initialization Vector
//         byte[] keyBytesIv = generateVector(vector, VECTOR_LEGHT);
//         IvParameterSpec ivSpec = new IvParameterSpec(keyBytesIv);
// 
//         Cipher cipher = Cipher.getInstance(method.getMethod());
//         cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
//         byte[] cipherText = cipher.doFinal(Base64.decode(message, Base64.DEFAULT));
// 
//         return new String(cipherText);
//     }
// }


// Path: app/src/main/java/ru/bullyboo/encryption/tests/TestDESede.java
import ru.bullyboo.encoder.Encoder;
import ru.bullyboo.encoder.callbacks.EncodeCallback;
import ru.bullyboo.encoder.methods.DESede;

                        .message("test message")
                        .key("test key") // not necessary
                        .keySize(DESede.Key.SIZE_128) // not necessary
                        .iVector("test vector") // not necessary
                        .encrypt();

                System.out.println("encrypt with " + method.getMethod() + " = " + encrypt);

                String decrypt = Encoder.BuilderDESede()
                        .message(encrypt)
                        .method(method)
                        .key(key, keySize)
                        .iVector(vector)
                        .decrypt();

                System.out.println("decrypt with " + method.getMethod() + " = " + decrypt);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void testDESede_Async(){

        Encoder.BuilderDESede()
                .method(DESede.Method.DESEDE_CBC_ISO10126Padding)
                .message("test message")
                .key("test key") // not necessary
                .keySize(DESede.Key.SIZE_128) // not necessary
                .iVector("test vector") // not necessary
                .encryptCallBack(new EncodeCallback() {