Collection syntax change because of Sonar
[aaf/authz.git] / cadi / core / src / main / java / org / onap / aaf / cadi / Symm.java
index 095f6e9..4067f16 100644 (file)
@@ -71,6 +71,7 @@ import org.onap.aaf.cadi.config.Config;
 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;
@@ -116,7 +117,8 @@ public class Symm {
        private static char passChars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+!@#$%^&*(){}[]?:;,.".toCharArray();
                        
 
-
+       private static Symm internalOnly = null;
+       
        /**
         * Use this to create special case Case Sets and/or Line breaks
         * 
@@ -136,7 +138,7 @@ public class Symm {
                // 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
@@ -207,7 +209,7 @@ public class Symm {
        }
 
        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);
@@ -388,7 +390,9 @@ public class Symm {
     }
 
     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);
     }
 
@@ -446,10 +450,13 @@ public class Symm {
                   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) {
@@ -533,10 +540,10 @@ public class Symm {
  * @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());
@@ -566,8 +573,14 @@ public class Symm {
                                }
                                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 
@@ -851,4 +864,22 @@ public class Symm {
 
          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;
+  }
 }