/** * Reduces an integer in 2^8 bit representation modulo the group order and returns the result. * * @param bytes The integer in 2^8 bit representation. * @return The mod group order reduced integer. */ public static byte[] reduceModGroupOrder(final byte[] bytes) { final BigInteger b = toBigInteger(bytes).mod(groupOrder); return toByteArray(b); }
/** * Calculates (a * b + c) mod group order and returns the result. * <p> * a, b and c are given in 2^8 bit representation. * * @param a The first integer. * @param b The second integer. * @param c The third integer. * @return The mod group order reduced result. */ public static byte[] multiplyAndAddModGroupOrder(final byte[] a, final byte[] b, final byte[] c) { final BigInteger result = toBigInteger(a).multiply(toBigInteger(b)).add(toBigInteger(c)).mod(groupOrder); return toByteArray(result); }
/** * Converts a BigInteger to a field element. * * @param b The BigInteger. * @return The field element. */ public static FieldElement toFieldElement(final BigInteger b) { return getField().getEncoding().decode(toByteArray(b)); }
@Test public void toByteArrayReturnsExpectedResult() { for (int i=0; i<100; i++) { // Arrange: final GroupElement g = MathUtils.getRandomGroupElement(); // Act: final byte[] gBytes = g.toByteArray(); final byte[] bytes = MathUtils.toByteArray(MathUtils.toBigInteger(g.getY())); if (MathUtils.toBigInteger(g.getX()).mod(new BigInteger("2")).equals(BigInteger.ONE)) { bytes[31] |= 0x80; } // Assert: Assert.assertThat(Arrays.equals(gBytes, bytes), IsEqual.equalTo(true)); } }
@Test public void encodeReturnsCorrectByteArray() { for (int i=0; i<10000; i++){ // Arrange: final int[] t = new int[10]; for (int j=0; j<10; j++) { t[j] = random.nextInt(1 << 28) - (1 << 27); } final FieldElement fieldElement1 = new Ed25519FieldElement(MathUtils.getField(), t); final BigInteger b = MathUtils.toBigInteger(t); // Act: final byte[] bytes = MathUtils.getField().getEncoding().encode(fieldElement1); // Assert: Assert.assertThat(bytes, IsEqual.equalTo(MathUtils.toByteArray(b.mod(MathUtils.getQ())))); } }
@Test public void encodeReturnsCorrectByteArrayForSimpleFieldElements() { // Arrange: final int[] t1 = new int[10]; final int[] t2 = new int[10]; t2[0] = 1; final FieldElement fieldElement1 = new Ed25519FieldElement(MathUtils.getField(), t1); final FieldElement fieldElement2 = new Ed25519FieldElement(MathUtils.getField(), t2); // Act: final byte[] bytes1 = MathUtils.getField().getEncoding().encode(fieldElement1); final byte[] bytes2 = MathUtils.getField().getEncoding().encode(fieldElement2); // Assert: Assert.assertThat(bytes1, IsEqual.equalTo(MathUtils.toByteArray(BigInteger.ZERO))); Assert.assertThat(bytes2, IsEqual.equalTo(MathUtils.toByteArray(BigInteger.ONE))); }