arnaucube
arnaucube/circomlibPublic Self-hosted repository
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