| /* |
| 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(); |
| }); |
| }); |
| }); |