Sitelet https://github.com/Snezhkko/cairo/commit/f3ea4aaff42bad602cb2b5e1f2c1bbab5f201939
Skip to content

Commit f3ea4aa

Browse files
authored
Refactored s check and improved failure in recover_public_key. (starkware-libs#9142)
1 parent daca8e7 commit f3ea4aa

2 files changed

Lines changed: 36 additions & 12 deletions

File tree

‎corelib/src/ecdsa.cairo‎

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,7 @@ use crate::zeroable::IsZeroResult;
5555
pub fn check_ecdsa_signature(
5656
message_hash: felt252, public_key: felt252, signature_r: felt252, signature_s: felt252,
5757
) -> bool {
58-
// Check that s != 0 (mod stark_curve::ORDER).
59-
if signature_s == 0
60-
|| signature_s == ec::stark_curve::ORDER
61-
|| signature_r == ec::stark_curve::ORDER {
58+
if is_equivalent_to_zero(signature_s) || signature_r == ec::stark_curve::ORDER {
6259
return false;
6360
}
6461

@@ -158,6 +155,10 @@ pub fn check_ecdsa_signature(
158155
pub fn recover_public_key(
159156
message_hash: felt252, signature_r: felt252, signature_s: felt252, y_parity: bool,
160157
) -> Option<felt252> {
158+
if is_equivalent_to_zero(signature_s) {
159+
return None;
160+
}
161+
161162
let r_point = EcPointTrait::new_nz_from_x(signature_r)?;
162163
let gen_point = generator_point()?;
163164

@@ -196,6 +197,12 @@ pub fn recover_public_key(
196197
Some(state.finalize_nz()?.x())
197198
}
198199

200+
/// Checks if `value != 0` (mod stark_curve::ORDER).
201+
fn is_equivalent_to_zero(value: felt252) -> bool {
202+
// Note that `2 * ec::stark_curve::ORDER` is larger than the felt252 PRIME.
203+
value == 0 || value == ec::stark_curve::ORDER
204+
}
205+
199206
// TODO(orizi): Remove this function on next Sierra release.
200207
/// Returns the generator point of the elliptic curve.
201208
///

‎corelib/src/test/ec_test.cairo‎

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::ec::{EcPoint, EcPointTrait, EcStateTrait};
1+
use crate::ec::{EcPoint, EcPointTrait, EcStateTrait, stark_curve};
22
use crate::ecdsa;
33
use crate::option::OptionTrait;
44
use crate::test::test_utils::assert_eq;
@@ -116,13 +116,11 @@ fn test_ecdsa_recover_public_key() {
116116
let message_hash = 0x503f4bea29baee10b22a7f10bdc82dda071c977c1f25b8f3973d34e6b03b2c;
117117
let signature_r = 0xbe96d72eb4f94078192c2e84d5230cde2a70f4b45c8797e2c907acff5060bb;
118118
let signature_s = 0x677ae6bba6daf00d2631fab14c8acf24be6579f9d9e98f67aa7f2770e57a1f5;
119-
assert_eq(
120-
@ecdsa::recover_public_key(:message_hash, :signature_r, :signature_s, y_parity: false)
121-
.unwrap(),
122-
@0x7b7454acbe7845da996377f85eb0892044d75ae95d04d3325a391951f35d2ec,
123-
'recover_ecdsa_public_key failed',
119+
assert_eq!(
120+
ecdsa::recover_public_key(:message_hash, :signature_r, :signature_s, y_parity: false),
121+
Some(0x7b7454acbe7845da996377f85eb0892044d75ae95d04d3325a391951f35d2ec),
124122
);
125-
assert(
123+
assert!(
126124
ecdsa::check_ecdsa_signature(
127125
:message_hash,
128126
public_key: ecdsa::recover_public_key(
@@ -132,7 +130,26 @@ fn test_ecdsa_recover_public_key() {
132130
:signature_r,
133131
:signature_s,
134132
),
135-
'ecdsa returned false',
133+
);
134+
assert_eq!(
135+
ecdsa::recover_public_key(:message_hash, signature_r: 0, :signature_s, y_parity: true),
136+
None,
137+
);
138+
assert_eq!(
139+
ecdsa::recover_public_key(
140+
:message_hash, signature_r: stark_curve::ORDER, :signature_s, y_parity: true,
141+
),
142+
None,
143+
);
144+
assert_eq!(
145+
ecdsa::recover_public_key(:message_hash, :signature_r, signature_s: 0, y_parity: true),
146+
None,
147+
);
148+
assert_eq!(
149+
ecdsa::recover_public_key(
150+
:message_hash, :signature_r, signature_s: stark_curve::ORDER, y_parity: true,
151+
),
152+
None,
136153
);
137154
}
138155

0 commit comments

Comments
 (0)