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

package org.bouncycastle.pqc.crypto.falcon;

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

public class FalconKeyPairGenerator implements AsymmetricCipherKeyPairGenerator
{
    private FalconKeyGenerationParameters params;
    private FalconNIST nist;
    private int pk_size;
    private int sk_size;
    
    @Override
    public void init(final KeyGenerationParameters keyGenerationParameters) {
        this.params = (FalconKeyGenerationParameters)keyGenerationParameters;
        final SecureRandom random = keyGenerationParameters.getRandom();
        final int logN = ((FalconKeyGenerationParameters)keyGenerationParameters).getParameters().getLogN();
        this.nist = new FalconNIST(logN, ((FalconKeyGenerationParameters)keyGenerationParameters).getParameters().getNonceLength(), random);
        final int n = 1 << logN;
        int n2 = 8;
        if (n == 1024) {
            n2 = 5;
        }
        else if (n == 256 || n == 512) {
            n2 = 6;
        }
        else if (n == 64 || n == 128) {
            n2 = 7;
        }
        this.pk_size = 1 + 14 * n / 8;
        this.sk_size = 1 + 2 * n2 * n / 8 + n;
    }
    
    @Override
    public AsymmetricCipherKeyPair generateKeyPair() {
        final byte[][] crypto_sign_keypair = this.nist.crypto_sign_keypair(new byte[this.pk_size], new byte[this.sk_size]);
        final FalconParameters parameters = this.params.getParameters();
        return new AsymmetricCipherKeyPair(new FalconPublicKeyParameters(parameters, crypto_sign_keypair[0]), new FalconPrivateKeyParameters(parameters, crypto_sign_keypair[1], crypto_sign_keypair[2], crypto_sign_keypair[3], crypto_sign_keypair[0]));
    }
}
