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

package org.bouncycastle.pqc.jcajce.provider.lms;

import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.pqc.crypto.lms.HSSPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.lms.HSSPublicKeyParameters;
import java.security.PrivateKey;
import java.security.PublicKey;
import org.bouncycastle.pqc.crypto.lms.LMSPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.lms.LMSKeyParameters;
import org.bouncycastle.pqc.crypto.lms.LMSPublicKeyParameters;
import org.bouncycastle.pqc.crypto.lms.LMOtsParameters;
import org.bouncycastle.pqc.crypto.lms.LMSigParameters;
import java.security.KeyPair;
import java.security.InvalidAlgorithmParameterException;
import org.bouncycastle.pqc.jcajce.spec.LMSHSSParameterSpec;
import org.bouncycastle.pqc.jcajce.spec.LMSParameterSpec;
import org.bouncycastle.pqc.crypto.lms.HSSKeyPairGenerator;
import org.bouncycastle.pqc.crypto.lms.HSSKeyGenerationParameters;
import org.bouncycastle.pqc.jcajce.spec.LMSHSSKeyGenParameterSpec;
import org.bouncycastle.pqc.crypto.lms.LMSKeyGenerationParameters;
import org.bouncycastle.pqc.crypto.lms.LMSParameters;
import org.bouncycastle.pqc.jcajce.spec.LMSKeyGenParameterSpec;
import java.security.spec.AlgorithmParameterSpec;
import org.bouncycastle.crypto.CryptoServicesRegistrar;
import org.bouncycastle.pqc.crypto.lms.LMSKeyPairGenerator;
import java.security.SecureRandom;
import org.bouncycastle.crypto.AsymmetricCipherKeyPairGenerator;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.crypto.KeyGenerationParameters;
import java.security.KeyPairGenerator;

public class LMSKeyPairGeneratorSpi extends KeyPairGenerator
{
    private KeyGenerationParameters param;
    private ASN1ObjectIdentifier treeDigest;
    private AsymmetricCipherKeyPairGenerator engine;
    private SecureRandom random;
    private boolean initialised;
    
    public LMSKeyPairGeneratorSpi() {
        super("LMS");
        this.engine = new LMSKeyPairGenerator();
        this.random = CryptoServicesRegistrar.getSecureRandom();
        this.initialised = false;
    }
    
    @Override
    public void initialize(final int n, final SecureRandom secureRandom) {
        throw new IllegalArgumentException("use AlgorithmParameterSpec");
    }
    
    @Override
    public void initialize(final AlgorithmParameterSpec algorithmParameterSpec, final SecureRandom secureRandom) throws InvalidAlgorithmParameterException {
        if (algorithmParameterSpec instanceof LMSKeyGenParameterSpec) {
            final LMSKeyGenParameterSpec lmsKeyGenParameterSpec = (LMSKeyGenParameterSpec)algorithmParameterSpec;
            this.param = new LMSKeyGenerationParameters(new LMSParameters(lmsKeyGenParameterSpec.getSigParams(), lmsKeyGenParameterSpec.getOtsParams()), secureRandom);
            (this.engine = new LMSKeyPairGenerator()).init(this.param);
        }
        else if (algorithmParameterSpec instanceof LMSHSSKeyGenParameterSpec) {
            final LMSKeyGenParameterSpec[] lmsSpecs = ((LMSHSSKeyGenParameterSpec)algorithmParameterSpec).getLMSSpecs();
            final LMSParameters[] array = new LMSParameters[lmsSpecs.length];
            for (int i = 0; i != lmsSpecs.length; ++i) {
                array[i] = new LMSParameters(lmsSpecs[i].getSigParams(), lmsSpecs[i].getOtsParams());
            }
            this.param = new HSSKeyGenerationParameters(array, secureRandom);
            (this.engine = new HSSKeyPairGenerator()).init(this.param);
        }
        else if (algorithmParameterSpec instanceof LMSParameterSpec) {
            final LMSParameterSpec lmsParameterSpec = (LMSParameterSpec)algorithmParameterSpec;
            this.param = new LMSKeyGenerationParameters(new LMSParameters(lmsParameterSpec.getSigParams(), lmsParameterSpec.getOtsParams()), secureRandom);
            (this.engine = new LMSKeyPairGenerator()).init(this.param);
        }
        else {
            if (!(algorithmParameterSpec instanceof LMSHSSParameterSpec)) {
                throw new InvalidAlgorithmParameterException("parameter object not a LMSParameterSpec/LMSHSSParameterSpec");
            }
            final LMSParameterSpec[] lmsSpecs2 = ((LMSHSSParameterSpec)algorithmParameterSpec).getLMSSpecs();
            final LMSParameters[] array2 = new LMSParameters[lmsSpecs2.length];
            for (int j = 0; j != lmsSpecs2.length; ++j) {
                array2[j] = new LMSParameters(lmsSpecs2[j].getSigParams(), lmsSpecs2[j].getOtsParams());
            }
            this.param = new HSSKeyGenerationParameters(array2, secureRandom);
            (this.engine = new HSSKeyPairGenerator()).init(this.param);
        }
        this.initialised = true;
    }
    
    @Override
    public KeyPair generateKeyPair() {
        if (!this.initialised) {
            this.param = new LMSKeyGenerationParameters(new LMSParameters(LMSigParameters.lms_sha256_n32_h10, LMOtsParameters.sha256_n32_w2), this.random);
            this.engine.init(this.param);
            this.initialised = true;
        }
        final AsymmetricCipherKeyPair generateKeyPair = this.engine.generateKeyPair();
        if (this.engine instanceof LMSKeyPairGenerator) {
            return new KeyPair(new BCLMSPublicKey((LMSKeyParameters)generateKeyPair.getPublic()), new BCLMSPrivateKey((LMSKeyParameters)generateKeyPair.getPrivate()));
        }
        return new KeyPair(new BCLMSPublicKey((LMSKeyParameters)generateKeyPair.getPublic()), new BCLMSPrivateKey((LMSKeyParameters)generateKeyPair.getPrivate()));
    }
}
