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

package org.bouncycastle.pqc.crypto.mldsa;

import java.security.SecureRandom;
import org.bouncycastle.util.Arrays;

public class MLDSAPrivateKeyParameters extends MLDSAKeyParameters
{
    public static final int BOTH = 0;
    public static final int SEED_ONLY = 1;
    public static final int EXPANDED_KEY = 2;
    final byte[] rho;
    final byte[] k;
    final byte[] tr;
    final byte[] s1;
    final byte[] s2;
    final byte[] t0;
    private final byte[] t1;
    private final byte[] seed;
    private final int prefFormat;
    
    public MLDSAPrivateKeyParameters(final MLDSAParameters mldsaParameters, final byte[] array) {
        this(mldsaParameters, array, null);
    }
    
    public MLDSAPrivateKeyParameters(final MLDSAParameters mldsaParameters, final byte[] array, final byte[] array2, final byte[] array3, final byte[] array4, final byte[] array5, final byte[] array6, final byte[] array7) {
        this(mldsaParameters, array, array2, array3, array4, array5, array6, array7, null);
    }
    
    public MLDSAPrivateKeyParameters(final MLDSAParameters mldsaParameters, final byte[] array, final byte[] array2, final byte[] array3, final byte[] array4, final byte[] array5, final byte[] array6, final byte[] array7, final byte[] array8) {
        super(true, mldsaParameters);
        this.rho = Arrays.clone(array);
        this.k = Arrays.clone(array2);
        this.tr = Arrays.clone(array3);
        this.s1 = Arrays.clone(array4);
        this.s2 = Arrays.clone(array5);
        this.t0 = Arrays.clone(array6);
        this.t1 = Arrays.clone(array7);
        this.seed = Arrays.clone(array8);
        this.prefFormat = ((array8 != null) ? 0 : 2);
    }
    
    public MLDSAPrivateKeyParameters(final MLDSAParameters mldsaParameters, final byte[] array, final MLDSAPublicKeyParameters mldsaPublicKeyParameters) {
        super(true, mldsaParameters);
        final MLDSAEngine engine = mldsaParameters.getEngine(null);
        if (array.length == 32) {
            final byte[][] generateKeyPairInternal = engine.generateKeyPairInternal(array);
            this.rho = generateKeyPairInternal[0];
            this.k = generateKeyPairInternal[1];
            this.tr = generateKeyPairInternal[2];
            this.s1 = generateKeyPairInternal[3];
            this.s2 = generateKeyPairInternal[4];
            this.t0 = generateKeyPairInternal[5];
            this.t1 = generateKeyPairInternal[6];
            this.seed = generateKeyPairInternal[7];
        }
        else {
            int n = 0;
            this.rho = Arrays.copyOfRange(array, 0, 32);
            n += 32;
            this.k = Arrays.copyOfRange(array, n, n + 32);
            n += 32;
            this.tr = Arrays.copyOfRange(array, n, n + 64);
            n += 64;
            final int n2 = engine.getDilithiumL() * engine.getDilithiumPolyEtaPackedBytes();
            this.s1 = Arrays.copyOfRange(array, n, n + n2);
            final int n3 = n + n2;
            final int n4 = engine.getDilithiumK() * engine.getDilithiumPolyEtaPackedBytes();
            this.s2 = Arrays.copyOfRange(array, n3, n3 + n4);
            final int n5 = n3 + n4;
            this.t0 = Arrays.copyOfRange(array, n5, n5 + engine.getDilithiumK() * 416);
            this.t1 = engine.deriveT1(this.rho, this.k, this.tr, this.s1, this.s2, this.t0);
            this.seed = null;
        }
        if (mldsaPublicKeyParameters != null && !Arrays.constantTimeAreEqual(this.t1, mldsaPublicKeyParameters.getT1())) {
            throw new IllegalArgumentException("passed in public key does not match private values");
        }
        this.prefFormat = ((this.seed != null) ? 0 : 2);
    }
    
    private MLDSAPrivateKeyParameters(final MLDSAPrivateKeyParameters mldsaPrivateKeyParameters, final int prefFormat) {
        super(true, mldsaPrivateKeyParameters.getParameters());
        this.rho = mldsaPrivateKeyParameters.rho;
        this.k = mldsaPrivateKeyParameters.k;
        this.tr = mldsaPrivateKeyParameters.tr;
        this.s1 = mldsaPrivateKeyParameters.s1;
        this.s2 = mldsaPrivateKeyParameters.s2;
        this.t0 = mldsaPrivateKeyParameters.t0;
        this.t1 = mldsaPrivateKeyParameters.t1;
        this.seed = mldsaPrivateKeyParameters.seed;
        this.prefFormat = prefFormat;
    }
    
    public MLDSAPrivateKeyParameters getParametersWithFormat(final int n) {
        if (this.prefFormat == n) {
            return this;
        }
        switch (n) {
            case 0:
            case 1: {
                if (this.seed == null) {
                    throw new IllegalStateException("no seed available");
                }
                break;
            }
            case 2: {
                break;
            }
            default: {
                throw new IllegalArgumentException("unknown format");
            }
        }
        return new MLDSAPrivateKeyParameters(this, n);
    }
    
    public int getPreferredFormat() {
        return this.prefFormat;
    }
    
    public byte[] getEncoded() {
        return Arrays.concatenate(new byte[][] { this.rho, this.k, this.tr, this.s1, this.s2, this.t0 });
    }
    
    public byte[] getK() {
        return Arrays.clone(this.k);
    }
    
    @Deprecated
    public byte[] getPrivateKey() {
        return this.getEncoded();
    }
    
    public byte[] getPublicKey() {
        return MLDSAPublicKeyParameters.getEncoded(this.rho, this.t1);
    }
    
    public byte[] getSeed() {
        return Arrays.clone(this.seed);
    }
    
    public MLDSAPublicKeyParameters getPublicKeyParameters() {
        if (this.t1 == null) {
            return null;
        }
        return new MLDSAPublicKeyParameters(this.getParameters(), this.rho, this.t1);
    }
    
    public byte[] getRho() {
        return Arrays.clone(this.rho);
    }
    
    public byte[] getS1() {
        return Arrays.clone(this.s1);
    }
    
    public byte[] getS2() {
        return Arrays.clone(this.s2);
    }
    
    public byte[] getT0() {
        return Arrays.clone(this.t0);
    }
    
    public byte[] getT1() {
        return Arrays.clone(this.t1);
    }
    
    public byte[] getTr() {
        return Arrays.clone(this.tr);
    }
}
