circomlib/src/mimcsponge_gencontract.js
src/mimcsponge_gencontract.jsRaw
1// Copyright (c) 2018 Jordi Baylina
2// License: LGPL-3.0+
3//
4
5const Web3Utils = require("web3-utils");
6
7const Contract = require("./evmasm");
8
9function createCode(seed, n) {
10
11 let ci = Web3Utils.keccak256(seed);
12
13 const C = new Contract();
14
15 C.push(0x64);
16 C.push("0x00");
17 C.push("0x00");
18 C.calldatacopy();
19 C.push("0x0100000000000000000000000000000000000000000000000000000000");
20 C.push("0x00");
21 C.mload();
22 C.div();
23 C.push("0x3f1a1187"); // MiMCSponge(uint256,uint256,uint256)
24 C.eq();
25 C.jmpi("start");
26 C.invalid();
27
28 C.label("start");
29 C.push("0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001"); // q
30 C.push("0x44");
31 C.mload(); // k q
32 C.push("0x04");
33 C.mload(); // xL k q
34 C.dup(2); // q xL k q
35 C.push("0x24");
36 C.mload(); // xR q xL k q
37 C.dup(1); // q xR q xL k q
38 C.dup(0); // q q xR q xL k q
39 C.dup(4); // xL q q xR q xL k q
40 C.dup(6); // k xL q q xR q xL k q
41 C.addmod(); // t=k+xL q xR q xL k q
42 C.dup(1); // q t q xR q xL k q
43 C.dup(0); // q q t q xR q xL k q
44 C.dup(2); // t q q t q xR q xL k q
45 C.dup(0); // t t q q t q xR q xL k q
46 C.mulmod(); // b=t^2 q t q xR q xL k q
47 C.dup(0); // b b q t q xR q xL k q
48 C.mulmod(); // c=t^4 t q xR q xL k q
49 C.mulmod(); // d=t^5 xR q xL k q
50 C.addmod(); // e=t^5+xR xL k q (for next round: xL xR k q)
51
52 for (let i=0; i<n-1; i++) {
53 if (i < n-2) {
54 ci = Web3Utils.keccak256(ci);
55 } else {
56 ci = "0x00";
57 }
58 C.swap(1); // xR xL k q
59 C.dup(3); // q xR xL k q
60 C.dup(3); // k q xR xL k q
61 C.dup(1); // q k q xR xL k q
62 C.dup(4); // xL q k q xR xL k q
63 C.push(ci); // ci xL q k q xR xL k q
64 C.addmod(); // a=ci+xL k q xR xL k q
65 C.addmod(); // t=a+k xR xL k q
66 C.dup(4); // q t xR xL k q
67 C.swap(1); // t q xR xL k q
68 C.dup(1); // q t q xR xL k q
69 C.dup(0); // q q t q xR xL k q
70 C.dup(2); // t q q t q xR xL k q
71 C.dup(0); // t t q q t q xR xL k q
72 C.mulmod(); // b=t^2 q t q xR xL k q
73 C.dup(0); // b b q t q xR xL k q
74 C.mulmod(); // c=t^4 t q xR xL k q
75 C.mulmod(); // d=t^5 xR xL k q
76 C.dup(4); // q d xR xL k q
77 C.swap(2); // xR d q xL k q
78 C.addmod(); // e=t^5+xR xL k q (for next round: xL xR k q)
79 }
80
81 C.push("0x20");
82 C.mstore(); // Save it to pos 0;
83 C.push("0x00");
84 C.mstore(); // Save it to pos 1;
85 C.push("0x40");
86 C.push("0x00");
87 C.return();
88
89 return C.createTxData();
90}
91
92module.exports.abi = [
93 {
94 "constant": true,
95 "inputs": [
96 {
97 "name": "xL_in",
98 "type": "uint256"
99 },
100 {
101 "name": "xR_in",
102 "type": "uint256"
103 },
104 {
105 "name": "k",
106 "type": "uint256"
107 }
108 ],
109 "name": "MiMCSponge",
110 "outputs": [
111 {
112 "name": "xL",
113 "type": "uint256"
114 },
115 {
116 "name": "xR",
117 "type": "uint256"
118 }
119 ],
120 "payable": false,
121 "stateMutability": "pure",
122 "type": "function"
123 }
124];
125
126module.exports.createCode = createCode;
127
128