View Javadoc
1   /*
2    * This file is part of Waarp Project (named also Waarp or GG).
3    *
4    *  Copyright (c) 2019, Waarp SAS, and individual contributors by the @author
5    *  tags. See the COPYRIGHT.txt in the distribution for a full listing of
6    * individual contributors.
7    *
8    *  All Waarp Project is free software: you can redistribute it and/or
9    * modify it under the terms of the GNU General Public License as published by
10   * the Free Software Foundation, either version 3 of the License, or (at your
11   * option) any later version.
12   *
13   * Waarp is distributed in the hope that it will be useful, but WITHOUT ANY
14   * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15   * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16   *
17   *  You should have received a copy of the GNU General Public License along with
18   * Waarp . If not, see <http://www.gnu.org/licenses/>.
19   */
20  package org.waarp.common.crypto;
21  
22  /**
23   * This class handles methods to encrypt and unencrypt messages with any
24   * available algorithms in the JVM.<br>
25   * <b>AES is the best compromise in term of security and efficiency.</b> <br>
26   * Usage:<br>
27   * <ul>
28   * <li>Create a Key object: DynamicKey key = new DynamicKey(size,algo,instance,extension);<br>
29   * As DynamicKey(56, "DES", "DES/ECB/PKCS5Padding", "des") for DES<br>
30   * or through Enum class INSTANCES (minimal supported size) or INSTANCESMAX
31   * (maximal supported size) as
32   * DynamicKey(INSTANCESMAX.AES,"aes")</li>
33   * <li>Create a key:
34   * <ul>
35   * <li>Generate: key.generateKey();<br>
36   * The method key.getSecretKeyInBytes() allow getting the key in Bytes.</li>
37   * <li>From an external source: key.setSecretKey(arrayOfBytes);</li>
38   * </ul>
39   * </li>
40   * <li>To encrypt a String in a Base64 format: String myStringCrypt =
41   * key.cryptToString(myString);</li>
42   * <li>To unencrypt one string from Base64 format to the original String:
43   * String
44   * myStringDecrypt =
45   * key.decryptStringInString(myStringCrypte);</li>
46   * </ul>
47   */
48  public class DynamicKeyObject extends KeyObject {
49  
50    /**
51     * Minimal key size
52     */
53    public enum INSTANCES {
54      AES(128), // Min 128
55      ARCFOUR(56), // No Max
56      Blowfish(56), // No Max
57      DES(56), // Must be 56 except if Strong Policy is used
58      DESede(112), // 112 or 168 triple DES
59      RC2(56), RC4(56);
60  
61      final int size;
62  
63      INSTANCES(final int size) {
64        this.size = size;
65      }
66    }
67  
68    /**
69     * Recommended key size when normal JVM installed (no extension on encrypt
70     * support)
71     */
72    public enum INSTANCESMAX {
73      AES(128), // Min 128
74      ARCFOUR(128), // No Max
75      Blowfish(128), // No Max
76      DES(56), // Must be 56 except if Strong Policy is used
77      DESede(168), // 112 or 168 triple DES
78      RC2(128), RC4(128);
79  
80      final int size;
81  
82      INSTANCESMAX(final int size) {
83        this.size = size;
84      }
85    }
86  
87    /**
88     * This value could be between 32 and 128 due to license limitation.
89     */
90    private final int keySize;
91    /**
92     * Short name for the algorithm
93     */
94    private final String algo;
95    /**
96     * Could be the shortname again (default implementation in JVM) or the full
97     * name as DES/ECB/PKCS5Padding
98     */
99    private final String instance;
100   /**
101    * The extension for the file to use when saving the key (note that an extra
102    * file as extension.inf will be
103    * also saved for the extra information)
104    */
105   private final String extension;
106 
107   /**
108    * @param kEYSIZE example DES: 56
109    * @param aLGO example DES: DES
110    * @param iNSTANCE example DES: DES/ECB/PKCS5Padding
111    * @param eXTENSION example DES: des
112    */
113   public DynamicKeyObject(final int kEYSIZE, final String aLGO,
114                           final String iNSTANCE, final String eXTENSION) {
115     keySize = kEYSIZE;
116     algo = aLGO;
117     instance = iNSTANCE;
118     extension = eXTENSION;
119   }
120 
121   /**
122    * @param instance the minimal default instance
123    * @param eXTENSION to use for files
124    */
125   public DynamicKeyObject(final INSTANCES instance, final String eXTENSION) {
126     keySize = instance.size;
127     algo = instance.name();
128     this.instance = instance.name();
129     extension = eXTENSION;
130   }
131 
132   /**
133    * @param instance the maximal default instance
134    * @param eXTENSION to use for files
135    */
136   public DynamicKeyObject(final INSTANCESMAX instance, final String eXTENSION) {
137     keySize = instance.size;
138     algo = instance.name();
139     this.instance = instance.name();
140     extension = eXTENSION;
141   }
142 
143   @Override
144   public final String getAlgorithm() {
145     return algo;
146   }
147 
148   @Override
149   public final String getInstance() {
150     return instance;
151   }
152 
153   @Override
154   public final int getKeySize() {
155     return keySize;
156   }
157 
158   @Override
159   public final String getFileExtension() {
160     return extension;
161   }
162 
163 }