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.

227 lines
5.6 KiB

  1. pragma circom 2.0.0;
  2. include "./utils.circom";
  3. template step() {
  4. // out = a ^ (^b) & c
  5. signal input a[64];
  6. signal input b[64];
  7. signal input c[64];
  8. signal output out[64];
  9. var i;
  10. // ^b
  11. component bXor = XorArraySingle(64);
  12. for (i=0; i<64; i++) {
  13. bXor.a[i] <== b[i];
  14. }
  15. // (^b)&c
  16. component bc = AndArray(64);
  17. for (i=0; i<64; i++) {
  18. bc.a[i] <== bXor.out[i];
  19. bc.b[i] <== c[i];
  20. }
  21. // a^(^b)&c
  22. component abc = XorArray(64);
  23. for (i=0; i<64; i++) {
  24. abc.a[i] <== a[i];
  25. abc.b[i] <== bc.out[i];
  26. }
  27. for (i=0; i<64; i++) {
  28. out[i] <== abc.out[i];
  29. }
  30. }
  31. template Chi() {
  32. signal input in[25*64];
  33. signal output out[25*64];
  34. var i;
  35. component r0 = step();
  36. for (i=0; i<64; i++) {
  37. r0.a[i] <== in[i];
  38. r0.b[i] <== in[1*64+i];
  39. r0.c[i] <== in[2*64+i];
  40. }
  41. component r1 = step();
  42. for (i=0; i<64; i++) {
  43. r1.a[i] <== in[1*64+i];
  44. r1.b[i] <== in[2*64+i];
  45. r1.c[i] <== in[3*64+i];
  46. }
  47. component r2 = step();
  48. for (i=0; i<64; i++) {
  49. r2.a[i] <== in[2*64+i];
  50. r2.b[i] <== in[3*64+i];
  51. r2.c[i] <== in[4*64+i];
  52. }
  53. component r3 = step();
  54. for (i=0; i<64; i++) {
  55. r3.a[i] <== in[3*64+i];
  56. r3.b[i] <== in[4*64+i];
  57. r3.c[i] <== in[0*64+i];
  58. }
  59. component r4 = step();
  60. for (i=0; i<64; i++) {
  61. r4.a[i] <== in[4*64+i];
  62. r4.b[i] <== in[i];
  63. r4.c[i] <== in[1*64+i];
  64. }
  65. component r5 = step();
  66. for (i=0; i<64; i++) {
  67. r5.a[i] <== in[5*64+i];
  68. r5.b[i] <== in[6*64+i];
  69. r5.c[i] <== in[7*64+i];
  70. }
  71. component r6 = step();
  72. for (i=0; i<64; i++) {
  73. r6.a[i] <== in[6*64+i];
  74. r6.b[i] <== in[7*64+i];
  75. r6.c[i] <== in[8*64+i];
  76. }
  77. component r7 = step();
  78. for (i=0; i<64; i++) {
  79. r7.a[i] <== in[7*64+i];
  80. r7.b[i] <== in[8*64+i];
  81. r7.c[i] <== in[9*64+i];
  82. }
  83. component r8 = step();
  84. for (i=0; i<64; i++) {
  85. r8.a[i] <== in[8*64+i];
  86. r8.b[i] <== in[9*64+i];
  87. r8.c[i] <== in[5*64+i];
  88. }
  89. component r9 = step();
  90. for (i=0; i<64; i++) {
  91. r9.a[i] <== in[9*64+i];
  92. r9.b[i] <== in[5*64+i];
  93. r9.c[i] <== in[6*64+i];
  94. }
  95. component r10 = step();
  96. for (i=0; i<64; i++) {
  97. r10.a[i] <== in[10*64+i];
  98. r10.b[i] <== in[11*64+i];
  99. r10.c[i] <== in[12*64+i];
  100. }
  101. component r11 = step();
  102. for (i=0; i<64; i++) {
  103. r11.a[i] <== in[11*64+i];
  104. r11.b[i] <== in[12*64+i];
  105. r11.c[i] <== in[13*64+i];
  106. }
  107. component r12 = step();
  108. for (i=0; i<64; i++) {
  109. r12.a[i] <== in[12*64+i];
  110. r12.b[i] <== in[13*64+i];
  111. r12.c[i] <== in[14*64+i];
  112. }
  113. component r13 = step();
  114. for (i=0; i<64; i++) {
  115. r13.a[i] <== in[13*64+i];
  116. r13.b[i] <== in[14*64+i];
  117. r13.c[i] <== in[10*64+i];
  118. }
  119. component r14 = step();
  120. for (i=0; i<64; i++) {
  121. r14.a[i] <== in[14*64+i];
  122. r14.b[i] <== in[10*64+i];
  123. r14.c[i] <== in[11*64+i];
  124. }
  125. component r15 = step();
  126. for (i=0; i<64; i++) {
  127. r15.a[i] <== in[15*64+i];
  128. r15.b[i] <== in[16*64+i];
  129. r15.c[i] <== in[17*64+i];
  130. }
  131. component r16 = step();
  132. for (i=0; i<64; i++) {
  133. r16.a[i] <== in[16*64+i];
  134. r16.b[i] <== in[17*64+i];
  135. r16.c[i] <== in[18*64+i];
  136. }
  137. component r17 = step();
  138. for (i=0; i<64; i++) {
  139. r17.a[i] <== in[17*64+i];
  140. r17.b[i] <== in[18*64+i];
  141. r17.c[i] <== in[19*64+i];
  142. }
  143. component r18 = step();
  144. for (i=0; i<64; i++) {
  145. r18.a[i] <== in[18*64+i];
  146. r18.b[i] <== in[19*64+i];
  147. r18.c[i] <== in[15*64+i];
  148. }
  149. component r19 = step();
  150. for (i=0; i<64; i++) {
  151. r19.a[i] <== in[19*64+i];
  152. r19.b[i] <== in[15*64+i];
  153. r19.c[i] <== in[16*64+i];
  154. }
  155. component r20 = step();
  156. for (i=0; i<64; i++) {
  157. r20.a[i] <== in[20*64+i];
  158. r20.b[i] <== in[21*64+i];
  159. r20.c[i] <== in[22*64+i];
  160. }
  161. component r21 = step();
  162. for (i=0; i<64; i++) {
  163. r21.a[i] <== in[21*64+i];
  164. r21.b[i] <== in[22*64+i];
  165. r21.c[i] <== in[23*64+i];
  166. }
  167. component r22 = step();
  168. for (i=0; i<64; i++) {
  169. r22.a[i] <== in[22*64+i];
  170. r22.b[i] <== in[23*64+i];
  171. r22.c[i] <== in[24*64+i];
  172. }
  173. component r23 = step();
  174. for (i=0; i<64; i++) {
  175. r23.a[i] <== in[23*64+i];
  176. r23.b[i] <== in[24*64+i];
  177. r23.c[i] <== in[20*64+i];
  178. }
  179. component r24 = step();
  180. for (i=0; i<64; i++) {
  181. r24.a[i] <== in[24*64+i];
  182. r24.b[i] <== in[20*64+i];
  183. r24.c[i] <== in[21*64+i];
  184. }
  185. for (i=0; i<64; i++) {
  186. out[i] <== r0.out[i];
  187. out[1*64+i] <== r1.out[i];
  188. out[2*64+i] <== r2.out[i];
  189. out[3*64+i] <== r3.out[i];
  190. out[4*64+i] <== r4.out[i];
  191. out[5*64+i] <== r5.out[i];
  192. out[6*64+i] <== r6.out[i];
  193. out[7*64+i] <== r7.out[i];
  194. out[8*64+i] <== r8.out[i];
  195. out[9*64+i] <== r9.out[i];
  196. out[10*64+i] <== r10.out[i];
  197. out[11*64+i] <== r11.out[i];
  198. out[12*64+i] <== r12.out[i];
  199. out[13*64+i] <== r13.out[i];
  200. out[14*64+i] <== r14.out[i];
  201. out[15*64+i] <== r15.out[i];
  202. out[16*64+i] <== r16.out[i];
  203. out[17*64+i] <== r17.out[i];
  204. out[18*64+i] <== r18.out[i];
  205. out[19*64+i] <== r19.out[i];
  206. out[20*64+i] <== r20.out[i];
  207. out[21*64+i] <== r21.out[i];
  208. out[22*64+i] <== r22.out[i];
  209. out[23*64+i] <== r23.out[i];
  210. out[24*64+i] <== r24.out[i];
  211. }
  212. }