blob: 7c4c97a15c379849ec8c1fe4dc4ca3467c154685 [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 ECP ARITHMETICS - test driver and function exerciser for ECP API Functions */
var chai = require('chai');
var CTX = require("../index");
var expect = chai.expect;
var ecp_curves = ['ED25519', 'GOLDILOCKS', 'NIST256', 'BRAINPOOL', 'ANSSI', 'HIFIVE', 'C25519', 'SECP256K1', 'NIST384', 'C41417',
'NIST521', 'NUMS256W', 'NUMS384W', 'NUMS512W', 'BN254', 'BN254CX', 'BLS383', 'BLS461', 'FP256BN', 'FP512BN', 'BLS24', 'BLS48'
];
var readBIG = function(string, ctx) {
while (string.length != ctx.BIG.MODBYTES*2){string = "00"+string;}
return ctx.BIG.fromBytes(Buffer.from(string, "hex"));
}
var readPoint = function(string, ctx) {
var P = new ctx.ECP(),
X,Y;
string = string.split(":");
X = readBIG(string[0],ctx);
Y = readBIG(string[1],ctx);
P.setxy(X,Y);
return P;
}
describe('TEST ECP ARITHMETIC', function() {
ecp_curves.forEach(function(curve) {
it('test '+ curve, function(done) {
this.timeout(0);
var ctx = new CTX(curve);
var vectors = require('../testVectors/ecp/'+curve+'.json');
vectors.forEach(function(vector) {
var P1 = readPoint(vector.ECP1,ctx);
var Paux1 = new ctx.ECP(0);
// test copy and equals
Paux1.copy(P1);
expect(Paux1.equals(P1)).to.equal(true);
if (ctx.ECP.CURVETYPE != ctx.ECP.MONTGOMERY) {
// test that y^2 = RHS
var x = Paux1.getx();
var y = Paux1.gety();
y.sqr();
x = ctx.ECP.RHS(x);
expect(x.toString()).to.equal(y.toString());
// test commutativity of the sum
var P2 = readPoint(vector.ECP2,ctx);
var Psum = readPoint(vector.ECPsum,ctx);
var Paux2 = new ctx.ECP(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(P2);
Paux2.add(Psum);
Paux2.add(P1);
Paux1.add(Psum)
expect(Paux1.toString()).to.equal(Paux2.toString());
// Test sum with infinity
Paux1.copy(P1);
Paux2.inf();
Paux1.add(Paux2);
expect(Paux1.toString()).to.equal(P1.toString());
Paux2.add(Paux1);
expect(Paux2.toString()).to.equal(P1.toString());
// test negative of a point
var Pneg = readPoint(vector.ECPneg,ctx);
Paux1.copy(P1);
Paux1.neg();
expect(Paux1.toString()).to.equal(Pneg.toString());
// test subtraction between points
var Psub = readPoint(vector.ECPsub,ctx);
Paux1.copy(P1);
Paux1.sub(P2);
expect(Paux1.toString()).to.equal(Psub.toString());
}
// test doubling
var Pdbl = readPoint(vector.ECPdbl,ctx);
Paux1.copy(P1);
Paux1.dbl();
expect(Paux1.toString()).to.equal(Pdbl.toString());
// test scalar multiplication
var Pmul = readPoint(vector.ECPmul,ctx);
var Scalar1 = readBIG(vector.BIGscalar1, ctx);
Paux1.copy(P1);
Paux1 = Paux1.mul(Scalar1);
expect(Paux1.toString()).to.equal(Pmul.toString());
if (ctx.ECP.CURVETYPE != ctx.ECP.MONTGOMERY) {
// test multiplication by small integer
var Ppinmul = readPoint(vector.ECPpinmul,ctx);
Paux1.copy(P1);
Paux1 = Paux1.pinmul(1234,14);
expect(Paux1.toString()).to.equal(Ppinmul.toString());
// test mul2
var Pmul2 = readPoint(vector.ECPmul2,ctx);
var Scalar1 = readBIG(vector.BIGscalar1, ctx);
var Scalar2 = readBIG(vector.BIGscalar2, ctx);
Paux1.copy(P1);
Paux2.copy(P2);
Paux1 = Paux1.mul2(Scalar1,Paux2,Scalar2);
expect(Paux1.toString()).to.equal(Pmul2.toString());
}
// test wrong coordinates and infinity point
var Pwrong = readPoint(vector.ECPwrong,ctx);
var Pinf = readPoint(vector.ECPinf,ctx);
// test copy and equals
expect(Pwrong.is_infinity()).to.equal(true);
expect(Pinf.is_infinity()).to.equal(true);
expect(Pwrong.equals(Pinf)).to.equal(true);
});
done();
});
});
});