keccak256-circom/circuits/rhopi.circom
circuits/rhopi.circomRaw
1pragma circom 2.0.0;
2
3include "./utils.circom";
4
5template stepRhoPi(shl, shr) {
6 // out = a<<shl|a>>shr
7 signal input a[64];
8 signal output out[64];
9 var i;
10
11 component aux0 = ShR(64, shr);
12 for (i=0; i<64; i++) {
13 aux0.in[i] <== a[i];
14 }
15 component aux1 = ShL(64, shl);
16 for (i=0; i<64; i++) {
17 aux1.in[i] <== a[i];
18 }
19 component aux2 = OrArray(64);
20 for (i=0; i<64; i++) {
21 aux2.a[i] <== aux0.out[i];
22 aux2.b[i] <== aux1.out[i];
23 }
24 for (i=0; i<64; i++) {
25 out[i] <== aux2.out[i];
26 }
27}
28template RhoPi() {
29 signal input in[25*64];
30 signal output out[25*64];
31
32 var i;
33
34 // r[10] = a[1]<<1|a[1]>>(64-1)
35 component s10 = stepRhoPi(1, 64-1);
36 for (i=0; i<64; i++) {
37 s10.a[i] <== in[1*64+i];
38 }
39 // r[7] = a[10]<<3|a[10]>>(64-3)
40 component s7 = stepRhoPi(3, 64-3);
41 for (i=0; i<64; i++) {
42 s7.a[i] <== in[10*64+i];
43 }
44 // r[11] = a[7]<<6|a[7]>>(64-6)
45 component s11 = stepRhoPi(6, 64-6);
46 for (i=0; i<64; i++) {
47 s11.a[i] <== in[7*64+i];
48 }
49 // r[17] = a[11]<<10|a[11]>>(64-10)
50 component s17 = stepRhoPi(10, 64-10);
51 for (i=0; i<64; i++) {
52 s17.a[i] <== in[11*64+i];
53 }
54 // r[18] = a[17]<<15|a[17]>>(64-15)
55 component s18 = stepRhoPi(15, 64-15);
56 for (i=0; i<64; i++) {
57 s18.a[i] <== in[17*64+i];
58 }
59 // r[3] = a[18]<<21|a[18]>>(64-21)
60 component s3 = stepRhoPi(21, 64-21);
61 for (i=0; i<64; i++) {
62 s3.a[i] <== in[18*64+i];
63 }
64 // r[5] = a[3]<<28|a[3]>>(64-28)
65 component s5 = stepRhoPi(28, 64-28);
66 for (i=0; i<64; i++) {
67 s5.a[i] <== in[3*64+i];
68 }
69 // r[16] = a[5]<<36|a[5]>>(64-36)
70 component s16 = stepRhoPi(36, 64-36);
71 for (i=0; i<64; i++) {
72 s16.a[i] <== in[5*64+i];
73 }
74 // r[8] = a[16]<<45|a[16]>>(64-45)
75 component s8 = stepRhoPi(45, 64-45);
76 for (i=0; i<64; i++) {
77 s8.a[i] <== in[16*64+i];
78 }
79 // r[21] = a[8]<<55|a[8]>>(64-55)
80 component s21 = stepRhoPi(55, 64-55);
81 for (i=0; i<64; i++) {
82 s21.a[i] <== in[8*64+i];
83 }
84 // r[24] = a[21]<<2|a[21]>>(64-2)
85 component s24 = stepRhoPi(2, 64-2);
86 for (i=0; i<64; i++) {
87 s24.a[i] <== in[21*64+i];
88 }
89 // r[4] = a[24]<<14|a[24]>>(64-14)
90 component s4 = stepRhoPi(14, 64-14);
91 for (i=0; i<64; i++) {
92 s4.a[i] <== in[24*64+i];
93 }
94 // r[15] = a[4]<<27|a[4]>>(64-27)
95 component s15 = stepRhoPi(27, 64-27);
96 for (i=0; i<64; i++) {
97 s15.a[i] <== in[4*64+i];
98 }
99 // r[23] = a[15]<<41|a[15]>>(64-41)
100 component s23 = stepRhoPi(41, 64-41);
101 for (i=0; i<64; i++) {
102 s23.a[i] <== in[15*64+i];
103 }
104 // r[19] = a[23]<<56|a[23]>>(64-56)
105 component s19 = stepRhoPi(56, 64-56);
106 for (i=0; i<64; i++) {
107 s19.a[i] <== in[23*64+i];
108 }
109 // r[13] = a[19]<<8|a[19]>>(64-8)
110 component s13 = stepRhoPi(8, 64-8);
111 for (i=0; i<64; i++) {
112 s13.a[i] <== in[19*64+i];
113 }
114 // r[12] = a[13]<<25|a[13]>>(64-25)
115 component s12 = stepRhoPi(25, 64-25);
116 for (i=0; i<64; i++) {
117 s12.a[i] <== in[13*64+i];
118 }
119 // r[2] = a[12]<<43|a[12]>>(64-43)
120 component s2 = stepRhoPi(43, 64-43);
121 for (i=0; i<64; i++) {
122 s2.a[i] <== in[12*64+i];
123 }
124 // r[20] = a[2]<<62|a[2]>>(64-62)
125 component s20 = stepRhoPi(62, 64-62);
126 for (i=0; i<64; i++) {
127 s20.a[i] <== in[2*64+i];
128 }
129 // r[14] = a[20]<<18|a[20]>>(64-18)
130 component s14 = stepRhoPi(18, 64-18);
131 for (i=0; i<64; i++) {
132 s14.a[i] <== in[20*64+i];
133 }
134 // r[22] = a[14]<<39|a[14]>>(64-39)
135 component s22 = stepRhoPi(39, 64-39);
136 for (i=0; i<64; i++) {
137 s22.a[i] <== in[14*64+i];
138 }
139 // r[9] = a[22]<<61|a[22]>>(64-61)
140 component s9 = stepRhoPi(61, 64-61);
141 for (i=0; i<64; i++) {
142 s9.a[i] <== in[22*64+i];
143 }
144 // r[6] = a[9]<<20|a[9]>>(64-20)
145 component s6 = stepRhoPi(20, 64-20);
146 for (i=0; i<64; i++) {
147 s6.a[i] <== in[9*64+i];
148 }
149 // r[1] = a[6]<<44|a[6]>>(64-44)
150 component s1 = stepRhoPi(44, 64-44);
151 for (i=0; i<64; i++) {
152 s1.a[i] <== in[6*64+i];
153 }
154
155 for (i=0; i<64; i++) {
156 out[i] <== in[i];
157 out[10*64+i] <== s10.out[i];
158 out[7*64+i] <== s7.out[i];
159 out[11*64+i] <== s11.out[i];
160 out[17*64+i] <== s17.out[i];
161 out[18*64+i] <== s18.out[i];
162 out[3*64+i] <== s3.out[i];
163 out[5*64+i] <== s5.out[i];
164 out[16*64+i] <== s16.out[i];
165 out[8*64+i] <== s8.out[i];
166 out[21*64+i] <== s21.out[i];
167 out[24*64+i] <== s24.out[i];
168 out[4*64+i] <== s4.out[i];
169 out[15*64+i] <== s15.out[i];
170 out[23*64+i] <== s23.out[i];
171 out[19*64+i] <== s19.out[i];
172 out[13*64+i] <== s13.out[i];
173 out[12*64+i] <== s12.out[i];
174 out[2*64+i] <== s2.out[i];
175 out[20*64+i] <== s20.out[i];
176 out[14*64+i] <== s14.out[i];
177 out[22*64+i] <== s22.out[i];
178 out[9*64+i] <== s9.out[i];
179 out[6*64+i] <== s6.out[i];
180 out[1*64+i] <== s1.out[i];
181 }
182}