Skip to content

Commit 4bd5794

Browse files
Sort_ecdsa_and_mod_builtins_private_inputs_by_idx (#1851)
* Sort_ecdsa_and_mod_builtins_private_inputs_by_idx * Add signature `get_air_private_input` test and msg if somehow reaching unreachable clause * sort sigs before iterating --------- Co-authored-by: Pedro Fontana <[email protected]>
1 parent 6025257 commit 4bd5794

File tree

3 files changed

+79
-1
lines changed

3 files changed

+79
-1
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818

1919
* chore: update Rust required version to 1.81.0 [#1857](https://github.com/lambdaclass/cairo-vm/pull/1857)
2020

21+
* fix: [#1851](https://github.com/lambdaclass/cairo-vm/pull/1851):
22+
* Fix unsorted signature and mod builtin outputs in air_private_input.
23+
2124
* feat(BREAKING): [#1824](https://github.com/lambdaclass/cairo-vm/pull/1824)[#1838](https://github.com/lambdaclass/cairo-vm/pull/1838):
2225
* Add support for dynamic layout
2326
* CLI change(BREAKING): The flag `cairo_layout_params_file` must be specified when using dynamic layout.

vm/src/vm/runners/builtin_runner/modulo.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ impl ModBuiltinRunner {
263263
});
264264
}
265265

266+
instances.sort_by_key(|input| input.index);
267+
266268
vec![PrivateInput::Mod(ModInput {
267269
instances,
268270
zero_value_address: relocation_table

vm/src/vm/runners/builtin_runner/signature.rs

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,17 @@ impl SignatureBuiltinRunner {
210210

211211
pub fn air_private_input(&self, memory: &Memory) -> Vec<PrivateInput> {
212212
let mut private_inputs = vec![];
213-
for (addr, signature) in self.signatures.borrow().iter() {
213+
214+
// Collect and sort the signatures by their index before the loop
215+
let binding = self.signatures.borrow();
216+
let mut sorted_signatures: Vec<_> = binding.iter().collect();
217+
sorted_signatures.sort_by_key(|(addr, _)| {
218+
addr.offset
219+
.checked_div(CELLS_PER_SIGNATURE as usize)
220+
.unwrap_or_default()
221+
});
222+
223+
for (addr, signature) in sorted_signatures {
214224
if let (Ok(pubkey), Some(msg)) = (
215225
memory.get_integer(*addr),
216226
(*addr + 1_usize)
@@ -554,4 +564,67 @@ mod tests {
554564
assert_eq!(signature_a.s, signature_b.s);
555565
}
556566
}
567+
#[test]
568+
fn get_air_private_input() {
569+
let mut builtin = SignatureBuiltinRunner::new(Some(512), true);
570+
571+
builtin.base = 0;
572+
573+
let signature1_r = Felt252::from(1234);
574+
let signature1_s = Felt252::from(5678);
575+
let signature2_r = Felt252::from(8765);
576+
let signature2_s = Felt252::from(4321);
577+
578+
let sig1_addr = Relocatable::from((builtin.base as isize, 0));
579+
let sig2_addr = Relocatable::from((builtin.base as isize, CELLS_PER_SIGNATURE as usize));
580+
581+
builtin
582+
.add_signature(sig1_addr, &(signature1_r, signature1_s))
583+
.unwrap();
584+
builtin
585+
.add_signature(sig2_addr, &(signature2_r, signature2_s))
586+
.unwrap();
587+
588+
let pubkey1 = Felt252::from(1111);
589+
let msg1 = Felt252::from(2222);
590+
let pubkey2 = Felt252::from(3333);
591+
let msg2 = Felt252::from(4444);
592+
593+
let segments = segments![
594+
((0, 0), 1111),
595+
((0, 1), 2222),
596+
((0, 2), 3333),
597+
((0, 3), 4444)
598+
];
599+
let w1 =
600+
Felt252::from(&div_mod(&BigInt::one(), &signature1_s.to_bigint(), &EC_ORDER).unwrap());
601+
602+
let w2 =
603+
Felt252::from(&div_mod(&BigInt::one(), &signature2_s.to_bigint(), &EC_ORDER).unwrap());
604+
605+
let expected_private_inputs = vec![
606+
PrivateInput::Signature(PrivateInputSignature {
607+
index: 0,
608+
pubkey: pubkey1,
609+
msg: msg1,
610+
signature_input: SignatureInput {
611+
r: signature1_r,
612+
w: w1,
613+
},
614+
}),
615+
PrivateInput::Signature(PrivateInputSignature {
616+
index: 1,
617+
pubkey: pubkey2,
618+
msg: msg2,
619+
signature_input: SignatureInput {
620+
r: signature2_r,
621+
w: w2,
622+
},
623+
}),
624+
];
625+
626+
let private_inputs = builtin.air_private_input(&segments.memory);
627+
628+
assert_eq!(private_inputs, expected_private_inputs);
629+
}
557630
}

0 commit comments

Comments
 (0)