| /* |
| 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 FP ARITHMETICS - test driver and function exerciser for FP API Functions */ |
| |
| // Here we test only some curves, but those tests cover all the fields FP. |
| |
| var chai = require('chai'); |
| |
| var CTX = require("../index"); |
| |
| var expect = chai.expect; |
| |
| var fp_curves = ['ED25519', 'GOLDILOCKS', 'NIST256', 'BRAINPOOL', 'ANSSI', 'HIFIVE', 'NIST384', 'C41417', 'SECP256K1', 'NIST521', 'NUMS256W', |
| 'NUMS256E', 'NUMS384W', 'NUMS512W', '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 readFP = function(string, ctx) { |
| return new ctx.FP(readBIG(string, ctx)); |
| } |
| describe('TEST FP ARITHMETIC', function() { |
| |
| fp_curves.forEach(function(curve){ |
| |
| it('test '+ curve, function(done) { |
| this.timeout(0); |
| |
| var ctx = new CTX(curve); |
| |
| // Select appropriate field for the curve |
| var field = ctx.config["FIELD"]; |
| if (curve == 'NUMS256E') { |
| field = field+"E"; |
| } |
| if (curve == 'NUMS256W') { |
| field = field+"W"; |
| } |
| |
| var vectors = require('../testVectors/fp/'+field+'.json'); |
| |
| vectors.forEach(function(vector) { |
| |
| // test commutativity of addition |
| var fp1 = readFP(vector.FP1,ctx); |
| var fp2 = readFP(vector.FP2,ctx); |
| var fpadd = readFP(vector.FPadd,ctx); |
| var a1 = new ctx.FP(0); |
| var a2 = new ctx.FP(0); |
| a1.copy(fp1); |
| a1.add(fp2); |
| expect(a1.toString()).to.equal(fpadd.toString()); |
| a2.copy(fp2); |
| a2.add(fp1); |
| expect(a2.toString()).to.equal(fpadd.toString()); |
| |
| // test associativity of addition |
| a2.add(fpadd); |
| a1.copy(fp1); |
| a1.add(fpadd); |
| a1.add(fp2); |
| expect(a1.toString()).to.equal(a2.toString()); |
| |
| // test subtraction |
| var fpsub = readFP(vector.FPsub, ctx); |
| a1.copy(fp1); |
| a1.sub(fp2); |
| expect(a1.toString()).to.equal(fpsub.toString()); |
| |
| // test multiplication |
| var fpmul = readFP(vector.FPmulmod, ctx); |
| a1.copy(fp1); |
| a1.mul(fp2); |
| expect(a1.toString()).to.equal(fpmul.toString()); |
| |
| // test small multiplication |
| var fpimul = readFP(vector.FPsmallmul, ctx); |
| a2.imul(0); |
| expect(a2.iszilch()).to.equal(true); |
| for (var vi = 1; vi <= 10; vi++) { |
| a1.copy(fp1); |
| a2.copy(fp1); |
| a1.imul(vi); |
| for (var vj = 1; vj < vi; vj++) { |
| a2.add(fp1); |
| } |
| expect(a1.toString()).to.equal(a2.toString()); |
| } |
| expect(a1.toString()).to.equal(fpimul.toString()); |
| |
| // test square |
| var fpsqr = readFP(vector.FPsqr, ctx); |
| a1.copy(fp1); |
| a1.sqr(); |
| expect(a1.toString()).to.equal(fpsqr.toString()); |
| |
| // test negative of a FP |
| var fpneg = readFP(vector.FPneg, ctx); |
| a1.copy(fp1); |
| a1.neg(); |
| expect(a1.toString()).to.equal(fpneg.toString()); |
| |
| // test division by 2 |
| var fpdiv2 = readFP(vector.FPdiv2, ctx); |
| a1.copy(fp1); |
| a1.div2(); |
| expect(a1.toString()).to.equal(fpdiv2.toString()); |
| |
| // test inverse |
| var fpinv = readFP(vector.FPinv, ctx); |
| a1.copy(fp1); |
| a1.inverse(); |
| expect(a1.toString()).to.equal(fpinv.toString()); |
| |
| // test power |
| var fppow = readFP(vector.FPexp, ctx); |
| a1.copy(fp1); |
| a2 = readBIG(vector.FP2, ctx); |
| a1 = a1.pow(a2); |
| expect(a1.toString()).to.equal(fppow.toString()); |
| }); |
| done(); |
| }); |
| }); |
| }); |