7702 validation checks v2 (#7653)

* yParity is valid  up to 2**256 as well

Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net>
pull/7664/head
daniellehrner 2 months ago committed by GitHub
parent 6e246ca4b0
commit 1751a77f98
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      crypto/algorithms/src/main/java/org/hyperledger/besu/crypto/AbstractSECP256.java
  2. 15
      crypto/algorithms/src/main/java/org/hyperledger/besu/crypto/CodeDelegationSignature.java
  3. 2
      crypto/algorithms/src/main/java/org/hyperledger/besu/crypto/SignatureAlgorithm.java
  4. 27
      crypto/algorithms/src/test/java/org/hyperledger/besu/crypto/CodeDelegationSignatureTest.java
  5. 2
      ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/CodeDelegationTransactionDecoder.java

@ -214,7 +214,7 @@ public abstract class AbstractSECP256 implements SignatureAlgorithm {
@Override @Override
public CodeDelegationSignature createCodeDelegationSignature( public CodeDelegationSignature createCodeDelegationSignature(
final BigInteger r, final BigInteger s, final long yParity) { final BigInteger r, final BigInteger s, final BigInteger yParity) {
return CodeDelegationSignature.create(r, s, yParity); return CodeDelegationSignature.create(r, s, yParity);
} }

@ -42,18 +42,25 @@ public class CodeDelegationSignature extends SECPSignature {
* @return the new CodeDelegationSignature * @return the new CodeDelegationSignature
*/ */
public static CodeDelegationSignature create( public static CodeDelegationSignature create(
final BigInteger r, final BigInteger s, final long yParity) { final BigInteger r, final BigInteger s, final BigInteger yParity) {
checkNotNull(r); checkNotNull(r);
checkNotNull(s); checkNotNull(s);
if (r.compareTo(TWO_POW_256) >= 0) { if (r.compareTo(TWO_POW_256) >= 0) {
throw new IllegalArgumentException("Invalid 'r' value, should be < 2^256 but got " + r); throw new IllegalArgumentException(
"Invalid 'r' value, should be < 2^256 but got " + r.toString(16));
} }
if (s.compareTo(TWO_POW_256) >= 0) { if (s.compareTo(TWO_POW_256) >= 0) {
throw new IllegalArgumentException("Invalid 's' value, should be < 2^256 but got " + s); throw new IllegalArgumentException(
"Invalid 's' value, should be < 2^256 but got " + s.toString(16));
} }
return new CodeDelegationSignature(r, s, (byte) yParity); if (yParity.compareTo(TWO_POW_256) >= 0) {
throw new IllegalArgumentException(
"Invalid 'yParity' value, should be < 2^256 but got " + yParity.toString(16));
}
return new CodeDelegationSignature(r, s, yParity.byteValue());
} }
} }

@ -224,7 +224,7 @@ public interface SignatureAlgorithm {
* @return the code delegation signature * @return the code delegation signature
*/ */
CodeDelegationSignature createCodeDelegationSignature( CodeDelegationSignature createCodeDelegationSignature(
final BigInteger r, final BigInteger s, final long yParity); final BigInteger r, final BigInteger s, final BigInteger yParity);
/** /**
* Decode secp signature. * Decode secp signature.

@ -29,19 +29,19 @@ class CodeDelegationSignatureTest {
void testValidInputs() { void testValidInputs() {
BigInteger r = BigInteger.ONE; BigInteger r = BigInteger.ONE;
BigInteger s = BigInteger.TEN; BigInteger s = BigInteger.TEN;
long yParity = 1L; BigInteger yParity = BigInteger.ONE;
CodeDelegationSignature result = CodeDelegationSignature.create(r, s, yParity); CodeDelegationSignature result = CodeDelegationSignature.create(r, s, yParity);
assertThat(r).isEqualTo(result.getR()); assertThat(r).isEqualTo(result.getR());
assertThat(s).isEqualTo(result.getS()); assertThat(s).isEqualTo(result.getS());
assertThat((byte) yParity).isEqualTo(result.getRecId()); assertThat(yParity.byteValue()).isEqualTo(result.getRecId());
} }
@Test @Test
void testNullRValue() { void testNullRValue() {
BigInteger s = BigInteger.TEN; BigInteger s = BigInteger.TEN;
long yParity = 0L; BigInteger yParity = BigInteger.ZERO;
assertThatExceptionOfType(NullPointerException.class) assertThatExceptionOfType(NullPointerException.class)
.isThrownBy(() -> CodeDelegationSignature.create(null, s, yParity)); .isThrownBy(() -> CodeDelegationSignature.create(null, s, yParity));
@ -50,7 +50,7 @@ class CodeDelegationSignatureTest {
@Test @Test
void testNullSValue() { void testNullSValue() {
BigInteger r = BigInteger.ONE; BigInteger r = BigInteger.ONE;
long yParity = 0L; BigInteger yParity = BigInteger.ZERO;
assertThatExceptionOfType(NullPointerException.class) assertThatExceptionOfType(NullPointerException.class)
.isThrownBy(() -> CodeDelegationSignature.create(r, null, yParity)); .isThrownBy(() -> CodeDelegationSignature.create(r, null, yParity));
@ -60,7 +60,7 @@ class CodeDelegationSignatureTest {
void testRValueExceedsTwoPow256() { void testRValueExceedsTwoPow256() {
BigInteger r = TWO_POW_256; BigInteger r = TWO_POW_256;
BigInteger s = BigInteger.TEN; BigInteger s = BigInteger.TEN;
long yParity = 0L; BigInteger yParity = BigInteger.ZERO;
assertThatExceptionOfType(IllegalArgumentException.class) assertThatExceptionOfType(IllegalArgumentException.class)
.isThrownBy(() -> CodeDelegationSignature.create(r, s, yParity)) .isThrownBy(() -> CodeDelegationSignature.create(r, s, yParity))
@ -71,23 +71,34 @@ class CodeDelegationSignatureTest {
void testSValueExceedsTwoPow256() { void testSValueExceedsTwoPow256() {
BigInteger r = BigInteger.ONE; BigInteger r = BigInteger.ONE;
BigInteger s = TWO_POW_256; BigInteger s = TWO_POW_256;
long yParity = 0L; BigInteger yParity = BigInteger.ZERO;
assertThatExceptionOfType(IllegalArgumentException.class) assertThatExceptionOfType(IllegalArgumentException.class)
.isThrownBy(() -> CodeDelegationSignature.create(r, s, yParity)) .isThrownBy(() -> CodeDelegationSignature.create(r, s, yParity))
.withMessageContainingAll("Invalid 's' value, should be < 2^256"); .withMessageContainingAll("Invalid 's' value, should be < 2^256");
} }
@Test
void testYParityExceedsTwoPow256() {
BigInteger r = BigInteger.ONE;
BigInteger s = BigInteger.TWO;
BigInteger yParity = TWO_POW_256;
assertThatExceptionOfType(IllegalArgumentException.class)
.isThrownBy(() -> CodeDelegationSignature.create(r, s, yParity))
.withMessageContainingAll("Invalid 'yParity' value, should be < 2^256");
}
@Test @Test
void testValidYParityZero() { void testValidYParityZero() {
BigInteger r = BigInteger.ONE; BigInteger r = BigInteger.ONE;
BigInteger s = BigInteger.TEN; BigInteger s = BigInteger.TEN;
long yParity = 0L; BigInteger yParity = BigInteger.ZERO;
CodeDelegationSignature result = CodeDelegationSignature.create(r, s, yParity); CodeDelegationSignature result = CodeDelegationSignature.create(r, s, yParity);
assertThat(r).isEqualTo(result.getR()); assertThat(r).isEqualTo(result.getR());
assertThat(s).isEqualTo(result.getS()); assertThat(s).isEqualTo(result.getS());
assertThat((byte) yParity).isEqualTo(result.getRecId()); assertThat(yParity.byteValue()).isEqualTo(result.getRecId());
} }
} }

@ -81,7 +81,7 @@ public class CodeDelegationTransactionDecoder {
final Address address = Address.wrap(input.readBytes()); final Address address = Address.wrap(input.readBytes());
final long nonce = input.readLongScalar(); final long nonce = input.readLongScalar();
final long yParity = input.readUnsignedIntScalar(); final BigInteger yParity = input.readUInt256Scalar().toUnsignedBigInteger();
final BigInteger r = input.readUInt256Scalar().toUnsignedBigInteger(); final BigInteger r = input.readUInt256Scalar().toUnsignedBigInteger();
final BigInteger s = input.readUInt256Scalar().toUnsignedBigInteger(); final BigInteger s = input.readUInt256Scalar().toUnsignedBigInteger();

Loading…
Cancel
Save