public class Symm {
private static final byte[] DOUBLE_EQ = new byte[] {'=','='};
public static final String ENC = "enc:";
+ private static final Object LOCK = new Object();
private static final SecureRandom random = new SecureRandom();
public final char[] codeset;
private static char passChars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+!@#$%^&*(){}[]?:;,.".toCharArray();
-
+ private static Symm internalOnly = null;
+
/**
* Use this to create special case Case Sets and/or Line breaks
*
// There can be time efficiencies gained when the underlying keyset consists mainly of ordered
// data (i.e. abcde...). Therefore, we'll quickly analyze the keyset. If it proves to have
// too much entropy, the "Unordered" algorithm, which is faster in such cases is used.
- ArrayList<int[]> la = new ArrayList<int[]>();
+ ArrayList<int[]> la = new ArrayList<>();
for(int i=0;i<codeset.length;++i) {
curr = codeset[i];
if(prev+1==curr) { // is next character in set
}
public <T> T exec(SyncExec<T> exec) throws Exception {
- synchronized(ENC) {
+ synchronized(LOCK) {
if(keyBytes == null) {
keyBytes = new byte[AES.AES_KEY_SIZE/8];
int offset = (Math.abs(codeset[0])+47)%(codeset.length-keyBytes.length);
}
public void decode(InputStream is, OutputStream os, int skip) throws IOException {
- is.skip(skip);
+ if(is.skip(skip)!=skip) {
+ throw new IOException("Error skipping on IOStream in Symm");
+ }
decode(is,os);
}
this.range = range;
}
public int convert(int read) throws IOException {
+ // System.out.print((char)read);
switch(read) {
case -1:
case '=':
- case '\n':
+ case ' ':
+ case '\n':
+ case '\r':
return -1;
}
for(int i=0;i<range.length;++i) {
* @throws CadiException
*/
public static Symm obtain(Access access) throws CadiException {
- Symm symm = Symm.baseCrypt();
-
String keyfile = access.getProperty(Config.CADI_KEYFILE,null);
if(keyfile!=null) {
+ Symm symm = Symm.baseCrypt();
+
File file = new File(keyfile);
try {
access.log(Level.INIT, Config.CADI_KEYFILE,"points to",file.getCanonicalPath());
}
throw new CadiException("ERROR: " + filename + " does not exist!");
}
+ return symm;
+ } else {
+ try {
+ return internalOnly();
+ } catch (IOException e) {
+ throw new CadiException(e);
+ }
}
- return symm;
}
/**
* Create a new random key
return newSymm;
}
+
+ /**
+ * This Symm is generated for internal JVM use. It has no external keyfile, but can be used
+ * for securing Memory, as it remains the same ONLY of the current JVM
+ * @return
+ * @throws IOException
+ */
+ public static synchronized Symm internalOnly() throws IOException {
+ if(internalOnly==null) {
+ ByteArrayInputStream baos = new ByteArrayInputStream(keygen());
+ try {
+ internalOnly = Symm.obtain(baos);
+ } finally {
+ baos.close();
+ }
+ }
+ return internalOnly;
+ }
}