/*
    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 FP12 ARITHMETICS - test driver and function exerciser for FP4 API Functions */

var chai = require('chai');

var CTX = require("../index");

var expect = chai.expect;

var pf_curves = ['BN254', 'BN254CX', 'BLS381', 'BLS383', 'BLS461', 'FP256BN', 'FP512BN'];

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);;
}

var readFP4 = function(string, ctx) {
    var X, Y;

    string = string.split("],[");
    var cox = string[0].slice(1) + "]";
    var coy = "[" + string[1].slice(0,-1);

    X = readFP2(cox,ctx);
    Y = readFP2(coy,ctx);

    return new ctx.FP4(X,Y);
}

var readFP12= function(string, ctx) {
    var X,Y,Z;

    string = string.split("]],[[");
    var cox = string[0].slice(1) + "]]";
    var coy = "[[" + string[1] + "]]";
    var coz = "[[" + string[2].slice(0,-1);

    X = readFP4(cox,ctx);
    Y = readFP4(coy,ctx);
    Z = readFP4(coz,ctx);

    return new ctx.FP12(X,Y,Z);
}

describe('TEST FP12 ARITHMETIC', function() {

    pf_curves.forEach(function(curve){

        it('test '+ curve, function(done) {
            this.timeout(0);

            var ctx = new CTX(curve);
            var vectors = require('../testVectors/fp12/'+ curve +'.json');

            var Fra = new ctx.FP(0),
                Frb = new ctx.FP(0),
                Fr;
            Fra.rcopy(ctx.ROM_FIELD.Fra);
            Frb.rcopy(ctx.ROM_FIELD.Frb);
            Fr = new ctx.FP2(Fra,Frb);

            var i = 0;
            vectors.forEach(function(vector) {
                // Generate/read the necessary FP12 and BIGs
                var fp121,fp122,fp123,fp124,fp12c;
                fp121 = readFP12(vector.FP121, ctx);
                fp122 = readFP12(vector.FP122, ctx);
                if (i===0){
                    fp123 = readFP12(vector.FP123, ctx);
                    fp124 = readFP12(vector.FP124, ctx);
                }
                    fp12c = readFP12(vector.FP12c, ctx);
                var BIGsc1,BIGsc2,BIGsc3,BIGsc4,BIGscs,BIGsco;
                BIGsc1 = readBIG(vector.BIGsc1, ctx);
                if (i===0){
                    BIGsc2 = readBIG(vector.BIGsc2, ctx);
                    BIGsc3 = readBIG(vector.BIGsc3, ctx);
                    BIGsc4 = readBIG(vector.BIGsc4, ctx);
                }
                BIGscs = readBIG(vector.BIGscs, ctx);
                BIGsco = readBIG(vector.BIGsco, ctx);
                var a1 = new ctx.FP12(0);
                var a2 = new ctx.FP12(0);

                // test conjugate of a FP4
                var fp12conj = readFP12(vector.FP12conj, ctx);
                a1.copy(fp121);
                a1.conj();
                expect(a1.toString()).to.equal(fp12conj.toString());

                // test multiplication and commutativity
                var fp12mul = readFP12(vector.FP12mul, ctx);
                a1.copy(fp121);
                a2.copy(fp122);
                a1.mul(fp122);
                a2.mul(fp121);
                expect(a1.toString()).to.equal(fp12mul.toString());
                expect(a2.toString()).to.equal(fp12mul.toString());

                // test square
                var fp12sqr = readFP12(vector.FP12square, ctx);
                a1.copy(fp121);
                a1.sqr();
                expect(a1.toString()).to.equal(fp12sqr.toString());

                // test unitary square
                var fp12usqr = readFP12(vector.FP12usquare, ctx);
                a1.copy(fp121);
                a1.usqr();
                expect(a1.toString()).to.equal(fp12usqr.toString());

                // test inverse
                var fp12inv = readFP12(vector.FP12inv, ctx);
                a1.copy(fp121);
                a1.inverse();
                expect(a1.toString()).to.equal(fp12inv.toString());

                // test smultiplication for D-TYPE
                var fp12smulydtype = readFP12(vector.FP12smulydtype,ctx);
                var fp12smuldtype = readFP12(vector.FP12smuldtype,ctx);
                a1.copy(fp121);
                a1.smul(fp12smulydtype, ctx.ECP.D_TYPE);
                expect(a1.toString()).to.equal(fp12smuldtype.toString());

                // test smultiplication for M-TYPE
                var fp12smulymtype = readFP12(vector.FP12smulymtype,ctx);
                var fp12smulmtype = readFP12(vector.FP12smulmtype,ctx);
                a1.copy(fp121);
                a1.smul(fp12smulymtype, ctx.ECP.M_TYPE);
                expect(a1.toString()).to.equal(fp12smulmtype.toString());

                // test power
                var fp12pow = readFP12(vector.FP12pow, ctx);
                a1 = fp121.pow(BIGsc1);
                expect(a1.toString()).to.equal(fp12pow.toString());

                // test power by small integer
                var fp12pinpow = readFP12(vector.FP12pinpow, ctx);
                a1.copy(fp121);
                a1.pinpow(i+1,10);
                expect(a1.toString()).to.equal(fp12pinpow.toString());
                i++;

                // test frobenius
                var fp12frob = readFP12(vector.FP12frob, ctx);
                a1.copy(fp121);
                a1.frob(Fr);
                expect(a1.toString()).to.equal(fp12frob.toString());

                // test compressed power with big integer
                var fp12compow = readFP4(vector.FP12compow, ctx);
                a1 = fp12c.compow(BIGsc1,BIGsco);
                expect(a1.toString()).to.equal(fp12compow.toString());

                // test compressed power with small integer
                var fp12compows = readFP4(vector.FP12compows, ctx);
                a1 = fp12c.compow(BIGscs,BIGsco);
                expect(a1.toString()).to.equal(fp12compows.toString());

                // test pow4
                // Executed only once for timing reasons
                if (i===0) {
                    var fp12pow4 = readFP12(vector.FP12pow4, ctx);
                    a1 = ctx.FP12.pow4([fp121,fp122,fp123,fp124],[BIGsc1,BIGsc2,BIGsc3,BIGsc4]);
                    expect(a1.toString()).to.equal(fp12pow4.toString());
                }

                //test trace
                var fp4trace = readFP4(vector.FP4trace, ctx);
                a1 = fp121.trace();
                expect(a1.toString()).to.equal(fp4trace.toString());
            });
            done();
        });
    });
});
