package org.apache.kerberos.kerb.crypto.cksum;
import org.apache.kerberos.kerb.crypto.Hmac;
import org.apache.kerberos.kerb.crypto.Rc4;
import org.apache.kerberos.kerb.crypto.cksum.provider.Md5Provider;
import org.apache.kerberos.kerb.crypto.enc.provider.Rc4Provider;
import org.apache.kerberos.kerb.KrbException;
import org.apache.kerberos.kerb.spec.common.CheckSumType;
public class Md5HmacRc4CheckSum extends AbstractKeyedCheckSumTypeHandler {
public Md5HmacRc4CheckSum() {
super(new Rc4Provider(), new Md5Provider(), 16, 16);
}
public int confounderSize() {
return 8;
}
public CheckSumType cksumType() {
return CheckSumType.MD5_HMAC_ARCFOUR;
}
public boolean isSafe() {
return true;
}
public int cksumSize() {
return 16; // bytes
}
public int keySize() {
return 16; // bytes
}
@Override
protected byte[] doChecksumWithKey(byte[] data, int start, int len,
byte[] key, int usage) throws KrbException {
byte[] Ksign = key;
byte[] salt = Rc4.getSalt(usage, false);
hashProvider().hash(salt);
hashProvider().hash(data, start, len);
byte[] hashTmp = hashProvider().output();
byte[] hmac = Hmac.hmac(hashProvider(), Ksign, hashTmp);
return hmac;
}
}