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

package org.bouncycastle.crypto.modes.gcm;

import java.util.ArrayList;
import java.util.List;

public class Tables1kGCMExponentiator implements GCMExponentiator
{
    private List lookupPowX2;
    
    @Override
    public void init(final byte[] array) {
        final long[] longs = GCMUtil.asLongs(array);
        if (this.lookupPowX2 != null && 0L != GCMUtil.areEqual(longs, this.lookupPowX2.get(0))) {
            return;
        }
        (this.lookupPowX2 = new ArrayList(8)).add(longs);
    }
    
    @Override
    public void exponentiateX(long n, final byte[] array) {
        final long[] oneAsLongs = GCMUtil.oneAsLongs();
        int n2 = 0;
        while (n > 0L) {
            if ((n & 0x1L) != 0x0L) {
                GCMUtil.multiply(oneAsLongs, this.getPowX2(n2));
            }
            ++n2;
            n >>>= 1;
        }
        GCMUtil.asBytes(oneAsLongs, array);
    }
    
    private long[] getPowX2(final int n) {
        int n2 = this.lookupPowX2.size() - 1;
        if (n2 < n) {
            long[] array = this.lookupPowX2.get(n2);
            do {
                final long[] array2 = new long[2];
                GCMUtil.square(array, array2);
                this.lookupPowX2.add(array2);
                array = array2;
            } while (++n2 < n);
        }
        return this.lookupPowX2.get(n);
    }
}
