/**
 *  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.EncryptionKey;
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.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.junit.Assume.assumeTrue;

/**
 * Decryption test with known ciphertexts.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class DecryptionTest {
    /**
     * The class used to store the test values
     */
    private static class TestCase {
        EncryptionType encType;
        String plainText;
        int keyUsage;
        String key;
        String cipher;

        TestCase(EncryptionType encType, String plainText,
                 int keyUsage, String key, String cipher) {
            this.encType = encType;
            this.plainText = plainText;
            this.keyUsage = keyUsage;
            this.key = key;
            this.cipher = cipher;
        }
    }

    /**
     * Actually do the test
     */
    private boolean testDecrypt(TestCase testCase) throws Exception {
        KeyUsage ku = KeyUsage.fromValue(testCase.keyUsage);

        byte[] cipherBytes = HexUtil.hex2bytes(testCase.cipher);
        byte[] keyBytes = HexUtil.hex2bytes(testCase.key);

        EncryptionKey encKey = new EncryptionKey(testCase.encType, keyBytes);
        byte[] decrypted = EncryptionHandler.decrypt(cipherBytes, encKey, ku);
        String plainText = new String(decrypted);

        return plainText.startsWith(testCase.plainText);
    }

    /**
     * Perform all the checks for a testcase
     */
    private void performTestDecrypt(TestCase testCase) {
        //assertThat(EncryptionHandler.isImplemented(testCase.encType)).isTrue();
        if (!EncryptionHandler.isImplemented(testCase.encType)) {
            System.err.println("Not implemented yet: " + testCase.encType.getDisplayName());
            return;
        }

        try {
            assertThat(testDecrypt(testCase)).isTrue();
        } catch (Exception e) {
            fail(e.getMessage());
        }
    }

    /**
     * Test for DES_CBC_CRC encryption type, with 0 byte
     */
    @Test
    public void testDecryptDES_CBC_CRC_0() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_CRC,
                "", 0,
                "45E6087CDF138FB5",
                "28F6B09A012BCCF72FB05122B2839E6E");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_CRC encryption type, with 1 byte
     */
    @Test
    public void testDecryptDES_CBC_CRC_1() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_CRC,
                "1", 1,
                "92A7155810586B2F",
                "B4C871C2F3E7BF7605EFD62F2EEEC205");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_CRC encryption type, with 9 bytes
     */
    @Test
    public void testDecryptDES_CBC_CRC_9() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_CRC,
                "9 bytesss", 2,
                "A4B9514A61646423",
                "5F14C35178D33D7CDE0EC169C623CC83" + "21B7B8BD34EA7EFE");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_CRC encryption type, with 13 bytes
     */
    @Test
    public void testDecryptDES_CBC_CRC_13() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_CRC,
                "13 bytes byte", 3,
                "2F16A2A7FDB05768",
                "0B588E38D971433C9D86D8BAEBF63E4C" + "1A01666E76D8A54A3293F72679ED88C9");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_CRC encryption type, with 30 bytes
     */
    @Test
    public void testDecryptDES_CBC_CRC_30() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_CRC,
                "30 bytes bytes bytes bytes byt", 4,
                "BC8F70FD2097D67C",
                "38D632D2C20A7C2EA250FC8ECE42938E"
                        + "92A9F5D302502665C1A33729C1050DC2"
                        + "056298FBFB1682CEEB65E59204FDA7DF");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_MD4 encryption type, with 0 byte
     */
    @Test
    public void testDecryptDES_CBC_MD4_0() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_MD4,
                "", 0,
                "13EF45D0D6D9A15D",
                "1FB202BF07AF3047FB7801E588568686"
                        + "BA63D78BE3E87DC7");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_MD4 encryption type, with 1 byte
     */
    @Test
    public void testDecryptDES_CBC_MD4_1() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_MD4,
                "1", 1,
                "64688654DC269E67",
                "1F6CB9CECB73F755ABFDB3D565BD31D5"
                        + "A2E64BFE44C491E20EEBE5BD20E4D2A9");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_MD4 encryption type, with 9 bytes
     */
    @Test
    public void testDecryptDES_CBC_MD4_9() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_MD4,
                "9 bytesss", 2,
                "6804FB26DF8A4C32",
                "08A53D62FEC3338AD1D218E60DBDD3B2"
                        + "12940679D125E0621B3BAB4680CE0367"
                        + "6A2C420E9BE784EB");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_MD4 encryption type, with 13 bytes
     */
    @Test
    public void testDecryptDES_CBC_MD4_13() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_MD4,
                "13 bytes byte", 3,
                "234A436EC72FA80B",
                "17CD45E14FF06B2840A6036E9AA7A414"
                        + "4E29768144A0C1827D8C4BC7C9906E72"
                        + "CD4DC328F6648C99");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_MD4 encryption type, with 30 bytes
     */
    @Test
    public void testDecryptDES_CBC_MD4_30() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_MD4,
                "30 bytes bytes bytes bytes byt", 4,
                "1FD5F74334C4FB8C",
                "51134CD8951E9D57C0A36053E04CE03E"
                        + "CB8422488FDDC5C074C4D85E60A2AE42"
                        + "3C3C701201314F362CB07448091679C6"
                        + "A496C11D7B93C71B");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_MD5 encryption type, with 0 byte
     */
    @Test
    public void testDecryptDES_CBC_MD5_0() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_MD5,
                "", 0,
                "4A545E0BF7A22631",
                "784CD81591A034BE82556F56DCA3224B"
                        + "62D9956FA90B1B93");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_MD5 encryption type, with 1 byte
     */
    @Test
    public void testDecryptDES_CBC_MD5_1() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_MD5,
                "1", 1,
                "D5804A269DC4E645",
                "FFA25C7BE287596BFE58126E90AAA0F1"
                        + "2D9A82A0D86DF6D5F9074B6B399E7FF1");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_MD5 encryption type, with 9 bytes
     */
    @Test
    public void testDecryptDES_CBC_MD5_9() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_MD5,
                "9 bytesss", 2,
                "C8312F7F83EA4640",
                "E7850337F2CC5E3F35CE3D69E2C32986"
                        + "38A7AA44B878031E39851E47C15B5D0E"
                        + "E7E7AC54DE111D80");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_MD5 encryption type, with 13 bytes
     */
    @Test
    public void testDecryptDES_CBC_MD5_13() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_MD5,
                "13 bytes byte", 3,
                "7FDA3E62AD8AF18C",
                "D7A8032E19994C928777506595FBDA98"
                        + "83158A8514548E296E911C29F465C672"
                        + "366000558BFC2E88");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_MD5 encryption type, with 30 bytes
     */
    @Test
    public void testDecryptDES_CBC_MD5_30() {
        TestCase testCase = new TestCase(
                EncryptionType.DES_CBC_MD5,
                "30 bytes bytes bytes bytes byt", 4,
                "D3D6832970A73752",
                "8A48166A4C6FEAE607A8CF68B381C075"
                        + "5E402B19DBC0F81A7D7CA19A25E05223"
                        + "F6064409BF5A4F50ACD826639FFA7673"
                        + "FD324EC19E429502");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_SHA1 encryption type, with 0 byte
     */
    @Test
    public void testDecryptDES_CBC_SHA1_0() {
        TestCase testCase = new TestCase(
                EncryptionType.DES3_CBC_SHA1,
                "", 0,
                "7A25DF8992296DCEDA0E135BC4046E23"
                        + "75B3C14C98FBC162",
                "548AF4D504F7D723303F12175FE8386B"
                        + "7B5335A967BAD61F3BF0B143");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_SHA1 encryption type, with 1 byte
     */
    @Test
    public void testDecryptDES_CBC_SHA1_1() {
        TestCase testCase = new TestCase(
                EncryptionType.DES3_CBC_SHA1,
                "1", 1,
                "BC0783891513D5CE57BC138FD3C11AE6"
                        + "40452385322962B6",
                "9C3C1DBA4747D85AF2916E4745F2DCE3"
                        + "8046796E5104BCCDFB669A91D44BC356"
                        + "660945C7");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_SHA1 encryption type, with 9 bytes
     */
    @Test
    public void testDecryptDES_CBC_SHA1_9() {
        TestCase testCase = new TestCase(
                EncryptionType.DES3_CBC_SHA1,
                "9 bytesss", 2,
                "2FD0F725CE04100D2FC8A18098831F85"
                        + "0B45D9EF850BD920",
                "CF9144EBC8697981075A8BAD8D74E5D7"
                        + "D591EB7D9770C7ADA25EE8C5B3D69444"
                        + "DFEC79A5B7A01482D9AF74E6");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_SHA1 encryption type, with 13 bytes
     */
    @Test
    public void testDecryptDES_CBC_SHA1_13() {
        TestCase testCase = new TestCase(
                EncryptionType.DES3_CBC_SHA1,
                "13 bytes byte", 3,
                "0DD52094E0F41CECCB5BE510A764B351"
                        + "76E3981332F1E598",
                "839A17081ECBAFBCDC91B88C6955DD3C"
                        + "4514023CF177B77BF0D0177A16F705E8"
                        + "49CB7781D76A316B193F8D30");

        performTestDecrypt(testCase);
    }


    /**
     * Test for DES_CBC_SHA1 encryption type, with 30 bytes
     */
    @Test
    public void testDecryptDES_CBC_SHA1_30() {
        TestCase testCase = new TestCase(
                EncryptionType.DES3_CBC_SHA1,
                "30 bytes bytes bytes bytes byt", 4,
                "F11686CBBC9E23EA54FECD2A3DCDFB20"
                        + "B6FE98BF2645C4C4",
                "89433E83FD0EA3666CFFCD18D8DEEBC5"
                        + "3B9A34EDBEB159D9F667C6C2B9A96440"
                        + "1D55E7E9C68D648D65C3AA84FFA3790C"
                        + "14A864DA8073A9A95C4BA2BC");

        performTestDecrypt(testCase);
    }


    /**
     * Test for ARCFOUR_HMAC encryption type, with 0 byte
     */
    @Test
    public void testDecryptARC_FOUR_0() {
        TestCase testCase = new TestCase(
                EncryptionType.ARCFOUR_HMAC,
                "", 0,
                "F81FEC39255F5784E850C4377C88BD85",
                "02C1EB15586144122EC717763DD348BF"
                        + "00434DDC6585954C"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for ARCFOUR_HMAC encryption type, with 1 byte
     */
    @Test
    public void testDecryptARC_FOUR_1() {
        TestCase testCase = new TestCase(
                EncryptionType.ARCFOUR_HMAC,
                "1", 1,
                "67D1300D281223867F9647FF48721273",
                "6156E0CC04E0A0874F9FDA008F498A7A"
                        + "DBBC80B70B14DDDBC0"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for ARCFOUR_HMAC encryption type, with 9 bytes
     */
    @Test
    public void testDecryptARC_FOUR_9() {
        TestCase testCase = new TestCase(
                EncryptionType.ARCFOUR_HMAC,
                "9 bytesss", 2,
                "3E40AB6093695281B3AC1A9304224D98",
                "0F9AD121D99D4A09448E4F1F718C4F5C"
                        + "BE6096262C66F29DF232A87C9F98755D"
                        + "55"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for ARCFOUR_HMAC encryption type, with 13 bytes
     */
    @Test
    public void testDecryptARC_FOUR_13() {
        TestCase testCase = new TestCase(
                EncryptionType.ARCFOUR_HMAC,
                "13 bytes byte", 3,
                "4BA2FBF0379FAED87A254D3B353D5A7E",
                "612C57568B17A70352BAE8CF26FB9459"
                        + "A6F3353CD35FD439DB3107CBEC765D32"
                        + "6DFC04C1DD"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for ARCFOUR_HMAC encryption type, with 30 bytes
     */
    @Test
    public void testDecryptARC_FOUR_30() {
        TestCase testCase = new TestCase(
                EncryptionType.ARCFOUR_HMAC,
                "30 bytes bytes bytes bytes byt", 4,
                "68F263DB3FCE15D031C9EAB02D67107A",
                "95F9047C3AD75891C2E9B04B16566DC8"
                        + "B6EB9CE4231AFB2542EF87A7B5A0F260"
                        + "A99F0460508DE0CECC632D07C354124E"
                        + "46C5D2234EB8"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for ARCFOUR_HMAC_EXP encryption type, with 0 byte
     */
    @Test
    public void testDecryptARCFOUR_HMAC_EXP_0() {
        TestCase testCase = new TestCase(
                EncryptionType.ARCFOUR_HMAC_EXP,
                "", 0,
                "F7D3A155AF5E238A0B7A871A96BA2AB2",
                "2827F0E90F62E7460C4E2FB39F9657BA"
                        + "8BFAA991D7FDADFF"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for ARCFOUR_HMAC encryption type, with 1 byte
     */
    @Test
    public void testDecryptARCFOUR_HMAC_EXP_1() {
        TestCase testCase = new TestCase(
                EncryptionType.ARCFOUR_HMAC_EXP,
                "1", 1,
                "DEEAA0607DB799E2FDD6DB2986BB8D65",
                "3DDA392E2E275A4D75183FA6328A0A4E"
                        + "6B752DF6CD2A25FA4E"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for ARCFOUR_HMAC encryption type, with 9 bytes
     */
    @Test
    public void testDecryptARCFOUR_HMAC_EXP_9() {
        TestCase testCase = new TestCase(
                EncryptionType.ARCFOUR_HMAC_EXP,
                "9 bytesss", 2,
                "33AD7FC2678615569B2B09836E0A3AB6",
                "09D136AC485D92644EC6701D6A0D03E8"
                        + "982D7A3CA7EFD0F8F4F83660EF4277BB"
                        + "81"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for ARCFOUR_HMAC encryption type, with 13 bytes
     */
    @Test
    public void testDecryptARCFOUR_HMAC_EXP_13() {
        TestCase testCase = new TestCase(
                EncryptionType.ARCFOUR_HMAC_EXP,
                "13 bytes byte", 3,
                "39F25CD4F0D41B2B2D9D300FCB2981CB",
                "912388D7C07612819E3B640FF5CECDAF"
                        + "72E5A59DF10F1091A6BEC39CAAD748AF"
                        + "9BD2D8D546"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for ARCFOUR_HMAC encryption type, with 30 bytes
     */
    @Test
    public void testDecryptARCFOUR_HMAC_EXP_30() {
        TestCase testCase = new TestCase(
                EncryptionType.ARCFOUR_HMAC_EXP,
                "30 bytes bytes bytes bytes byt", 4,
                "9F725542D9F72AA1F386CBE7896984FC",
                "78B35A08B08BE265AEB4145F076513B6"
                        + "B56EFED3F7526574AF74F7D2F9BAE96E"
                        + "ABB76F2D87386D2E93E3A77B99919F1D"
                        + "976490E2BD45"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for AES128_CTS_HMAC_SHA1_96 encryption type, with 0 byte
     */
    @Test
    public void testDecryptAES128_CTS_HMAC_SHA1_96_0() {
        TestCase testCase = new TestCase(
                EncryptionType.AES128_CTS_HMAC_SHA1_96,
                "", 0,
                "5A5C0F0BA54F3828B2195E66CA24A289",
                "49FF8E11C173D9583A3254FBE7B1F1DF"
                        + "36C538E8416784A1672E6676"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for AES128_CTS_HMAC_SHA1_96 encryption type, with 1 byte
     */
    @Test
    public void testDecryptAES128_CTS_HMAC_SHA1_96_1() {
        TestCase testCase = new TestCase(
                EncryptionType.AES128_CTS_HMAC_SHA1_96,
                "1", 1,
                "98450E3F3BAA13F5C99BEB936981B06F",
                "F86742F537B35DC2174A4DBAA920FAF9"
                        + "042090B065E1EBB1CAD9A65394"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for AES128_CTS_HMAC_SHA1_96 encryption type, with 9 bytes
     */
    @Test
    public void testDecryptAES128_CTS_HMAC_SHA1_96_9() {
        TestCase testCase = new TestCase(
                EncryptionType.AES128_CTS_HMAC_SHA1_96,
                "9 bytesss", 2,
                "9062430C8CDA3388922E6D6A509F5B7A",
                "68FB9679601F45C78857B2BF820FD6E5"
                        + "3ECA8D42FD4B1D7024A09205ABB7CD2E"
                        + "C26C355D2F"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for AES128_CTS_HMAC_SHA1_96 encryption type, with 13 bytes
     */
    @Test
    public void testDecryptAES128_CTS_HMAC_SHA1_96_13() {
        TestCase testCase = new TestCase(
                EncryptionType.AES128_CTS_HMAC_SHA1_96,
                "13 bytes byte", 3,
                "033EE6502C54FD23E27791E987983827",
                "EC366D0327A933BF49330E650E49BC6B"
                        + "974637FE80BF532FE51795B4809718E6"
                        + "194724DB948D1FD637"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for AES128_CTS_HMAC_SHA1_96 encryption type, with 30 bytes
     */
    @Test
    public void testDecryptAES128_CTS_HMAC_SHA1_96_30() {
        TestCase testCase = new TestCase(
                EncryptionType.AES128_CTS_HMAC_SHA1_96,
                "30 bytes bytes bytes bytes byt", 4,
                "DCEEB70B3DE76562E689226C76429148",
                "C96081032D5D8EEB7E32B4089F789D0F"
                        + "AA481DEA74C0F97CBF3146DDFCF8E800"
                        + "156ECB532FC203E30FF600B63B350939"
                        + "FECE510F02D7FF1E7BAC"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for AES256_CTS_HMAC_SHA1_96 encryption type, with 0 byte
     */
    @Test
    public void testDecryptAES256_CTS_HMAC_SHA1_96_0() {
        assumeTrue(EncryptoUtil.isAES256Enabled());

        TestCase testCase = new TestCase(
                EncryptionType.AES256_CTS_HMAC_SHA1_96,
                "", 0,
                "17F275F2954F2ED1F90C377BA7F4D6A3"
                        + "69AA0136E0BF0C927AD6133C693759A9",
                "E5094C55EE7B38262E2B044280B06937"
                        + "9A95BF95BD8376FB3281B435"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for AES256_CTS_HMAC_SHA1_96 encryption type, with 1 byte
     */
    @Test
    public void testDecryptAES256_CTS_HMAC_SHA1_96_1() {
        assumeTrue(EncryptoUtil.isAES256Enabled());

        TestCase testCase = new TestCase(
                EncryptionType.AES256_CTS_HMAC_SHA1_96,
                "1", 1,
                "B9477E1FF0329C0050E20CE6C72D2DFF"
                        + "27E8FE541AB0954429A9CB5B4F7B1E2A",
                "406150B97AEB76D43B36B62CC1ECDFBE"
                        + "6F40E95755E0BEB5C27825F3A4"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for AES256_CTS_HMAC_SHA1_96 encryption type, with 9 bytes
     */
    @Test
    public void testDecryptAES256_CTS_HMAC_SHA1_96_9() {
        assumeTrue(EncryptoUtil.isAES256Enabled());

        TestCase testCase = new TestCase(
                EncryptionType.AES256_CTS_HMAC_SHA1_96,
                "9 bytesss", 2,
                "B1AE4CD8462AFF1677053CC9279AAC30"
                        + "B796FB81CE21474DD3DDBCFEA4EC76D7",
                "09957AA25FCAF88F7B39E4406E633012"
                        + "D5FEA21853F6478DA7065CAEF41FD454"
                        + "A40824EEC5"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for AES256_CTS_HMAC_SHA1_96 encryption type, with 13 bytes
     */
    @Test
    public void testDecryptAES256_CTS_HMAC_SHA1_96_13() {
        assumeTrue(EncryptoUtil.isAES256Enabled());

        TestCase testCase = new TestCase(
                EncryptionType.AES256_CTS_HMAC_SHA1_96,
                "13 bytes byte", 3,
                "E5A72BE9B7926C1225BAFEF9C1872E7B"
                        + "A4CDB2B17893D84ABD90ACDD8764D966",
                "D8F1AAFEEC84587CC3E700A774E56651"
                        + "A6D693E174EC4473B5E6D96F80297A65"
                        + "3FB818AD893E719F96"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for AES256_CTS_HMAC_SHA1_96 encryption type, with 30 bytes
     */
    @Test
    public void testDecryptAES256_CTS_HMAC_SHA1_96_30() {
        assumeTrue(EncryptoUtil.isAES256Enabled());

        TestCase testCase = new TestCase(
                EncryptionType.AES256_CTS_HMAC_SHA1_96,
                "30 bytes bytes bytes bytes byt", 4,
                "F1C795E9248A09338D82C3F8D5B56704"
                        + "0B0110736845041347235B1404231398",
                "D1137A4D634CFECE924DBC3BF6790648"
                        + "BD5CFF7DE0E7B99460211D0DAEF3D79A"
                        + "295C688858F3B34B9CBD6EEBAE81DAF6"
                        + "B734D4D498B6714F1C1D"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for CAMELLIA128_CTS_CMAC encryption type, with 0 byte
     */
    @Test
    public void testDecryptCAMELIA128_CTS_CMAC_0() {
        TestCase testCase = new TestCase(
                EncryptionType.CAMELLIA128_CTS_CMAC,
                "", 0,
                "1DC46A8D763F4F93742BCBA3387576C3",
                "C466F1871069921EDB7C6FDE244A52DB"
                        + "0BA10EDC197BDB8006658CA3CCCE6EB8"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for CAMELLIA128_CTS_CMAC encryption type, with 1 byte
     */
    @Test
    public void testDecryptCAMELIA128_CTS_CMAC_1() {
        TestCase testCase = new TestCase(
                EncryptionType.CAMELLIA128_CTS_CMAC,
                "1", 1,
                "5027BC231D0F3A9D23333F1CA6FDBE7C",
                "842D21FD950311C0DD464A3F4BE8D6DA"
                        + "88A56D559C9B47D3F9A85067AF661559"
                        + "B8"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for CAMELLIA128_CTS_CMAC encryption type, with 9 bytes
     */
    @Test
    public void testDecryptCAMELIA128_CTS_CMAC_9() {
        TestCase testCase = new TestCase(
                EncryptionType.CAMELLIA128_CTS_CMAC,
                "9 bytesss", 2,
                "A1BB61E805F9BA6DDE8FDBDDC05CDEA0",
                "619FF072E36286FF0A28DEB3A352EC0D"
                        + "0EDF5C5160D663C901758CCF9D1ED33D"
                        + "71DB8F23AABF8348A0"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for CAMELLIA128_CTS_CMAC encryption type, with 13 bytes
     */
    @Test
    public void testDecryptCAMELIA128_CTS_CMAC_13() {
        TestCase testCase = new TestCase(
                EncryptionType.CAMELLIA128_CTS_CMAC,
                "13 bytes byte", 3,
                "2CA27A5FAF5532244506434E1CEF6676",
                "B8ECA3167AE6315512E59F98A7C50020"
                        + "5E5F63FF3BB389AF1C41A21D640D8615"
                        + "C9ED3FBEB05AB6ACB67689B5EA"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for CAMELLIA128_CTS_CMAC encryption type, with 30 bytes
     */
    @Test
    public void testDecryptCAMELIA128_CTS_CMAC_30() {
        TestCase testCase = new TestCase(
                EncryptionType.CAMELLIA128_CTS_CMAC,
                "30 bytes bytes bytes bytes byt", 4,
                "7824F8C16F83FF354C6BF7515B973F43",
                "A26A3905A4FFD5816B7B1E27380D0809"
                        + "0C8EC1F304496E1ABDCD2BDCD1DFFC66"
                        + "0989E117A713DDBB57A4146C1587CBA4"
                        + "356665591D2240282F5842B105A5"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for CAMELLIA256_CTS_CMAC encryption type, with 0 byte
     */
    @Test
    public void testDecryptCAMELIA256_CTS_CMAC_0() {
        TestCase testCase = new TestCase(
                EncryptionType.CAMELLIA256_CTS_CMAC,
                "", 0,
                "B61C86CC4E5D2757545AD423399FB703"
                        + "1ECAB913CBB900BD7A3C6DD8BF92015B",
                "03886D03310B47A6D8F06D7B94D1DD83"
                        + "7ECCE315EF652AFF620859D94A259266"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for CAMELLIA256_CTS_CMAC encryption type, with 1 byte
     */
    @Test
    public void testDecryptCAMELIA256_CTS_CMAC_1() {
        TestCase testCase = new TestCase(
                EncryptionType.CAMELLIA256_CTS_CMAC,
                "1", 1,
                "1B97FE0A190E2021EB30753E1B6E1E77"
                        + "B0754B1D684610355864104963463833",
                "2C9C1570133C99BF6A34BC1B0212002F"
                        + "D194338749DB4135497A347CFCD9D18A12"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for CAMELLIA256_CTS_CMAC encryption type, with 9 bytes
     */
    @Test
    public void testDecryptCAMELIA256_CTS_CMAC_9() {
        TestCase testCase = new TestCase(
                EncryptionType.CAMELLIA256_CTS_CMAC,
                "9 bytesss", 2,
                "32164C5B434D1D1538E4CFD9BE8040FE"
                        + "8C4AC7ACC4B93D3314D2133668147A05",
                "9C6DE75F812DE7ED0D28B2963557A115"
                        + "640998275B0AF5152709913FF52A2A9C"
                        + "8E63B872F92E64C839"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for CAMELLIA256_CTS_CMAC encryption type, with 13 bytes
     */
    @Test
    public void testDecryptCAMELIA256_CTS_CMAC_13() {
        TestCase testCase = new TestCase(
                EncryptionType.CAMELLIA256_CTS_CMAC,
                "13 bytes byte", 3,
                "B038B132CD8E06612267FAB7170066D8"
                        + "8AECCBA0B744BFC60DC89BCA182D0715",
                "EEEC85A9813CDC536772AB9B42DEFC57"
                        + "06F726E975DDE05A87EB5406EA324CA1"
                        + "85C9986B42AABE794B84821BEE"
        );

        performTestDecrypt(testCase);
    }


    /**
     * Test for CAMELLIA256_CTS_CMAC encryption type, with 30 bytes
     */
    @Test
    public void testDecryptCAMELIA256_CTS_CMAC_30() {
        TestCase testCase = new TestCase(
                EncryptionType.CAMELLIA256_CTS_CMAC,
                "30 bytes bytes bytes bytes byt", 4,
                "CCFCD349BF4C6677E86E4B02B8EAB924"
                        + "A546AC731CF9BF6989B996E7D6BFBBA7",
                "0E44680985855F2D1F1812529CA83BFD"
                        + "8E349DE6FD9ADA0BAAA048D68E265FEB"
                        + "F34AD1255A344999AD37146887A6C684"
                        + "5731AC7F46376A0504CD06571474"
        );

        performTestDecrypt(testCase);
    }
}
