circomlibjs/test/eddsa.js

171 lines
7.5 KiB
JavaScript

import chai from "chai";
import { Scalar } from "ffjavascript";
const assert = chai.assert;
import buildEddsa from "../src/eddsa.js";
const fromHexString = hexString =>
new Uint8Array(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));
const toHexString = bytes =>
bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');
describe("EdDSA js test", function () {
let eddsa;
this.timeout(100000);
before(async () => {
eddsa = await buildEddsa();
});
after(async () => {
globalThis.curve_bn128.terminate();
});
it("Sign (using Pedersen) a single 10 bytes from 0 to 9", () => {
const F = eddsa.babyJub.F;
const msgBuf = fromHexString("00010203040506070809");
const prvKey = fromHexString("0001020304050607080900010203040506070809000102030405060708090001");
const pubKey = eddsa.prv2pub(prvKey);
assert(F.eq(pubKey[0], F.e("13277427435165878497778222415993513565335242147425444199013288855685581939618")));
assert(F.eq(pubKey[1], F.e("13622229784656158136036771217484571176836296686641868549125388198837476602820")));
const pPubKey = eddsa.babyJub.packPoint(pubKey);
const signature = eddsa.signPedersen(prvKey, msgBuf);
// console.log(F.toString(signature.R8[0]));
assert(F.eq(signature.R8[0], F.e("21253904451576600568378459528205653033385900307028841334532552830614710476912")));
// console.log(F.toString(signature.R8[1]));
assert(F.eq(signature.R8[1], F.e("20125634407542493427571099944365246191501563803226486072348038614369379124499")));
// console.log(Scalar.toString(signature.S));
assert(Scalar.eq(signature.S, Scalar.e("2129243915978267980511515511350111723623685317644064470882297086073041379651")));
const pSignature = eddsa.packSignature(signature);
// console.log(toHexString(pSignature));
assert.equal(toHexString(pSignature), ""+
"138501d9e734e73f485269bcdc29a9ef2da3fac2f5c9653761d0364f95b47eac"+
"43e1a02b56ff3dacfdac040f3e8c2023dc259ba3f6880ca8ad246b4bfe1bb504");
const uSignature = eddsa.unpackSignature(pSignature);
assert(eddsa.verifyPedersen(msgBuf, uSignature, pubKey));
});
it("Sign (using Mimc7) a single 10 bytes from 0 to 9", () => {
const F = eddsa.babyJub.F;
const msgBuf = fromHexString("000102030405060708090000");
const msg = eddsa.babyJub.F.e(Scalar.fromRprLE(msgBuf, 0));
// const prvKey = crypto.randomBytes(32);
const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
const pubKey = eddsa.prv2pub(prvKey);
assert(F.eq(pubKey[0], F.e("13277427435165878497778222415993513565335242147425444199013288855685581939618")));
assert(F.eq(pubKey[1], F.e("13622229784656158136036771217484571176836296686641868549125388198837476602820")));
const pPubKey = eddsa.babyJub.packPoint(pubKey);
const signature = eddsa.signMiMC(prvKey, msg);
// console.log(F.toString(signature.R8[0]));
assert(F.eq(signature.R8[0], F.e("11384336176656855268977457483345535180380036354188103142384839473266348197733")));
// console.log(F.toString(signature.R8[1]));
assert(F.eq(signature.R8[1], F.e("15383486972088797283337779941324724402501462225528836549661220478783371668959")));
// console.log(Scalar.toString(signature.S));
assert(Scalar.eq(signature.S, Scalar.e("2523202440825208709475937830811065542425109372212752003460238913256192595070")));
const pSignature = eddsa.packSignature(signature);
// console.log(toHexString(pSignature));
assert.equal(toHexString(pSignature), ""+
"dfedb4315d3f2eb4de2d3c510d7a987dcab67089c8ace06308827bf5bcbe02a2"+
"7ed40dab29bf993c928e789d007387998901a24913d44fddb64b1f21fc149405");
const uSignature = eddsa.unpackSignature(pSignature);
assert(eddsa.verifyMiMC(msg, uSignature, pubKey));
});
it("Sign (using Poseidon) a single 10 bytes from 0 to 9", () => {
const F = eddsa.babyJub.F;
const msgBuf = fromHexString("000102030405060708090000");
const msg = eddsa.babyJub.F.e(Scalar.fromRprLE(msgBuf, 0));
// const prvKey = crypto.randomBytes(32);
const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
const pubKey = eddsa.prv2pub(prvKey);
assert(F.eq(pubKey[0], F.e("13277427435165878497778222415993513565335242147425444199013288855685581939618")));
assert(F.eq(pubKey[1], F.e("13622229784656158136036771217484571176836296686641868549125388198837476602820")));
const pPubKey = eddsa.babyJub.packPoint(pubKey);
const signature = eddsa.signPoseidon(prvKey, msg);
// console.log(F.toString(signature.R8[0]));
assert(F.eq(signature.R8[0], F.e("11384336176656855268977457483345535180380036354188103142384839473266348197733")));
// console.log(F.toString(signature.R8[1]));
assert(F.eq(signature.R8[1], F.e("15383486972088797283337779941324724402501462225528836549661220478783371668959")));
// console.log(Scalar.toString(signature.S));
assert(Scalar.eq(signature.S, Scalar.e("1672775540645840396591609181675628451599263765380031905495115170613215233181")));
const pSignature = eddsa.packSignature(signature);
// console.log(toHexString(pSignature));
assert.equal(toHexString(pSignature), ""+
"dfedb4315d3f2eb4de2d3c510d7a987dcab67089c8ace06308827bf5bcbe02a2"+
"9d043ece562a8f82bfc0adb640c0107a7d3a27c1c7c1a6179a0da73de5c1b203");
const uSignature = eddsa.unpackSignature(pSignature);
assert(eddsa.verifyPoseidon(msg, uSignature, pubKey));
});
it("Sign (using mimcsponge) a single 10 bytes from 0 to 9", () => {
const F = eddsa.babyJub.F;
const msgBuf = fromHexString("000102030405060708090000");
const msg = eddsa.babyJub.F.e(Scalar.fromRprLE(msgBuf, 0));
// const prvKey = crypto.randomBytes(32);
const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
const pubKey = eddsa.prv2pub(prvKey);
assert(F.eq(pubKey[0], F.e("13277427435165878497778222415993513565335242147425444199013288855685581939618")));
assert(F.eq(pubKey[1], F.e("13622229784656158136036771217484571176836296686641868549125388198837476602820")));
const pPubKey = eddsa.babyJub.packPoint(pubKey);
const signature = eddsa.signMiMCSponge(prvKey, msg);
// console.log(F.toString(signature.R8[0]));
assert(F.eq(signature.R8[0], F.e("11384336176656855268977457483345535180380036354188103142384839473266348197733")));
// console.log(F.toString(signature.R8[1]));
assert(F.eq(signature.R8[1], F.e("15383486972088797283337779941324724402501462225528836549661220478783371668959")));
// console.log(Scalar.toString(signature.S));
assert(Scalar.eq(signature.S, Scalar.e("1868336918738674306327358602987493427631678603535639134028485964115448322340")));
const pSignature = eddsa.packSignature(signature);
// console.log(toHexString(pSignature));
assert.equal(toHexString(pSignature), ""+
"dfedb4315d3f2eb4de2d3c510d7a987dcab67089c8ace06308827bf5bcbe02a2"+
"24599218a1c2e5290bf58b2eec37bfec1395179ed5e817f10f86c9e7f3702104");
const uSignature = eddsa.unpackSignature(pSignature);
assert(eddsa.verifyMiMCSponge(msg, uSignature, pubKey));
});
});