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.

407 lines
9.5 KiB

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