Skip to content

Commit c4644dd

Browse files
MegaRedHandkariy
authored andcommitted
fix: dibit shouldn't fail when m is zero (lambdaclass#1247)
* Fix test * Fix n_pair_bits if condition It was always checking that `m` wasn't zero, but that was correct only for a `number_of_pairs` equal to 2 (i.e. quad_bit). * Rename error * Update changelog * Add test for quad_bit with `m == 0`
1 parent 59d23c4 commit c4644dd

File tree

3 files changed

+36
-11
lines changed

3 files changed

+36
-11
lines changed

CHANGELOG.md

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

33
#### Upcoming Changes
44

5+
* fix: `dibit` hint no longer fails when called with an `m` of zero [#1247](https://github.com/lambdaclass/cairo-rs/pull/1247)
6+
57
* fix(security): avoid denial of service on malicious input exploiting the scientific notation parser [#1239](https://github.com/lambdaclass/cairo-rs/pull/1239)
68

79
* perf: accumulate `min` and `max` instruction offsets during run to speed up range check [#1080](https://github.com/lambdaclass/cairo-rs/pull/)

vm/src/hint_processor/builtin_hint_processor/secp/ec_utils.rs

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -498,8 +498,8 @@ pub fn n_pair_bits(
498498
if m >= 253 {
499499
return insert_value_from_var_name(result_name, 0, vm, ids_data, ap_tracking);
500500
}
501-
if m.is_zero() {
502-
return Err(HintError::NPairBitsMZero);
501+
if m + 1 < number_of_pairs {
502+
return Err(HintError::NPairBitsTooLowM);
503503
}
504504

505505
let (scalar_v, scalar_u) = (scalar_v.to_biguint(), scalar_u.to_biguint());
@@ -1329,7 +1329,7 @@ mod tests {
13291329
}
13301330

13311331
#[test]
1332-
fn run_quad_bit_for_m_1() {
1332+
fn run_quad_bit_for_m_1_ok() {
13331333
let hint_code = hint_code::QUAD_BIT;
13341334
let mut vm = vm_with_range_check!();
13351335

@@ -1351,6 +1351,29 @@ mod tests {
13511351
check_memory![vm.segments.memory, ((1, 3), 0)];
13521352
}
13531353

1354+
#[test]
1355+
fn run_quad_bit_for_m_0() {
1356+
let hint_code = hint_code::QUAD_BIT;
1357+
let mut vm = vm_with_range_check!();
1358+
1359+
let scalar_u = 0b1010101;
1360+
let scalar_v = 0b1010101;
1361+
let m = 0;
1362+
// Insert ids.scalar into memory
1363+
vm.segments = segments![((1, 0), scalar_u), ((1, 1), scalar_v), ((1, 2), m)];
1364+
1365+
// Initialize RunContext
1366+
run_context!(vm, 0, 4, 4);
1367+
1368+
let ids_data = ids_data!["scalar_u", "scalar_v", "m", "quad_bit"];
1369+
1370+
// Execute the hint
1371+
assert_matches!(
1372+
run_hint!(vm, ids_data, hint_code),
1373+
Err(HintError::NPairBitsTooLowM)
1374+
);
1375+
}
1376+
13541377
#[test]
13551378
fn run_quad_bit_with_max_m_ok() {
13561379
let hint_code = hint_code::QUAD_BIT;
@@ -1423,12 +1446,12 @@ mod tests {
14231446
}
14241447

14251448
#[test]
1426-
fn run_di_bit_m_zero() {
1449+
fn run_di_bit_m_zero_ok() {
14271450
let hint_code = hint_code::DI_BIT;
14281451
let mut vm = vm_with_range_check!();
14291452

1430-
let scalar_u = 0b10101111001110000;
1431-
let scalar_v = 0b101101000111011111100;
1453+
let scalar_u = 0b00;
1454+
let scalar_v = 0b01;
14321455
let m = 0;
14331456
// Insert ids.scalar into memory
14341457
vm.segments = segments![((1, 0), scalar_u), ((1, 1), scalar_v), ((1, 2), m)];
@@ -1439,10 +1462,10 @@ mod tests {
14391462
let ids_data = ids_data!["scalar_u", "scalar_v", "m", "dibit"];
14401463

14411464
// Execute the hint
1442-
assert_matches!(
1443-
run_hint!(vm, ids_data, hint_code),
1444-
Err(HintError::NPairBitsMZero)
1445-
);
1465+
assert_matches!(run_hint!(vm, ids_data, hint_code), Ok(()));
1466+
1467+
// Check hint memory inserts
1468+
check_memory![vm.segments.memory, ((1, 3), 0b10)];
14461469
}
14471470

14481471
#[test]

vm/src/vm/errors/hint_errors.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ pub enum HintError {
184184
#[error("Invalid value for {}. Got: {}. Expected: {}", (*.0).0, (*.0).1, (*.0).2)]
185185
InvalidValue(Box<(&'static str, Felt252, Felt252)>),
186186
#[error("Attempt to subtract with overflow: ids.m - 1")]
187-
NPairBitsMZero,
187+
NPairBitsTooLowM,
188188
}
189189

190190
#[cfg(test)]

0 commit comments

Comments
 (0)