package org.apache.kerberos.kerb.crypto;
import org.apache.kerberos.kerb.KrbErrorCode;
import org.apache.kerberos.kerb.KrbException;
import org.apache.kerberos.kerb.crypto.cksum.*;
import org.apache.kerberos.kerb.spec.common.CheckSum;
import org.apache.kerberos.kerb.spec.common.CheckSumType;
import org.apache.kerberos.kerb.spec.common.KeyUsage;
public class CheckSumHandler {
public static CheckSumTypeHandler getCheckSumHandler(String cksumType) throws KrbException {
CheckSumType eTypeEnum = CheckSumType.fromName(cksumType);
return getCheckSumHandler(eTypeEnum);
}
public static CheckSumTypeHandler getCheckSumHandler(int cksumType) throws KrbException {
CheckSumType eTypeEnum = CheckSumType.fromValue(cksumType);
return getCheckSumHandler(eTypeEnum);
}
public static boolean isImplemented(CheckSumType cksumType) throws KrbException {
return getCheckSumHandler(cksumType, true) != null;
}
public static CheckSumTypeHandler getCheckSumHandler(CheckSumType cksumType) throws KrbException {
return getCheckSumHandler(cksumType, false);
}
private static CheckSumTypeHandler getCheckSumHandler(CheckSumType cksumType, boolean check) throws KrbException {
CheckSumTypeHandler cksumHandler = null;
switch (cksumType) {
case CRC32:
cksumHandler = new Crc32CheckSum();
break;
case DES_MAC:
cksumHandler = new DesCbcCheckSum();
break;
case RSA_MD4:
cksumHandler = new RsaMd4CheckSum();
break;
case RSA_MD5:
cksumHandler = new RsaMd5CheckSum();
break;
case NIST_SHA:
cksumHandler = new Sha1CheckSum();
break;
case RSA_MD4_DES:
cksumHandler = new RsaMd4DesCheckSum();
break;
case RSA_MD5_DES:
cksumHandler = new RsaMd5DesCheckSum();
break;
case HMAC_SHA1_DES3:
case HMAC_SHA1_DES3_KD:
cksumHandler = new HmacSha1Des3CheckSum();
break;
case HMAC_SHA1_96_AES128:
cksumHandler = new HmacSha1Aes128CheckSum();
break;
case HMAC_SHA1_96_AES256:
cksumHandler = new HmacSha1Aes256CheckSum();
break;
case CMAC_CAMELLIA128:
cksumHandler = new CmacCamellia128CheckSum();
break;
case CMAC_CAMELLIA256:
cksumHandler = new CmacCamellia256CheckSum();
break;
case HMAC_MD5_ARCFOUR:
cksumHandler = new HmacMd5Rc4CheckSum();
break;
case MD5_HMAC_ARCFOUR:
cksumHandler = new Md5HmacRc4CheckSum();
break;
default:
break;
}
if (cksumHandler == null && ! check) {
String message = "Unsupported checksum type: " + cksumType.name();
throw new KrbException(KrbErrorCode.KDC_ERR_SUMTYPE_NOSUPP, message);
}
return cksumHandler;
}
public static CheckSum checksum(CheckSumType checkSumType, byte[] bytes) throws KrbException {
CheckSumTypeHandler handler = getCheckSumHandler(checkSumType);
byte[] checksumBytes = handler.checksum(bytes);
CheckSum checkSum = new CheckSum();
checkSum.setCksumtype(checkSumType);
checkSum.setChecksum(checksumBytes);
return checkSum;
}
public static boolean verify(CheckSum checkSum, byte[] bytes) throws KrbException {
CheckSumType checkSumType = checkSum.getCksumtype();
CheckSumTypeHandler handler = getCheckSumHandler(checkSumType);
return handler.verify(bytes, checkSum.getChecksum());
}
public static CheckSum checksumWithKey(CheckSumType checkSumType,
byte[] bytes, byte[] key, KeyUsage usage) throws KrbException {
CheckSumTypeHandler handler = getCheckSumHandler(checkSumType);
byte[] checksumBytes = handler.checksumWithKey(bytes, key, usage.getValue());
CheckSum checkSum = new CheckSum();
checkSum.setCksumtype(checkSumType);
checkSum.setChecksum(checksumBytes);
return checkSum;
}
public static boolean verifyWithKey(CheckSum checkSum, byte[] bytes,
byte[] key, KeyUsage usage) throws KrbException {
CheckSumType checkSumType = checkSum.getCksumtype();
CheckSumTypeHandler handler = getCheckSumHandler(checkSumType);
return handler.verifyWithKey(bytes, key,
usage.getValue(), checkSum.getChecksum());
}
}