| /** |
| * 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()); |
| } |
| } |
| } |