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

package org.bouncycastle.pqc.crypto.rainbow;

import org.bouncycastle.util.Arrays;

public class RainbowPublicKeyParameters extends RainbowKeyParameters
{
    short[][][] pk;
    byte[] pk_seed;
    short[][][] l1_Q3;
    short[][][] l1_Q5;
    short[][][] l1_Q6;
    short[][][] l1_Q9;
    short[][][] l2_Q9;
    
    RainbowPublicKeyParameters(final RainbowParameters rainbowParameters, final short[][][] array, final short[][][] array2, final short[][][] array3, final short[][][] array4, final short[][][] array5, final short[][][] array6, final short[][][] array7, final short[][][] array8, final short[][][] array9, final short[][][] array10, final short[][][] array11, final short[][][] array12) {
        super(false, rainbowParameters);
        final int v1 = rainbowParameters.getV1();
        final int o1 = rainbowParameters.getO1();
        final int o2 = rainbowParameters.getO2();
        this.pk = new short[rainbowParameters.getM()][rainbowParameters.getN()][rainbowParameters.getN()];
        for (int i = 0; i < o1; ++i) {
            for (int j = 0; j < v1; ++j) {
                System.arraycopy(array[i][j], 0, this.pk[i][j], 0, v1);
                System.arraycopy(array2[i][j], 0, this.pk[i][j], v1, o1);
                System.arraycopy(array3[i][j], 0, this.pk[i][j], v1 + o1, o2);
            }
            for (int k = 0; k < o1; ++k) {
                System.arraycopy(array4[i][k], 0, this.pk[i][k + v1], v1, o1);
                System.arraycopy(array5[i][k], 0, this.pk[i][k + v1], v1 + o1, o2);
            }
            for (int l = 0; l < o2; ++l) {
                System.arraycopy(array6[i][l], 0, this.pk[i][l + v1 + o1], v1 + o1, o2);
            }
        }
        for (int n = 0; n < o2; ++n) {
            for (int n2 = 0; n2 < v1; ++n2) {
                System.arraycopy(array7[n][n2], 0, this.pk[n + o1][n2], 0, v1);
                System.arraycopy(array8[n][n2], 0, this.pk[n + o1][n2], v1, o1);
                System.arraycopy(array9[n][n2], 0, this.pk[n + o1][n2], v1 + o1, o2);
            }
            for (int n3 = 0; n3 < o1; ++n3) {
                System.arraycopy(array10[n][n3], 0, this.pk[n + o1][n3 + v1], v1, o1);
                System.arraycopy(array11[n][n3], 0, this.pk[n + o1][n3 + v1], v1 + o1, o2);
            }
            for (int n4 = 0; n4 < o2; ++n4) {
                System.arraycopy(array12[n][n4], 0, this.pk[n + o1][n4 + v1 + o1], v1 + o1, o2);
            }
        }
    }
    
    RainbowPublicKeyParameters(final RainbowParameters rainbowParameters, final byte[] array, final short[][][] array2, final short[][][] array3, final short[][][] array4, final short[][][] array5, final short[][][] array6) {
        super(false, rainbowParameters);
        this.pk_seed = array.clone();
        this.l1_Q3 = RainbowUtil.cloneArray(array2);
        this.l1_Q5 = RainbowUtil.cloneArray(array3);
        this.l1_Q6 = RainbowUtil.cloneArray(array4);
        this.l1_Q9 = RainbowUtil.cloneArray(array5);
        this.l2_Q9 = RainbowUtil.cloneArray(array6);
    }
    
    public RainbowPublicKeyParameters(final RainbowParameters rainbowParameters, final byte[] array) {
        super(false, rainbowParameters);
        final int m = rainbowParameters.getM();
        final int n = rainbowParameters.getN();
        if (this.getParameters().getVersion() == Version.CLASSIC) {
            this.pk = new short[m][n][n];
            int n2 = 0;
            for (int i = 0; i < n; ++i) {
                for (int j = 0; j < n; ++j) {
                    for (int k = 0; k < m; ++k) {
                        if (i > j) {
                            this.pk[k][i][j] = 0;
                        }
                        else {
                            this.pk[k][i][j] = (short)(array[n2] & 0xFF);
                            ++n2;
                        }
                    }
                }
            }
        }
        else {
            this.pk_seed = Arrays.copyOfRange(array, 0, rainbowParameters.getLen_pkseed());
            this.l1_Q3 = new short[rainbowParameters.getO1()][rainbowParameters.getV1()][rainbowParameters.getO2()];
            this.l1_Q5 = new short[rainbowParameters.getO1()][rainbowParameters.getO1()][rainbowParameters.getO1()];
            this.l1_Q6 = new short[rainbowParameters.getO1()][rainbowParameters.getO1()][rainbowParameters.getO2()];
            this.l1_Q9 = new short[rainbowParameters.getO1()][rainbowParameters.getO2()][rainbowParameters.getO2()];
            this.l2_Q9 = new short[rainbowParameters.getO2()][rainbowParameters.getO2()][rainbowParameters.getO2()];
            final int len_pkseed = rainbowParameters.getLen_pkseed();
            final int n3 = len_pkseed + RainbowUtil.loadEncoded(this.l1_Q3, array, len_pkseed, false);
            final int n4 = n3 + RainbowUtil.loadEncoded(this.l1_Q5, array, n3, true);
            final int n5 = n4 + RainbowUtil.loadEncoded(this.l1_Q6, array, n4, false);
            final int n6 = n5 + RainbowUtil.loadEncoded(this.l1_Q9, array, n5, true);
            if (n6 + RainbowUtil.loadEncoded(this.l2_Q9, array, n6, true) != array.length) {
                throw new IllegalArgumentException("unparsed data in key encoding");
            }
        }
    }
    
    public short[][][] getPk() {
        return RainbowUtil.cloneArray(this.pk);
    }
    
    public byte[] getEncoded() {
        if (this.getParameters().getVersion() != Version.CLASSIC) {
            return Arrays.concatenate(Arrays.concatenate(Arrays.concatenate(Arrays.concatenate(Arrays.concatenate(this.pk_seed, RainbowUtil.getEncoded(this.l1_Q3, false)), RainbowUtil.getEncoded(this.l1_Q5, true)), RainbowUtil.getEncoded(this.l1_Q6, false)), RainbowUtil.getEncoded(this.l1_Q9, true)), RainbowUtil.getEncoded(this.l2_Q9, true));
        }
        return RainbowUtil.getEncoded(this.pk, true);
    }
}
