arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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[k]))
16		q := api.Mul(a[k], inner)
17		out[k] = api.Add(q, b[k], c[k], api.Mul(-2, mid[k]))
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// }