g1 and g2 tests works

This commit is contained in:
Jordi Baylina 2018-08-12 22:11:42 +02:00
parent 89173c3e63
commit 143654c8d6
No known key found for this signature in database
GPG Key ID: 7480C80C1BE43112
3 changed files with 122 additions and 31 deletions

@ -22,7 +22,9 @@ const C = {
bigInt("8495653923123431417604973247489272438418190587263600148770280649306958101930"), bigInt("8495653923123431417604973247489272438418190587263600148770280649306958101930"),
bigInt("4082367875863433681332203403145435568316851327593401208105741076214120093531") bigInt("4082367875863433681332203403145435568316851327593401208105741076214120093531")
] ]
] ],
f2nonResidue: bigInt("21888242871839275222246405745257275088696311157297823662689037894645226208582")
}; };

@ -1,54 +1,106 @@
const bigInt = require("big-integer");
class F2Field { class F2Field {
constructor(p) { constructor(F, nonResidue) {
this.p = n; this.F = F;
this.zero = [this.F.zero, this.F.zero];
this.one = [this.F.one, this.F.zero];
this.nonResidue = nonResidue;
}
e(c0, c1) {
return [bigInt(c0), bigInt(c1)];
}
copy(a) {
return [this.F.copy(a[0]), this.F.copy(a[1])];
} }
add(a, b) { add(a, b) {
const maxGrade = Math.max(a.length, b.length); return [
const res = new Array(maxGrade); this.F.add(a[0], b[0]),
for (let i=0; i<maxGrade; i++) { this.F.add(a[1], b[1])
res[i] = this.F.add(a[i], b[i]); ];
}
return this._reduce(res);
} }
sub(a, b) { sub(a, b) {
// TODO return [
throw new Error("Not Implementted"); this.F.sub(a[0], b[0]),
this.F.sub(a[1], b[1])
];
} }
neg(a) { neg(a) {
// TODO return this.sub(this.zero, a);
throw new Error("Not Implementted");
} }
mul(a, b) { mul(a, b) {
// TODO const aA = this.F.mul(a[0] , b[0]);
throw new Error("Not Implementted"); const bB = this.F.mul(a[1] , b[1]);
return [
this.F.add( aA , this.F.mul(this.nonResidue , bB)),
this.F.sub(
this.F.mul(
this.F.add(a[0], a[1]),
this.F.add(b[0], b[1])),
this.F.add(aA, bB))];
} }
inverse(a, b) { inverse(a) {
// TODO const t0 = this.F.square(a[0]);
throw new Error("Not Implementted"); const t1 = this.F.square(a[1]);
const t2 = this.F.sub(t0, this.F.mul(this.nonResidue, t1));
const t3 = this.F.inverse(t2);
return [
this.F.mul(a[0], t3),
this.F.neg(this.F.mul( a[1], t3)) ];
} }
div(a, b) { div(a, b) {
// TODO return this.mul(a, this.inverse(b));
throw new Error("Not Implementted"); }
square(a) {
const ab = this.F.mul(a[0] , a[1]);
/*
[
(a + b) * (a + non_residue * b) - ab - non_residue * ab,
ab + ab
];
*/
return [
this.F.sub(
this.F.mul(
this.F.add(a[0], a[1]) ,
this.F.add(
a[0] ,
this.F.mul(this.nonResidue , a[1]))),
this.F.add(
ab,
this.F.mul(this.nonResidue, ab))),
this.F.add(ab, ab)
];
} }
isZero(a) { isZero(a) {
// TODO return this.F.isZero(a[0]) && this.F.isZero(a[1]);
throw new Error("Not Implementted");
} }
random() { equals(a, b) {
// TODO return this.F.equals(a[0], b[0]) && this.F.equals(a[1], b[1]);
throw new Error("Not Implementted");
} }
affine(a) {
return [this.F.affine(a[0]), this.F.affine(a[1])];
}
toString(a) {
const cp = this.affine(a);
return `[ ${this.F.toString(cp[0])} , ${this.F.toString(cp[1])} ]`;
}
} }
module.exports = F2Field; module.exports = F2Field;

@ -1,12 +1,13 @@
const bigInt = require("big-integer");
const F1Field = require("../src/f1field.js"); const F1Field = require("../src/f1field.js");
const F2Field = require("../src/f2field.js");
const GCurve = require("../src/gcurve.js"); const GCurve = require("../src/gcurve.js");
const constants = require("../src/constants.js"); const constants = require("../src/constants.js");
const chai = require('chai'); const chai = require("chai");
const assert = chai.assert; const assert = chai.assert;
describe("Curve G1 Test", () => { describe("Curve G1 Test", () => {
it ("r*one == 0", () => { it ("r*one == 0", () => {
const F1 = new F1Field(constants.q); const F1 = new F1Field(constants.q);
const G1 = new GCurve(F1, constants.g1); const G1 = new GCurve(F1, constants.g1);
@ -16,12 +17,12 @@ describe("Curve G1 Test", () => {
assert(G1.equals(res, G1.zero), "G1 does not have range r"); assert(G1.equals(res, G1.zero), "G1 does not have range r");
}); });
it("Should add match in various", () => { it("Should add match in various in G1", () => {
const F1 = new F1Field(constants.q); const F1 = new F1Field(constants.q);
const G1 = new GCurve(F1, constants.g1); const G1 = new GCurve(F1, constants.g1);
const r1 = F1.e(33); const r1 = bigInt(33);
const r2 = F1.e(44); const r2 = bigInt(44);
const gr1 = G1.mulEscalar(G1.g, r1); const gr1 = G1.mulEscalar(G1.g, r1);
const gr2 = G1.mulEscalar(G1.g, r2); const gr2 = G1.mulEscalar(G1.g, r2);
@ -33,3 +34,39 @@ describe("Curve G1 Test", () => {
assert(G1.equals(grsum1, grsum2)); assert(G1.equals(grsum1, grsum2));
}); });
}); });
describe("Curve G2 Test", () => {
it ("r*one == 0", () => {
const F1 = new F1Field(constants.q);
const F2 = new F2Field(F1, constants.f2nonResidue);
const G2 = new GCurve(F2, constants.g2);
const res = G2.mulEscalar(G2.g, constants.r);
assert(G2.equals(res, G2.zero), "G2 does not have range r");
});
it("Should add match in various in G2", () => {
const F1 = new F1Field(constants.q);
const F2 = new F2Field(F1, constants.f2nonResidue);
const G2 = new GCurve(F2, constants.g2);
const r1 = bigInt(33);
const r2 = bigInt(44);
const gr1 = G2.mulEscalar(G2.g, r1);
const gr2 = G2.mulEscalar(G2.g, r2);
const grsum1 = G2.add(gr1, gr2);
const grsum2 = G2.mulEscalar(G2.g, r1.add(r2));
/*
console.log(G2.toString(grsum1));
console.log(G2.toString(grsum2));
*/
assert(G2.equals(grsum1, grsum2));
});
});