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