blob: c19d9b7020b4c1b8e49c74502810c9529e336b07 [file] [log] [blame]
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
/* Test ECP2 ARITHMETICS - test driver and function exerciser for ECP2 API Functions */
var chai = require('chai');
var CTX = require("../index");
var expect = chai.expect;
var pf_curves = ['BN254', 'BN254CX', 'BLS381', 'BLS383', 'BLS461', 'FP256BN', 'FP512BN'];
var readBIG = function(string, ctx) {
while (string.length != ctx.BIG.MODBYTES*2){string = "00"+string;}
return ctx.BIG.fromBytes(Buffer.from(string, "hex"));
}
var readPoint2 = function(string, ctx) {
var P = new ctx.ECP2(),
X, Y;
var coxy = string.split("&");
var cox = coxy[0].split(":");
var coy = coxy[1].split(":");
var x1 = readBIG(cox[0],ctx);
var x2 = readBIG(cox[1],ctx);
var y1 = readBIG(coy[0],ctx);
var y2 = readBIG(coy[1],ctx);
X = new ctx.FP2(x1,x2);
Y = new ctx.FP2(y1,y2);
P.setxy(X,Y);
return P;
}
describe('TEST ECP2 ARITHMETIC', function() {
pf_curves.forEach(function(curve) {
it('test '+curve, function(done) {
this.timeout(0);
var ctx = new CTX(curve);
var vectors = require('../testVectors/ecp2/'+curve+'.json');
var i = 0;
vectors.forEach(function(vector) {
var P1 = readPoint2(vector.ECP21,ctx);
var Paux1 = new ctx.ECP2(0);
// test copy and equals
Paux1.copy(P1);
expect(Paux1.equals(P1)).to.equal(true);
// test that y^2 = RHS
var x = Paux1.getx();
var y = Paux1.gety();
y.sqr();
var res = ctx.ECP2.RHS(x);
expect(res.toString()).to.equal(y.toString());
// test commutativity of the sum
var P2 = readPoint2(vector.ECP22,ctx);
var Psum = readPoint2(vector.ECP2sum,ctx);
var Paux2 = new ctx.ECP2(0);
Paux1.copy(P1);
Paux2.copy(P2);
Paux1.add(P2);
Paux2.add(P1);
expect(Paux1.toString()).to.equal(Psum.toString());
expect(Paux2.toString()).to.equal(Psum.toString());
// test associativity of the sum
Paux2.copy(P1);
Paux2.add(P2);
Paux2.add(Psum);
Paux1.add(Psum)
expect(Paux1.toString()).to.equal(Paux2.toString());
// test negative of a point
var Pneg = readPoint2(vector.ECP2neg,ctx);
Paux1.copy(P1);
Paux1.neg();
expect(Paux1.toString()).to.equal(Pneg.toString());
// test subtraction between points
var Psub = readPoint2(vector.ECP2sub,ctx);
Paux1.copy(P1);
Paux1.sub(P2);
expect(Paux1.toString()).to.equal(Psub.toString());
// test doubling
var Pdbl = readPoint2(vector.ECP2dbl,ctx);
Paux1.copy(P1);
Paux1.dbl();
expect(Paux1.toString()).to.equal(Pdbl.toString());
// test scalar multiplication
var Pmul = readPoint2(vector.ECP2mul,ctx);
var Scalar1 = readBIG(vector.BIGscalar1, ctx);
Paux1.copy(P1);
Paux1 = Paux1.mul(Scalar1);
expect(Paux1.toString()).to.equal(Pmul.toString());
// test linear mul4, linear combination of 4 points
// Only executed once for timing reasons
if (i===0){
i++;
var P3 = readPoint2(vector.ECP23,ctx);
var P4 = readPoint2(vector.ECP24,ctx);
var Scalar2 = readBIG(vector.BIGscalar2, ctx);
var Scalar3 = readBIG(vector.BIGscalar3, ctx);
var Scalar4 = readBIG(vector.BIGscalar4, ctx);
var Pmul4 = readPoint2(vector.ECP2mul4,ctx);
Paux1 = ctx.ECP2.mul4([P1,P2,P3,P4],[Scalar1,Scalar2,Scalar3,Scalar4]);
expect(Paux1.toString()).to.equal(Pmul4.toString());
}
// test wrong coordinates and infinity point
var Pwrong = readPoint2(vector.ECP2wrong,ctx);
var Pinf = readPoint2(vector.ECP2inf,ctx);
expect(Pwrong.is_infinity()).to.equal(true);
expect(Pinf.is_infinity()).to.equal(true);
expect(Pwrong.equals(Pinf)).to.equal(true);
});
done();
});
});
});