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.

182 lines
5.0 KiB

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