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

package org.bouncycastle.pqc.math.ntru;

import org.bouncycastle.pqc.math.ntru.parameters.NTRUParameterSet;
import org.bouncycastle.pqc.math.ntru.parameters.NTRUHPSParameterSet;

public class HPSPolynomial extends Polynomial
{
    public HPSPolynomial(final NTRUHPSParameterSet set) {
        super(set);
    }
    
    @Override
    public byte[] sqToBytes(final int n) {
        final byte[] array = new byte[n];
        final short[] array2 = new short[8];
        int i;
        for (i = 0; i < this.params.packDegree() / 8; ++i) {
            for (int j = 0; j < 8; ++j) {
                array2[j] = (short)Polynomial.modQ(this.coeffs[8 * i + j] & 0xFFFF, this.params.q());
            }
            array[11 * i + 0] = (byte)(array2[0] & 0xFF);
            array[11 * i + 1] = (byte)(array2[0] >>> 8 | (array2[1] & 0x1F) << 3);
            array[11 * i + 2] = (byte)(array2[1] >>> 5 | (array2[2] & 0x3) << 6);
            array[11 * i + 3] = (byte)(array2[2] >>> 2 & 0xFF);
            array[11 * i + 4] = (byte)(array2[2] >>> 10 | (array2[3] & 0x7F) << 1);
            array[11 * i + 5] = (byte)(array2[3] >>> 7 | (array2[4] & 0xF) << 4);
            array[11 * i + 6] = (byte)(array2[4] >>> 4 | (array2[5] & 0x1) << 7);
            array[11 * i + 7] = (byte)(array2[5] >>> 1 & 0xFF);
            array[11 * i + 8] = (byte)(array2[5] >>> 9 | (array2[6] & 0x3F) << 2);
            array[11 * i + 9] = (byte)(array2[6] >>> 6 | (array2[7] & 0x7) << 5);
            array[11 * i + 10] = (byte)(array2[7] >>> 3);
        }
        int k;
        for (k = 0; k < this.params.packDegree() - 8 * i; ++k) {
            array2[k] = (short)Polynomial.modQ(this.coeffs[8 * i + k] & 0xFFFF, this.params.q());
        }
        while (k < 8) {
            array2[k] = 0;
            ++k;
        }
        switch (this.params.packDegree() & 0x7) {
            case 4: {
                array[11 * i + 0] = (byte)(array2[0] & 0xFF);
                array[11 * i + 1] = (byte)(array2[0] >>> 8 | (array2[1] & 0x1F) << 3);
                array[11 * i + 2] = (byte)(array2[1] >>> 5 | (array2[2] & 0x3) << 6);
                array[11 * i + 3] = (byte)(array2[2] >>> 2 & 0xFF);
                array[11 * i + 4] = (byte)(array2[2] >>> 10 | (array2[3] & 0x7F) << 1);
                array[11 * i + 5] = (byte)(array2[3] >>> 7 | (array2[4] & 0xF) << 4);
                break;
            }
            case 2: {
                array[11 * i + 0] = (byte)(array2[0] & 0xFF);
                array[11 * i + 1] = (byte)(array2[0] >>> 8 | (array2[1] & 0x1F) << 3);
                array[11 * i + 2] = (byte)(array2[1] >>> 5 | (array2[2] & 0x3) << 6);
                break;
            }
        }
        return array;
    }
    
    @Override
    public void sqFromBytes(final byte[] array) {
        final int length = this.coeffs.length;
        int i;
        for (i = 0; i < this.params.packDegree() / 8; ++i) {
            this.coeffs[8 * i + 0] = (short)((array[11 * i + 0] & 0xFF) >>> 0 | ((short)(array[11 * i + 1] & 0xFF) & 0x7) << 8);
            this.coeffs[8 * i + 1] = (short)((array[11 * i + 1] & 0xFF) >>> 3 | ((short)(array[11 * i + 2] & 0xFF) & 0x3F) << 5);
            this.coeffs[8 * i + 2] = (short)((array[11 * i + 2] & 0xFF) >>> 6 | ((short)(array[11 * i + 3] & 0xFF) & 0xFF) << 2 | ((short)(array[11 * i + 4] & 0xFF) & 0x1) << 10);
            this.coeffs[8 * i + 3] = (short)((array[11 * i + 4] & 0xFF) >>> 1 | ((short)(array[11 * i + 5] & 0xFF) & 0xF) << 7);
            this.coeffs[8 * i + 4] = (short)((array[11 * i + 5] & 0xFF) >>> 4 | ((short)(array[11 * i + 6] & 0xFF) & 0x7F) << 4);
            this.coeffs[8 * i + 5] = (short)((array[11 * i + 6] & 0xFF) >>> 7 | ((short)(array[11 * i + 7] & 0xFF) & 0xFF) << 1 | ((short)(array[11 * i + 8] & 0xFF) & 0x3) << 9);
            this.coeffs[8 * i + 6] = (short)((array[11 * i + 8] & 0xFF) >>> 2 | ((short)(array[11 * i + 9] & 0xFF) & 0x1F) << 6);
            this.coeffs[8 * i + 7] = (short)((array[11 * i + 9] & 0xFF) >>> 5 | ((short)(array[11 * i + 10] & 0xFF) & 0xFF) << 3);
        }
        switch (this.params.packDegree() & 0x7) {
            case 4: {
                this.coeffs[8 * i + 0] = (short)((array[11 * i + 0] & 0xFF) >>> 0 | ((short)(array[11 * i + 1] & 0xFF) & 0x7) << 8);
                this.coeffs[8 * i + 1] = (short)((array[11 * i + 1] & 0xFF) >>> 3 | ((short)(array[11 * i + 2] & 0xFF) & 0x3F) << 5);
                this.coeffs[8 * i + 2] = (short)((array[11 * i + 2] & 0xFF) >>> 6 | ((short)(array[11 * i + 3] & 0xFF) & 0xFF) << 2 | ((short)(array[11 * i + 4] & 0xFF) & 0x1) << 10);
                this.coeffs[8 * i + 3] = (short)((array[11 * i + 4] & 0xFF) >>> 1 | ((short)(array[11 * i + 5] & 0xFF) & 0xF) << 7);
                break;
            }
            case 2: {
                this.coeffs[8 * i + 0] = (short)((array[11 * i + 0] & 0xFF) >>> 0 | ((short)(array[11 * i + 1] & 0xFF) & 0x7) << 8);
                this.coeffs[8 * i + 1] = (short)((array[11 * i + 1] & 0xFF) >>> 3 | ((short)(array[11 * i + 2] & 0xFF) & 0x3F) << 5);
                break;
            }
        }
        this.coeffs[length - 1] = 0;
    }
    
    @Override
    public void lift(final Polynomial polynomial) {
        System.arraycopy(polynomial.coeffs, 0, this.coeffs, 0, this.coeffs.length);
        this.z3ToZq();
    }
}
