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

package org.bouncycastle.crypto.threshold;

abstract class Polynomial
{
    public static Polynomial newInstance(final ShamirSecretSplitter.Algorithm algorithm, final ShamirSecretSplitter.Mode mode) {
        if (mode == ShamirSecretSplitter.Mode.Native) {
            return new PolynomialNative(algorithm);
        }
        return new PolynomialTable(algorithm);
    }
    
    protected abstract byte gfMul(final int p0, final int p1);
    
    protected abstract byte gfDiv(final int p0, final int p1);
    
    protected byte gfPow(int gfMul, final byte b) {
        byte gfMul2 = 1;
        for (int i = 0; i < 8; ++i) {
            if ((b & 1 << i) != 0x0) {
                gfMul2 = this.gfMul(gfMul2 & 0xFF, gfMul & 0xFF);
            }
            gfMul = this.gfMul(gfMul & 0xFF, gfMul & 0xFF);
        }
        return gfMul2;
    }
    
    public byte[] gfVecMul(final byte[] array, final byte[][] array2) {
        final byte[] array3 = new byte[array2[0].length];
        for (int i = 0; i < array2[0].length; ++i) {
            int n = 0;
            for (int j = 0; j < array.length; ++j) {
                n ^= this.gfMul(array[j] & 0xFF, array2[j][i] & 0xFF);
            }
            array3[i] = (byte)n;
        }
        return array3;
    }
}
