package org.apache.kerberos.kerb.crypto;
import org.apache.kerberos.kerb.spec.common.CheckSum;
import org.apache.kerberos.kerb.spec.common.CheckSumType;
import org.apache.kerberos.kerb.spec.common.EncryptionType;
import org.apache.kerberos.kerb.spec.common.KeyUsage;
import org.junit.Test;
/**
* These are to test the checksums of good answers, and the checksums
* are deterministic. For other cases, look at CheckSumTest.
*/
public class CheckSumsTest {
static class CksumTest {
String plainText;
CheckSumType cksumType;
EncryptionType encType;
String key;
int keyUsage;
String answer;
CksumTest(String plainText, CheckSumType cksumType, EncryptionType encType,
int keyUsage, String key, String answer) {
this.plainText = plainText;
this.cksumType = cksumType;
this.encType = encType;
this.key = key;
this.keyUsage = keyUsage;
this.answer = answer;
}
}
static CksumTest[] testCases = new CksumTest[] {
new CksumTest(
"abc",
CheckSumType.CRC32, EncryptionType.NONE, 0, "",
"D09865CA"
),
new CksumTest(
"one",
CheckSumType.RSA_MD4, EncryptionType.NONE, 0, "",
"305DCC2C0FDD5339969552C7B8996348"
),
new CksumTest(
"two three four five",
CheckSumType.RSA_MD5, EncryptionType.NONE, 0, "",
"BAB5321551E1084490869635B3C26815"
),
new CksumTest(
"",
CheckSumType.NIST_SHA, EncryptionType.NONE, 0, "",
"DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"
),
new CksumTest(
"six seven",
CheckSumType.HMAC_SHA1_DES3, EncryptionType.DES3_CBC_SHA1, 2,
"7A25DF8992296DCEDA0E135BC4046E2375B3C14C98FBC162",
"0EEFC9C3E049AABC1BA5C401677D9AB699082BB4"
),
new CksumTest(
"eight nine ten eleven twelve thirteen",
CheckSumType.HMAC_SHA1_96_AES128, EncryptionType.AES128_CTS_HMAC_SHA1_96, 3,
"9062430C8CDA3388922E6D6A509F5B7A",
"01A4B088D45628F6946614E3"
),
new CksumTest(
"fourteen",
CheckSumType.HMAC_SHA1_96_AES256, EncryptionType.AES256_CTS_HMAC_SHA1_96, 4,
"B1AE4CD8462AFF1677053CC9279AAC30B796FB81CE21474DD3DDBCFEA4EC76D7",
"E08739E3279E2903EC8E3836"
),
new CksumTest(
"fifteen sixteen",
CheckSumType.MD5_HMAC_ARCFOUR, EncryptionType.ARCFOUR_HMAC, 5,
"F7D3A155AF5E238A0B7A871A96BA2AB2",
"9F41DF304907DE735447001FD2A197B9"
),
new CksumTest(
"seventeen eighteen nineteen twenty",
CheckSumType.HMAC_MD5_ARCFOUR, EncryptionType.ARCFOUR_HMAC, 6,
"F7D3A155AF5E238A0B7A871A96BA2AB2",
"EB38CC97E2230F59DA4117DC5859D7EC"
),
new CksumTest(
"abcdefghijk",
CheckSumType.CMAC_CAMELLIA128, EncryptionType.CAMELLIA128_CTS_CMAC, 7,
"1DC46A8D763F4F93742BCBA3387576C3",
"1178E6C5C47A8C1AE0C4B9C7D4EB7B6B"
),
new CksumTest(
"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
CheckSumType.CMAC_CAMELLIA128, EncryptionType.CAMELLIA128_CTS_CMAC, 8,
"5027BC231D0F3A9D23333F1CA6FDBE7C",
"D1B34F7004A731F23A0C00BF6C3F753A"
),
new CksumTest(
"123456789",
CheckSumType.CMAC_CAMELLIA256, EncryptionType.CAMELLIA256_CTS_CMAC, 9,
"B61C86CC4E5D2757545AD423399FB7031ECAB913CBB900BD7A3C6DD8BF92015B",
"87A12CFD2B96214810F01C826E7744B1"
),
new CksumTest(
"!@#$%^&*()!@#$%^&*()!@#$%^&*()",
CheckSumType.CMAC_CAMELLIA256, EncryptionType.CAMELLIA256_CTS_CMAC, 10,
"32164C5B434D1D1538E4CFD9BE8040FE8C4AC7ACC4B93D3314D2133668147A05",
"3FA0B42355E52B189187294AA252AB64"
)
};
@Test
public void testCheckSums() {
for (CksumTest tc : testCases) {
System.err.println("Checksum testing for " + tc.cksumType.getName());
try {
testWith(tc);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void testWith(CksumTest testCase) throws Exception {
byte[] answer = TestUtil.hex2bytes(testCase.answer);
byte[] plainData = testCase.plainText.getBytes();
CheckSum newCksum;
if (! CheckSumHandler.isImplemented(testCase.cksumType)) {
System.err.println("Checksum type not supported yet: "
+ testCase.cksumType.getName());
return;
}
if (testCase.encType != EncryptionType.NONE) {
if (! EncryptionHandler.isImplemented(testCase.encType)) {
System.err.println("Key type not supported yet: " + testCase.encType.getName());
return;
}
byte[] key = TestUtil.hex2bytes(testCase.key);
KeyUsage keyUsage = KeyUsage.fromValue(testCase.keyUsage);
newCksum = CheckSumHandler.checksumWithKey(testCase.cksumType, plainData, key, keyUsage);
if (CheckSumHandler.verifyWithKey(newCksum, plainData, key, keyUsage)) {
System.err.println("Checksum test OK for " + testCase.cksumType.getName());
} else {
System.err.println("Checksum test failed for " + testCase.cksumType.getName());
}
} else {
newCksum = CheckSumHandler.checksum(testCase.cksumType, plainData);
if (CheckSumHandler.verify(newCksum, plainData)) {
System.err.println("Checksum and verifying OK for " + testCase.cksumType.getName());
} else {
System.err.println("Checksum and verifying failed for " + testCase.cksumType.getName());
}
}
if (! newCksum.isEqual(answer)) {
System.err.println("Checksum test failed for " + testCase.cksumType.getName());
} else {
System.err.println("Checksum test OK for " + testCase.cksumType.getName());
}
}
}