gnark-plonky2-verifier/sha512/sha512compression.go
sha512/sha512compression.goRaw
1package sha512
2
3import (
4 "github.com/consensys/gnark/frontend"
5)
6
7
8func Sha512compression(api frontend.API, hin, inp []frontend.Variable) ([]frontend.Variable) {
9 if len(hin) != 512 { panic("bad length") }
10 if len(inp) != 1024 { panic("bad length") }
11
12 var ct_k [80][]frontend.Variable
13 for i := 0; i < 80; i++ {
14 ct_k[i] = K512(uint(i))
15 }
16
17 var a [81][64]frontend.Variable
18 var b [81][64]frontend.Variable
19 var c [81][64]frontend.Variable
20 var d [81][64]frontend.Variable
21 var e [81][64]frontend.Variable
22 var f [81][64]frontend.Variable
23 var g [81][64]frontend.Variable
24 var h [81][64]frontend.Variable
25 var w [80][64]frontend.Variable
26
27 for t := 0; t < 80; t++ {
28 if t < 16 {
29 for k := 0; k < 64; k++ {
30 w[t][k] = inp[t*64+63-k]
31 }
32 } else {
33 w[t] = SigmaPlus512(api, w[t-2][:], w[t-7][:], w[t-15][:], w[t-16][:])
34 }
35 // if (t<16) {
36 // for (k=0; k<64; k++) {
37 // w[t][k] <== inp[t*64+63-k];
38 // }
39 // } else {
40 // for (k=0; k<64; k++) {
41 // sigmaPlus[t-16].in2[k] <== w[t-2][k];
42 // sigmaPlus[t-16].in7[k] <== w[t-7][k];
43 // sigmaPlus[t-16].in15[k] <== w[t-15][k];
44 // sigmaPlus[t-16].in16[k] <== w[t-16][k];
45 // }
46 // for (k=0; k<64; k++) {
47 // w[t][k] <== sigmaPlus[t-16].out[k];
48 // }
49 // }
50 }
51
52
53 for k := 0; k < 64; k++ {
54 a[0][k] = hin[k]
55 b[0][k] = hin[64*1 + k]
56 c[0][k] = hin[64*2 + k]
57 d[0][k] = hin[64*3 + k]
58 e[0][k] = hin[64*4 + k]
59 f[0][k] = hin[64*5 + k]
60 g[0][k] = hin[64*6 + k]
61 h[0][k] = hin[64*7 + k]
62 }
63 // for (k=0; k<64; k++ ) {
64 // a[0][k] <== hin[k];
65 // b[0][k] <== hin[64*1 + k];
66 // c[0][k] <== hin[64*2 + k];
67 // d[0][k] <== hin[64*3 + k];
68 // e[0][k] <== hin[64*4 + k];
69 // f[0][k] <== hin[64*5 + k];
70 // g[0][k] <== hin[64*6 + k];
71 // h[0][k] <== hin[64*7 + k];
72 // }
73
74
75 for t := 0; t < 80; t++ {
76 t1 := T1_512(api, h[t][:], e[t][:], f[t][:], g[t][:], ct_k[t][:], w[t][:])
77 t2 := T2_512(api, a[t][:], b[t][:], c[t][:])
78 // for (k=0; k<64; k++) {
79 // t1[t].h[k] <== h[t][k];
80 // t1[t].e[k] <== e[t][k];
81 // t1[t].f[k] <== f[t][k];
82 // t1[t].g[k] <== g[t][k];
83 // t1[t].k[k] <== ct_k[t].out[k];
84 // t1[t].w[k] <== w[t][k];
85
86 // t2[t].a[k] <== a[t][k];
87 // t2[t].b[k] <== b[t][k];
88 // t2[t].c[k] <== c[t][k];
89 // }
90
91 sume := BinSum(d[t], t1)
92 suma := BinSum(t1, t2)
93 // for (k=0; k<64; k++) {
94 // sume[t].in[0][k] <== d[t][k];
95 // sume[t].in[1][k] <== t1[t].out[k];
96
97 // suma[t].in[0][k] <== t1[t].out[k];
98 // suma[t].in[1][k] <== t2[t].out[k];
99 // }
100
101 for k := 0; k < 64; k++ {
102 h[t+1][k] = g[t][k];
103 g[t+1][k] = f[t][k];
104 f[t+1][k] = e[t][k];
105 e[t+1][k] = sume[k];
106 d[t+1][k] = c[t][k];
107 c[t+1][k] = b[t][k];
108 b[t+1][k] = a[t][k];
109 a[t+1][k] = suma[k];
110 }
111 // for (k=0; k<64; k++) {
112 // h[t+1][k] <== g[t][k];
113 // g[t+1][k] <== f[t][k];
114 // f[t+1][k] <== e[t][k];
115 // e[t+1][k] <== sume[t].out[k];
116 // d[t+1][k] <== c[t][k];
117 // c[t+1][k] <== b[t][k];
118 // b[t+1][k] <== a[t][k];
119 // a[t+1][k] <== suma[t].out[k];
120 // }
121 }
122
123 var fsum_in [8][2][64]frontend.Variable
124
125 for k := 0; k < 64; k++ {
126 fsum_in[0][0][k] = hin[64*0+k]
127 fsum_in[0][1][k] = a[80][k]
128 fsum_in[1][0][k] = hin[64*1+k]
129 fsum_in[1][1][k] = b[80][k]
130 fsum_in[2][0][k] = hin[64*2+k]
131 fsum_in[2][1][k] = c[80][k]
132 fsum_in[3][0][k] = hin[64*3+k]
133 fsum_in[3][1][k] = d[80][k]
134 fsum_in[4][0][k] = hin[64*4+k]
135 fsum_in[4][1][k] = e[80][k]
136 fsum_in[5][0][k] = hin[64*5+k]
137 fsum_in[5][1][k] = f[80][k]
138 fsum_in[6][0][k] = hin[64*6+k]
139 fsum_in[6][1][k] = g[80][k]
140 fsum_in[7][0][k] = hin[64*7+k]
141 fsum_in[7][1][k] = h[80][k]
142 }
143 // for (k=0; k<64; k++) {
144 // fsum[0].in[0][k] <== hin[64*0+k];
145 // fsum[0].in[1][k] <== a[80][k];
146 // fsum[1].in[0][k] <== hin[64*1+k];
147 // fsum[1].in[1][k] <== b[80][k];
148 // fsum[2].in[0][k] <== hin[64*2+k];
149 // fsum[2].in[1][k] <== c[80][k];
150 // fsum[3].in[0][k] <== hin[64*3+k];
151 // fsum[3].in[1][k] <== d[80][k];
152 // fsum[4].in[0][k] <== hin[64*4+k];
153 // fsum[4].in[1][k] <== e[80][k];
154 // fsum[5].in[0][k] <== hin[64*5+k];
155 // fsum[5].in[1][k] <== f[80][k];
156 // fsum[6].in[0][k] <== hin[64*6+k];
157 // fsum[6].in[1][k] <== g[80][k];
158 // fsum[7].in[0][k] <== hin[64*7+k];
159 // fsum[7].in[1][k] <== h[80][k];
160 // }
161
162 var fsum [8][]frontend.Variable
163 for i := 0; i < 8; i++ {
164 fsum[i] = BinSum(fsum_in[i][0], fsum_in[i][1])
165 }
166
167 var out [512]frontend.Variable
168
169 for k := 0; k < 64; k++ {
170 out[63-k] = fsum[0][k]
171 out[64+63-k] = fsum[1][k]
172 out[128+63-k] = fsum[2][k]
173 out[192+63-k] = fsum[3][k]
174 out[256+63-k] = fsum[4][k]
175 out[320+63-k] = fsum[5][k]
176 out[384+63-k] = fsum[6][k]
177 out[448+63-k] = fsum[7][k]
178 }
179 // for (k=0; k<64; k++) {
180 // out[63-k] <== fsum[0].out[k];
181 // out[64+63-k] <== fsum[1].out[k];
182 // out[128+63-k] <== fsum[2].out[k];
183 // out[192+63-k] <== fsum[3].out[k];
184 // out[256+63-k] <== fsum[4].out[k];
185 // out[320+63-k] <== fsum[5].out[k];
186 // out[384+63-k] <== fsum[6].out[k];
187 // out[448+63-k] <== fsum[7].out[k];
188 // }
189 return out[:]
190}