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

package org.bouncycastle.pqc.crypto.sphincsplus;

import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.KeyGenerationParameters;
import java.security.SecureRandom;
import org.bouncycastle.crypto.AsymmetricCipherKeyPairGenerator;

public class SPHINCSPlusKeyPairGenerator implements AsymmetricCipherKeyPairGenerator
{
    private SecureRandom random;
    private SPHINCSPlusParameters parameters;
    
    @Override
    public void init(final KeyGenerationParameters keyGenerationParameters) {
        this.random = keyGenerationParameters.getRandom();
        this.parameters = ((SPHINCSPlusKeyGenerationParameters)keyGenerationParameters).getParameters();
    }
    
    @Override
    public AsymmetricCipherKeyPair generateKeyPair() {
        final SPHINCSPlusEngine engine = this.parameters.getEngine();
        byte[] sec_rand2;
        SK sk;
        if (engine instanceof SPHINCSPlusEngine.HarakaSEngine) {
            final byte[] sec_rand = this.sec_rand(engine.N * 3);
            final byte[] array = new byte[engine.N];
            final byte[] array2 = new byte[engine.N];
            sec_rand2 = new byte[engine.N];
            System.arraycopy(sec_rand, 0, array, 0, engine.N);
            System.arraycopy(sec_rand, engine.N, array2, 0, engine.N);
            System.arraycopy(sec_rand, engine.N << 1, sec_rand2, 0, engine.N);
            sk = new SK(array, array2);
        }
        else {
            sk = new SK(this.sec_rand(engine.N), this.sec_rand(engine.N));
            sec_rand2 = this.sec_rand(engine.N);
        }
        engine.init(sec_rand2);
        final PK pk = new PK(sec_rand2, new HT(engine, sk.seed, sec_rand2).htPubKey);
        return new AsymmetricCipherKeyPair(new SPHINCSPlusPublicKeyParameters(this.parameters, pk), new SPHINCSPlusPrivateKeyParameters(this.parameters, sk, pk));
    }
    
    private byte[] sec_rand(final int n) {
        final byte[] bytes = new byte[n];
        this.random.nextBytes(bytes);
        return bytes;
    }
}
