arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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) ([512] 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][64]frontend.Variable
28
29	for i := 0; i < 8; i++ {
30		h512Components[i] = H512(uint(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}