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.

248 lines
12 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. extern crate rand;
  2. #[macro_use]
  3. extern crate ff;
  4. use ff::*;
  5. #[derive(PrimeField)]
  6. #[PrimeFieldModulus = "21888242871839275222246405745257275088548364400416034343698204186575808495617"]
  7. #[PrimeFieldGenerator = "7"]
  8. pub struct Fr(FrRepr);
  9. pub struct Constants {
  10. n_rounds: i64,
  11. cts: Vec<Fr>,
  12. }
  13. pub fn load_constants() -> Constants {
  14. // constants generated from the 'gen_constants' subpackage
  15. let cts_str: Vec<&str> = vec![
  16. "0",
  17. "20888961410941983456478427210666206549300505294776164667214940546594746570981",
  18. "15265126113435022738560151911929040668591755459209400716467504685752745317193",
  19. "8334177627492981984476504167502758309043212251641796197711684499645635709656",
  20. "1374324219480165500871639364801692115397519265181803854177629327624133579404",
  21. "11442588683664344394633565859260176446561886575962616332903193988751292992472",
  22. "2558901189096558760448896669327086721003508630712968559048179091037845349145",
  23. "11189978595292752354820141775598510151189959177917284797737745690127318076389",
  24. "3262966573163560839685415914157855077211340576201936620532175028036746741754",
  25. "17029914891543225301403832095880481731551830725367286980611178737703889171730",
  26. "4614037031668406927330683909387957156531244689520944789503628527855167665518",
  27. "19647356996769918391113967168615123299113119185942498194367262335168397100658",
  28. "5040699236106090655289931820723926657076483236860546282406111821875672148900",
  29. "2632385916954580941368956176626336146806721642583847728103570779270161510514",
  30. "17691411851977575435597871505860208507285462834710151833948561098560743654671",
  31. "11482807709115676646560379017491661435505951727793345550942389701970904563183",
  32. "8360838254132998143349158726141014535383109403565779450210746881879715734773",
  33. "12663821244032248511491386323242575231591777785787269938928497649288048289525",
  34. "3067001377342968891237590775929219083706800062321980129409398033259904188058",
  35. "8536471869378957766675292398190944925664113548202769136103887479787957959589",
  36. "19825444354178182240559170937204690272111734703605805530888940813160705385792",
  37. "16703465144013840124940690347975638755097486902749048533167980887413919317592",
  38. "13061236261277650370863439564453267964462486225679643020432589226741411380501",
  39. "10864774797625152707517901967943775867717907803542223029967000416969007792571",
  40. "10035653564014594269791753415727486340557376923045841607746250017541686319774",
  41. "3446968588058668564420958894889124905706353937375068998436129414772610003289",
  42. "4653317306466493184743870159523234588955994456998076243468148492375236846006",
  43. "8486711143589723036499933521576871883500223198263343024003617825616410932026",
  44. "250710584458582618659378487568129931785810765264752039738223488321597070280",
  45. "2104159799604932521291371026105311735948154964200596636974609406977292675173",
  46. "16313562605837709339799839901240652934758303521543693857533755376563489378839",
  47. "6032365105133504724925793806318578936233045029919447519826248813478479197288",
  48. "14025118133847866722315446277964222215118620050302054655768867040006542798474",
  49. "7400123822125662712777833064081316757896757785777291653271747396958201309118",
  50. "1744432620323851751204287974553233986555641872755053103823939564833813704825",
  51. "8316378125659383262515151597439205374263247719876250938893842106722210729522",
  52. "6739722627047123650704294650168547689199576889424317598327664349670094847386",
  53. "21211457866117465531949733809706514799713333930924902519246949506964470524162",
  54. "13718112532745211817410303291774369209520657938741992779396229864894885156527",
  55. "5264534817993325015357427094323255342713527811596856940387954546330728068658",
  56. "18884137497114307927425084003812022333609937761793387700010402412840002189451",
  57. "5148596049900083984813839872929010525572543381981952060869301611018636120248",
  58. "19799686398774806587970184652860783461860993790013219899147141137827718662674",
  59. "19240878651604412704364448729659032944342952609050243268894572835672205984837",
  60. "10546185249390392695582524554167530669949955276893453512788278945742408153192",
  61. "5507959600969845538113649209272736011390582494851145043668969080335346810411",
  62. "18177751737739153338153217698774510185696788019377850245260475034576050820091",
  63. "19603444733183990109492724100282114612026332366576932662794133334264283907557",
  64. "10548274686824425401349248282213580046351514091431715597441736281987273193140",
  65. "1823201861560942974198127384034483127920205835821334101215923769688644479957",
  66. "11867589662193422187545516240823411225342068709600734253659804646934346124945",
  67. "18718569356736340558616379408444812528964066420519677106145092918482774343613",
  68. "10530777752259630125564678480897857853807637120039176813174150229243735996839",
  69. "20486583726592018813337145844457018474256372770211860618687961310422228379031",
  70. "12690713110714036569415168795200156516217175005650145422920562694422306200486",
  71. "17386427286863519095301372413760745749282643730629659997153085139065756667205",
  72. "2216432659854733047132347621569505613620980842043977268828076165669557467682",
  73. "6309765381643925252238633914530877025934201680691496500372265330505506717193",
  74. "20806323192073945401862788605803131761175139076694468214027227878952047793390",
  75. "4037040458505567977365391535756875199663510397600316887746139396052445718861",
  76. "19948974083684238245321361840704327952464170097132407924861169241740046562673",
  77. "845322671528508199439318170916419179535949348988022948153107378280175750024",
  78. "16222384601744433420585982239113457177459602187868460608565289920306145389382",
  79. "10232118865851112229330353999139005145127746617219324244541194256766741433339",
  80. "6699067738555349409504843460654299019000594109597429103342076743347235369120",
  81. "6220784880752427143725783746407285094967584864656399181815603544365010379208",
  82. "6129250029437675212264306655559561251995722990149771051304736001195288083309",
  83. "10773245783118750721454994239248013870822765715268323522295722350908043393604",
  84. "4490242021765793917495398271905043433053432245571325177153467194570741607167",
  85. "19596995117319480189066041930051006586888908165330319666010398892494684778526",
  86. "837850695495734270707668553360118467905109360511302468085569220634750561083",
  87. "11803922811376367215191737026157445294481406304781326649717082177394185903907",
  88. "10201298324909697255105265958780781450978049256931478989759448189112393506592",
  89. "13564695482314888817576351063608519127702411536552857463682060761575100923924",
  90. "9262808208636973454201420823766139682381973240743541030659775288508921362724",
  91. "173271062536305557219323722062711383294158572562695717740068656098441040230",
  92. "18120430890549410286417591505529104700901943324772175772035648111937818237369",
  93. "20484495168135072493552514219686101965206843697794133766912991150184337935627",
  94. "19155651295705203459475805213866664350848604323501251939850063308319753686505",
  95. "11971299749478202793661982361798418342615500543489781306376058267926437157297",
  96. "18285310723116790056148596536349375622245669010373674803854111592441823052978",
  97. "7069216248902547653615508023941692395371990416048967468982099270925308100727",
  98. "6465151453746412132599596984628739550147379072443683076388208843341824127379",
  99. "16143532858389170960690347742477978826830511669766530042104134302796355145785",
  100. "19362583304414853660976404410208489566967618125972377176980367224623492419647",
  101. "1702213613534733786921602839210290505213503664731919006932367875629005980493",
  102. "10781825404476535814285389902565833897646945212027592373510689209734812292327",
  103. "4212716923652881254737947578600828255798948993302968210248673545442808456151",
  104. "7594017890037021425366623750593200398174488805473151513558919864633711506220",
  105. "18979889247746272055963929241596362599320706910852082477600815822482192194401",
  106. "13602139229813231349386885113156901793661719180900395818909719758150455500533",
  107. ];
  108. let n_rounds: i64 = 91;
  109. let mut cts: Vec<Fr> = Vec::new();
  110. for i in 0..cts_str.len() {
  111. let n: Fr = Fr::from_str(cts_str[i]).unwrap();
  112. cts.push(n);
  113. }
  114. Constants {
  115. n_rounds: n_rounds,
  116. cts: cts,
  117. }
  118. }
  119. pub struct Mimc7 {
  120. constants: Constants,
  121. }
  122. impl Mimc7 {
  123. pub fn new() -> Mimc7 {
  124. Mimc7 {
  125. constants: load_constants(),
  126. }
  127. }
  128. pub fn hash(&self, arr: Vec<Fr>) -> Fr {
  129. let mut h: Fr = Fr::zero();
  130. for i in 0..arr.len() {
  131. h.add_assign(&self.mimc7_hash(&arr[i], &h));
  132. h.add_assign(&arr[i].clone());
  133. }
  134. h
  135. }
  136. pub fn mimc7_hash(&self, x_in: &Fr, k: &Fr) -> Fr {
  137. let mut h: Fr = Fr::zero();
  138. for i in 0..self.constants.n_rounds as usize {
  139. let mut t: Fr;
  140. if i == 0 {
  141. t = x_in.clone();
  142. t.add_assign(k);
  143. } else {
  144. t = h.clone();
  145. t.add_assign(&k);
  146. t.add_assign(&self.constants.cts[i]);
  147. }
  148. let mut t2 = t.clone();
  149. t2.square();
  150. let mut t7 = t2.clone();
  151. t7.square();
  152. t7.mul_assign(&t2);
  153. t7.mul_assign(&t);
  154. h = t7.clone();
  155. }
  156. h.add_assign(&k);
  157. h
  158. }
  159. }
  160. #[cfg(test)]
  161. mod tests {
  162. use super::*;
  163. #[test]
  164. fn test_load_constants() {
  165. let constants = load_constants();
  166. assert_eq!(
  167. "Fr(0x2e2ebbb178296b63d88ec198f0976ad98bc1d4eb0d921ddd2eb86cb7e70a98e5)",
  168. constants.cts[1].to_string()
  169. );
  170. }
  171. #[test]
  172. fn test_mimc7() {
  173. let b12: Fr = Fr::from_str("12").unwrap();
  174. let b45: Fr = Fr::from_str("45").unwrap();
  175. let b78: Fr = Fr::from_str("78").unwrap();
  176. let b41: Fr = Fr::from_str("41").unwrap();
  177. let mut big_arr1: Vec<Fr> = Vec::new();
  178. big_arr1.push(b12.clone());
  179. let mimc7 = Mimc7::new();
  180. let h1 = mimc7.hash(big_arr1);
  181. assert_eq!(
  182. h1.to_string(),
  183. "Fr(0x237c92644dbddb86d8a259e0e923aaab65a93f1ec5758b8799988894ac0958fd)"
  184. );
  185. let mh2 = mimc7.mimc7_hash(&b12, &b45);
  186. assert_eq!(
  187. mh2.to_string(),
  188. "Fr(0x2ba7ebad3c6b6f5a20bdecba2333c63173ca1a5f2f49d958081d9fa7179c44e4)"
  189. );
  190. let mut big_arr2: Vec<Fr> = Vec::new();
  191. big_arr2.push(b78.clone());
  192. big_arr2.push(b41.clone());
  193. let h2 = mimc7.hash(big_arr2);
  194. assert_eq!(
  195. h2.to_string(),
  196. "Fr(0x067f3202335ea256ae6e6aadcd2d5f7f4b06a00b2d1e0de903980d5ab552dc70)"
  197. );
  198. let mut big_arr2: Vec<Fr> = Vec::new();
  199. big_arr2.push(b12.clone());
  200. big_arr2.push(b45.clone());
  201. let h1 = mimc7.hash(big_arr2);
  202. assert_eq!(
  203. h1.to_string(),
  204. "Fr(0x15ff7fe9793346a17c3150804bcb36d161c8662b110c50f55ccb7113948d8879)"
  205. );
  206. let mut big_arr1: Vec<Fr> = Vec::new();
  207. big_arr1.push(b12.clone());
  208. big_arr1.push(b45.clone());
  209. big_arr1.push(b78.clone());
  210. big_arr1.push(b41.clone());
  211. let mimc7 = Mimc7::new();
  212. let h1 = mimc7.hash(big_arr1);
  213. assert_eq!(
  214. h1.to_string(),
  215. "Fr(0x284bc1f34f335933a23a433b6ff3ee179d682cd5e5e2fcdd2d964afa85104beb)"
  216. );
  217. let r_1: Fr = Fr::from_str(
  218. "21888242871839275222246405745257275088548364400416034343698204186575808495616",
  219. )
  220. .unwrap();
  221. let mut big_arr1: Vec<Fr> = Vec::new();
  222. big_arr1.push(r_1.clone());
  223. let mimc7 = Mimc7::new();
  224. let h1 = mimc7.hash(big_arr1);
  225. assert_eq!(
  226. h1.to_string(),
  227. "Fr(0x0a4fffe99225f9972ec39fd780dd084f349286c723d4dd42ad05e2e7421fef0e)"
  228. );
  229. }
  230. }