// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.math.ec;

import java.math.BigInteger;

public class WTauNafMultiplier extends AbstractECMultiplier
{
    static final String PRECOMP_NAME = "bc_wtnaf";
    
    @Override
    protected ECPoint multiplyPositive(final ECPoint ecPoint, final BigInteger bigInteger) {
        if (!(ecPoint instanceof ECPoint.AbstractF2m)) {
            throw new IllegalArgumentException("Only ECPoint.AbstractF2m can be used in WTauNafMultiplier");
        }
        final ECPoint.AbstractF2m abstractF2m = (ECPoint.AbstractF2m)ecPoint;
        final ECCurve.AbstractF2m abstractF2m2 = (ECCurve.AbstractF2m)abstractF2m.getCurve();
        final byte byteValue = abstractF2m2.getA().toBigInteger().byteValue();
        final byte mu = Tnaf.getMu(byteValue);
        return this.multiplyWTnaf(abstractF2m, Tnaf.partModReduction(abstractF2m2, bigInteger, byteValue, mu, (byte)10), byteValue, mu);
    }
    
    private ECPoint.AbstractF2m multiplyWTnaf(final ECPoint.AbstractF2m abstractF2m, final ZTauElement zTauElement, final byte b, final byte b2) {
        return multiplyFromWTnaf(abstractF2m, Tnaf.tauAdicWNaf(b2, zTauElement, 4, Tnaf.getTw(b2, 4).intValue(), (b == 0) ? Tnaf.alpha0 : Tnaf.alpha1));
    }
    
    private static ECPoint.AbstractF2m multiplyFromWTnaf(final ECPoint.AbstractF2m abstractF2m, final byte[] array) {
        final ECCurve.AbstractF2m abstractF2m2 = (ECCurve.AbstractF2m)abstractF2m.getCurve();
        final ECPoint.AbstractF2m[] preComp = ((WTauNafPreCompInfo)abstractF2m2.precompute(abstractF2m, "bc_wtnaf", new PreCompCallback() {
            final /* synthetic */ byte val$a = abstractF2m2.getA().toBigInteger().byteValue();
            
            @Override
            public PreCompInfo precompute(final PreCompInfo preCompInfo) {
                if (preCompInfo instanceof WTauNafPreCompInfo) {
                    return preCompInfo;
                }
                final WTauNafPreCompInfo wTauNafPreCompInfo = new WTauNafPreCompInfo();
                wTauNafPreCompInfo.setPreComp(Tnaf.getPreComp(abstractF2m, this.val$a));
                return wTauNafPreCompInfo;
            }
        })).getPreComp();
        final ECPoint.AbstractF2m[] array2 = new ECPoint.AbstractF2m[preComp.length];
        for (int i = 0; i < preComp.length; ++i) {
            array2[i] = (ECPoint.AbstractF2m)preComp[i].negate();
        }
        ECPoint.AbstractF2m tauPow = (ECPoint.AbstractF2m)abstractF2m.getCurve().getInfinity();
        int n = 0;
        for (int j = array.length - 1; j >= 0; --j) {
            ++n;
            final byte b = array[j];
            if (b != 0) {
                final ECPoint.AbstractF2m tauPow2 = tauPow.tauPow(n);
                n = 0;
                tauPow = (ECPoint.AbstractF2m)tauPow2.add((b > 0) ? preComp[b >>> 1] : array2[-b >>> 1]);
            }
        }
        if (n > 0) {
            tauPow = tauPow.tauPow(n);
        }
        return tauPow;
    }
}
