blob: 3d9ee9a6a8aa8fca88e2b34ab5606e56cca5d47b [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.crypto.enc.provider.Aes128Provider;
import org.apache.kerby.kerberos.kerb.crypto.enc.provider.Aes256Provider;
import org.apache.kerby.kerberos.kerb.crypto.enc.provider.Camellia128Provider;
import org.apache.kerby.kerberos.kerb.crypto.enc.provider.Camellia256Provider;
import org.apache.kerby.kerberos.kerb.crypto.enc.provider.Des3Provider;
import org.apache.kerby.kerberos.kerb.crypto.key.AesKeyMaker;
import org.apache.kerby.kerberos.kerb.crypto.key.CamelliaKeyMaker;
import org.apache.kerby.kerberos.kerb.crypto.key.Des3KeyMaker;
import org.apache.kerby.kerberos.kerb.crypto.key.DkKeyMaker;
import org.apache.kerby.kerberos.kerb.type.base.EncryptionType;
import org.apache.kerby.util.EncryptoUtil;
import org.apache.kerby.util.HexUtil;
import org.junit.Test;
import java.util.Arrays;
import static org.assertj.core.api.Assertions.fail;
import static org.junit.Assume.assumeTrue;
/**
* Key derivation test with known values.
*/
public class KeyDeriveTest {
static class TestCase {
EncryptionType encType;
String inkey;
String constant;
String answer;
TestCase(EncryptionType encType, String inkey,
String constant, String answer) {
this.encType = encType;
this.inkey = inkey;
this.constant = constant;
this.answer = answer;
}
}
@Test
public void testKeyDerive_DES3_CBC_SHA1_299() throws Exception {
performTest(new TestCase(
EncryptionType.DES3_CBC_SHA1,
"850BB51358548CD05E86768C313E3BFE"
+ "F7511937DCF72C3E",
"0000000299",
"F78C496D16E6C2DAE0E0B6C24057A84C"
+ "0426AEEF26FD6DCE"
));
}
@Test
public void testKeyDerive_DES3_CBC_SHA1_2AA() throws Exception {
performTest(new TestCase(
EncryptionType.DES3_CBC_SHA1,
"850BB51358548CD05E86768C313E3BFE"
+ "F7511937DCF72C3E",
"00000002AA",
"5B5723D0B634CB684C3EBA5264E9A70D"
+ "52E683231AD3C4CE"
));
}
@Test
public void testKeyDerive_DES3_CBC_SHA1_255() throws Exception {
performTest(new TestCase(
EncryptionType.DES3_CBC_SHA1,
"850BB51358548CD05E86768C313E3BFE"
+ "F7511937DCF72C3E",
"0000000255",
"A77C94980E9B7345A81525C423A737CE"
+ "67F4CD91B6B3DA45"
));
}
@Test
public void testKeyDerive_AES128_CTS_HMAC_SHA1_96_299() throws Exception {
performTest(new TestCase(
EncryptionType.AES128_CTS_HMAC_SHA1_96,
"42263C6E89F4FC28B8DF68EE09799F15",
"0000000299",
"34280A382BC92769B2DA2F9EF066854B"
));
}
@Test
public void testKeyDerive_AES128_CTS_HMAC_SHA1_96_2AA() throws Exception {
performTest(new TestCase(
EncryptionType.AES128_CTS_HMAC_SHA1_96,
"42263C6E89F4FC28B8DF68EE09799F15",
"00000002AA",
"5B14FC4E250E14DDF9DCCF1AF6674F53"
));
}
@Test
public void testKeyDerive_AES128_CTS_HMAC_SHA1_96_255() throws Exception {
performTest(new TestCase(
EncryptionType.AES128_CTS_HMAC_SHA1_96,
"42263C6E89F4FC28B8DF68EE09799F15",
"0000000255",
"4ED31063621684F09AE8D89991AF3E8F"
));
}
@Test
public void testKeyDerive_AES256_CTS_HMAC_SHA1_96_299() throws Exception {
assumeTrue(EncryptoUtil.isAES256Enabled());
performTest(new TestCase(
EncryptionType.AES256_CTS_HMAC_SHA1_96,
"FE697B52BC0D3CE14432BA036A92E65B"
+ "BB52280990A2FA27883998D72AF30161",
"0000000299",
"BFAB388BDCB238E9F9C98D6A878304F0"
+ "4D30C82556375AC507A7A852790F4674"
));
}
@Test
public void testKeyDerive_AES256_CTS_HMAC_SHA1_96_2AA() throws Exception {
assumeTrue(EncryptoUtil.isAES256Enabled());
performTest(new TestCase(
EncryptionType.AES256_CTS_HMAC_SHA1_96,
"FE697B52BC0D3CE14432BA036A92E65B"
+ "BB52280990A2FA27883998D72AF30161",
"00000002AA",
"C7CFD9CD75FE793A586A542D87E0D139"
+ "6F1134A104BB1A9190B8C90ADA3DDF37"
));
}
@Test
public void testKeyDerive_AES256_CTS_HMAC_SHA1_96_255() throws Exception {
assumeTrue(EncryptoUtil.isAES256Enabled());
performTest(new TestCase(
EncryptionType.AES256_CTS_HMAC_SHA1_96,
"FE697B52BC0D3CE14432BA036A92E65B"
+ "BB52280990A2FA27883998D72AF30161",
"0000000255",
"97151B4C76945063E2EB0529DC067D97"
+ "D7BBA90776D8126D91F34F3101AEA8BA"
));
}
@Test
public void testKeyDerive_CAMELLIA128_CTS_CMAC_299() throws Exception {
performTest(new TestCase(
EncryptionType.CAMELLIA128_CTS_CMAC,
"57D0297298FFD9D35DE5A47FB4BDE24B",
"0000000299",
"D155775A209D05F02B38D42A389E5A56"
));
}
@Test
public void testKeyDerive_CAMELLIA128_CTS_CMAC_2AA() throws Exception {
performTest(new TestCase(
EncryptionType.CAMELLIA128_CTS_CMAC,
"57D0297298FFD9D35DE5A47FB4BDE24B",
"00000002AA",
"64DF83F85A532F17577D8C37035796AB"
));
}
@Test
public void testKeyDerive_CAMELLIA128_CTS_CMAC_255() throws Exception {
performTest(new TestCase(
EncryptionType.CAMELLIA128_CTS_CMAC,
"57D0297298FFD9D35DE5A47FB4BDE24B",
"0000000255",
"3E4FBDF30FB8259C425CB6C96F1F4635"
));
}
@Test
public void testKeyDerive_CAMELLIA256_CTS_CMAC_299() throws Exception {
performTest(new TestCase(
EncryptionType.CAMELLIA256_CTS_CMAC,
"B9D6828B2056B7BE656D88A123B1FAC6"
+ "8214AC2B727ECF5F69AFE0C4DF2A6D2C",
"0000000299",
"E467F9A9552BC7D3155A6220AF9C1922"
+ "0EEED4FF78B0D1E6A1544991461A9E50"
));
}
@Test
public void testKeyDerive_CAMELLIA256_CTS_CMAC_2AA() throws Exception {
performTest(new TestCase(
EncryptionType.CAMELLIA256_CTS_CMAC,
"B9D6828B2056B7BE656D88A123B1FAC6"
+ "8214AC2B727ECF5F69AFE0C4DF2A6D2C",
"00000002AA",
"412AEFC362A7285FC3966C6A5181E760"
+ "5AE675235B6D549FBFC9AB6630A4C604"
));
}
@Test
public void testKeyDerive_CAMELLIA256_CTS_CMAC_255() throws Exception {
performTest(new TestCase(
EncryptionType.CAMELLIA256_CTS_CMAC,
"B9D6828B2056B7BE656D88A123B1FAC6"
+ "8214AC2B727ECF5F69AFE0C4DF2A6D2C",
"0000000255",
"FA624FA0E523993FA388AEFDC67E67EB"
+ "CD8C08E8A0246B1D73B0D1DD9FC582B0"
));
}
static DkKeyMaker getKeyMaker(EncryptionType encType) {
switch (encType) {
case DES3_CBC_SHA1:
return new Des3KeyMaker(new Des3Provider());
case AES128_CTS_HMAC_SHA1_96:
return new AesKeyMaker(new Aes128Provider());
case AES256_CTS_HMAC_SHA1_96:
return new AesKeyMaker(new Aes256Provider());
case CAMELLIA128_CTS_CMAC:
return new CamelliaKeyMaker(new Camellia128Provider());
case CAMELLIA256_CTS_CMAC:
return new CamelliaKeyMaker(new Camellia256Provider());
default:
return null;
}
}
/**
* Perform key derive tests using the testCase data object
* @param testCase
* @throws Exception
*/
private static void performTest(TestCase testCase) throws Exception {
byte[] answer = HexUtil.hex2bytes(testCase.answer);
byte[] inkey = HexUtil.hex2bytes(testCase.inkey);
byte[] constant = HexUtil.hex2bytes(testCase.constant);
byte[] outkey;
DkKeyMaker km = getKeyMaker(testCase.encType);
outkey = km.dk(inkey, constant);
if (!Arrays.equals(answer, outkey)) {
System.err.println("failed with:");
System.err.println("outKey:" + HexUtil.bytesToHex(outkey));
System.err.println("answer:" + testCase.answer);
fail("KeyDerive test failed for " + testCase.encType.getName());
}
}
}