arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
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(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(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(h[t], e[t], f[t], g[t], ct_k[t], w[t])
 77		t2 := T2_512(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[0][0][k] =  hin[64*0+k]
127	    fsum[0][1][k] =  a[80][k]
128	    fsum[1][0][k] =  hin[64*1+k]
129	    fsum[1][1][k] =  b[80][k]
130	    fsum[2][0][k] =  hin[64*2+k]
131	    fsum[2][1][k] =  c[80][k]
132	    fsum[3][0][k] =  hin[64*3+k]
133	    fsum[3][1][k] =  d[80][k]
134	    fsum[4][0][k] =  hin[64*4+k]
135	    fsum[4][1][k] =  e[80][k]
136	    fsum[5][0][k] =  hin[64*5+k]
137	    fsum[5][1][k] =  f[80][k]
138	    fsum[6][0][k] =  hin[64*6+k]
139	    fsum[6][1][k] =  g[80][k]
140	    fsum[7][0][k] =  hin[64*7+k]
141	    fsum[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}