Skip to content

Commit 0a14a99

Browse files
authored
Catch possible subtraction error in QUAD_BIT & DI_BIT hints (#1185)
* Catch possible sustraction error in QUAD_BIT & DI_BIT hints * Fix changelog entry * Typo * Fix changelog entry
1 parent 45bf5c8 commit 0a14a99

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
#### Upcoming Changes
44

5+
* Fix possible subtraction overflow in `QUAD_BIT` & `DI_BIT` hints [#1185](https://github.com/lambdaclass/cairo-rs/pull/1185)
6+
7+
* These hints now return an error when ids.m equals zero
8+
59
* Add `CairoRunner::run_until_pc_with_steps_limit method` [#1181](https://github.com/lambdaclass/cairo-rs/pull/1181)
610

711
* fix: felt_from_number not properly returning parse errors [#1012](https://github.com/lambdaclass/cairo-rs/pull/1012)

src/hint_processor/builtin_hint_processor/secp/ec_utils.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,9 @@ pub fn n_pair_bits(
487487
if m >= 253 {
488488
return insert_value_from_var_name("quad_bit", 0, vm, ids_data, ap_tracking);
489489
}
490+
if m.is_zero() {
491+
return Err(HintError::NPairBitsMZero);
492+
}
490493

491494
let one = &Felt252::one();
492495
let two = &Felt252::from(2);
@@ -1281,6 +1284,29 @@ mod tests {
12811284
check_memory![vm.segments.memory, ((1, 3), 2)];
12821285
}
12831286

1287+
#[test]
1288+
fn run_di_bit_m_zero() {
1289+
let hint_code = hint_code::DI_BIT;
1290+
let mut vm = vm_with_range_check!();
1291+
1292+
let scalar_u = 0b10101111001110000;
1293+
let scalar_v = 0b101101000111011111100;
1294+
let m = 0;
1295+
// Insert ids.scalar into memory
1296+
vm.segments = segments![((1, 0), scalar_u), ((1, 1), scalar_v), ((1, 2), m)];
1297+
1298+
// Initialize RunContext
1299+
run_context!(vm, 0, 4, 4);
1300+
1301+
let ids_data = ids_data!["scalar_u", "scalar_v", "m", "dibit"];
1302+
1303+
// Execute the hint
1304+
assert_matches!(
1305+
run_hint!(vm, ids_data, hint_code),
1306+
Err(HintError::NPairBitsMZero)
1307+
);
1308+
}
1309+
12841310
#[test]
12851311
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
12861312
fn run_import_secp256r1_alpha() {

src/vm/errors/hint_errors.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,4 +179,6 @@ pub enum HintError {
179179
RecoverYPointNotOnCurve(Felt252),
180180
#[error("Invalid value for {0}. Got: {1}. Expected: {2}")]
181181
InvalidValue(&'static str, Felt252, Felt252),
182+
#[error("Attempt to subtract with overflow: ids.m - 1")]
183+
NPairBitsMZero,
182184
}

0 commit comments

Comments
 (0)