arnaucube
arnaucube/circomlibPublic Self-hosted repository
added pvk->pbk circuit
adriamb adria@codecontext.io
Sun, 17 Mar 2019 10:38:36 +0100
commit

d9d6e43143d4eb780346351e12dad90e72831388

parent

8cb7b46603bdabc2ae435c442b439448167cb077

3 files changed, 57 insertions(+), 2 deletions(-)

jump to
M circuits/babyjub.circom → circuits/babyjub.circom

@@ -17,6 +17,9 @@ You should have received a copy of the GNU General Public License

along with circom. If not, see <https://www.gnu.org/licenses/>. */ +include "bitify.circom"; +include "escalarmulfix.circom"; + template BabyAdd() { signal input x1; signal input y1;

@@ -77,3 +80,27 @@ y2 <== y*y;

a*x2 + y2 === 1 + d*x2*y2; } + +// Extracts the public key from private key +template BabyPbk() { + signal private input in; + signal output Ax; + signal output Ay; + + var BASE8 = [ + 17777552123799933955779906779655732241715742912184938656739573121738514868268, + 2626589144620713026669568689430873010625803728049924121243784502389097019475 + ]; + + component pvkBits = Num2Bits(253); + pvkBits.in <== in; + + component mulFix = EscalarMulFix(253, BASE8); + + var i; + for (i=0; i<253; i++) { + mulFix.e[i] <== pvkBits.out[i]; + } + Ax <== mulFix.out[0]; + Ay <== mulFix.out[1]; +}
M test/babyjub.js → test/babyjub.js

@@ -3,10 +3,12 @@ const path = require("path");

const snarkjs = require("snarkjs"); const compiler = require("circom"); -const assert = chai.assert; +const createBlakeHash = require("blake-hash"); +const eddsa = require("../src/eddsa.js"); -const bigInt = require("big-integer"); +const assert = chai.assert; +const bigInt = require("snarkjs").bigInt; describe("Baby Jub test", function () { let circuitAdd;

@@ -22,6 +24,11 @@

const cirDefTest = await compiler(path.join(__dirname, "circuits", "babycheck_test.circom")); circuitTest = new snarkjs.Circuit(cirDefTest); console.log("NConstrains BabyTest: " + circuitTest.nConstraints); + + const cirDefPbk = await compiler(path.join(__dirname, "circuits", "babypbk_test.circom")); + circuitPbk = new snarkjs.Circuit(cirDefPbk); + console.log("NConstrains BabyPbk: " + circuitPbk.nConstraints); + }); it("Should add point (0,1) and (0,1)", async () => {

@@ -95,6 +102,24 @@ assert(false, "Should be a valid point");

} catch(err) { assert.equal(err.message, "Constraint doesn't match: 168700 != 1"); } + }); + + it("Should extract the public key from the private one", async () => { + + const rawpvk = Buffer.from("0001020304050607080900010203040506070809000102030405060708090021", "hex"); + const pvk = eddsa.pruneBuffer(createBlakeHash("blake512").update(rawpvk).digest().slice(0,32)); + const S = bigInt.leBuff2int(pvk).shr(3); + + const A = eddsa.prv2pub(rawpvk); + + const input = { + in : S, + Ax : A[0], + Ay : A[1] + } + + const w = circuitPbk.calculateWitness(input); + assert(circuitPbk.checkWitness(w)); }); });
A test/circuits/babypbk_test.circom

@@ -0,0 +1,3 @@

+include "../../circuits/babyjub.circom"; + +component main = BabyPbk();