/*
 * KeyManager - Tim Tyler 2001.
 * 
 * KeyManager - hash a passphrase to produce a key...
 *
 * This code has been placed in the public domain.
 * You can do what you like with it.
 * Note that this code comes with no warranty.
 *
 */

/*
 * ToDo
 * ====
 *
 */

   import java.security.MessageDigest;

   class KeyManager {
      int size_of_key;
      Block key_block;
   
      void setUpKeyConstants(Block iv) {
         key_block = new Block(size_of_key);
         for (int i = 0; i < size_of_key; i = i + 2) {
            key_block.data[i] = (byte)0xC7;
            key_block.data[i + 1] = (byte)0x38;
         }
      
        // add in IV...
         for (int i = 0; i < 16; i++) {
            key_block.data[i] = iv.data[i];
         }
      
         key_block.data[0] |= 1; // make sure the result is an odd number...
      }
   
   
      byte[] getKeyByteArray(String s) {
         byte[] ba;
         byte[] temp;
         byte[] digest;
         MessageDigest md;
      
         if (size_of_key == 0) {
            digest = getHexKey(s);
            if (size_of_key != 0) {
               return digest;
            }
         
            size_of_key = 32;
         }
      
         digest = getHashKey(s);
      
         return digest;
      }
   
   
      byte[] getHashKey(String s) {
         byte[] ba;
         byte[] temp;
         byte[] digest;
         MessageDigest md;
      
         digest = new byte[size_of_key];
         try {
            ba = stringToByteArray(s);
            md = MessageDigest.getInstance("SHA");
            md.update(ba);
            temp = md.digest();
            System.arraycopy(temp,0,digest,0,16);
         
            if (size_of_key > 16) {
               md.update(new byte[1]); // a single extra 00 byte...
               temp = md.digest();
               System.arraycopy(temp, 0, digest, 16, size_of_key - 16);
            }
         } 
            catch (Exception e) {
               Log.log("Error while getting key:");
               e.printStackTrace(Log.getPrintStream());
            }
      
         return digest;
      }
   
   
      byte[] getHexKey(String s) {
         byte[] key = new byte[48];
         byte[] key2 = new byte[48];
         int val;
         String byte_str;
         int index = 0;
         int len = s.length();
      
         size_of_key = 0;
      
         try {
            if (s.charAt(0) == '0') {
               if (s.charAt(1) == 'x') {
                  for (index = 2; index < len; index += 2) {
                     byte_str = "" + s.charAt(index) + s.charAt(index + 1);
                     val = Integer.parseInt(byte_str,16);
                     key[((index - 2) >>> 1)] = (byte)val;
                  }
               }
            }
         } 
            catch (Exception e) {
                // silence...
               // Log.log("Problems parsing hex key...");
               // e.printStackTrace(Log.getPrintStream());
            }
      
         index = (index - 2) >>> 1;
      
         if ((index == 16) || (index == 24) || (index == 32)) {
            // Log.log("HEX KEY:");
            size_of_key = index;
         
            key2 = new byte[size_of_key];
            System.arraycopy(key, 0, key2, 0, size_of_key); // copy a block across...
         
            return key2;
         }
      
         return null;
      }
   
   
      int getKeySize() {
         return size_of_key;
      }
   
   
      int getBestBlockSize() {
         return (size_of_key == 16) ? 16 : 32;
      }
   
   
      byte[] stringToByteArray(String s) {
         int len = s.length();
         byte[] ba = new byte[len];
      
         for (int i = 0; i < len; i++ ) {
            ba[i] = (byte)(s.charAt(i));
         
         }
      
         return ba;
      }
   
   
      String appendByteArrayToString(String s, byte[] b) {
         StringBuffer sb = new StringBuffer(s);
      
         int len = b.length;
      
         byte[] ba = new byte[len];
      
         for (int i = 0; i < len; i++ ) {
            sb.append((char)b[i]);
         }
      
         return sb.toString();
      }
   
   
      public static void main(String args[]) {
         BIAESFrEnd.main(args);
      }
   
   }