package org.apache.kerberos.kerb.crypto.enc.provider;
import org.apache.kerberos.kerb.KrbException;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.GeneralSecurityException;
public class DesProvider extends AbstractEncryptProvider {
public DesProvider() {
super(8, 7, 8);
}
@Override
protected void doEncrypt(byte[] input, byte[] key,
byte[] cipherState, boolean encrypt) throws KrbException {
Cipher cipher = null;
try {
cipher = Cipher.getInstance("DES/CBC/NoPadding");
} catch (GeneralSecurityException e) {
throw new KrbException("Failed to init cipher", e);
}
IvParameterSpec params = new IvParameterSpec(cipherState);
SecretKeySpec skSpec = new SecretKeySpec(key, "DES");
try {
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = (SecretKey) skSpec;
cipher.init(encrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, sk, params);
byte[] output = cipher.doFinal(input);
System.arraycopy(output, 0, input, 0, output.length);
} catch (GeneralSecurityException e) {
KrbException ke = new KrbException(e.getMessage());
ke.initCause(e);
throw ke;
}
}
@Override
public byte[] cbcMac(byte[] key, byte[] cipherState, byte[] data) throws KrbException {
Cipher cipher = null;
try {
cipher = Cipher.getInstance("DES/CBC/NoPadding");
} catch (GeneralSecurityException e) {
throw new KrbException("Failed to init cipher", e);
}
IvParameterSpec params = new IvParameterSpec(cipherState);
SecretKeySpec skSpec = new SecretKeySpec(key, "DES");
byte[] output = null;
try {
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
// SecretKey sk = skf.generateSecret(skSpec);
SecretKey sk = (SecretKey) skSpec;
cipher.init(Cipher.ENCRYPT_MODE, sk, params);
for (int i = 0; i < data.length / 8; i++) {
output = cipher.doFinal(data, i * 8, 8);
cipher.init(Cipher.ENCRYPT_MODE, sk, (new IvParameterSpec(output)));
}
}
catch (GeneralSecurityException e) {
KrbException ke = new KrbException(e.getMessage());
ke.initCause(e);
throw ke;
}
return output;
}
@Override
public boolean supportCbcMac() {
return true;
}
}