You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
1.3 KiB

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
}