Skip to content

Commit f292846

Browse files
Add_hint_splitting_data_for_blake_with_no_encoding
1 parent 4226352 commit f292846

File tree

3 files changed

+113
-9
lines changed

3 files changed

+113
-9
lines changed

vm/src/hint_processor/builtin_hint_processor/blake2s_utils.rs

Lines changed: 101 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ for i in range(ids.packed_values_len):
275275
val_len = 2 if val < 2**63 else 8
276276
if val_len == 8:
277277
val += 2**255
278-
for i in range(val_len - 1, -1, -1):
278+
for i in range(val_len):
279279
val, memory[ids.unpacked_u32s + offset + i] = divmod(val, 2**32)
280280
assert val == 0
281281
offset += val_len
@@ -302,11 +302,11 @@ pub fn blake2s_unpack_felts(
302302
.flat_map(|val| {
303303
if val < pow2_63 {
304304
let (high, low) = val.div_rem(&pow2_32);
305-
vec![high, low]
305+
vec![low, high]
306306
} else {
307307
let mut limbs = vec![BigUint::from(0_u32); 8];
308308
let mut val: BigUint = val + &pow2_255;
309-
for limb in limbs.iter_mut().rev() {
309+
for limb in limbs.iter_mut() {
310310
let (q, r) = val.div_rem(&pow2_32);
311311
*limb = r;
312312
val = q;
@@ -323,6 +323,51 @@ pub fn blake2s_unpack_felts(
323323
Ok(())
324324
}
325325

326+
/* Implements Hint:
327+
offset = 0
328+
for i in range(ids.packed_values_len):
329+
val = (memory[ids.packed_values + i] % PRIME)
330+
for i in range(8):
331+
val, memory[ids.unpacked_u32s + offset + i] = divmod(val, 2**32)
332+
assert val == 0
333+
offset += val_len
334+
*/
335+
pub fn blake2s_split_felts_to_u32s(
336+
vm: &mut VirtualMachine,
337+
ids_data: &HashMap<String, HintReference>,
338+
ap_tracking: &ApTracking,
339+
) -> Result<(), HintError> {
340+
let packed_values_len =
341+
get_integer_from_var_name("packed_values_len", vm, ids_data, ap_tracking)?;
342+
let packed_values = get_ptr_from_var_name("packed_values", vm, ids_data, ap_tracking)?;
343+
let unpacked_u32s = get_ptr_from_var_name("unpacked_u32s", vm, ids_data, ap_tracking)?;
344+
345+
let vals = vm.get_integer_range(packed_values, felt_to_usize(&packed_values_len)?)?;
346+
let pow2_32 = BigUint::from(1_u32) << 32;
347+
348+
// Split value into either 2 or 8 32-bit limbs.
349+
let out: Vec<MaybeRelocatable> = vals
350+
.into_iter()
351+
.map(|val| val.to_biguint())
352+
.flat_map(|val| {
353+
let mut limbs = vec![BigUint::from(0_u32); 8];
354+
let mut val: BigUint = val;
355+
for limb in limbs.iter_mut() {
356+
let (q, r) = val.div_rem(&pow2_32);
357+
*limb = r;
358+
val = q;
359+
}
360+
limbs
361+
})
362+
.map(Felt252::from)
363+
.map(MaybeRelocatable::from)
364+
.collect();
365+
366+
vm.load_data(unpacked_u32s, &out)
367+
.map_err(HintError::Memory)?;
368+
Ok(())
369+
}
370+
326371
/* Implements Hint:
327372
%{
328373
from starkware.cairo.common.cairo_blake2s.blake2s_utils import IV, blake2s_compress
@@ -769,16 +814,64 @@ mod tests {
769814
//Check data ptr
770815
check_memory![
771816
vm.segments.memory,
772-
((2, 0), 0x1234),
773-
((2, 1), 0x56781234),
774-
((2, 2), 0x80000000),
817+
((2, 0), 0x56781234),
818+
((2, 1), 0x1234),
819+
((2, 2), 0x1234abcd),
820+
((2, 3), 0x5678efab),
821+
((2, 4), 0x1234abcd),
822+
((2, 5), 0),
823+
((2, 6), 0),
824+
((2, 7), 0),
825+
((2, 8), 0),
826+
((2, 9), 0x80000000),
827+
];
828+
}
829+
830+
#[test]
831+
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
832+
fn blake2s_split_felts_to_u32s() {
833+
let hint_code = hint_code::BLAKE2S_SPLIT_FELTS_TO_U32S;
834+
//Create vm
835+
let mut vm = vm!();
836+
//Insert ids into memory
837+
vm.segments = segments![
838+
((1, 0), 2),
839+
((1, 1), (1, 3)),
840+
((1, 2), (2, 0)),
841+
((1, 3), 0x123456781234),
842+
((1, 4), 0x1234abcd5678efab1234abcd5678efab)
843+
];
844+
vm.set_fp(5);
845+
vm.set_ap(5);
846+
let ids_data = ids_data![
847+
"packed_values_len",
848+
"packed_values",
849+
"unpacked_u32s",
850+
"small_value",
851+
"big_value"
852+
];
853+
vm.segments.add();
854+
//Execute the hint
855+
assert_matches!(run_hint!(vm, ids_data, hint_code), Ok(()));
856+
//Check data ptr
857+
check_memory![
858+
vm.segments.memory,
859+
((2, 0), 0x56781234),
860+
((2, 1), 0x1234),
861+
((2, 2), 0),
775862
((2, 3), 0),
776863
((2, 4), 0),
777864
((2, 5), 0),
778865
((2, 6), 0),
779-
((2, 7), 0x1234abcd),
866+
((2, 7), 0),
780867
((2, 8), 0x5678efab),
781-
((2, 9), 0x1234abcd)
868+
((2, 9), 0x1234abcd),
869+
((2, 10), 0x5678efab),
870+
((2, 11), 0x1234abcd),
871+
((2, 12), 0),
872+
((2, 13), 0),
873+
((2, 14), 0),
874+
((2, 15), 0),
782875
];
783876
}
784877

vm/src/hint_processor/builtin_hint_processor/builtin_hint_processor_definition.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use super::{
2323
pack::*,
2424
},
2525
};
26+
use crate::hint_processor::builtin_hint_processor::blake2s_utils::blake2s_split_felts_to_u32s;
2627
use crate::Felt252;
2728
use crate::{
2829
hint_processor::builtin_hint_processor::secp::secp_utils::{SECP256R1_ALPHA, SECP256R1_P},
@@ -366,6 +367,9 @@ impl HintProcessorLogic for BuiltinHintProcessor {
366367
hint_code::BLAKE2S_UNPACK_FELTS => {
367368
blake2s_unpack_felts(vm, &hint_data.ids_data, &hint_data.ap_tracking)
368369
}
370+
hint_code::BLAKE2S_SPLIT_FELTS_TO_U32S => {
371+
blake2s_split_felts_to_u32s(vm, &hint_data.ids_data, &hint_data.ap_tracking)
372+
}
369373
hint_code::UNSAFE_KECCAK => {
370374
unsafe_keccak(vm, exec_scopes, &hint_data.ids_data, &hint_data.ap_tracking)
371375
}

vm/src/hint_processor/builtin_hint_processor/hint_code.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,14 @@ for i in range(ids.packed_values_len):
433433
val_len = 2 if val < 2**63 else 8
434434
if val_len == 8:
435435
val += 2**255
436-
for i in range(val_len - 1, -1, -1):
436+
for i in range(val_len):
437+
val, memory[ids.unpacked_u32s + offset + i] = divmod(val, 2**32)
438+
assert val == 0
439+
offset += val_len"#}),
440+
(BLAKE2S_SPLIT_FELTS_TO_U32S, indoc! {r#"offset = 0
441+
for i in range(ids.packed_values_len):
442+
val = (memory[ids.packed_values + i] % PRIME)
443+
for i in range(8):
437444
val, memory[ids.unpacked_u32s + offset + i] = divmod(val, 2**32)
438445
assert val == 0
439446
offset += val_len"#}),

0 commit comments

Comments
 (0)