From f2b078a232dfc169b7b0a814d910a3bd19ab6b29 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 29 May 2023 16:13:01 -0300 Subject: [PATCH 1/4] Catch possible sustraction error in QUAD_BIT & DI_BIT hints --- .../builtin_hint_processor/secp/ec_utils.rs | 26 +++++++++++++++++++ src/vm/errors/hint_errors.rs | 2 ++ 2 files changed, 28 insertions(+) diff --git a/src/hint_processor/builtin_hint_processor/secp/ec_utils.rs b/src/hint_processor/builtin_hint_processor/secp/ec_utils.rs index 2295a0d685..1c89beeb3d 100644 --- a/src/hint_processor/builtin_hint_processor/secp/ec_utils.rs +++ b/src/hint_processor/builtin_hint_processor/secp/ec_utils.rs @@ -487,6 +487,9 @@ pub fn n_pair_bits( if m >= 253 { return insert_value_from_var_name("quad_bit", 0, vm, ids_data, ap_tracking); } + if m.is_zero() { + return Err(HintError::NPairBitsMZero); + } let one = &Felt252::one(); let two = &Felt252::from(2); @@ -1281,6 +1284,29 @@ mod tests { check_memory![vm.segments.memory, ((1, 3), 2)]; } + #[test] + fn run_di_bit_m_zero() { + let hint_code = hint_code::DI_BIT; + let mut vm = vm_with_range_check!(); + + let scalar_u = 0b10101111001110000; + let scalar_v = 0b101101000111011111100; + let m = 0; + // Insert ids.scalar into memory + vm.segments = segments![((1, 0), scalar_u), ((1, 1), scalar_v), ((1, 2), m)]; + + // Initialize RunContext + run_context!(vm, 0, 4, 4); + + let ids_data = ids_data!["scalar_u", "scalar_v", "m", "dibit"]; + + // Execute the hint + assert_matches!( + run_hint!(vm, ids_data, hint_code), + Err(HintError::NPairBitsMZero) + ); + } + #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn run_import_secp256r1_alpha() { diff --git a/src/vm/errors/hint_errors.rs b/src/vm/errors/hint_errors.rs index 7f88c5d25c..bd299b67b7 100644 --- a/src/vm/errors/hint_errors.rs +++ b/src/vm/errors/hint_errors.rs @@ -179,4 +179,6 @@ pub enum HintError { RecoverYPointNotOnCurve(Felt252), #[error("Invalid value for {0}. Got: {1}. Expected: {2}")] InvalidValue(&'static str, Felt252, Felt252), + #[error("Attempt to subtract with overflow: ids.m - 1")] + NPairBitsMZero, } From 2c9ae6f39e9d6ea6f19bf46fa6e866026fb537a9 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 29 May 2023 16:17:02 -0300 Subject: [PATCH 2/4] Fix changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a61dd69dc..15c420b221 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ #### Upcoming Changes +* Fix possible sustraction overflow in `QUAD_BIT` & `DI_BIT` hints [#1185](https://github.com/lambdaclass/cairo-rs/pull/1185) + + * Hints now return an error when ids.m equals zero + * Add `CairoRunner::run_until_pc_with_steps_limit method` [#1181](https://github.com/lambdaclass/cairo-rs/pull/1181) * fix: felt_from_number not properly returning parse errors [#1012](https://github.com/lambdaclass/cairo-rs/pull/1012) From b24270200f5bcc40abab4eb730d59d45ebbaa062 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 29 May 2023 16:17:55 -0300 Subject: [PATCH 3/4] Typo --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15c420b221..39053c3883 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ #### Upcoming Changes -* Fix possible sustraction overflow in `QUAD_BIT` & `DI_BIT` hints [#1185](https://github.com/lambdaclass/cairo-rs/pull/1185) +* Fix possible subtraction overflow in `QUAD_BIT` & `DI_BIT` hints [#1185](https://github.com/lambdaclass/cairo-rs/pull/1185) * Hints now return an error when ids.m equals zero From 4b2cd4047a827c404ae58b9674ccf0687e64dff9 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 29 May 2023 16:18:34 -0300 Subject: [PATCH 4/4] Fix changelog entry --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39053c3883..6014085a38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ * Fix possible subtraction overflow in `QUAD_BIT` & `DI_BIT` hints [#1185](https://github.com/lambdaclass/cairo-rs/pull/1185) - * Hints now return an error when ids.m equals zero + * These hints now return an error when ids.m equals zero * Add `CairoRunner::run_until_pc_with_steps_limit method` [#1181](https://github.com/lambdaclass/cairo-rs/pull/1181)