gnark-plonky2-verifier/poseidon/hash.go
poseidon/hash.goRaw
1package poseidon
2
3import (
4 "github.com/consensys/gnark/frontend"
5 "github.com/succinctlabs/gnark-plonky2-verifier/field"
6)
7
8type Hash = [4]field.F
9
10type HashAPI struct {
11 fieldAPI frontend.API
12}
13
14func NewHashAPI(
15 fieldAPI frontend.API,
16) *HashAPI {
17 return &HashAPI{
18 fieldAPI: fieldAPI,
19 }
20}
21
22func (h *HashAPI) SelectHash(bit frontend.Variable, leftHash, rightHash Hash) Hash {
23 var returnHash Hash
24 for i := 0; i < 4; i++ {
25 returnHash[i] = h.fieldAPI.Select(bit, leftHash[i], rightHash[i]).(field.F)
26 }
27
28 return returnHash
29}
30
31func (h *HashAPI) Lookup2Hash(b0 frontend.Variable, b1 frontend.Variable, h0, h1, h2, h3 Hash) Hash {
32 var returnHash Hash
33
34 for i := 0; i < 4; i++ {
35 returnHash[i] = h.fieldAPI.Lookup2(b0, b1, h0[i], h1[i], h2[i], h3[i]).(field.F)
36 }
37
38 return returnHash
39}
40
41func (h *HashAPI) AssertIsEqualHash(h1, h2 Hash) {
42 for i := 0; i < 4; i++ {
43 h.fieldAPI.AssertIsEqual(h1[0], h2[0])
44 }
45}
46
47func Uint64ArrayToHashArray(input [][]uint64) []Hash {
48 var output []Hash
49 for i := 0; i < len(input); i++ {
50 output = append(output, [4]field.F{field.NewFieldElement(input[i][0]), field.NewFieldElement(input[i][1]), field.NewFieldElement(input[i][2]), field.NewFieldElement(input[i][3])})
51 }
52 return output
53}