-
Notifications
You must be signed in to change notification settings - Fork 847
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix 7702 signature bound checks #7641
Changes from all commits
e7e06c3
f8bf9f7
6367ae3
64a14f0
bcdbb7b
0a8c96c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We could be a bit more precise here and check whether r and s are smaller than the prime of the curve, which is p = 2^256-2^32-977. But that still does not guarantee that (r, s) is a point on the curve. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Looking at the code this could be any curve that is being used here, so 2^256 might be better for an initial check? |
||
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); | ||
} | ||
} |
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()); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if you want to reduce the failure rate of ATs, then increase the number of total runners, maybe you can move 2 from reference-tests, that are faster, here