@@ -275,7 +275,7 @@ for i in range(ids.packed_values_len):
275
275
val_len = 2 if val < 2**63 else 8
276
276
if val_len == 8:
277
277
val += 2**255
278
- for i in range(val_len - 1, -1, -1 ):
278
+ for i in range(val_len):
279
279
val, memory[ids.unpacked_u32s + offset + i] = divmod(val, 2**32)
280
280
assert val == 0
281
281
offset += val_len
@@ -302,11 +302,11 @@ pub fn blake2s_unpack_felts(
302
302
. flat_map ( |val| {
303
303
if val < pow2_63 {
304
304
let ( high, low) = val. div_rem ( & pow2_32) ;
305
- vec ! [ high , low ]
305
+ vec ! [ low , high ]
306
306
} else {
307
307
let mut limbs = vec ! [ BigUint :: from( 0_u32 ) ; 8 ] ;
308
308
let mut val: BigUint = val + & pow2_255;
309
- for limb in limbs. iter_mut ( ) . rev ( ) {
309
+ for limb in limbs. iter_mut ( ) {
310
310
let ( q, r) = val. div_rem ( & pow2_32) ;
311
311
* limb = r;
312
312
val = q;
@@ -323,6 +323,51 @@ pub fn blake2s_unpack_felts(
323
323
Ok ( ( ) )
324
324
}
325
325
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
+
326
371
/* Implements Hint:
327
372
%{
328
373
from starkware.cairo.common.cairo_blake2s.blake2s_utils import IV, blake2s_compress
@@ -769,16 +814,64 @@ mod tests {
769
814
//Check data ptr
770
815
check_memory ! [
771
816
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 ) ,
775
862
( ( 2 , 3 ) , 0 ) ,
776
863
( ( 2 , 4 ) , 0 ) ,
777
864
( ( 2 , 5 ) , 0 ) ,
778
865
( ( 2 , 6 ) , 0 ) ,
779
- ( ( 2 , 7 ) , 0x1234abcd ) ,
866
+ ( ( 2 , 7 ) , 0 ) ,
780
867
( ( 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 ) ,
782
875
] ;
783
876
}
784
877
0 commit comments