/*
 * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

/*
 * @test
 * @bug 4921443
 * @summary Ensure ISO10126Padding works correctly.
 * @author Valerie Peng
 */
import java.util.Arrays;
import java.security.*;
import java.security.spec.*;

import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.Provider;
import com.sun.crypto.provider.*;

public class TestISO10126Padding {
    private static final String ALGO = "AES";
    private static final String TRANS = "AES/ECB";
    private static final int KEYSIZE = 16; // in bytes

    private SecretKey key;

    private TestISO10126Padding() throws Exception {
        // setup
        KeyGenerator kg = KeyGenerator.getInstance(ALGO, "SunJCE");
        kg.init(KEYSIZE*8);
        key = kg.generateKey();
    }

    private void runTest(int dataLength) throws Exception {
        // setup
        byte[] data = new byte[dataLength];
        new SecureRandom().nextBytes(data);
        System.out.println("Testing data length: " + dataLength);

        // TEST#1 --
        // generate the cipher text using manually-supplied
        // XML Encryption padding
        Cipher ci = Cipher.getInstance(TRANS + "/NoPadding", "SunJCE");
        ci.init(Cipher.ENCRYPT_MODE, key);
        byte[] paddedData = new byte[ci.getBlockSize()];
        System.arraycopy(data, 0, paddedData, 0, data.length);
        int padValue = paddedData.length - data.length;
        paddedData[paddedData.length-1] = (byte) padValue;
        byte[] cipherText = ci.doFinal(paddedData);

        // decrypt using ISO10126Padding
        ci = Cipher.getInstance(TRANS + "/ISO10126Padding", "SunJCE");
        ci.init(Cipher.DECRYPT_MODE, key);
        byte[] recovered = ci.doFinal(cipherText);
        if (!Arrays.equals(data, recovered)) {
            throw new Exception("TEST#1: decryption failed");
        }
        // TEST#2 --
        // generate the cipher text using ISO10126Padding
        ci = Cipher.getInstance(TRANS + "/ISO10126Padding", "SunJCE");
        ci.init(Cipher.ENCRYPT_MODE, key);
        cipherText = ci.doFinal(data);

        // decrypt using ISO10126Padding
        ci.init(Cipher.DECRYPT_MODE, key);
        recovered = ci.doFinal(cipherText);
        if (!Arrays.equals(data, recovered)) {
            throw new Exception("TEST#2: decryption failed");
        }
    }

    public static void main(String[] argv) throws Exception {
        TestISO10126Padding test = new TestISO10126Padding();
        for (int i = 0; i<16; i++) {
            test.runTest(i);
        }
        System.out.println("Test Passed");
    }
}
