forked from hyperledger/besu
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix 7702 signature bound checks (hyperledger#7641)
* create separate signature class for code delegations as they have different bound checks Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net> * test if increasing xmx let's failing acceptance test pass Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net> * javadoc Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com> --------- Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net> Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com> Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com>
- Loading branch information
1 parent
25186d3
commit cb1e36a
Showing
8 changed files
with
193 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
59 changes: 59 additions & 0 deletions
59
crypto/algorithms/src/main/java/org/hyperledger/besu/crypto/CodeDelegationSignature.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
/* | ||
* Copyright contributors to Hyperledger Besu. | ||
* | ||
* Licensed 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. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package org.hyperledger.besu.crypto; | ||
|
||
import static com.google.common.base.Preconditions.checkNotNull; | ||
|
||
import java.math.BigInteger; | ||
|
||
/** Secp signature with code delegation. */ | ||
public class CodeDelegationSignature extends SECPSignature { | ||
private static final BigInteger TWO_POW_256 = BigInteger.TWO.pow(256); | ||
|
||
/** | ||
* Instantiates a new SECPSignature. | ||
* | ||
* @param r the r part of the signature | ||
* @param s the s part of the signature | ||
* @param yParity the parity of the y coordinate of the public key | ||
*/ | ||
public CodeDelegationSignature(final BigInteger r, final BigInteger s, final byte yParity) { | ||
super(r, s, yParity); | ||
} | ||
|
||
/** | ||
* Create a new CodeDelegationSignature. | ||
* | ||
* @param r the r part of the signature | ||
* @param s the s part of the signature | ||
* @param yParity the parity of the y coordinate of the public key | ||
* @return the new CodeDelegationSignature | ||
*/ | ||
public static CodeDelegationSignature create( | ||
final BigInteger r, final BigInteger s, final long yParity) { | ||
checkNotNull(r); | ||
checkNotNull(s); | ||
|
||
if (r.compareTo(TWO_POW_256) >= 0) { | ||
throw new IllegalArgumentException("Invalid 'r' value, should be < 2^256 but got " + r); | ||
} | ||
|
||
if (s.compareTo(TWO_POW_256) >= 0) { | ||
throw new IllegalArgumentException("Invalid 's' value, should be < 2^256 but got " + s); | ||
} | ||
|
||
return new CodeDelegationSignature(r, s, (byte) yParity); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
93 changes: 93 additions & 0 deletions
93
crypto/algorithms/src/test/java/org/hyperledger/besu/crypto/CodeDelegationSignatureTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
/* | ||
* Copyright contributors to Hyperledger Besu. | ||
* | ||
* Licensed 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. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package org.hyperledger.besu.crypto; | ||
|
||
import static org.assertj.core.api.Assertions.assertThat; | ||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType; | ||
|
||
import java.math.BigInteger; | ||
|
||
import org.junit.jupiter.api.Test; | ||
|
||
class CodeDelegationSignatureTest { | ||
|
||
private static final BigInteger TWO_POW_256 = BigInteger.valueOf(2).pow(256); | ||
|
||
@Test | ||
void testValidInputs() { | ||
BigInteger r = BigInteger.ONE; | ||
BigInteger s = BigInteger.TEN; | ||
long yParity = 1L; | ||
|
||
CodeDelegationSignature result = CodeDelegationSignature.create(r, s, yParity); | ||
|
||
assertThat(r).isEqualTo(result.getR()); | ||
assertThat(s).isEqualTo(result.getS()); | ||
assertThat((byte) yParity).isEqualTo(result.getRecId()); | ||
} | ||
|
||
@Test | ||
void testNullRValue() { | ||
BigInteger s = BigInteger.TEN; | ||
long yParity = 0L; | ||
|
||
assertThatExceptionOfType(NullPointerException.class) | ||
.isThrownBy(() -> CodeDelegationSignature.create(null, s, yParity)); | ||
} | ||
|
||
@Test | ||
void testNullSValue() { | ||
BigInteger r = BigInteger.ONE; | ||
long yParity = 0L; | ||
|
||
assertThatExceptionOfType(NullPointerException.class) | ||
.isThrownBy(() -> CodeDelegationSignature.create(r, null, yParity)); | ||
} | ||
|
||
@Test | ||
void testRValueExceedsTwoPow256() { | ||
BigInteger r = TWO_POW_256; | ||
BigInteger s = BigInteger.TEN; | ||
long yParity = 0L; | ||
|
||
assertThatExceptionOfType(IllegalArgumentException.class) | ||
.isThrownBy(() -> CodeDelegationSignature.create(r, s, yParity)) | ||
.withMessageContainingAll("Invalid 'r' value, should be < 2^256"); | ||
} | ||
|
||
@Test | ||
void testSValueExceedsTwoPow256() { | ||
BigInteger r = BigInteger.ONE; | ||
BigInteger s = TWO_POW_256; | ||
long yParity = 0L; | ||
|
||
assertThatExceptionOfType(IllegalArgumentException.class) | ||
.isThrownBy(() -> CodeDelegationSignature.create(r, s, yParity)) | ||
.withMessageContainingAll("Invalid 's' value, should be < 2^256"); | ||
} | ||
|
||
@Test | ||
void testValidYParityZero() { | ||
BigInteger r = BigInteger.ONE; | ||
BigInteger s = BigInteger.TEN; | ||
long yParity = 0L; | ||
|
||
CodeDelegationSignature result = CodeDelegationSignature.create(r, s, yParity); | ||
|
||
assertThat(r).isEqualTo(result.getR()); | ||
assertThat(s).isEqualTo(result.getS()); | ||
assertThat((byte) yParity).isEqualTo(result.getRecId()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters