blob: 9e92152a1fe301d83e2bae1f937feffc66848c03 [file] [log] [blame]
/*
* 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.util.Arrays;
import javax.crypto.spec.RC5ParameterSpec;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
*/
public class RC5ParameterSpecTest extends TestCase {
/**
* RC5ParameterSpec(int version, int rounds, int wordSize, byte[] iv) method
* testing. Tests that IllegalArgumentException is thrown in the case of
* inappropriate constructor parameters and that input iv array is
* copied to protect against subsequent modification.
*/
public void testRC5ParameterSpec1() {
int version = 1;
int rounds = 5;
int wordSize = 16;
byte[] iv = {1, 2, 3, 4};
try {
new RC5ParameterSpec(version, rounds, wordSize, null);
fail("An IllegalArgumentException should be thrown "
+ "in the case of null iv.");
} catch (IllegalArgumentException e) {
}
try {
new RC5ParameterSpec(version, rounds, wordSize+8, iv);
fail("An IllegalArgumentException should be thrown "
+ "in the case of short iv.");
} catch (IllegalArgumentException e) {
}
try {
new RC5ParameterSpec(version, rounds, wordSize, new byte[] {1, 2, 3});
fail("An IllegalArgumentException should be thrown "
+ "in the case of short iv.");
} catch (IllegalArgumentException e) {
}
RC5ParameterSpec ps = new RC5ParameterSpec(version, rounds,
wordSize, iv);
iv[0] ++;
assertFalse("The change of iv specified in the constructor "
+ "should not cause the change of internal array.",
iv[0] == ps.getIV()[0]);
}
/**
* RC5ParameterSpec(int version, int rounds, int wordSize, byte[] iv, int
* offset) method testing. Tests that IllegalArgumentException is thrown in
* the case of inappropriate constructor parameters and that input iv array
* is copied to protect against subsequent modification.
*/
public void testRC5ParameterSpec2() {
int version = 1;
int rounds = 5;
int wordSize = 16;
byte[] iv = {1, 2, 3, 4, 5, 6};
int offset = 2;
try {
new RC5ParameterSpec(version, rounds, wordSize, null, offset);
fail("An IllegalArgumentException should be thrown "
+ "in the case of null iv.");
} catch (IllegalArgumentException e) {
}
try {
new RC5ParameterSpec(version, rounds, wordSize+8, iv, offset);
fail("An IllegalArgumentException should be thrown "
+ "in the case of short iv.");
} catch (IllegalArgumentException e) {
}
try {
new RC5ParameterSpec(version, rounds, wordSize, iv, offset+1);
fail("An IllegalArgumentException should be thrown "
+ "in the case of short iv.");
} catch (IllegalArgumentException e) {
}
try {
new RC5ParameterSpec(version, rounds, wordSize, new byte[] { 1, 2,
3, 4 }, offset);
fail("An IllegalArgumentException should be thrown "
+ "in the case of short iv.");
} catch (IllegalArgumentException e) {
}
RC5ParameterSpec ps = new RC5ParameterSpec(version, rounds, wordSize,
iv, offset);
iv[offset] ++;
assertFalse("The change of iv specified in the constructor "
+ "should not cause the change of internal array.",
iv[offset] == ps.getIV()[0]);
// Regression test for HARMONY-1077
try {
new RC5ParameterSpec(0, 9, 77, new byte[] { 2 }, -100);
fail("ArrayIndexOutOfBoundsException expected");
} catch (ArrayIndexOutOfBoundsException e) {
// expected
}
}
/**
* getVersion() method testing. Tests that returned value is
* equal to the value specified in the constructor.
*/
public void testGetVersion() {
int version = 1;
int rounds = 5;
int wordSize = 16;
RC5ParameterSpec ps = new RC5ParameterSpec(version, rounds, wordSize);
assertTrue("The returned version value should be equal to the "
+ "value specified in the constructor.",
ps.getVersion() == version);
}
/**
* getRounds() method testing. Tests that returned value is
* equal to the value specified in the constructor.
*/
public void testGetRounds() {
int version = 1;
int rounds = 5;
int wordSize = 16;
RC5ParameterSpec ps = new RC5ParameterSpec(version, rounds, wordSize);
assertTrue("The returned rounds value should be equal to the "
+ "value specified in the constructor.",
ps.getRounds() == rounds);
}
/**
* getWordSize() method testing. Tests that returned value is
* equal to the value specified in the constructor.
*/
public void testGetWordSize() {
int version = 1;
int rounds = 5;
int wordSize = 16;
RC5ParameterSpec ps = new RC5ParameterSpec(version, rounds, wordSize);
assertTrue("The returned wordSize value should be equal to the "
+ "value specified in the constructor.",
ps.getWordSize() == wordSize);
}
/**
* getIV() method testing. Tests that returned array is equal to the
* array specified in the constructor. Checks that modification
* of returned array does not affect the internal array. Also it checks
* that getIV() method returns null if iv is not specified.
*/
public void testGetIV() {
int version = 1;
int rounds = 5;
int wordSize = 16;
byte[] iv = {1, 2, 3, 4};
RC5ParameterSpec ps = new RC5ParameterSpec(version, rounds,
wordSize, iv);
byte[] result = ps.getIV();
if (! Arrays.equals(iv, result)) {
fail("The returned iv is not equal to the specified "
+ "in the constructor.");
}
result[0] ++;
assertFalse("The change of returned by getIV() method iv "
+ "should not cause the change of internal array.",
result[0] == ps.getIV()[0]);
ps = new RC5ParameterSpec(version, rounds, wordSize);
assertNull("The getIV() method should return null if the parameter "
+ "set does not contain IV.", ps.getIV());
}
/**
* equals(Object obj) method testing. Tests the correctness of equal
* operation: it should be reflexive, symmetric, transitive, consistent
* and should be false on null object.
*/
public void testEquals() {
int version = 1;
int rounds = 5;
int wordSize = 16;
byte[] iv = {1, 2, 3, 4, 5, 6};
RC5ParameterSpec ps1 = new RC5ParameterSpec(version, rounds,
wordSize, iv);
RC5ParameterSpec ps2 = new RC5ParameterSpec(version, rounds,
wordSize, iv);
RC5ParameterSpec ps3 = new RC5ParameterSpec(version, rounds, wordSize,
new byte[] {1, 2, 3, 4});
// checking for reflexive law:
assertTrue("The equivalence relation should be reflexive.",
ps1.equals(ps1));
assertTrue("Objects built on the same parameters should be equal.",
ps1.equals(ps2));
// checking for symmetric law:
assertTrue("The equivalence relation should be symmetric.",
ps2.equals(ps1));
assertTrue("Objects built on the equal parameters should be equal.",
ps2.equals(ps3));
// checking for transitive law:
assertTrue("The equivalence relation should be transitive.",
ps1.equals(ps3));
assertFalse("Should return not be equal to null object.",
ps1.equals(null));
ps2 = new RC5ParameterSpec(version+1, rounds, wordSize, iv);
assertFalse("Objects should not be equal.", ps1.equals(ps2));
ps2 = new RC5ParameterSpec(version, rounds+1, wordSize, iv);
assertFalse("Objects should not be equal.", ps1.equals(ps2));
ps2 = new RC5ParameterSpec(version, rounds, wordSize/2, iv);
assertFalse("Objects should not be equal.", ps1.equals(ps2));
ps2 = new RC5ParameterSpec(version, rounds, wordSize,
new byte[] {4, 3, 2, 1});
assertFalse("Objects should not be equal.", ps1.equals(ps2));
}
/**
* hashCode() method testing. Tests that for equal objects hash codes
* are equal.
*/
public void testHashCode() {
int version = 1;
int rounds = 5;
int wordSize = 16;
byte[] iv = {1, 2, 3, 4, 5, 6};
RC5ParameterSpec ps1 = new RC5ParameterSpec(version, rounds,
wordSize, iv);
RC5ParameterSpec ps2 = new RC5ParameterSpec(version, rounds,
wordSize, iv);
assertTrue("Equal objects should have the same hash codes.",
ps1.hashCode() == ps2.hashCode());
}
public void test_constructorIII() {
int version = 1;
int rounds = 5;
int wordSize = 16;
RC5ParameterSpec ps1 = new RC5ParameterSpec(version, rounds, wordSize);
RC5ParameterSpec ps2 = new RC5ParameterSpec(version, rounds, wordSize);
RC5ParameterSpec ps3 = new RC5ParameterSpec(version, rounds, wordSize + 1);
assertTrue(ps1.equals(ps2));
assertFalse(ps1.equals(ps3));
}
public static Test suite() {
return new TestSuite(RC5ParameterSpecTest.class);
}
}