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