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