/* * 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. */ /** * @author Alexander Y. Kleymenov * @version $Revision$ */ package org.apache.harmony.crypto.tests.javax.crypto.spec; import java.lang.NullPointerException; import java.security.InvalidKeyException; import java.util.Arrays; import javax.crypto.spec.DESKeySpec; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** */ public class DESKeySpecTest extends TestCase { // DES weak and semi-weak keys // Got from: // FIP PUB 74 // FEDERAL INFORMATION PROCESSING STANDARDS PUBLICATION 1981 // GUIDELINES FOR IMPLEMENTING AND USING THE NBS DATA ENCRYPTION STANDARD // http://www.dice.ucl.ac.be/crypto/standards/fips/fip74/fip74-1.pdf private static final byte[][] semiweaks = { {(byte) 0xE0, (byte) 0x01, (byte) 0xE0, (byte) 0x01, (byte) 0xF1, (byte) 0x01, (byte) 0xF1, (byte) 0x01}, {(byte) 0x01, (byte) 0xE0, (byte) 0x01, (byte) 0xE0, (byte) 0x01, (byte) 0xF1, (byte) 0x01, (byte) 0xF1}, {(byte) 0xFE, (byte) 0x1F, (byte) 0xFE, (byte) 0x1F, (byte) 0xFE, (byte) 0x0E, (byte) 0xFE, (byte) 0x0E}, {(byte) 0x1F, (byte) 0xFE, (byte) 0x1F, (byte) 0xFE, (byte) 0x0E, (byte) 0xFE, (byte) 0x0E, (byte) 0xFE}, {(byte) 0xE0, (byte) 0x1F, (byte) 0xE0, (byte) 0x1F, (byte) 0xF1, (byte) 0x0E, (byte) 0xF1, (byte) 0x0E}, {(byte) 0x1F, (byte) 0xE0, (byte) 0x1F, (byte) 0xE0, (byte) 0x0E, (byte) 0xF1, (byte) 0x0E, (byte) 0xF1}, {(byte) 0x01, (byte) 0xFE, (byte) 0x01, (byte) 0xFE, (byte) 0x01, (byte) 0xFE, (byte) 0x01, (byte) 0xFE}, {(byte) 0xFE, (byte) 0x01, (byte) 0xFE, (byte) 0x01, (byte) 0xFE, (byte) 0x01, (byte) 0xFE, (byte) 0x01}, {(byte) 0x01, (byte) 0x1F, (byte) 0x01, (byte) 0x1F, (byte) 0x01, (byte) 0x0E, (byte) 0x01, (byte) 0x0E}, {(byte) 0x1F, (byte) 0x01, (byte) 0x1F, (byte) 0x01, (byte) 0x0E, (byte) 0x01, (byte) 0x0E, (byte) 0x01}, {(byte) 0xE0, (byte) 0xFE, (byte) 0xE0, (byte) 0xFE, (byte) 0xF1, (byte) 0xFE, (byte) 0xF1, (byte) 0xFE}, {(byte) 0xFE, (byte) 0xE0, (byte) 0xFE, (byte) 0xE0, (byte) 0xFE, (byte) 0xF1, (byte) 0xFE, (byte) 0xF1}, {(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01}, {(byte) 0xFE, (byte) 0xFE, (byte) 0xFE, (byte) 0xFE, (byte) 0xFE, (byte) 0xFE, (byte) 0xFE, (byte) 0xFE}, {(byte) 0xE0, (byte) 0xE0, (byte) 0xE0, (byte) 0xE0, (byte) 0xF1, (byte) 0xF1, (byte) 0xF1, (byte) 0xF1}, {(byte) 0x1F, (byte) 0x1F, (byte) 0x1F, (byte) 0x1F, (byte) 0x0E, (byte) 0x0E, (byte) 0x0E, (byte) 0x0E}, }; /* DES not weak or semi-weak keys */ private static final byte[][] notsemiweaks = { {(byte) 0x1f, (byte) 0x1f, (byte) 0x1f, (byte) 0x1f, (byte) 0x1f, (byte) 0x1f, (byte) 0x1f, (byte) 0x1f}, {(byte) 0xe0, (byte) 0xe0, (byte) 0xe0, (byte) 0xe0, (byte) 0xe0, (byte) 0xe0, (byte) 0xe0, (byte) 0xe0} }; /** * Constructors testing. Tests behavior of each of two constructors * in the cases of: null array, short array, normal array. */ public void testDESKeySpec() { try { new DESKeySpec((byte []) null); fail("Should raise an NullPointerException " + "in case of null byte array."); } catch (NullPointerException e) { } catch (InvalidKeyException e) { fail("Should raise an NullPointerException " + "in case of null byte array."); } try { new DESKeySpec(new byte [] {1, 2, 3}); fail("Should raise an InvalidKeyException on a short byte array."); } catch (NullPointerException e) { fail("Unexpected NullPointerException was thrown."); } catch (InvalidKeyException e) { } try { new DESKeySpec(new byte[] {1, 2, 3, 4, 5, 6, 7, 8}); } catch (NullPointerException e) { fail("Unexpected NullPointerException was thrown."); } catch (InvalidKeyException e) { fail("Unexpected InvalidKeyException was thrown."); } try { new DESKeySpec((byte []) null, 1); fail("Should raise an NullPointerException " + "in case of null byte array."); } catch (NullPointerException e) { } catch (InvalidKeyException e) { fail("Should raise an NullPointerException " + "in case of null byte array."); } try { new DESKeySpec(new byte [] {1, 2, 3, 4, 5, 6, 7, 8}, 1); fail("Should raise an InvalidKeyException on a short byte array."); } catch (NullPointerException e) { fail("Unexpected NullPointerException was thrown."); } catch (InvalidKeyException e) { } try { new DESKeySpec(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9}, 1); } catch (NullPointerException e) { fail("Unexpected NullPointerException was thrown."); } catch (InvalidKeyException e) { fail("Unexpected InvalidKeyException was thrown."); } } /** * getKey() method testing. Checks that modification of returned key * does not affect the internal key. Also test check an equality of * the key with the key specified in the constructor. The object under * the test is created by different constructors. */ public void testGetKey() { byte[] key = {1, 2, 3, 4, 5, 6, 7, 8}; DESKeySpec ks; try { ks = new DESKeySpec(key); } catch (InvalidKeyException e) { fail("InvalidKeyException should not be thrown."); return; } byte[] res = ks.getKey(); assertTrue("The returned array should be equal to the specified " + "in constructor.", Arrays.equals(key, res)); res[0] += 1; assertFalse("The modification of returned key should not affect" + "the underlying key.", key[0] == res[0]); byte[] key1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; try { ks = new DESKeySpec(key1, 2); } catch (InvalidKeyException e) { fail("InvalidKeyException should not be thrown."); return; } res = ks.getKey(); assertNotSame("The returned array should not be the same object " + "as specified in a constructor.", key1, res); byte[] exp = new byte[8]; System.arraycopy(key1, 2, exp, 0, 8); assertTrue("The returned array should be equal to the specified " + "in constructor.", Arrays.equals(exp, res)); } /** * isParityAdjusted(byte[] key, offset) method testing. Tests if the * method throws appropriate exceptions on incorrect byte array, if * it returns false on the key which is not parity adjusted, and if * it returns true on parity adjusted key. */ public void testIsParityAdjusted() { try { DESKeySpec.isParityAdjusted(null, 1); fail("Should raise an InvalidKeyException " + "in case of null byte array."); } catch (NullPointerException e) { fail("Unexpected NullPointerException was thrown."); } catch (InvalidKeyException e) { } byte[] key = {1, 2, 3, 4, 5, 6, 7, 8}; try { DESKeySpec.isParityAdjusted(key, 1); fail("Should raise an InvalidKeyException " + "in case of short byte array."); } catch (NullPointerException e) { fail("Unexpected NullPointerException was thrown."); } catch (InvalidKeyException e) { } byte[] key_not_pa = {1, 2, 3, 4, 5, 6, 7, 8}; try { assertFalse("Method returns true when false is expected.", DESKeySpec.isParityAdjusted(key_not_pa, 0)); } catch (NullPointerException e) { fail("Unexpected NullPointerException was thrown."); } catch (InvalidKeyException e) { fail("Unexpected InvalidKeyException was thrown."); } byte[] key_pa = {(byte) 128, (byte) 131, (byte) 133, (byte) 134, (byte) 137, (byte) 138, (byte) 140, (byte) 143}; try { assertTrue("Method returns false when true is expected.", DESKeySpec.isParityAdjusted(key_pa, 0)); } catch (NullPointerException e) { fail("Unexpected NullPointerException was thrown."); } catch (InvalidKeyException e) { fail("Unexpected InvalidKeyException was thrown."); } } /** * isWeak(byte[] key, int offset) method testing. Tests if the * method throws appropriate exceptions on incorrect byte array, if * it returns true on weak or semi-weak keys, and if it returns * false on other keys. */ public void testIsWeak() { try { DESKeySpec.isWeak(null, 1); fail("Should raise an InvalidKeyException " + "in case of null byte array."); } catch (NullPointerException e) { fail("Unexpected NullPointerException was thrown."); } catch (InvalidKeyException e) { } byte[] key = {1, 2, 3, 4, 5, 6, 7, 8}; try { DESKeySpec.isWeak(key, 1); fail("Should raise an InvalidKeyException " + "in case of short byte array."); } catch (NullPointerException e) { fail("Unexpected NullPointerException was thrown."); } catch (InvalidKeyException e) { } for (int i=0; i<semiweaks.length; i++) { try { assertTrue("Method returns false when true is expected", DESKeySpec.isWeak(semiweaks[i], 0)); } catch (InvalidKeyException e) { fail("Unexpected InvalidKeyException was thrown."); } } for (int i=0; i<notsemiweaks.length; i++) { try { assertFalse("Method returns true when false is expected", DESKeySpec.isWeak(notsemiweaks[i], 0)); } catch (InvalidKeyException e) { fail("Unexpected InvalidKeyException was thrown."); } } } public static Test suite() { return new TestSuite(DESKeySpecTest.class); } }