gnark-plonky2-verifier/sha512/xor3.go
sha512/xor3.goRaw
1package sha512
2
3import (
4 "github.com/consensys/gnark/frontend"
5)
6
7func Xor3_512(api frontend.API, a, b, c []frontend.Variable) ([]frontend.Variable) {
8 n := len(a)
9 if len(a) != n { panic("bad length") }
10 if len(b) != n { panic("bad length") }
11 if len(c) != n { panic("bad length") }
12 out := make([]frontend.Variable, n)
13 for k := 0; k < n; k++ {
14 mid := api.Mul(b[k], c[k])
15 p := api.Add(1, api.Mul(-2, b[k]), api.Mul(-2, c[k]), api.Mul(4, mid))
16 q := api.Mul(a[k], p)
17 out[k] = api.Add(q, b[k], c[k], api.Mul(-2, mid))
18 // TODO: try doing this instead:
19 // out[k] = api.Xor(a[k], api.Xor(b[k], c[k]))
20 }
21 return out
22}
23
24// template Xor3_512(n) {
25// signal input a[n];
26// signal input b[n];
27// signal input c[n];
28// signal output out[n];
29// signal mid[n];
30
31// for (var k=0; k<n; k++) {
32// mid[k] <== b[k]*c[k];
33// out[k] <== a[k] * (1 -2*b[k] -2*c[k] +4*mid[k]) + b[k] + c[k] -2*mid[k];
34// }
35// }