/* * 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 tests.security.spec; import junit.framework.TestCase; import java.math.BigInteger; import java.security.spec.ECField; import java.security.spec.ECFieldF2m; import java.security.spec.ECFieldFp; import java.security.spec.EllipticCurve; import java.util.Arrays; /** * Tests for EllipticCurve class fields and methods. * */ public class EllipticCurveTest extends TestCase { /** * Test #1 for EllipticCurve(ECField, BigInteger, BigInteger, byte[]) * constructor
* Assertion: creates instance of EllipticCurve
* Test preconditions: valid parameters passed
* Expected: must pass without any exceptions */ public final void testEllipticCurveECFieldBigIntegerBigIntegerbyteArray01() { // test case 1 parameters set ECFieldFp f = new ECFieldFp(BigInteger.valueOf(23L)); BigInteger a = BigInteger.ONE; BigInteger b = BigInteger.valueOf(19L); byte[] seed = new byte[24]; // perform test case 1 new EllipticCurve(f, a, b, seed); // test case 2 parameters set ECFieldF2m f1 = new ECFieldF2m(5); a = BigInteger.ZERO; b = BigInteger.valueOf(23L); // perform test case 2 new EllipticCurve(f1, a, b, seed); // test case 3 parameters set, // the seed parameter may be null f = new ECFieldFp(BigInteger.valueOf(23L)); a = BigInteger.ONE; b = BigInteger.valueOf(19L); seed = null; // perform test case 3 new EllipticCurve(f, a, b, seed); } /** * Test #2 for EllipticCurve(ECField, BigInteger, BigInteger, byte[]) * constructor
* Assertion: throws NullPointerException if field, * a or b is null
* Test preconditions: pass null as mentioned parameters
* Expected: must throw NullPointerException */ public final void testEllipticCurveECFieldBigIntegerBigIntegerbyteArray02() { // test case 1 parameters set ECFieldFp f = null; BigInteger a = BigInteger.ONE; BigInteger b = BigInteger.valueOf(19L); byte[] seed = new byte[24]; // perform test case 1 try { new EllipticCurve(f, a, b, seed); fail("#1: Expected NPE not thrown"); } catch (NullPointerException ok) {} // test case 2 parameters set, f = new ECFieldFp(BigInteger.valueOf(23L)); a = null; b = BigInteger.valueOf(19L); seed = new byte[24]; // perform test case 2 try { new EllipticCurve(f, a, b, seed); fail("#2: Expected NPE not thrown"); } catch (NullPointerException ok) {} // test case 3 parameters set, f = new ECFieldFp(BigInteger.valueOf(23L)); a = BigInteger.ONE; b = null; seed = new byte[24]; // perform test case 2 try { new EllipticCurve(f, a, b, seed); fail("#3: Expected NPE not thrown"); } catch (NullPointerException ok) {} } /** * Test #3 for EllipticCurve(ECField, BigInteger, BigInteger, byte[]) * constructor
* Assertion: throws IllegalArgumentException if * a or b is not null and not in * the field
* Test preconditions: pass a, b which are * not in the field of type ECFieldFp
* Expected: must throw IllegalArgumentException */ public final void testEllipticCurveECFieldBigIntegerBigIntegerbyteArray03() { // test case 1 parameters set, // a is not in field ECFieldFp f = new ECFieldFp(BigInteger.valueOf(23L)); BigInteger a = BigInteger.valueOf(24L); BigInteger b = BigInteger.valueOf(19L); byte[] seed = new byte[24]; // perform test case 1 try { new EllipticCurve(f, a, b, seed); fail("#1: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} // test case 1.1 parameters set, // b is not in field f = new ECFieldFp(BigInteger.valueOf(23L)); a = BigInteger.valueOf(1L); b = BigInteger.valueOf(23L); seed = new byte[24]; // perform test case 1.1 try { new EllipticCurve(f, a, b, seed); fail("#1.1: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} // test case 2 parameters set, // b is not in field f = new ECFieldFp(BigInteger.valueOf(23L)); a = BigInteger.valueOf(19L); b = BigInteger.valueOf(24L); seed = new byte[24]; // perform test case 2 try { new EllipticCurve(f, a, b, seed); fail("#2: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} // test case 3 parameters set, // both a and b are not in field f = new ECFieldFp(BigInteger.valueOf(23L)); a = BigInteger.valueOf(25L); b = BigInteger.valueOf(240L); seed = new byte[24]; // perform test case 3 try { new EllipticCurve(f, a, b, seed); fail("#3: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} } /** * Test #4 for EllipticCurve(ECField, BigInteger, BigInteger, byte[]) * constructor
* Assertion: throws IllegalArgumentException if * a or b is not null and not in * the field
* Test preconditions: pass a, b which are * not in the field of type ECFieldF2m
* Expected: must throw IllegalArgumentException */ public final void testEllipticCurveECFieldBigIntegerBigIntegerbyteArray04() { // test case 1 parameters set, // a is not in field ECFieldF2m f = new ECFieldF2m(5); BigInteger a = BigInteger.valueOf(32L); BigInteger b = BigInteger.valueOf(19L); byte[] seed = new byte[24]; // perform test case 1 try { new EllipticCurve(f, a, b, seed); fail("#1: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} // test case 2 parameters set, // b is not in field f = new ECFieldF2m(5); a = BigInteger.valueOf(19L); b = BigInteger.valueOf(32L); seed = new byte[24]; // perform test case 2 try { new EllipticCurve(f, a, b, seed); fail("#2: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} // test case 3 parameters set, // both a and b are not in field f = new ECFieldF2m(5); a = BigInteger.valueOf(32L); b = BigInteger.valueOf(43L); seed = new byte[24]; // perform test case 3 try { new EllipticCurve(f, a, b, seed); fail("#3: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} } /** * Test #5 for EllipticCurve(ECField, BigInteger, BigInteger, byte[]) * constructor
* Assertion: array seed is copied to prevent subsequent modification
* Test preconditions: pass seed to the ctor then modify it
* Expected: getSeed() must return unmodified array */ public final void testEllipticCurveECFieldBigIntegerBigIntegerbyteArray05() { ECFieldF2m f = new ECFieldF2m(5); BigInteger a = BigInteger.valueOf(0L); BigInteger b = BigInteger.valueOf(19L); byte[] seed = new byte[24]; byte[] seedCopy = seed.clone(); EllipticCurve c = new EllipticCurve(f, a, b, seedCopy); // modify array passed seedCopy[0] = (byte) 1; // check that above modification did not changed // internal state of test object assertTrue(Arrays.equals(seed, c.getSeed())); } /** * Test #1 for EllipticCurve(ECField, BigInteger, BigInteger) * constructor
* Assertion: creates instance of EllipticCurve
* Test preconditions: valid parameters passed, field type is ECFieldFp
* Expected: must pass without any exceptions */ public final void testEllipticCurveECFieldBigIntegerBigInteger01() { // test case 1 parameters set ECFieldFp f = new ECFieldFp(BigInteger.valueOf(23L)); BigInteger a = BigInteger.ONE; BigInteger b = BigInteger.valueOf(19L); // perform test case 1 new EllipticCurve(f, a, b); // test case 2 parameters set ECFieldF2m f1 = new ECFieldF2m(5); a = BigInteger.ZERO; b = BigInteger.valueOf(23L); // perform test case 2 new EllipticCurve(f1, a, b); // test case 3 parameters set, // the seed parameter may be null f = new ECFieldFp(BigInteger.valueOf(23L)); a = BigInteger.ONE; b = BigInteger.valueOf(19L); // perform test case 3 new EllipticCurve(f, a, b); } /** * Test #2 for EllipticCurve(ECField, BigInteger, BigInteger) * constructor
* Assertion: throws NullPointerException if field, * a or b is null
* Test preconditions: pass null as mentioned parameters
* Expected: must throw NullPointerException */ public final void testEllipticCurveECFieldBigIntegerBigInteger02() { // test case 1 parameters set ECFieldFp f = null; BigInteger a = BigInteger.ONE; BigInteger b = BigInteger.valueOf(19L); // perform test case 1 try { new EllipticCurve(f, a, b); fail("#1: Expected NPE not thrown"); } catch (NullPointerException ok) {} // test case 2 parameters set, f = new ECFieldFp(BigInteger.valueOf(23L)); a = null; b = BigInteger.valueOf(19L); // perform test case 2 try { new EllipticCurve(f, a, b); fail("#2: Expected NPE not thrown"); } catch (NullPointerException ok) {} // test case 3 parameters set, f = new ECFieldFp(BigInteger.valueOf(23L)); a = BigInteger.ONE; b = null; // perform test case 3 try { new EllipticCurve(f, a, b); fail("#3: Expected NPE not thrown"); } catch (NullPointerException ok) {} } /** * Test #3 for EllipticCurve(ECField, BigInteger, BigInteger) * constructor
* Assertion: throws IllegalArgumentException if * a or b is not null and not in * the field
* Test preconditions: pass a, b which are * not in the field of type ECFieldFp
* Expected: must throw IllegalArgumentException */ public final void testEllipticCurveECFieldBigIntegerBigInteger03() { // test case 1 parameters set, // a is not in field ECFieldFp f = new ECFieldFp(BigInteger.valueOf(23L)); BigInteger a = BigInteger.valueOf(24L); BigInteger b = BigInteger.valueOf(19L); // perform test case 1 try { new EllipticCurve(f, a, b); fail("#1: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} // test case 1.1 parameters set, // a is not in field f = new ECFieldFp(BigInteger.valueOf(23L)); a = BigInteger.valueOf(23L); b = BigInteger.valueOf(19L); // perform test case 1.1 try { new EllipticCurve(f, a, b); fail("#1.1: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} // test case 2 parameters set, // b is not in field f = new ECFieldFp(BigInteger.valueOf(23L)); a = BigInteger.valueOf(19L); b = BigInteger.valueOf(24L); // perform test case 2 try { new EllipticCurve(f, a, b); fail("#2: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} // test case 3 parameters set, // both a and b are not in field f = new ECFieldFp(BigInteger.valueOf(23L)); a = BigInteger.valueOf(25L); b = BigInteger.valueOf(240L); // perform test case 3 try { new EllipticCurve(f, a, b); fail("#3: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} } /** * Test #4 for EllipticCurve(ECField, BigInteger, BigInteger, byte[]) * constructor
* Assertion: throws IllegalArgumentException if * a or b is not null and not in * the field
* Test preconditions: pass a, b which are * not in the field of type ECFieldF2m
* Expected: must throw IllegalArgumentException */ public final void testEllipticCurveECFieldBigIntegerBigInteger04() { // test case 1 parameters set, // a is not in field ECFieldF2m f = new ECFieldF2m(5); BigInteger a = BigInteger.valueOf(32L); BigInteger b = BigInteger.valueOf(19L); // perform test case 1 try { new EllipticCurve(f, a, b); fail("#1: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} // test case 2 parameters set, // b is not in field f = new ECFieldF2m(5); a = BigInteger.valueOf(19L); b = BigInteger.valueOf(32L); // perform test case 2 try { new EllipticCurve(f, a, b); fail("#2: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} // test case 3 parameters set, // both a and b are not in field f = new ECFieldF2m(5); a = BigInteger.valueOf(32L); b = BigInteger.valueOf(43L); // perform test case 3 try { new EllipticCurve(f, a, b); fail("#3: Expected IAE not thrown"); } catch (IllegalArgumentException ok) {} } /** * Test for getA() method
* Assertion: returns coefficient a
* Test preconditions: ECFieldF2m instance * created using valid parameters
* Expected: must return coefficient a which is equal * to the one passed to the constructor; (both must refer * the same object) */ public final void testGetA() { ECFieldF2m f = new ECFieldF2m(5); BigInteger a = BigInteger.valueOf(5L); BigInteger b = BigInteger.valueOf(19L); EllipticCurve c = new EllipticCurve(f, a, b); assertEquals(a, c.getA()); assertSame(a, c.getA()); } /** * java/security/spec/EllipticCurve#EllipticCurve(EcField,BigInteger,BigInteger) */ public final void testEllipticCurveECFieldBigIntegerBigInteger05() { // Regression for Harmony-731 EllipticCurve ec = new EllipticCurve(new testECField(), BigInteger .valueOf(4L), BigInteger.ONE); assertEquals("incorrect a", ec.getA(), BigInteger.valueOf(4L)); assertEquals("incorrect b", ec.getB(), BigInteger.ONE); assertEquals("incorrect size", ec.getField().getFieldSize(), 2); } /** * Test for getB() method
* Assertion: returns coefficient b
* Test preconditions: ECFieldF2m instance * created using valid parameters
* Expected: must return coefficient b which is equal * to the one passed to the constructor; (both must refer * the same object) */ public final void testGetB() { ECFieldF2m f = new ECFieldF2m(5); BigInteger a = BigInteger.valueOf(5L); BigInteger b = BigInteger.valueOf(19L); EllipticCurve c = new EllipticCurve(f, a, b); assertEquals(b, c.getB()); assertSame(b, c.getB()); } /** * Test for getField() method
* Assertion: returns field
* Test preconditions: ECFieldF2m instance * created using valid parameters
* Expected: must return field which is equal * to the one passed to the constructor; (both must refer * the same object) */ public final void testGetField() { ECFieldF2m f = new ECFieldF2m(5); BigInteger a = BigInteger.valueOf(5L); BigInteger b = BigInteger.valueOf(19L); EllipticCurve c = new EllipticCurve(f, a, b); assertEquals(f, c.getField()); assertSame(f, c.getField()); } /** * Test #1 for getSeed() method
* Assertion: returns seed
* Test preconditions: ECFieldF2m instance * created using valid parameters
* Expected: must return seed which is equal * to the one passed to the constructor */ public final void testGetSeed01() { ECFieldFp f = new ECFieldFp(BigInteger.valueOf(23L)); BigInteger a = BigInteger.ONE; BigInteger b = BigInteger.valueOf(19L); byte[] seed = new byte[24]; EllipticCurve c = new EllipticCurve(f, a, b, seed); byte[] seedRet = c.getSeed(); assertNotNull(seedRet); assertTrue(Arrays.equals(seed, seedRet)); } /** * Test #2 for getSeed() method
* Assertion: returned array is copied to prevent subsequent modification
* Test preconditions: ECFieldF2m instance * created using valid parameters; getSeed() * called and then returned array modified
* Expected: internal state must not be affected by the modification */ public final void testGetSeed02() { ECFieldFp f = new ECFieldFp(BigInteger.valueOf(23L)); BigInteger a = BigInteger.ONE; BigInteger b = BigInteger.valueOf(19L); byte[] seed = new byte[24]; EllipticCurve c = new EllipticCurve(f, a, b, seed.clone()); byte[] seedRet = c.getSeed(); // modify returned array seedRet[0] = (byte) 1; // check that above modification did not changed // internal state of test object assertTrue(Arrays.equals(seed, c.getSeed())); } /** * Test #3 for getSeed() method
* Assertion: returned array is copied to prevent subsequent modification
* Test preconditions: ECFieldF2m instance * created using valid parameters
* Expected: repeated method calls must return different refs */ public final void testGetSeed03() { ECFieldFp f = new ECFieldFp(BigInteger.valueOf(23L)); BigInteger a = BigInteger.ONE; BigInteger b = BigInteger.valueOf(19L); byte[] seed = new byte[24]; EllipticCurve c = new EllipticCurve(f, a, b, seed); c.getSeed(); assertNotSame(c.getSeed(), c.getSeed()); } /** * java.security.spec.EllipticCurve#getSeed() * Assertion: null if not specified */ public final void testGetSeed04() { //Regression for HARMONY-732 ECFieldFp f = new ECFieldFp(BigInteger.valueOf(23L)); BigInteger a = BigInteger.ONE; assertNull(new EllipticCurve(f, a, a).getSeed()); } /** * Test #1 for equals(Object other) method
* Assertion: return true if this and other objects are equal
* Test preconditions: see test comments
* Expected: all objects in this test must be equal */ public final void testEqualsObject01() { // test case 1: must be equal to itself EllipticCurve c2 = null, c1 = new EllipticCurve(new ECFieldFp( BigInteger.valueOf(23L)), BigInteger.ONE, BigInteger .valueOf(19L)); assertTrue(c1.equals(c1)); // test case 2: equal objects c1 = new EllipticCurve(new ECFieldFp(BigInteger.valueOf(23L)), BigInteger.ONE, BigInteger.valueOf(19L)); c2 = new EllipticCurve(new ECFieldFp(BigInteger.valueOf(23L)), BigInteger.valueOf(1L), BigInteger.valueOf(19L)); assertTrue(c1.equals(c2) && c2.equals(c1)); // test case 3: equal objects with seed not null c1 = new EllipticCurve(new ECFieldFp(BigInteger.valueOf(23L)), BigInteger.ONE, BigInteger.valueOf(19L), new byte[24]); c2 = new EllipticCurve(new ECFieldFp(BigInteger.valueOf(23L)), BigInteger.valueOf(1L), BigInteger.valueOf(19L), new byte[24]); assertTrue(c1.equals(c2) && c2.equals(c1)); // test case 4: equal object and subclass object c1 = new EllipticCurve(new ECFieldFp(BigInteger.valueOf(23L)), BigInteger.ONE, BigInteger.valueOf(19L), new byte[24]); MyEllipticCurve c3 = new MyEllipticCurve(new ECFieldFp(BigInteger .valueOf(23L)), BigInteger.ONE, BigInteger.valueOf(19L), new byte[24]); assertTrue(c1.equals(c3) && c3.equals(c1)); // test case 5: equal objects c1 = new EllipticCurve(new ECFieldFp(BigInteger.valueOf(23L)), BigInteger.ONE, BigInteger.valueOf(19L)); c2 = new EllipticCurve(new ECFieldFp(BigInteger.valueOf(23L)), BigInteger.valueOf(1L), BigInteger.valueOf(19L), null); assertTrue(c1.equals(c2) && c2.equals(c1)); } /** * Test #1 for hashCode() method.
* * Assertion: must return the same value if invoked * repeatedly on the same object. */ public final void testHashCode01() { int hc = 0; EllipticCurve f = new EllipticCurve(new ECFieldFp(BigInteger .valueOf(23L)), BigInteger.ONE, BigInteger.valueOf(19L), new byte[24]); hc = f.hashCode(); assertTrue(hc == f.hashCode() && hc == f.hashCode() && hc == f.hashCode() && hc == f.hashCode() && hc == f.hashCode() && hc == f.hashCode() && hc == f.hashCode() && hc == f.hashCode()); } /** * Test #2 for hashCode() method.
* * Assertion: must return the same value if invoked * on equal (according to the equals(Object) method) objects. */ public final void testHashCode02() { assertEquals(new EllipticCurve(new ECFieldFp(BigInteger.valueOf(23L)), BigInteger.ONE, BigInteger.valueOf(19L), new byte[24]) .hashCode(), new EllipticCurve(new ECFieldFp(BigInteger .valueOf(23L)), BigInteger.ONE, BigInteger.valueOf(19L), new byte[24]).hashCode()); } // // Private stuff // class testECField implements ECField { public int getFieldSize() { return 2; } } /** * EllipticCurve subclass for testing purposes * */ private static class MyEllipticCurve extends EllipticCurve { MyEllipticCurve(ECField f, BigInteger a, BigInteger b, byte[] seed) { super(f, a, b, seed); } } }