package sha512
|
|
|
|
import (
|
|
"github.com/consensys/gnark/frontend"
|
|
)
|
|
|
|
func Sha512(api frontend.API, in [] frontend.Variable) ([] frontend.Variable) {
|
|
nBits := len(in)
|
|
|
|
nBlocks := ((nBits + 128) / 1024) + 1
|
|
|
|
paddedIn := make([] frontend.Variable, nBlocks * 1024)
|
|
|
|
for k := 0; k < nBits; k++ {
|
|
paddedIn[k] = in[k]
|
|
}
|
|
paddedIn[nBits] = 1
|
|
|
|
for k := nBits+1; k < len(paddedIn); k++ {
|
|
paddedIn[k] = 0
|
|
}
|
|
|
|
for k := 0; k < 128; k++ {
|
|
paddedIn[nBlocks*1024 - k - 1] = (nBits >> k) & 1
|
|
}
|
|
|
|
var h512Components = [8][]frontend.Variable
|
|
|
|
for i := 0; i < 8; i++ {
|
|
h512Components[i] = H512(i)
|
|
}
|
|
|
|
sha512compression := make([][] frontend.Variable, nBlocks)
|
|
|
|
for i := 0; i < nBlocks; i++ {
|
|
var hin = make([] frontend.Variable, 64 * 8)
|
|
var inp = make([] frontend.Variable, 1024)
|
|
if i == 0 {
|
|
for k := 0; k < 64; k++ {
|
|
for j := 0; j < 8; j++ {
|
|
hin[j*64 + k] = h512Components[j][k]
|
|
}
|
|
}
|
|
} else {
|
|
for k := 0; k < 64; k++ {
|
|
for j := 0; j < 8; j++ {
|
|
hin[j*64 + k] = sha512compression[i-1][64*j+63-k]
|
|
}
|
|
}
|
|
}
|
|
for k := 0; k < 1024; k++ {
|
|
inp[k] = paddedIn[i*1024 + k]
|
|
}
|
|
sha512compression[i] = Sha512Compression(api, hin, inp)
|
|
}
|
|
|
|
var out = [512]frontend.Variable
|
|
|
|
for k := 0; k < 512; k++ {
|
|
out[k] = sha512compression[nBlocks-1][k]
|
|
|
|
}
|
|
|
|
return out
|
|
}
|