arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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}