Author: erodriguez
Date: Tue Nov  9 19:29:34 2004
New Revision: 57122

Modified:
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/Des3CbcEncryption.java
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/Des3CbcMd5Encryption.java
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/Des3CbcSha1Encryption.java
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcCrcEncryption.java
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcEncryption.java
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcMd4Encryption.java
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcMd5Encryption.java
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/EncryptionEngine.java
   
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/NullEncryption.java
Log:
Refactoring.  Added template methods getBlockCipher and getChecksumEngine which 
allow a good amount of Kerberos cipher text processing to move into the 
EncryptionEngine base class.  Also eliminated some triplicated block cipher 
processing code.

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/Des3CbcEncryption.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/Des3CbcEncryption.java
   (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/Des3CbcEncryption.java
   Tue Nov  9 19:29:34 2004
@@ -16,50 +16,29 @@
  */
 package org.apache.kerberos.crypto.encryption;
 
-import org.bouncycastle.crypto.engines.*;
-import org.bouncycastle.crypto.modes.*;
-import org.bouncycastle.crypto.params.*;
+import org.bouncycastle.crypto.BlockCipher;
+import org.bouncycastle.crypto.engines.DESedeEngine;
 
-public abstract class Des3CbcEncryption extends EncryptionEngine {
+public abstract class Des3CbcEncryption extends EncryptionEngine
+{
+    public BlockCipher getBlockCipher()
+    {
+        return new DESedeEngine();
+    }
 
-       public CipherType keyType() {
+       public CipherType keyType()
+    {
                return CipherType.DES3;
        }
 
-       public int blockSize() {
+       public int blockSize()
+    {
                return 8;
        }
 
-       public int keySize() {
+       public int keySize()
+    {
                return 24;
-       }
-       
-       // TODO - duplicated in CryptoService.
-       protected synchronized byte[] processBlockCipher(boolean encrypt, 
byte[] data, byte[] key, byte[] ivec) {
-               byte[] returnData = new byte[data.length];
-               CBCBlockCipher cbcCipher = new CBCBlockCipher(new 
DESedeEngine());
-               KeyParameter keyParameter = new KeyParameter(key);
-
-               if (ivec != null) {
-                       ParametersWithIV kpWithIV = new 
ParametersWithIV(keyParameter, ivec);
-                       cbcCipher.init(encrypt, kpWithIV);
-               } else
-                       cbcCipher.init(encrypt, keyParameter);
-
-               int offset = 0;
-               int processedBytesLength = 0;
-
-               while (offset < returnData.length) {
-                       try {
-                               processedBytesLength = 
cbcCipher.processBlock(data, offset, returnData, offset);
-                               offset += processedBytesLength;
-                       } catch (Exception e) {
-                               e.printStackTrace();
-                               break;
-                       }
-               }
-
-               return returnData;
        }
 }
 

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/Des3CbcMd5Encryption.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/Des3CbcMd5Encryption.java
        (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/Des3CbcMd5Encryption.java
        Tue Nov  9 19:29:34 2004
@@ -16,27 +16,39 @@
  */
 package org.apache.kerberos.crypto.encryption;
 
-import org.apache.kerberos.crypto.checksum.*;
+import org.apache.kerberos.crypto.checksum.ChecksumEngine;
+import org.apache.kerberos.crypto.checksum.ChecksumType;
+import org.apache.kerberos.crypto.checksum.RsaMd5Checksum;
 
-public class Des3CbcMd5Encryption extends Des3CbcEncryption {
+public class Des3CbcMd5Encryption extends Des3CbcEncryption
+{
+    public ChecksumEngine getChecksumEngine()
+    {
+        return new RsaMd5Checksum();
+    }
 
-       public EncryptionType encryptionType() {
+       public EncryptionType encryptionType()
+    {
                return EncryptionType.DES3_CBC_MD5;
        }
 
-       public ChecksumType checksumType() {
+       public ChecksumType checksumType()
+    {
                return ChecksumType.RSA_MD5;
        }
 
-       public int confounderSize() {
+       public int confounderSize()
+    {
                return 8;
        }
 
-       public int checksumSize() {
+       public int checksumSize()
+    {
                return 16;
        }
        
-       public int minimumPadSize() {
+       public int minimumPadSize()
+    {
                return 0;
        }
 }

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/Des3CbcSha1Encryption.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/Des3CbcSha1Encryption.java
       (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/Des3CbcSha1Encryption.java
       Tue Nov  9 19:29:34 2004
@@ -16,27 +16,39 @@
  */
 package org.apache.kerberos.crypto.encryption;
 
-import org.apache.kerberos.crypto.checksum.*;
+import org.apache.kerberos.crypto.checksum.ChecksumEngine;
+import org.apache.kerberos.crypto.checksum.ChecksumType;
+import org.apache.kerberos.crypto.checksum.Sha1Checksum;
 
-public class Des3CbcSha1Encryption extends Des3CbcEncryption {
+public class Des3CbcSha1Encryption extends Des3CbcEncryption
+{
+    public ChecksumEngine getChecksumEngine()
+    {
+        return new Sha1Checksum();
+    }
 
-       public EncryptionType encryptionType() {
+       public EncryptionType encryptionType()
+    {
                return EncryptionType.DES3_CBC_SHA1;
        }
 
-       public ChecksumType checksumType() {
+       public ChecksumType checksumType()
+    {
                return ChecksumType.SHA1;
        }
 
-       public int confounderSize() {
+       public int confounderSize()
+    {
                return 8;
        }
 
-       public int checksumSize() {
+       public int checksumSize()
+    {
                return 20;
        }
        
-       public int minimumPadSize() {
+       public int minimumPadSize()
+    {
                return 0;
        }
 }

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcCrcEncryption.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcCrcEncryption.java
 (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcCrcEncryption.java
 Tue Nov  9 19:29:34 2004
@@ -16,31 +16,44 @@
  */
 package org.apache.kerberos.crypto.encryption;
 
-import org.apache.kerberos.crypto.checksum.*;
+import org.apache.kerberos.crypto.checksum.ChecksumEngine;
+import org.apache.kerberos.crypto.checksum.ChecksumType;
+import org.apache.kerberos.crypto.checksum.Crc32Checksum;
+
+public class DesCbcCrcEncryption extends DesCbcEncryption
+{
+    public ChecksumEngine getChecksumEngine()
+    {
+        return new Crc32Checksum();
+    }
 
-public class DesCbcCrcEncryption extends DesCbcEncryption {
-
-       public EncryptionType encryptionType() {
+       public EncryptionType encryptionType()
+    {
                return EncryptionType.DES_CBC_CRC;
        }
 
-       public ChecksumType checksumType() {
+       public ChecksumType checksumType()
+    {
                return ChecksumType.CRC32;
        }
 
-       public CipherType cipherType() {
+       public CipherType cipherType()
+    {
                return CipherType.DES;
        }
 
-       public int confounderSize() {
+       public int confounderSize()
+    {
                return 8;
        }
 
-       public int checksumSize() {
+       public int checksumSize()
+    {
                return 4;
        }
 
-       public int minimumPadSize() {
+       public int minimumPadSize()
+    {
                return 4;
        }
 }

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcEncryption.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcEncryption.java
    (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcEncryption.java
    Tue Nov  9 19:29:34 2004
@@ -16,50 +16,29 @@
  */
 package org.apache.kerberos.crypto.encryption;
 
-import org.bouncycastle.crypto.engines.*;
-import org.bouncycastle.crypto.modes.*;
-import org.bouncycastle.crypto.params.*;
+import org.bouncycastle.crypto.BlockCipher;
+import org.bouncycastle.crypto.engines.DESEngine;
 
-public abstract class DesCbcEncryption extends EncryptionEngine {
+public abstract class DesCbcEncryption extends EncryptionEngine
+{
+    public BlockCipher getBlockCipher()
+    {
+        return new DESEngine();
+    }
 
-       public CipherType keyType() {
+       public CipherType keyType()
+    {
                return CipherType.DES;
        }
 
-       public int blockSize() {
+       public int blockSize()
+    {
                return 8;
        }
 
-       public int keySize() {
+       public int keySize()
+    {
                return 8;
-       }
-       
-       // TODO - duplicated in CryptoService.
-       protected synchronized byte[] processBlockCipher(boolean encrypt, 
byte[] data, byte[] key, byte[] ivec) {
-               byte[] returnData = new byte[data.length];
-               CBCBlockCipher cbcCipher = new CBCBlockCipher(new DESEngine());
-               KeyParameter keyParameter = new KeyParameter(key);
-
-               if (ivec != null) {
-                       ParametersWithIV kpWithIV = new 
ParametersWithIV(keyParameter, ivec);
-                       cbcCipher.init(encrypt, kpWithIV);
-               } else
-                       cbcCipher.init(encrypt, keyParameter);
-
-               int offset = 0;
-               int processedBytesLength = 0;
-
-               while (offset < returnData.length) {
-                       try {
-                               processedBytesLength = 
cbcCipher.processBlock(data, offset, returnData, offset);
-                               offset += processedBytesLength;
-                       } catch (Exception e) {
-                               e.printStackTrace();
-                               break;
-                       }
-               }
-
-               return returnData;
        }
 }
 

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcMd4Encryption.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcMd4Encryption.java
 (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcMd4Encryption.java
 Tue Nov  9 19:29:34 2004
@@ -16,27 +16,39 @@
  */
 package org.apache.kerberos.crypto.encryption;
 
-import org.apache.kerberos.crypto.checksum.*;
+import org.apache.kerberos.crypto.checksum.ChecksumEngine;
+import org.apache.kerberos.crypto.checksum.ChecksumType;
+import org.apache.kerberos.crypto.checksum.RsaMd4Checksum;
 
-public class DesCbcMd4Encryption extends DesCbcEncryption {
+public class DesCbcMd4Encryption extends DesCbcEncryption
+{
+    public ChecksumEngine getChecksumEngine()
+    {
+        return new RsaMd4Checksum();
+    }
 
-       public EncryptionType encryptionType() {
+       public EncryptionType encryptionType()
+    {
                return EncryptionType.DES_CBC_MD4;
        }
 
-       public ChecksumType checksumType() {
+       public ChecksumType checksumType()
+    {
                return ChecksumType.RSA_MD4;
        }
 
-       public int confounderSize() {
+       public int confounderSize()
+    {
                return 8;
        }
 
-       public int checksumSize() {
+       public int checksumSize()
+    {
                return 16;
        }
        
-       public int minimumPadSize() {
+       public int minimumPadSize()
+    {
                return 0;
        }
 }

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcMd5Encryption.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcMd5Encryption.java
 (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/DesCbcMd5Encryption.java
 Tue Nov  9 19:29:34 2004
@@ -16,27 +16,39 @@
  */
 package org.apache.kerberos.crypto.encryption;
 
-import org.apache.kerberos.crypto.checksum.*;
+import org.apache.kerberos.crypto.checksum.ChecksumEngine;
+import org.apache.kerberos.crypto.checksum.ChecksumType;
+import org.apache.kerberos.crypto.checksum.RsaMd5Checksum;
 
-public class DesCbcMd5Encryption extends DesCbcEncryption {
+public class DesCbcMd5Encryption extends DesCbcEncryption
+{
+    public ChecksumEngine getChecksumEngine()
+    {
+        return new RsaMd5Checksum();
+    }
 
-       public EncryptionType encryptionType() {
+       public EncryptionType encryptionType()
+    {
                return EncryptionType.DES_CBC_MD5;
        }
 
-       public ChecksumType checksumType() {
+       public ChecksumType checksumType()
+    {
                return ChecksumType.RSA_MD5;
        }
 
-       public int confounderSize() {
+       public int confounderSize()
+    {
                return 8;
        }
 
-       public int checksumSize() {
+       public int checksumSize()
+    {
                return 16;
        }
        
-       public int minimumPadSize() {
+       public int minimumPadSize()
+    {
                return 0;
        }
 }

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/EncryptionEngine.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/EncryptionEngine.java
    (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/EncryptionEngine.java
    Tue Nov  9 19:29:34 2004
@@ -16,46 +16,162 @@
  */
 package org.apache.kerberos.crypto.encryption;
 
-import org.apache.kerberos.crypto.*;
-import org.apache.kerberos.crypto.checksum.*;
-import org.apache.kerberos.kdc.*;
+import org.apache.kerberos.crypto.checksum.ChecksumEngine;
+import org.apache.kerberos.crypto.checksum.ChecksumType;
+import org.apache.kerberos.kdc.KerberosException;
+import org.apache.kerberos.messages.value.EncryptedData;
+import org.apache.kerberos.messages.value.EncryptionKey;
+import org.bouncycastle.crypto.BlockCipher;
+import org.bouncycastle.crypto.modes.CBCBlockCipher;
+import org.bouncycastle.crypto.params.KeyParameter;
+import org.bouncycastle.crypto.params.ParametersWithIV;
+
+import java.security.SecureRandom;
+
+public abstract class EncryptionEngine
+{
+    private static final SecureRandom random = new SecureRandom();
 
-public abstract class EncryptionEngine {
+    public abstract ChecksumEngine getChecksumEngine();
+    public abstract BlockCipher getBlockCipher();
 
        public abstract EncryptionType encryptionType();
-
        public abstract ChecksumType checksumType();
-
        public abstract CipherType keyType();
-
        public abstract int confounderSize();
-
        public abstract int checksumSize();
-
        public abstract int blockSize();
-       
        public abstract int minimumPadSize();
-
        public abstract int keySize();
 
-       protected abstract byte[] processBlockCipher(boolean encrypt, byte[] 
data, byte[] key, byte[] ivec);
+    public byte[] getDecryptedData( EncryptionKey key, EncryptedData data )
+            throws KerberosException
+    {
+               byte[] decryptedData = decrypt( data.getCipherText(), 
key.getKeyValue() );
+
+               return removeBytes( decryptedData, confounderSize(), 
checksumSize() );
+       }
+
+    public EncryptedData getEncryptedData( EncryptionKey key, byte[] plainText 
)
+                       throws KerberosException
+    {
+               byte[] conFounder      = getRandomBytes(confounderSize());
+               byte[] zeroedChecksum  = new byte[checksumSize()];
+        byte[] paddedPlainText = padString(plainText);
+               byte[] dataBytes       = concatenateBytes(conFounder, 
concatenateBytes(zeroedChecksum, paddedPlainText));
+               byte[] checksumBytes   = calculateChecksum(dataBytes);
+               byte[] paddedDataBytes = padString(dataBytes);
+
+        // lay the checksum into the ciphertext
+               for (int i = confounderSize(); i < confounderSize() + 
checksumSize(); i++)
+        {
+                       paddedDataBytes[i] = checksumBytes[i - 
confounderSize()];
+        }
+
+               byte[] encryptedData = encrypt(paddedDataBytes, 
key.getKeyValue());
 
-       public byte[] encrypt(byte[] data, byte[] key) {
-               return processBlockCipher(true, data, key, null);
+               return new EncryptedData( encryptionType(), 
key.getKeyVersion(), encryptedData );
        }
 
-       public byte[] decrypt(byte[] data, byte[] key) {
-               return processBlockCipher(false, data, key, null);
+    private byte[] encrypt( byte[] data, byte[] key )
+    {
+               return processBlockCipher( true, data, key, null );
        }
 
-       public byte[] calculateChecksum(byte[] data) {
-               ChecksumEngine digester = null;
-               try {
-                       digester = CryptoService.getInstance(checksumType());
-               } catch (KerberosException ke) {
-                       
System.out.println(KerberosException.KDC_ERR_SUMTYPE_NOSUPP);
-               }
+       private byte[] decrypt( byte[] data, byte[] key )
+    {
+               return processBlockCipher( false, data, key, null );
+       }
+
+    private byte[] getRandomBytes( int size )
+    {
+        byte[] bytes = new byte[size];
+
+        // SecureRandom.nextBytes is already synchronized
+        random.nextBytes(bytes);
+
+        return bytes;
+    }
+
+       private byte[] padString( byte encodedString[] )
+    {
+               int x;
+               if (encodedString.length < 8)
+                       x = encodedString.length;
+               else
+                       x = encodedString.length % 8;
+
+               if (x == 0)
+                       return encodedString;
+
+               byte paddedByteArray[] = new byte[(8 - x) + 
encodedString.length];
+               for (int y = paddedByteArray.length - 1; y > 
encodedString.length - 1; y--)
+                       paddedByteArray[y] = 0;
+
+               System.arraycopy(encodedString, 0, paddedByteArray, 0, 
encodedString.length);
+
+               return paddedByteArray;
+       }
+
+       private byte[] concatenateBytes( byte[] array1, byte[] array2 )
+    {
+               byte concatenatedBytes[] = new byte[array1.length + 
array2.length];
+
+               for (int i = 0; i < array1.length; i++)
+                       concatenatedBytes[i] = array1[i];
+
+               for (int j = array1.length; j < concatenatedBytes.length; j++)
+                       concatenatedBytes[j] = array2[j - array1.length];
+
+               return concatenatedBytes;
+       }
+
+    private byte[] calculateChecksum( byte[] data )
+    {
+               ChecksumEngine digester = getChecksumEngine();
+
                return digester.calculateChecksum(data);
+       }
+
+    private byte[] removeBytes( byte[] array, int confounder, int checksum )
+    {
+               byte lessBytes[] = new byte[array.length - confounder - 
checksum];
+
+               int j = 0;
+               for (int i = confounder + checksum; i < array.length; i++) {
+                       lessBytes[j] = array[i];
+                       j++;
+               }
+
+               return lessBytes;
+       }
+
+    private byte[] processBlockCipher( boolean encrypt, byte[] data, byte[] 
key, byte[] ivec )
+    {
+               byte[] returnData = new byte[data.length];
+               CBCBlockCipher cbcCipher = new CBCBlockCipher(getBlockCipher());
+               KeyParameter keyParameter = new KeyParameter(key);
+
+               if (ivec != null) {
+                       ParametersWithIV kpWithIV = new 
ParametersWithIV(keyParameter, ivec);
+                       cbcCipher.init(encrypt, kpWithIV);
+               } else
+                       cbcCipher.init(encrypt, keyParameter);
+
+               int offset = 0;
+               int processedBytesLength = 0;
+
+               while (offset < returnData.length) {
+                       try {
+                               processedBytesLength = 
cbcCipher.processBlock(data, offset, returnData, offset);
+                               offset += processedBytesLength;
+                       } catch (Exception e) {
+                               e.printStackTrace();
+                               break;
+                       }
+               }
+
+               return returnData;
        }
 }
 

Modified: 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/NullEncryption.java
==============================================================================
--- 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/NullEncryption.java
      (original)
+++ 
incubator/directory/kerberos/trunk/kerberos/src/java/org/apache/kerberos/crypto/encryption/NullEncryption.java
      Tue Nov  9 19:29:34 2004
@@ -16,47 +16,69 @@
  */
 package org.apache.kerberos.crypto.encryption;
 
-import org.apache.kerberos.crypto.checksum.*;
+import org.apache.kerberos.crypto.checksum.ChecksumEngine;
+import org.apache.kerberos.crypto.checksum.ChecksumType;
+import org.bouncycastle.crypto.BlockCipher;
+
+public class NullEncryption extends EncryptionEngine
+{
+    public BlockCipher getBlockCipher()
+    {
+        return null;
+    }
+
+    public ChecksumEngine getChecksumEngine()
+    {
+        return null;
+    }
 
-public class NullEncryption extends EncryptionEngine {
-
-       public EncryptionType encryptionType() {
+       public EncryptionType encryptionType()
+    {
                return EncryptionType.NULL;
        }
 
-       public CipherType keyType() {
+       public CipherType keyType()
+    {
                return CipherType.NULL;
        }
 
-       public ChecksumType checksumType() {
+       public ChecksumType checksumType()
+    {
                return ChecksumType.NULL;
        }
 
-       public int blockSize() {
+       public int blockSize()
+    {
                return 1;
        }
 
-       public int keySize() {
+       public int keySize()
+    {
                return 0;
        }
 
-       public int checksumSize() {
+       public int checksumSize()
+    {
                return 0;
        }
 
-       public int confounderSize() {
+       public int confounderSize()
+    {
                return 0;
        }
 
-       public int minimumPadSize() {
+       public int minimumPadSize()
+    {
                return 0;
        }
 
-       protected byte[] processBlockCipher(boolean encrypt, byte[] data, 
byte[] key, byte[] ivec) {
+       protected byte[] processBlockCipher(boolean encrypt, byte[] data, 
byte[] key, byte[] ivec)
+    {
                return data;
        }
 
-       public byte[] calculateChecksum(byte[] plainText) {
+       public byte[] calculateChecksum(byte[] plainText)
+    {
                return null;
        }
 }

Reply via email to