package org.apache.kerberos.kerb.crypto.enc; import org.apache.kerberos.kerb.crypto.AbstractCryptoTypeHandler; import org.apache.kerberos.kerb.crypto.EncTypeHandler; import org.apache.kerberos.kerb.crypto.cksum.HashProvider; import org.apache.kerberos.kerb.crypto.key.KeyMaker; import org.apache.kerberos.kerb.KrbException; public abstract class AbstractEncTypeHandler extends AbstractCryptoTypeHandler implements EncTypeHandler { private KeyMaker keyMaker; public AbstractEncTypeHandler(EncryptProvider encProvider, HashProvider hashProvider) { super(encProvider, hashProvider); } protected void keyMaker(KeyMaker keyMaker) { this.keyMaker = keyMaker; } protected KeyMaker keyMaker() { return keyMaker; } @Override public String name() { return eType().getName(); } @Override public String displayName() { return eType().getDisplayName(); } protected int paddingLength(int inputLen) { int payloadLen = confounderSize() + checksumSize() + inputLen; int padding = paddingSize(); if (padding == 0 || (payloadLen % padding) == 0) { return 0; } return padding - (payloadLen % padding); } @Override public int keyInputSize() { return encProvider().keyInputSize(); } @Override public int keySize() { return encProvider().keySize(); } @Override public int confounderSize() { return encProvider().blockSize(); } @Override public int checksumSize() { return hashProvider().hashSize(); } @Override public int paddingSize() { return encProvider().blockSize(); } @Override public byte[] str2key(String string, String salt, byte[] param) throws KrbException { return keyMaker.str2key(string, salt, param); } @Override public byte[] random2Key(byte[] randomBits) throws KrbException { return keyMaker.random2Key(randomBits); } @Override public byte[] encrypt(byte[] data, byte[] key, int usage) throws KrbException { byte[] iv = new byte[encProvider().blockSize()]; return encrypt(data, key, iv, usage); } @Override public byte[] encrypt(byte[] data, byte[] key, byte[] iv, int usage) throws KrbException { int confounderLen = confounderSize(); int checksumLen = checksumSize(); int headerLen = confounderLen + checksumLen; int inputLen = data.length; int paddingLen = paddingLength(inputLen); /** * E(Confounder | Checksum | Plaintext | Padding), or * header | data | padding | trailer, where trailer may be absent */ int workLength = headerLen + inputLen + paddingLen; byte[] workBuffer = new byte[workLength]; System.arraycopy(data, 0, workBuffer, headerLen, data.length); int [] workLens = new int[] {confounderLen, checksumLen, inputLen, paddingLen}; encryptWith(workBuffer, workLens, key, iv, usage); return workBuffer; } protected void encryptWith(byte[] workBuffer, int[] workLens, byte[] key, byte[] iv, int usage) throws KrbException { } public byte[] decrypt(byte[] cipher, byte[] key, int usage) throws KrbException { byte[] iv = new byte[encProvider().blockSize()]; return decrypt(cipher, key, iv, usage); } public byte[] decrypt(byte[] cipher, byte[] key, byte[] iv, int usage) throws KrbException { int totalLen = cipher.length; int confounderLen = confounderSize(); int checksumLen = checksumSize(); int dataLen = totalLen - (confounderLen + checksumLen); int[] workLens = new int[] {confounderLen, checksumLen, dataLen}; return decryptWith(cipher, workLens, key, iv, usage); } protected byte[] decryptWith(byte[] workBuffer, int[] workLens, byte[] key, byte[] iv, int usage) throws KrbException { return null; } }