/* | |
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 FP2 ARITHMETICS - test driver and function exerciser for FP2 API Functions */ | |
var chai = require('chai'); | |
var CTX = require("../index"); | |
var expect = chai.expect; | |
var pf_curves = ['BN254', 'BN254CX', 'BLS381', '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 readFP2 = function(string, ctx) { | |
string = string.split(","); | |
var cox = string[0].slice(1); | |
var coy = string[1].slice(0,-1); | |
var x = readBIG(cox,ctx); | |
var y = readBIG(coy,ctx); | |
return new ctx.FP2(x,y); | |
} | |
describe('TEST FP2 ARITHMETIC', function() { | |
pf_curves.forEach(function(curve){ | |
it('test '+ curve, function(done) { | |
this.timeout(0); | |
var ctx = new CTX(curve); | |
var vectors = require('../testVectors/fp2/'+curve+'.json'); | |
var i=0; | |
vectors.forEach(function(vector){ | |
// test commutativity of addition | |
var fp21 = readFP2(vector.FP21,ctx); | |
var fp22 = readFP2(vector.FP22,ctx); | |
var fp2add = readFP2(vector.FP2add,ctx); | |
var a1 = new ctx.FP2(0); | |
var a2 = new ctx.FP2(0); | |
a1.copy(fp21); | |
a1.add(fp22); | |
expect(a1.toString()).to.equal(fp2add.toString()); | |
a2.copy(fp22); | |
a2.add(fp21); | |
expect(a2.toString()).to.equal(fp2add.toString()); | |
// test associativity of addition | |
a2.add(fp2add); | |
a1.copy(fp21); | |
a1.add(fp2add); | |
a1.add(fp22); | |
expect(a1.toString()).to.equal(a2.toString()); | |
// test subtraction | |
var fp2sub = readFP2(vector.FP2sub, ctx); | |
a1.copy(fp21); | |
a1.sub(fp22); | |
expect(a1.toString()).to.equal(fp2sub.toString()); | |
// test negative of a FP2 | |
var fp2neg = readFP2(vector.FP2neg, ctx); | |
a1.copy(fp21); | |
a1.neg(); | |
expect(a1.toString()).to.equal(fp2neg.toString()); | |
// test conjugate of a FP2 | |
var fp2conj = readFP2(vector.FP2conj, ctx); | |
a1.copy(fp21); | |
a1.conj(); | |
expect(a1.toString()).to.equal(fp2conj.toString()); | |
// test scalar multiplication | |
var fp2pmul = readFP2(vector.FP2pmul, ctx); | |
var scalar = readBIG(vector.BIGsc, ctx); | |
var fpsc = new ctx.FP(0); | |
fpsc.bcopy(scalar); | |
a1.copy(fp21); | |
a1.pmul(fpsc); | |
expect(a1.toString()).to.equal(fp2pmul.toString()); | |
// test small scalar multiplication | |
var fp2imul = readFP2(vector.FP2imul, ctx); | |
a1.copy(fp21); | |
a1.imul(i); | |
expect(a1.toString()).to.equal(fp2imul.toString()); | |
i++; | |
// test square and square root | |
var fp2sqr = readFP2(vector.FP2sqr, ctx); | |
a1.copy(fp21); | |
a1.sqr(); | |
expect(a1.toString()).to.equal(fp2sqr.toString()); | |
a1.sqrt(); | |
a1.sqr(); | |
expect(a1.toString()).to.equal(fp2sqr.toString()); | |
// test multiplication | |
var fp2mul = readFP2(vector.FP2mul, ctx); | |
a1.copy(fp21); | |
a2.copy(fp22); | |
a1.mul(a2); | |
expect(a1.toString()).to.equal(fp2mul.toString()); | |
// test power | |
var fp2pow = readFP2(vector.FP2pow, ctx); | |
a1 = fp21.pow(scalar); | |
expect(a1.toString()).to.equal(fp2pow.toString()); | |
// test inverse | |
var fp2inv = readFP2(vector.FP2inv, ctx); | |
a1.copy(fp21); | |
a1.inverse(); | |
expect(a1.toString()).to.equal(fp2inv.toString()); | |
// test division by 2 | |
var fp2div2 = readFP2(vector.FP2div2, ctx); | |
a1.copy(fp21); | |
a1.div2(); | |
expect(a1.toString()).to.equal(fp2div2.toString()); | |
// test multiplication by (1+sqrt(-1)) | |
var fp2mulip = readFP2(vector.FP2mulip, ctx); | |
a1.copy(fp21); | |
a1.mul_ip(); | |
expect(a1.toString()).to.equal(fp2mulip.toString()); | |
// test division by (1+sqrt(-1)) | |
var fp2divip = readFP2(vector.FP2divip, ctx); | |
a1.copy(fp21); | |
a1.div_ip(); | |
expect(a1.toString()).to.equal(fp2divip.toString()); | |
}); | |
done(); | |
}); | |
}); | |
}); |