@Test public void hashCodesAreEqualForEquivalentObjects() { // Arrange: final GroupElement g1 = MathUtils.getRandomGroupElement(); final GroupElement g2 = MathUtils.toRepresentation(g1, GroupElement.Representation.P2); final GroupElement g3 = MathUtils.toRepresentation(g1, GroupElement.Representation.P1P1); final GroupElement g4 = MathUtils.getRandomGroupElement(); // Assert Assert.assertThat(g2.hashCode(), IsEqual.equalTo(g1.hashCode())); Assert.assertThat(g3.hashCode(), IsEqual.equalTo(g1.hashCode())); Assert.assertThat(g1.hashCode(), IsNot.not(IsEqual.equalTo(g4.hashCode()))); Assert.assertThat(g2.hashCode(), IsNot.not(IsEqual.equalTo(g4.hashCode()))); Assert.assertThat(g3.hashCode(), IsNot.not(IsEqual.equalTo(g4.hashCode()))); }
@Test public void equalsOnlyReturnsTrueForEquivalentObjects() { // Arrange: final GroupElement g1 = MathUtils.getRandomGroupElement(); final GroupElement g2 = MathUtils.toRepresentation(g1, GroupElement.Representation.P2); final GroupElement g3 = MathUtils.toRepresentation(g1, GroupElement.Representation.CACHED); final GroupElement g4 = MathUtils.toRepresentation(g1, GroupElement.Representation.P1P1); final GroupElement g5 = MathUtils.getRandomGroupElement(); // Assert Assert.assertThat(g2, IsEqual.equalTo(g1)); Assert.assertThat(g3, IsEqual.equalTo(g1)); Assert.assertThat(g1, IsEqual.equalTo(g4)); Assert.assertThat(g1, IsNot.not(IsEqual.equalTo(g5))); Assert.assertThat(g2, IsNot.not(IsEqual.equalTo(g5))); Assert.assertThat(g3, IsNot.not(IsEqual.equalTo(g5))); Assert.assertThat(g5, IsNot.not(IsEqual.equalTo(g4))); }
@Test(expected = IllegalArgumentException.class) public void toCachedThrowsIfGroupElementHasP1P1Representation() { // Arrange: final GroupElement g = MathUtils.toRepresentation( MathUtils.getRandomGroupElement(), GroupElement.Representation.P1P1); // Assert: g.toCached(); }
@Test(expected = IllegalArgumentException.class) public void toP3ThrowsIfGroupElementHasPrecompRepresentation() { // Arrange: final GroupElement g = MathUtils.toRepresentation( MathUtils.getRandomGroupElement(), GroupElement.Representation.PRECOMP); // Assert: g.toP3(); }
@Test public void toP3ReturnsExpectedResultIfGroupElementHasP1P1Representation() { for (int i = 0; i < 10; i++) { // Arrange: final GroupElement g = MathUtils.toRepresentation( MathUtils.getRandomGroupElement(), GroupElement.Representation.P1P1); // Act: final GroupElement h1 = g.toP3(); final GroupElement h2 = MathUtils.toRepresentation(g, GroupElement.Representation.P3); // Assert: Assert.assertThat(h1, IsEqual.equalTo(h2)); Assert.assertThat(h1.getRepresentation(), IsEqual.equalTo(GroupElement.Representation.P3)); Assert.assertThat(h1.getX(), IsEqual.equalTo(g.getX().multiply(g.getT()))); Assert.assertThat(h1.getY(), IsEqual.equalTo(g.getY().multiply(g.getZ()))); Assert.assertThat(h1.getZ(), IsEqual.equalTo(g.getZ().multiply(g.getT()))); Assert.assertThat(h1.getT(), IsEqual.equalTo(g.getX().multiply(g.getY()))); } }
@Test public void dblPrecomputedTableContainsExpectedGroupElements() { // Arrange: GroupElement g = ed25519.getB(); GroupElement h = MathUtils.addGroupElements(g, g); // Act + Assert: for (int i = 0; i < 8; i++) { Assert.assertThat( MathUtils.toRepresentation(g, GroupElement.Representation.PRECOMP), IsEqual.equalTo(ed25519.getB().dblPrecmp[i])); g = MathUtils.addGroupElements(g, h); } }
@Test public void precomputedTableContainsExpectedGroupElements() { // Arrange: GroupElement g = ed25519.getB(); // Act + Assert: for (int i = 0; i < 32; i++) { GroupElement h = g; for (int j = 0; j < 8; j++) { Assert.assertThat( MathUtils.toRepresentation(h, GroupElement.Representation.PRECOMP), IsEqual.equalTo(ed25519.getB().precmp[i][j])); h = MathUtils.addGroupElements(h, g); } for (int k = 0; k < 8; k++) { g = MathUtils.addGroupElements(g, g); } } }
@Test public void toP2ReturnsExpectedResultIfGroupElementHasP2Representation() { for (int i = 0; i < 10; i++) { // Arrange: final GroupElement g = MathUtils.toRepresentation( MathUtils.getRandomGroupElement(), GroupElement.Representation.P2); // Act: final GroupElement h = g.toP2(); // Assert: Assert.assertThat(h, IsEqual.equalTo(g)); Assert.assertThat(h.getRepresentation(), IsEqual.equalTo(GroupElement.Representation.P2)); Assert.assertThat(h.getX(), IsEqual.equalTo(g.getX())); Assert.assertThat(h.getY(), IsEqual.equalTo(g.getY())); Assert.assertThat(h.getZ(), IsEqual.equalTo(g.getZ())); Assert.assertThat(h.getT(), IsEqual.equalTo(null)); } }
@Test public void toCachedReturnsExpectedResultIfGroupElementHasP3Representation() { for (int i = 0; i < 10; i++) { // Arrange: final GroupElement g = MathUtils.getRandomGroupElement(); // Act: final GroupElement h1 = g.toCached(); final GroupElement h2 = MathUtils.toRepresentation(g, GroupElement.Representation.CACHED); // Assert: Assert.assertThat(h1, IsEqual.equalTo(h2)); Assert.assertThat( h1.getRepresentation(), IsEqual.equalTo(GroupElement.Representation.CACHED)); Assert.assertThat(h1, IsEqual.equalTo(g)); Assert.assertThat(h1.getX(), IsEqual.equalTo(g.getY().add(g.getX()))); Assert.assertThat(h1.getY(), IsEqual.equalTo(g.getY().subtract(g.getX()))); Assert.assertThat(h1.getZ(), IsEqual.equalTo(g.getZ())); Assert.assertThat(h1.getT(), IsEqual.equalTo(g.getT().multiply(curve.get2D()))); } }