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.

346 lines
8.2 KiB

  1. pragma circom 2.0.0;
  2. include "./utils.circom";
  3. template D(n, shl, shr) {
  4. // d = b ^ (a<<shl | a>>shr)
  5. signal input a[n];
  6. signal input b[n];
  7. signal output out[n];
  8. var i;
  9. component aux0 = ShR(64, shr);
  10. for (i=0; i<64; i++) {
  11. aux0.in[i] <== a[i];
  12. }
  13. component aux1 = ShL(64, shl);
  14. for (i=0; i<64; i++) {
  15. aux1.in[i] <== a[i];
  16. }
  17. component aux2 = OrArray(64);
  18. for (i=0; i<64; i++) {
  19. aux2.a[i] <== aux0.out[i];
  20. aux2.b[i] <== aux1.out[i];
  21. }
  22. component aux3 = XorArray(64);
  23. for (i=0; i<64; i++) {
  24. aux3.a[i] <== b[i];
  25. aux3.b[i] <== aux2.out[i];
  26. }
  27. for (i=0; i<64; i++) {
  28. out[i] <== aux3.out[i];
  29. }
  30. }
  31. template Theta() {
  32. signal input in[25*64];
  33. signal output out[25*64];
  34. var i;
  35. component c0 = Xor5(64);
  36. for (i=0; i<64; i++) {
  37. c0.a[i] <== in[i];
  38. c0.b[i] <== in[5*64+i];
  39. c0.c[i] <== in[10*64+i];
  40. c0.d[i] <== in[15*64+i];
  41. c0.e[i] <== in[20*64+i];
  42. }
  43. component c1 = Xor5(64);
  44. for (i=0; i<64; i++) {
  45. c1.a[i] <== in[1*64+i];
  46. c1.b[i] <== in[6*64+i];
  47. c1.c[i] <== in[11*64+i];
  48. c1.d[i] <== in[16*64+i];
  49. c1.e[i] <== in[21*64+i];
  50. }
  51. component c2 = Xor5(64);
  52. for (i=0; i<64; i++) {
  53. c2.a[i] <== in[2*64+i];
  54. c2.b[i] <== in[7*64+i];
  55. c2.c[i] <== in[12*64+i];
  56. c2.d[i] <== in[17*64+i];
  57. c2.e[i] <== in[22*64+i];
  58. }
  59. component c3 = Xor5(64);
  60. for (i=0; i<64; i++) {
  61. c3.a[i] <== in[3*64+i];
  62. c3.b[i] <== in[8*64+i];
  63. c3.c[i] <== in[13*64+i];
  64. c3.d[i] <== in[18*64+i];
  65. c3.e[i] <== in[23*64+i];
  66. }
  67. component c4 = Xor5(64);
  68. for (i=0; i<64; i++) {
  69. c4.a[i] <== in[4*64+i];
  70. c4.b[i] <== in[9*64+i];
  71. c4.c[i] <== in[14*64+i];
  72. c4.d[i] <== in[19*64+i];
  73. c4.e[i] <== in[24*64+i];
  74. }
  75. // d = c4 ^ (c1<<1 | c1>>(64-1))
  76. component d0 = D(64, 1, 64-1);
  77. for (i=0; i<64; i++) {
  78. d0.a[i] <== c1.out[i];
  79. d0.b[i] <== c4.out[i];
  80. }
  81. // r[0] = a[0] ^ d
  82. component r0 = XorArray(64);
  83. for (i=0; i<64; i++) {
  84. r0.a[i] <== in[i];
  85. r0.b[i] <== d0.out[i];
  86. }
  87. for (i=0; i<64; i++) {
  88. out[i] <== r0.out[i];
  89. }
  90. // r[5] = a[5] ^ d
  91. component r5 = XorArray(64);
  92. for (i=0; i<64; i++) {
  93. r5.a[i] <== in[5*64+i];
  94. r5.b[i] <== d0.out[i];
  95. }
  96. for (i=0; i<64; i++) {
  97. out[5*64+i] <== r5.out[i];
  98. }
  99. // r[10] = a[10] ^ d
  100. component r10 = XorArray(64);
  101. for (i=0; i<64; i++) {
  102. r10.a[i] <== in[10*64+i];
  103. r10.b[i] <== d0.out[i];
  104. }
  105. for (i=0; i<64; i++) {
  106. out[10*64+i] <== r10.out[i];
  107. }
  108. // r[15] = a[15] ^ d
  109. component r15 = XorArray(64);
  110. for (i=0; i<64; i++) {
  111. r15.a[i] <== in[15*64+i];
  112. r15.b[i] <== d0.out[i];
  113. }
  114. for (i=0; i<64; i++) {
  115. out[15*64+i] <== r15.out[i];
  116. }
  117. // r[20] = a[20] ^ d
  118. component r20 = XorArray(64);
  119. for (i=0; i<64; i++) {
  120. r20.a[i] <== in[20*64+i];
  121. r20.b[i] <== d0.out[i];
  122. }
  123. for (i=0; i<64; i++) {
  124. out[20*64+i] <== r20.out[i];
  125. }
  126. // d = c0 ^ (c2<<1 | c2>>(64-1))
  127. component d1 = D(64, 1, 64-1);
  128. for (i=0; i<64; i++) {
  129. d1.a[i] <== c2.out[i];
  130. d1.b[i] <== c0.out[i];
  131. }
  132. // r[1] = a[1] ^ d
  133. component r1 = XorArray(64);
  134. for (i=0; i<64; i++) {
  135. r1.a[i] <== in[1*64+i];
  136. r1.b[i] <== d1.out[i];
  137. }
  138. for (i=0; i<64; i++) {
  139. out[1*64+i] <== r1.out[i];
  140. }
  141. // r[6] = a[6] ^ d
  142. component r6 = XorArray(64);
  143. for (i=0; i<64; i++) {
  144. r6.a[i] <== in[6*64+i];
  145. r6.b[i] <== d1.out[i];
  146. }
  147. for (i=0; i<64; i++) {
  148. out[6*64+i] <== r6.out[i];
  149. }
  150. // r[11] = a[11] ^ d
  151. component r11 = XorArray(64);
  152. for (i=0; i<64; i++) {
  153. r11.a[i] <== in[11*64+i];
  154. r11.b[i] <== d1.out[i];
  155. }
  156. for (i=0; i<64; i++) {
  157. out[11*64+i] <== r11.out[i];
  158. }
  159. // r[16] = a[16] ^ d
  160. component r16 = XorArray(64);
  161. for (i=0; i<64; i++) {
  162. r16.a[i] <== in[16*64+i];
  163. r16.b[i] <== d1.out[i];
  164. }
  165. for (i=0; i<64; i++) {
  166. out[16*64+i] <== r16.out[i];
  167. }
  168. // r[21] = a[21] ^ d
  169. component r21 = XorArray(64);
  170. for (i=0; i<64; i++) {
  171. r21.a[i] <== in[21*64+i];
  172. r21.b[i] <== d1.out[i];
  173. }
  174. for (i=0; i<64; i++) {
  175. out[21*64+i] <== r21.out[i];
  176. }
  177. // d = c1 ^ (c3<<1 | c3>>(64-1))
  178. component d2 = D(64, 1, 64-1);
  179. for (i=0; i<64; i++) {
  180. d2.a[i] <== c3.out[i];
  181. d2.b[i] <== c1.out[i];
  182. }
  183. // r[2] = a[2] ^ d
  184. component r2 = XorArray(64);
  185. for (i=0; i<64; i++) {
  186. r2.a[i] <== in[2*64+i];
  187. r2.b[i] <== d2.out[i];
  188. }
  189. for (i=0; i<64; i++) {
  190. out[2*64+i] <== r2.out[i];
  191. }
  192. // r[7] = a[7] ^ d
  193. component r7 = XorArray(64);
  194. for (i=0; i<64; i++) {
  195. r7.a[i] <== in[7*64+i];
  196. r7.b[i] <== d2.out[i];
  197. }
  198. for (i=0; i<64; i++) {
  199. out[7*64+i] <== r7.out[i];
  200. }
  201. // r[12] = a[12] ^ d
  202. component r12 = XorArray(64);
  203. for (i=0; i<64; i++) {
  204. r12.a[i] <== in[12*64+i];
  205. r12.b[i] <== d2.out[i];
  206. }
  207. for (i=0; i<64; i++) {
  208. out[12*64+i] <== r12.out[i];
  209. }
  210. // r[17] = a[17] ^ d
  211. component r17 = XorArray(64);
  212. for (i=0; i<64; i++) {
  213. r17.a[i] <== in[17*64+i];
  214. r17.b[i] <== d2.out[i];
  215. }
  216. for (i=0; i<64; i++) {
  217. out[17*64+i] <== r17.out[i];
  218. }
  219. // r[22] = a[22] ^ d
  220. component r22 = XorArray(64);
  221. for (i=0; i<64; i++) {
  222. r22.a[i] <== in[22*64+i];
  223. r22.b[i] <== d2.out[i];
  224. }
  225. for (i=0; i<64; i++) {
  226. out[22*64+i] <== r22.out[i];
  227. }
  228. // d = c2 ^ (c4<<1 | c4>>(64-1))
  229. component d3 = D(64, 1, 64-1);
  230. for (i=0; i<64; i++) {
  231. d3.a[i] <== c4.out[i];
  232. d3.b[i] <== c2.out[i];
  233. }
  234. // r[3] = a[3] ^ d
  235. component r3 = XorArray(64);
  236. for (i=0; i<64; i++) {
  237. r3.a[i] <== in[3*64+i];
  238. r3.b[i] <== d3.out[i];
  239. }
  240. for (i=0; i<64; i++) {
  241. out[3*64+i] <== r3.out[i];
  242. }
  243. // r[8] = a[8] ^ d
  244. component r8 = XorArray(64);
  245. for (i=0; i<64; i++) {
  246. r8.a[i] <== in[8*64+i];
  247. r8.b[i] <== d3.out[i];
  248. }
  249. for (i=0; i<64; i++) {
  250. out[8*64+i] <== r8.out[i];
  251. }
  252. // r[13] = a[13] ^ d
  253. component r13 = XorArray(64);
  254. for (i=0; i<64; i++) {
  255. r13.a[i] <== in[13*64+i];
  256. r13.b[i] <== d3.out[i];
  257. }
  258. for (i=0; i<64; i++) {
  259. out[13*64+i] <== r13.out[i];
  260. }
  261. // r[18] = a[18] ^ d
  262. component r18 = XorArray(64);
  263. for (i=0; i<64; i++) {
  264. r18.a[i] <== in[18*64+i];
  265. r18.b[i] <== d3.out[i];
  266. }
  267. for (i=0; i<64; i++) {
  268. out[18*64+i] <== r18.out[i];
  269. }
  270. // r[23] = a[23] ^ d
  271. component r23 = XorArray(64);
  272. for (i=0; i<64; i++) {
  273. r23.a[i] <== in[23*64+i];
  274. r23.b[i] <== d3.out[i];
  275. }
  276. for (i=0; i<64; i++) {
  277. out[23*64+i] <== r23.out[i];
  278. }
  279. // d = c3 ^ (c0<<1 | c0>>(64-1))
  280. component d4 = D(64, 1, 64-1);
  281. for (i=0; i<64; i++) {
  282. d4.a[i] <== c0.out[i];
  283. d4.b[i] <== c3.out[i];
  284. }
  285. // r[4] = a[4] ^ d
  286. component r4 = XorArray(64);
  287. for (i=0; i<64; i++) {
  288. r4.a[i] <== in[4*64+i];
  289. r4.b[i] <== d4.out[i];
  290. }
  291. for (i=0; i<64; i++) {
  292. out[4*64+i] <== r4.out[i];
  293. }
  294. // r[9] = a[9] ^ d
  295. component r9 = XorArray(64);
  296. for (i=0; i<64; i++) {
  297. r9.a[i] <== in[9*64+i];
  298. r9.b[i] <== d4.out[i];
  299. }
  300. for (i=0; i<64; i++) {
  301. out[9*64+i] <== r9.out[i];
  302. }
  303. // r[14] = a[14] ^ d
  304. component r14 = XorArray(64);
  305. for (i=0; i<64; i++) {
  306. r14.a[i] <== in[14*64+i];
  307. r14.b[i] <== d4.out[i];
  308. }
  309. for (i=0; i<64; i++) {
  310. out[14*64+i] <== r14.out[i];
  311. }
  312. // r[19] = a[19] ^ d
  313. component r19 = XorArray(64);
  314. for (i=0; i<64; i++) {
  315. r19.a[i] <== in[19*64+i];
  316. r19.b[i] <== d4.out[i];
  317. }
  318. for (i=0; i<64; i++) {
  319. out[19*64+i] <== r19.out[i];
  320. }
  321. // r[24] = a[24] ^ d
  322. component r24 = XorArray(64);
  323. for (i=0; i<64; i++) {
  324. r24.a[i] <== in[24*64+i];
  325. r24.b[i] <== d4.out[i];
  326. }
  327. for (i=0; i<64; i++) {
  328. out[24*64+i] <== r24.out[i];
  329. }
  330. }