Skip to content

Commit 4c5e3fd

Browse files
committed
Keccakf32Memory: use compute_from instead of provide_value
1 parent a6e27ef commit 4c5e3fd

File tree

1 file changed

+43
-28
lines changed

1 file changed

+43
-28
lines changed

std/machines/hash/keccakf32_memory.asm

+43-28
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use std::convert::fe;
88
use std::prelude::set_hint;
99
use std::prelude::Query;
1010
use std::prover::eval;
11-
use std::prover::provide_value;
11+
use std::prover::compute_from;
1212
use std::machines::large_field::memory::Memory;
1313

1414
machine Keccakf32Memory(mem: Memory) with
@@ -592,10 +592,10 @@ machine Keccakf32Memory(mem: Memory) with
592592
// }
593593
// }
594594

595-
let query_c: int, int, int -> int = query |x, limb, bit_in_limb|
595+
let query_c: int, int, int, fe[] -> int = query |x, limb, bit_in_limb, a|
596596
utils::fold(
597597
5,
598-
|y| (int(eval(a[y * 10 + x * 2 + limb])) >> bit_in_limb) & 0x1,
598+
|y| (int(a[y * 10 + x * 2 + limb]) >> bit_in_limb) & 0x1,
599599
0,
600600
|acc, e| acc ^ e
601601
);
@@ -607,7 +607,7 @@ machine Keccakf32Memory(mem: Memory) with
607607
let limb = z / 32;
608608
let bit_in_limb = z % 32;
609609

610-
provide_value(c_i, row, fe(query_c(x, limb, bit_in_limb)));
610+
compute_from(c_i, row, a, |a| fe(query_c(x, limb, bit_in_limb, a)))
611611
});
612612
};
613613

@@ -622,17 +622,17 @@ machine Keccakf32Memory(mem: Memory) with
622622
// }
623623
// }
624624

625-
let query_c_prime: int, int -> int = query |x, z|
626-
int(eval(c[x * 64 + z])) ^
627-
int(eval(c[((x + 4) % 5) * 64 + z])) ^
628-
int(eval(c[((x + 1) % 5) * 64 + (z + 63) % 64]));
625+
let query_c_prime: int, int, fe[] -> int = query |x, z, c|
626+
int(c[x * 64 + z]) ^
627+
int(c[((x + 4) % 5) * 64 + z]) ^
628+
int(c[((x + 1) % 5) * 64 + (z + 63) % 64]);
629629

630630
query |row| {
631631
let _ = array::map_enumerated(c_prime, |i, c_i| {
632632
let x = i / 64;
633633
let z = i % 64;
634634

635-
provide_value(c_i, row, fe(query_c_prime(x, z)));
635+
compute_from(c_i, row, c, |c| fe(query_c_prime(x, z, c)));
636636
});
637637
};
638638

@@ -652,10 +652,6 @@ machine Keccakf32Memory(mem: Memory) with
652652
// }
653653
// }
654654

655-
let query_a_prime: int, int, int, int, int -> int = query |x, y, z, limb, bit_in_limb|
656-
((int(eval(a[y * 10 + x * 2 + limb])) >> bit_in_limb) & 0x1) ^
657-
int(eval(c[x * 64 + z])) ^
658-
int(eval(c_prime[x * 64 + z]));
659655

660656
query |row| {
661657
let _ = array::map_enumerated(a_prime, |i, a_i| {
@@ -665,7 +661,14 @@ machine Keccakf32Memory(mem: Memory) with
665661
let limb = z / 32;
666662
let bit_in_limb = z % 32;
667663

668-
provide_value(a_i, row, fe(query_a_prime(x, y, z, limb, bit_in_limb)));
664+
let a_elem = a[y * 10 + x * 2 + limb];
665+
let c_elem = c[x * 64 + z];
666+
let c_prime_elem = c_prime[x * 64 + z];
667+
668+
compute_from(
669+
a_i, row, [a_elem, c_elem, c_prime_elem],
670+
|inputs| fe(((int(inputs[0]) >> bit_in_limb) & 0x1) ^ int(inputs[1]) ^ int(inputs[2]))
671+
);
669672
});
670673
};
671674

@@ -687,13 +690,23 @@ machine Keccakf32Memory(mem: Memory) with
687690
// }
688691
// }
689692

690-
let query_a_prime_prime: int, int, int -> int = query |x, y, limb|
693+
694+
let b_index: int, int, int -> int = |x, y, z| {
695+
let a: int = (x + 3 * y) % 5;
696+
let rot: int = R[a * 5 + x]; // b = x
697+
x * 320 + a * 64 + (z + 64 - rot) % 64
698+
};
699+
let andn_int: int, int -> int = |a, b| (1 - a) * b;
700+
701+
let query_a_prime_prime: int, int, int, fe[] -> int = query |x, y, limb, a_prime|
691702
utils::fold(
692703
32,
693-
|z|
694-
int(eval(b(x, y, (limb + 1) * 32 - 1 - z))) ^
695-
int(eval(andn(b((x + 1) % 5, y, (limb + 1) * 32 - 1 - z),
696-
b((x + 2) % 5, y, (limb + 1) * 32 - 1 - z)))),
704+
|z|
705+
int(a_prime[b_index(x, y, (limb + 1) * 32 - 1 - z)]) ^
706+
int(andn_int(
707+
int(a_prime[b_index((x + 1) % 5, y, (limb + 1) * 32 - 1 - z)]),
708+
int(a_prime[b_index((x + 2) % 5, y, (limb + 1) * 32 - 1 - z)])
709+
)),
697710
0,
698711
|acc, e| acc * 2 + e
699712
);
@@ -704,7 +717,7 @@ machine Keccakf32Memory(mem: Memory) with
704717
let x = (i / 2) % 5;
705718
let limb = i % 2;
706719

707-
provide_value(a_i, row, fe(query_a_prime_prime(x, y, limb)));
720+
compute_from(a_i, row, a_prime, |a_prime| fe(query_a_prime_prime(x, y, limb, a_prime)));
708721
});
709722
};
710723

@@ -730,10 +743,11 @@ machine Keccakf32Memory(mem: Memory) with
730743
let limb = i / 32;
731744
let bit_in_limb = i % 32;
732745

733-
provide_value(
746+
compute_from(
734747
a_i,
735-
row,
736-
fe((int(eval(a_prime_prime[limb])) >> bit_in_limb) & 0x1)
748+
row,
749+
a_prime_prime,
750+
|a_prime_prime| fe((int(a_prime_prime[limb]) >> bit_in_limb) & 0x1)
737751
);
738752
});
739753
};
@@ -745,16 +759,17 @@ machine Keccakf32Memory(mem: Memory) with
745759
// F::from_canonical_u16(row.a_prime_prime[0][0][limb].as_canonical_u64() as u16 ^ rc_lo);
746760
// }
747761

748-
let query_a_prime_prime_prime_0_0_limbs: int, int -> int = query |round, limb|
749-
int(eval(a_prime_prime[limb])) ^
762+
let query_a_prime_prime_prime_0_0_limbs: int, int, fe[] -> int = query |round, limb, a_prime_prime|
763+
int(a_prime_prime[limb]) ^
750764
((RC[round] >> (limb * 32)) & 0xffffffff);
751765

752766
query |row| {
753767
let _ = array::new(2, |limb| {
754-
provide_value(
768+
compute_from(
755769
a_prime_prime_prime_0_0_limbs[limb],
756-
row,
757-
fe(query_a_prime_prime_prime_0_0_limbs(row % NUM_ROUNDS, limb)
770+
row,
771+
a_prime_prime,
772+
|a_prime_prime| fe(query_a_prime_prime_prime_0_0_limbs(row % NUM_ROUNDS, limb, a_prime_prime)
758773
));
759774
});
760775
};

0 commit comments

Comments
 (0)