gnark-plonky2-verifier/sha512/sha512.go
sha512/sha512.goRaw
1package sha512
2
3import (
4 "fmt"
5 "github.com/consensys/gnark/frontend"
6)
7
8func Sha512(api frontend.API, in [] frontend.Variable) ([512] frontend.Variable) {
9 nBits := len(in)
10
11 for _, v := range in {
12 api.AssertIsBoolean(v)
13 }
14
15 nBlocks := ((nBits + 128) / 1024) + 1
16
17 paddedIn := make([] frontend.Variable, nBlocks * 1024)
18
19 for k := 0; k < nBits; k++ {
20 paddedIn[k] = in[k]
21 }
22 paddedIn[nBits] = 1
23
24 for k := nBits+1; k < len(paddedIn); k++ {
25 paddedIn[k] = 0
26 }
27
28 for k := 0; k < 128; k++ {
29 paddedIn[nBlocks*1024 - k - 1] = (nBits >> k) & 1
30 }
31
32 fmt.Println(paddedIn)
33
34 var h512Components [8][64]frontend.Variable
35
36 for i := 0; i < 8; i++ {
37 h512Components[i] = H512(uint(i))
38 }
39
40 sha512compression := make([][] frontend.Variable, nBlocks)
41
42 for i := 0; i < nBlocks; i++ {
43 var hin = make([] frontend.Variable, 64 * 8)
44 var inp = make([] frontend.Variable, 1024)
45 if i == 0 {
46 for k := 0; k < 64; k++ {
47 for j := 0; j < 8; j++ {
48 hin[j*64 + k] = h512Components[j][k]
49 }
50 }
51 } else {
52 for k := 0; k < 64; k++ {
53 for j := 0; j < 8; j++ {
54 hin[j*64 + k] = sha512compression[i-1][64*j+63-k]
55 }
56 }
57 }
58 for k := 0; k < 1024; k++ {
59 inp[k] = paddedIn[i*1024 + k]
60 }
61 sha512compression[i] = Sha512compression(api, hin, inp)
62 }
63
64 var out [512]frontend.Variable
65
66 for k := 0; k < 512; k++ {
67 out[k] = sha512compression[nBlocks-1][k]
68
69 }
70
71 return out
72}