blob: fc23f7742b2cd8f8d850c998816f12edb9d18b9e [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.kerby.kerberos.kerb.crypto;
import org.apache.kerby.kerberos.kerb.type.base.CheckSum;
import org.apache.kerby.kerberos.kerb.type.base.CheckSumType;
import org.apache.kerby.kerberos.kerb.type.base.EncryptionType;
import org.apache.kerby.kerberos.kerb.type.base.KeyUsage;
import org.apache.kerby.util.EncryptoUtil;
import org.apache.kerby.util.HexUtil;
import org.junit.Test;
import static org.assertj.core.api.Assertions.fail;
import static org.junit.Assume.assumeTrue;
/**
* These are to test the checksums of good answers, and the checksums
* are deterministic. For other cases, look at CheckSumTest.
*/
public class CheckSumsTest {
private 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;
}
}
@Test
public void testCheckSums_CRC32() throws Exception {
performTest(new CksumTest(
"abc",
CheckSumType.CRC32, EncryptionType.NONE, 0, "",
"D09865CA"
));
}
@Test
public void testCheckSums_RSA_MD4() throws Exception {
performTest(new CksumTest(
"one",
CheckSumType.RSA_MD4, EncryptionType.NONE, 0, "",
"305DCC2C0FDD5339969552C7B8996348"
));
}
@Test
public void testCheckSums_RSA_MD5() throws Exception {
performTest(new CksumTest(
"two three four five",
CheckSumType.RSA_MD5, EncryptionType.NONE, 0, "",
"BAB5321551E1084490869635B3C26815"
));
}
@Test
public void testCheckSums_NIST_SHA() throws Exception {
performTest(new CksumTest(
"",
CheckSumType.NIST_SHA, EncryptionType.NONE, 0, "",
"DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"
));
}
@Test
public void testCheckSums_HMAC_SHA1_DES3() throws Exception {
performTest(new CksumTest(
"six seven",
CheckSumType.HMAC_SHA1_DES3, EncryptionType.DES3_CBC_SHA1, 2,
"7A25DF8992296DCEDA0E135BC4046E2375B3C14C98FBC162",
"0EEFC9C3E049AABC1BA5C401677D9AB699082BB4"
));
}
@Test
public void testCheckSums_HMAC_SHA1_96_AES128() throws Exception {
performTest(new CksumTest(
"eight nine ten eleven twelve thirteen",
CheckSumType.HMAC_SHA1_96_AES128, EncryptionType.AES128_CTS_HMAC_SHA1_96, 3,
"9062430C8CDA3388922E6D6A509F5B7A",
"01A4B088D45628F6946614E3"
));
}
@Test
public void testCheckSums_HMAC_SHA1_96_AES256() throws Exception {
assumeTrue(EncryptoUtil.isAES256Enabled());
performTest(new CksumTest(
"fourteen",
CheckSumType.HMAC_SHA1_96_AES256, EncryptionType.AES256_CTS_HMAC_SHA1_96, 4,
"B1AE4CD8462AFF1677053CC9279AAC30B796FB81CE21474DD3DDBCFEA4EC76D7",
"E08739E3279E2903EC8E3836"
));
}
@Test
public void testCheckSums_MD5_HMAC_ARCFOUR() throws Exception {
performTest(new CksumTest(
"fifteen sixteen",
CheckSumType.MD5_HMAC_ARCFOUR, EncryptionType.ARCFOUR_HMAC, 5,
"F7D3A155AF5E238A0B7A871A96BA2AB2",
"9F41DF304907DE735447001FD2A197B9"
));
}
@Test
public void testCheckSums_HMAC_MD5_ARCFOUR() throws Exception {
performTest(new CksumTest(
"seventeen eighteen nineteen twenty",
CheckSumType.HMAC_MD5_ARCFOUR, EncryptionType.ARCFOUR_HMAC, 6,
"F7D3A155AF5E238A0B7A871A96BA2AB2",
"EB38CC97E2230F59DA4117DC5859D7EC"
));
}
@Test
public void testCheckSums_CMAC_CAMELLIA128_1() throws Exception {
performTest(new CksumTest(
"abcdefghijk",
CheckSumType.CMAC_CAMELLIA128, EncryptionType.CAMELLIA128_CTS_CMAC, 7,
"1DC46A8D763F4F93742BCBA3387576C3",
"1178E6C5C47A8C1AE0C4B9C7D4EB7B6B"
));
}
@Test
public void testCheckSums_CMAC_CAMELLIA128_2() throws Exception {
performTest(new CksumTest(
"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
CheckSumType.CMAC_CAMELLIA128, EncryptionType.CAMELLIA128_CTS_CMAC, 8,
"5027BC231D0F3A9D23333F1CA6FDBE7C",
"D1B34F7004A731F23A0C00BF6C3F753A"
));
}
@Test
public void testCheckSums_CMAC_CAMELLIA256_1() throws Exception {
performTest(new CksumTest(
"123456789",
CheckSumType.CMAC_CAMELLIA256, EncryptionType.CAMELLIA256_CTS_CMAC, 9,
"B61C86CC4E5D2757545AD423399FB7031ECAB913CBB900BD7A3C6DD8BF92015B",
"87A12CFD2B96214810F01C826E7744B1"
));
}
@Test
public void testCheckSums_CMAC_CAMELLIA256_2() throws Exception {
performTest(new CksumTest(
"!@#$%^&*()!@#$%^&*()!@#$%^&*()",
CheckSumType.CMAC_CAMELLIA256, EncryptionType.CAMELLIA256_CTS_CMAC, 10,
"32164C5B434D1D1538E4CFD9BE8040FE8C4AC7ACC4B93D3314D2133668147A05",
"3FA0B42355E52B189187294AA252AB64"
));
}
/**
* Perform checksum checks using the testcase data object
* @param testCase
* @throws Exception
*/
private static void performTest(CksumTest testCase) throws Exception {
byte[] answer = HexUtil.hex2bytes(testCase.answer);
byte[] plainData = testCase.plainText.getBytes();
CheckSum newCksum;
if (!CheckSumHandler.isImplemented(testCase.cksumType)) {
fail("Checksum type not supported yet: "
+ testCase.cksumType.getName());
return;
}
if (testCase.encType != EncryptionType.NONE) {
/**
* For keyed checksum types
*/
if (!EncryptionHandler.isImplemented(testCase.encType)) {
fail("Key type not supported yet: " + testCase.encType.getName());
return;
}
byte[] key = HexUtil.hex2bytes(testCase.key);
KeyUsage keyUsage = KeyUsage.fromValue(testCase.keyUsage);
newCksum = CheckSumHandler.checksumWithKey(testCase.cksumType, plainData, key, keyUsage);
if (!CheckSumHandler.verifyWithKey(newCksum, plainData, key, keyUsage)) {
fail("Checksum test failed for " + testCase.cksumType.getName());
}
} else {
/**
* For un-keyed checksum types
*/
newCksum = CheckSumHandler.checksum(testCase.cksumType, plainData);
if (!CheckSumHandler.verify(newCksum, plainData)) {
fail("Checksum and verifying failed for " + testCase.cksumType.getName());
}
}
if (!newCksum.isEqual(answer)) {
fail("Checksum test failed for " + testCase.cksumType.getName());
}
}
}